tilting at windmills with ctypes and cygwinreg

109
Tilting at Windmills with ctypes and cygwinreg Simon Law [email protected]

Upload: simon-law

Post on 25-Jun-2015

2.098 views

Category:

Technology


3 download

DESCRIPTION

In this presentation, I take a brisk walk through a small problem in automated browser testing, take a quick right at Windows, and dash through implementing a new Python module replacing winreg. http://pypi.python.org/pypi/cygwinreg

TRANSCRIPT

Page 1: Tilting at Windmills with ctypes and cygwinreg

Tilting at Windmillswith

ctypes and cygwinreg

Simon [email protected]

Page 2: Tilting at Windmills with ctypes and cygwinreg

def introduction():

Page 3: Tilting at Windmills with ctypes and cygwinreg
Page 4: Tilting at Windmills with ctypes and cygwinreg

social reality game

Page 5: Tilting at Windmills with ctypes and cygwinreg

def problem():

Page 6: Tilting at Windmills with ctypes and cygwinreg

website

Page 7: Tilting at Windmills with ctypes and cygwinreg
Page 8: Tilting at Windmills with ctypes and cygwinreg

testing

Page 9: Tilting at Windmills with ctypes and cygwinreg
Page 10: Tilting at Windmills with ctypes and cygwinreg
Page 11: Tilting at Windmills with ctypes and cygwinreg
Page 12: Tilting at Windmills with ctypes and cygwinreg

clickwaitlook

Page 13: Tilting at Windmills with ctypes and cygwinreg

clickwaitlook

Page 14: Tilting at Windmills with ctypes and cygwinreg

clickwaitlook

Page 15: Tilting at Windmills with ctypes and cygwinreg

slow

Page 16: Tilting at Windmills with ctypes and cygwinreg

laborious

Page 17: Tilting at Windmills with ctypes and cygwinreg

boring

Page 18: Tilting at Windmills with ctypes and cygwinreg

automated testing

Page 19: Tilting at Windmills with ctypes and cygwinreg

def test_browser():

Page 20: Tilting at Windmills with ctypes and cygwinreg

© Andy HeatwoleCreative Commons Attribution-NonCommercial-NoDerivs 2.5.

http://blog.bluehourphoto.com/?showimage=224

Page 21: Tilting at Windmills with ctypes and cygwinreg

getwindmill.com

Page 22: Tilting at Windmills with ctypes and cygwinreg
Page 23: Tilting at Windmills with ctypes and cygwinreg
Page 24: Tilting at Windmills with ctypes and cygwinreg
Page 25: Tilting at Windmills with ctypes and cygwinreg
Page 26: Tilting at Windmills with ctypes and cygwinreg

one script

Page 27: Tilting at Windmills with ctypes and cygwinreg

all browsers

Page 28: Tilting at Windmills with ctypes and cygwinreg

from windmill.authoring import *

def setup_module(module): client = WindmillTestClient(__name__) client.click(id=u'home') client.waits.forPageLoad(timeout=u'60000') client.asserts.assertNode(id='LoginPage')

Page 29: Tilting at Windmills with ctypes and cygwinreg

from windmill.authoring import *

def setup_module(module): client = WindmillTestClient(__name__) client.click(id=u'home') client.waits.forPageLoad(timeout=u'60000') client.asserts.assertNode(id='LoginPage')

Page 30: Tilting at Windmills with ctypes and cygwinreg

from windmill.authoring import *

def setup_module(module): client = WindmillTestClient(__name__) client.click(id=u'home') client.waits.forPageLoad(timeout=u'60000') client.asserts.assertNode(id='LoginPage')

Page 31: Tilting at Windmills with ctypes and cygwinreg

from windmill.authoring import *

def setup_module(module): client = WindmillTestClient(__name__) client.click(id=u'home') client.waits.forPageLoad(timeout=u'60000') client.asserts.assertNode(id='LoginPage')

Page 32: Tilting at Windmills with ctypes and cygwinreg

semi-automated testing

Page 33: Tilting at Windmills with ctypes and cygwinreg

def continuous_integration():

Page 34: Tilting at Windmills with ctypes and cygwinreg

test automatically

Page 35: Tilting at Windmills with ctypes and cygwinreg

buildbot.net

Page 36: Tilting at Windmills with ctypes and cygwinreg

~/akoha$ make check

Page 37: Tilting at Windmills with ctypes and cygwinreg

C:\>make check'make' is not recognized as an internal or external command, operable program or batch file.

Page 38: Tilting at Windmills with ctypes and cygwinreg
Page 39: Tilting at Windmills with ctypes and cygwinreg

cygwin.com

Page 40: Tilting at Windmills with ctypes and cygwinreg

~/akoha$ make check

Page 41: Tilting at Windmills with ctypes and cygwinreg

Traceback (most recent call last): ...ImportError: No module named _winreg

Page 42: Tilting at Windmills with ctypes and cygwinreg

def windows_registry():

Page 43: Tilting at Windmills with ctypes and cygwinreg

proxy settings

Page 44: Tilting at Windmills with ctypes and cygwinreg

import _winreg

Page 45: Tilting at Windmills with ctypes and cygwinreg

import winreg

Page 46: Tilting at Windmills with ctypes and cygwinreg

32.3. winregWindows registry access

Platforms: Windows

Page 47: Tilting at Windmills with ctypes and cygwinreg

32.3. winregWindows registry access

Platforms: Windows

Page 48: Tilting at Windmills with ctypes and cygwinreg

3 choices

Page 49: Tilting at Windmills with ctypes and cygwinreg

1

Page 50: Tilting at Windmills with ctypes and cygwinreg

give up

Page 51: Tilting at Windmills with ctypes and cygwinreg

2

Page 52: Tilting at Windmills with ctypes and cygwinreg

recompile Python

Page 53: Tilting at Windmills with ctypes and cygwinreg

3

Page 54: Tilting at Windmills with ctypes and cygwinreg

cygwinreg

Page 55: Tilting at Windmills with ctypes and cygwinreg

like hurting myself

Page 56: Tilting at Windmills with ctypes and cygwinreg

def call_system_libraries():

Page 57: Tilting at Windmills with ctypes and cygwinreg

import ctypes

Page 58: Tilting at Windmills with ctypes and cygwinreg

foreign function interface

Page 59: Tilting at Windmills with ctypes and cygwinreg

call functions

Page 60: Tilting at Windmills with ctypes and cygwinreg

shared libraries

Page 61: Tilting at Windmills with ctypes and cygwinreg

libiberty.so

Page 62: Tilting at Windmills with ctypes and cygwinreg

libgcc.dynlib

Page 63: Tilting at Windmills with ctypes and cygwinreg

advapi32.dll

Page 64: Tilting at Windmills with ctypes and cygwinreg

>>> from ctypes import cdll

Page 65: Tilting at Windmills with ctypes and cygwinreg

>>> cdll.advapi32<CDLL 'advapi32', ... at ...>

Page 66: Tilting at Windmills with ctypes and cygwinreg

>>> cdll.advapi32.RegCloseKey<_FuncPtr object at 0x...>

Page 67: Tilting at Windmills with ctypes and cygwinreg

>>> a = cdll.advapi32>>> RegCloseKey = a.RegCloseKey>>> RegCloseKey(0)6

Page 68: Tilting at Windmills with ctypes and cygwinreg

no introspection

Page 69: Tilting at Windmills with ctypes and cygwinreg

>>> RegCloseKey(0)6>>> RegCloseKey()6

Page 70: Tilting at Windmills with ctypes and cygwinreg

return value

Page 71: Tilting at Windmills with ctypes and cygwinreg

function arguments

Page 72: Tilting at Windmills with ctypes and cygwinreg
Page 73: Tilting at Windmills with ctypes and cygwinreg

from ctypes import cdllfrom ctypes import c_long, c_ulong

# WINADVAPI LONG WINAPI RegCloseKey(HKEY);RegCloseKey = cdll.advapi32.RegCloseKeyRegCloseKey.restype = c_longRegCloseKey.argtypes = [c_ulong]

Page 74: Tilting at Windmills with ctypes and cygwinreg

from ctypes import cdllfrom ctypes import c_long, c_ulong

# WINADVAPI LONG WINAPI RegCloseKey(HKEY);RegCloseKey = cdll.advapi32.RegCloseKeyRegCloseKey.restype = c_longRegCloseKey.argtypes = [c_ulong]

Page 75: Tilting at Windmills with ctypes and cygwinreg

from ctypes import cdllfrom ctypes import c_long, c_ulong

# WINADVAPI LONG WINAPI RegCloseKey(HKEY);RegCloseKey = cdll.advapi32.RegCloseKeyRegCloseKey.restype = c_longRegCloseKey.argtypes = [c_ulong]

Page 76: Tilting at Windmills with ctypes and cygwinreg

from ctypes import cdllfrom ctypes import c_long, c_ulong

LONG = c_longHANDLE = c_ulong # in header files: void *HKEY = HANDLE

# WINADVAPI LONG WINAPI RegCloseKey(HKEY);RegCloseKey = cdll.advapi32.RegCloseKeyRegCloseKey.restype = LONGRegCloseKey.argtypes = [HKEY]

Page 77: Tilting at Windmills with ctypes and cygwinreg

>>> RegCloseKey(0)6>>> RegCloseKey()Traceback (most recent call last): ...TypeError: this function takes at least 1 argument (0 given)

Page 78: Tilting at Windmills with ctypes and cygwinreg

not Pythonic

Page 79: Tilting at Windmills with ctypes and cygwinreg
Page 80: Tilting at Windmills with ctypes and cygwinreg

PyHKEY.Close()

Closes the underlying Windows handle.

Page 81: Tilting at Windmills with ctypes and cygwinreg

class PyHKEY(object): def __init__(self, hkey): self.hkey = hkey

def Close(self): if RegCloseKey(self.hkey) != 0: raise WindowsError() self.hkey = 0

class WindowsError(OSError): ...

Page 82: Tilting at Windmills with ctypes and cygwinreg

class PyHKEY(object): def __init__(self, hkey): self.hkey = hkey

def Close(self): RegCloseKey(self.hkey) raise WindowsError() self.hkey = 0

class WindowsError(OSError): ...

Page 83: Tilting at Windmills with ctypes and cygwinreg

class PyHKEY(object): def __init__(self, hkey): self.hkey = hkey

def Close(self): if RegCloseKey(self.hkey) != 0: raise WindowsError() self.hkey = 0

class WindowsError(OSError): ...

Page 84: Tilting at Windmills with ctypes and cygwinreg

>>> from cygwinreg import PyHKEY>>> hkey = PyHKEY(0)>>> hkey.Close()

Page 85: Tilting at Windmills with ctypes and cygwinreg
Page 86: Tilting at Windmills with ctypes and cygwinreg

RegDeleteKeyW = cdll.advapi32.RegDeleteKeyWRegDeleteKeyW.restype = LONGRegDeleteKeyW.argtypes = [HKEY, LPCWSTR]

Page 87: Tilting at Windmills with ctypes and cygwinreg
Page 88: Tilting at Windmills with ctypes and cygwinreg

def DeleteKey(key, sub_key): from cygwinreg.w32api import RegDeleteKeyW wincall(RegDeleteKeyW(PyHKEY.make(key), sub_key))

Page 89: Tilting at Windmills with ctypes and cygwinreg

hours later

Page 90: Tilting at Windmills with ctypes and cygwinreg

>>> try:... import winreg... except ImportError:... import cygwinreg as winreg

Page 91: Tilting at Windmills with ctypes and cygwinreg

def tradeoffs():

Page 92: Tilting at Windmills with ctypes and cygwinreg

Python only

Page 93: Tilting at Windmills with ctypes and cygwinreg

no compilation

Page 94: Tilting at Windmills with ctypes and cygwinreg

slower

Page 95: Tilting at Windmills with ctypes and cygwinreg

no parsing

Page 96: Tilting at Windmills with ctypes and cygwinreg

simple

Page 97: Tilting at Windmills with ctypes and cygwinreg

not automatic

Page 98: Tilting at Windmills with ctypes and cygwinreg

standard

Page 99: Tilting at Windmills with ctypes and cygwinreg

portable

Page 100: Tilting at Windmills with ctypes and cygwinreg

good enough

Page 101: Tilting at Windmills with ctypes and cygwinreg

def conclusion():

Page 102: Tilting at Windmills with ctypes and cygwinreg

~/akoha$ make check

Page 103: Tilting at Windmills with ctypes and cygwinreg

continuous integration

Page 104: Tilting at Windmills with ctypes and cygwinreg

browser tests

Page 105: Tilting at Windmills with ctypes and cygwinreg

pypi.python.org/pypi/cygwinreg

Page 106: Tilting at Windmills with ctypes and cygwinreg

no compilation

Page 107: Tilting at Windmills with ctypes and cygwinreg

no installation

Page 108: Tilting at Windmills with ctypes and cygwinreg

no :'-(

Page 109: Tilting at Windmills with ctypes and cygwinreg

cygwinregpypi.python.org/pypi/cygwinreg

PSF License

this presentation:Attribution-Share Alike 3.0