2011-07-27 19:07:14 +08:00
|
|
|
#
|
|
|
|
#
|
|
|
|
#
|
|
|
|
|
2011-10-03 15:40:27 +08:00
|
|
|
import unittest
|
|
|
|
import target
|
|
|
|
import pykd
|
2011-07-27 19:07:14 +08:00
|
|
|
|
2011-10-03 15:40:27 +08:00
|
|
|
class TypeInfoTest( unittest.TestCase ):
|
2011-07-27 19:07:14 +08:00
|
|
|
|
2011-10-03 15:40:27 +08:00
|
|
|
def testCtor( self ):
|
2012-03-27 21:26:02 +08:00
|
|
|
self.assertEqual( "structTest", pykd.typeInfo( "structTest" ).name() )
|
|
|
|
self.assertEqual( "structTest", pykd.typeInfo( target.moduleName + "!structTest" ).name() )
|
|
|
|
self.assertEqual( "structTest", pykd.typeInfo( "g_structTest" ).name() )
|
2012-06-20 18:13:47 +08:00
|
|
|
self.assertEqual( "structTest", pykd.typeInfo( target.moduleName + "!g_structTest" ).name() )
|
2012-07-18 15:32:51 +08:00
|
|
|
self.assertEqual( "Int1B", pykd.typeInfo( "Int1B" ).name() )
|
2012-03-27 21:26:02 +08:00
|
|
|
|
2011-10-03 15:40:27 +08:00
|
|
|
def testCreateByName( self ):
|
|
|
|
""" creating typeInfo by the type name """
|
2012-11-23 17:55:17 +08:00
|
|
|
self.assertEqual( "Int4B*", target.module.type("Int4B*").name() )
|
|
|
|
self.assertEqual( "Int4B*", pykd.typeInfo("Int4B*").name() )
|
2011-12-05 15:48:46 +08:00
|
|
|
self.assertEqual( "structTest", target.module.type( "structTest" ).name() )
|
|
|
|
self.assertEqual( "structTest**", target.module.type( "structTest**" ).name() )
|
2011-11-16 14:42:00 +08:00
|
|
|
self.assertEqual( "Int4B[2][3]", target.module.type("Int4B[2][3]").name() )
|
2011-12-06 23:49:25 +08:00
|
|
|
self.assertEqual( "Int4B(*[4])[2][3]", target.module.type("Int4B(*[4])[2][3]").name() )
|
2011-12-09 14:45:12 +08:00
|
|
|
self.assertEqual( "Int4B(*)[2][3]", target.module.type("Int4B((*))[2][3]").name() )
|
2012-01-19 18:16:07 +08:00
|
|
|
|
2011-12-05 15:48:46 +08:00
|
|
|
def testCreateBySymbol(self):
|
|
|
|
""" creating typeInfo by the symbol name """
|
|
|
|
self.assertEqual( "structTest[2]", target.module.type("g_testArray").name() )
|
|
|
|
self.assertEqual( "Int4B[2][3]", target.module.type("intMatrix").name() )
|
|
|
|
self.assertEqual( "structTest*", target.module.type("g_structTestPtr").name() )
|
|
|
|
self.assertEqual( "structTest**", target.module.type("g_structTestPtrPtr").name() )
|
|
|
|
self.assertEqual( "Char*[2]", target.module.type("strArray").name() )
|
|
|
|
self.assertEqual( "Char*(*)[2]", target.module.type("ptrStrArray").name() )
|
|
|
|
self.assertEqual( "Int4B(*[4])[2][3]", target.module.type("arrIntMatrixPtrs").name() )
|
2011-12-09 14:45:12 +08:00
|
|
|
self.assertEqual( "Int4B(*)[2][3]", target.module.type("ptrIntMatrix1").name() )
|
|
|
|
|
2011-11-08 18:53:07 +08:00
|
|
|
|
2011-10-04 15:00:54 +08:00
|
|
|
def testGetField( self ):
|
|
|
|
""" get field of the complex type """
|
|
|
|
ti1 = target.module.type( "structTest" )
|
2011-10-06 14:26:25 +08:00
|
|
|
self.assertTrue( hasattr( ti1, "m_field0" ) )
|
|
|
|
try: hasattr(ti1, "m_field4" ) # non-exsisting field
|
2011-11-16 14:42:00 +08:00
|
|
|
except pykd.BaseException: pass
|
|
|
|
|
|
|
|
def testBaseTypes( self ):
|
2012-01-19 18:16:07 +08:00
|
|
|
|
2012-01-18 00:30:15 +08:00
|
|
|
self.assertEqual("Int1B", target.module.type( "Int1B" ).name() )
|
|
|
|
self.assertEqual("Int2B", target.module.type( "Int2B" ).name() )
|
|
|
|
self.assertEqual("Int4B", target.module.type( "Int4B" ).name() )
|
|
|
|
self.assertEqual("Int8B", target.module.type( "Int8B" ).name() )
|
|
|
|
self.assertEqual("UInt1B", target.module.type( "UInt1B" ).name() )
|
|
|
|
self.assertEqual("UInt2B", target.module.type( "UInt2B" ).name() )
|
|
|
|
self.assertEqual("UInt4B", target.module.type( "UInt4B" ).name() )
|
|
|
|
self.assertEqual("UInt8B", target.module.type( "UInt8B" ).name() )
|
2012-01-19 18:16:07 +08:00
|
|
|
|
2012-01-18 00:30:15 +08:00
|
|
|
self.assertEqual("Long", target.module.type( "Long" ).name() )
|
2012-01-19 18:16:07 +08:00
|
|
|
self.assertEqual("ULong", target.module.type( "ULong" ).name() )
|
2012-01-18 00:30:15 +08:00
|
|
|
self.assertEqual("Bool", target.module.type( "Bool" ).name() )
|
|
|
|
self.assertEqual("Char", target.module.type("Char").name() )
|
2012-01-19 18:16:07 +08:00
|
|
|
self.assertEqual("WChar", target.module.type("WChar").name() )
|
|
|
|
|
|
|
|
self.assertEqual( 1, target.module.type("Int1B").size() )
|
|
|
|
self.assertEqual( 1, target.module.type("UInt1B").size() )
|
|
|
|
self.assertEqual( 2, target.module.type("Int2B").size() )
|
|
|
|
self.assertEqual( 2, target.module.type("UInt2B").size() )
|
|
|
|
self.assertEqual( 4, target.module.type("Int4B").size() )
|
|
|
|
self.assertEqual( 4, target.module.type("UInt4B").size() )
|
|
|
|
self.assertEqual( 8, target.module.type("Int8B").size() )
|
|
|
|
self.assertEqual( 8, target.module.type("UInt8B").size() )
|
|
|
|
|
2012-01-18 00:30:15 +08:00
|
|
|
self.assertEqual( 4, target.module.type("Long" ).size() )
|
2012-01-19 18:16:07 +08:00
|
|
|
self.assertEqual( 4, target.module.type("ULong" ).size() )
|
|
|
|
self.assertEqual( 1, target.module.type("Bool" ).size() )
|
2012-01-18 00:30:15 +08:00
|
|
|
self.assertEqual( 1, target.module.type("Char").size() )
|
|
|
|
self.assertEqual( 2, target.module.type("WChar").size() )
|
2012-01-19 18:16:07 +08:00
|
|
|
|
2012-01-18 00:30:15 +08:00
|
|
|
try:
|
2012-01-19 18:16:07 +08:00
|
|
|
self.assertEqual("Int9B", target.module.type( "Int9B" ).name() )
|
2012-01-18 00:30:15 +08:00
|
|
|
except pykd.SymbolException:
|
|
|
|
pass
|
2012-12-06 14:28:59 +08:00
|
|
|
|
|
|
|
def testBaseTypePtr(self):
|
|
|
|
self.assertEqual("Int1B*", target.module.type( "Int1B*" ).name() )
|
|
|
|
self.assertEqual("Int1B", target.module.type( "Int1B*" ).deref().name() )
|
|
|
|
|
|
|
|
def testBaseTypeArray(self):
|
|
|
|
self.assertEqual("Int4B[20]", target.module.type( "Int4B[20]" ).name() )
|
2011-11-08 18:53:07 +08:00
|
|
|
|
2011-10-04 15:00:54 +08:00
|
|
|
def testName( self ):
|
|
|
|
ti1 = target.module.type( "classChild" )
|
|
|
|
self.assertEqual( "classChild", ti1.name() )
|
2011-11-16 14:42:00 +08:00
|
|
|
self.assertEqual( "Int4B", ti1.m_childField.name() )
|
2011-10-04 15:00:54 +08:00
|
|
|
self.assertEqual( "structTest", ti1.m_childField3.name() )
|
2011-10-19 16:13:02 +08:00
|
|
|
self.assertEqual( "structTest", target.module.type("g_structTest").name() )
|
2012-03-19 14:03:00 +08:00
|
|
|
|
|
|
|
def testVarName( self ):
|
|
|
|
self.assertEqual( "structTest", target.module.type( "g_structTest").name() )
|
2012-03-19 14:44:18 +08:00
|
|
|
self.assertRaises( pykd.TypeException, target.module.type, "g_testArray[0]" )
|
|
|
|
self.assertRaises( pykd.TypeException, target.module.type, "*g_structTestPtr" )
|
2012-01-19 18:16:07 +08:00
|
|
|
|
2011-10-04 15:00:54 +08:00
|
|
|
def testOffset( self ):
|
|
|
|
ti1 = target.module.type( "structTest" )
|
2012-07-20 23:01:13 +08:00
|
|
|
self.assertEqual( 0, ti1.fieldOffset("m_field0") )
|
|
|
|
self.assertEqual( 4, ti1.fieldOffset("m_field1") )
|
|
|
|
self.assertEqual( 12, ti1.fieldOffset("m_field2") )
|
|
|
|
self.assertEqual( 14, ti1.fieldOffset("m_field3") )
|
|
|
|
|
|
|
|
ti2 = target.module.type( "struct2" )
|
|
|
|
self.assertTrue( ti2.fieldOffset("m_union") >= ti2.m_struct.size() )
|
|
|
|
self.assertEqual( 0, ti2.m_union.fieldOffset("m_value") )
|
|
|
|
|
2011-10-06 14:26:25 +08:00
|
|
|
def testSize( self ):
|
|
|
|
ti1 = target.module.type( "structTest" )
|
2012-01-12 21:57:49 +08:00
|
|
|
self.assertEqual( 16 + pykd.ptrSize(), ti1.size() )
|
2012-07-20 23:01:13 +08:00
|
|
|
self.assertEqual( pykd.ptrSize(), target.module.type("structTest**").size() )
|
2012-06-20 18:13:47 +08:00
|
|
|
self.assertEqual( pykd.sizeof("structTest"), target.module.type("structTest").size() )
|
|
|
|
self.assertEqual( pykd.sizeof("structTest**"), target.module.type("structTest**").size() )
|
2012-07-20 23:01:13 +08:00
|
|
|
self.assertEqual( pykd.sizeof("Int1B"), target.module.type("Int1B").size() )
|
2012-01-19 18:16:07 +08:00
|
|
|
|
2011-12-13 15:52:04 +08:00
|
|
|
def testBitField( self ):
|
|
|
|
ti = target.module.type( "g_structWithBits" )
|
2012-07-20 23:01:13 +08:00
|
|
|
self.assertEqual( 0, ti.fieldOffset("m_bit6_7") )
|
2011-12-13 15:52:04 +08:00
|
|
|
self.assertEqual( 4, ti.m_bit6_7.size() )
|
|
|
|
self.assertEqual( "ULong:2", ti.m_bit6_7.name() )
|
|
|
|
self.assertEqual( 2, ti.m_bit6_7.bitWidth() )
|
|
|
|
self.assertEqual( 6, ti.m_bit6_7.bitOffset() )
|
2012-01-19 18:16:07 +08:00
|
|
|
|
2011-12-27 16:32:50 +08:00
|
|
|
def testEnum(self):
|
|
|
|
ti = target.module.type("enumType")
|
|
|
|
self.assertTrue( hasattr( ti, "TWO" ) )
|
|
|
|
self.assertEqual( 4, ti.TWO.size() )
|
2012-07-20 23:01:13 +08:00
|
|
|
|
2011-12-27 16:32:50 +08:00
|
|
|
ti = target.module.type("classChild")
|
|
|
|
self.assertEqual( "enumType", ti.m_enumField.name() )
|
2012-07-20 23:01:13 +08:00
|
|
|
|
2012-02-17 17:58:48 +08:00
|
|
|
def testPtr(self):
|
|
|
|
self.assertEqual( "listStruct1*", target.module.type( "g_listHead1" ).name() )
|
2012-02-18 01:22:34 +08:00
|
|
|
self.assertEqual( "listStruct1*[2]", target.module.type( "g_arrOfListStruct1" ).name())
|
2012-02-17 17:58:48 +08:00
|
|
|
self.assertEqual( "Void*", target.module.type( "g_voidPtr" ).name() )
|
2012-02-18 01:22:34 +08:00
|
|
|
self.assertEqual( "Void*[3]", target.module.type( "g_arrOfVoidPtr" ).name())
|
2012-02-21 03:42:19 +08:00
|
|
|
self.assertEqual( "<function>*", target.module.type( "g_ptrToFunction" ).name())
|
|
|
|
self.assertEqual( "<function>*[4]", target.module.type( "g_arrOfPtrToFunc" ).name())
|
2012-01-19 18:16:07 +08:00
|
|
|
|
2011-12-27 16:32:50 +08:00
|
|
|
def testUnion(self):
|
|
|
|
ti = target.module.type("unionTest")
|
2012-07-20 23:01:13 +08:00
|
|
|
self.assertEqual( 0, ti.fieldOffset("m_doubleValue") )
|
|
|
|
self.assertEqual( 0, ti.fieldOffset("m_bits") )
|
2011-12-27 16:32:50 +08:00
|
|
|
self.assertEqual( ti.size(), ti.m_doubleValue.size() )
|
2012-01-19 18:16:07 +08:00
|
|
|
|
2011-12-29 23:50:44 +08:00
|
|
|
def testAsMap(self):
|
|
|
|
ti = target.module.type("enumType")
|
|
|
|
self.assertEqual( { 1 : "ONE", 2 : "TWO", 3 : "THREE" }, ti.asMap() )
|
2012-01-19 18:16:07 +08:00
|
|
|
|
2012-01-10 14:54:25 +08:00
|
|
|
def testDeref(self):
|
|
|
|
ti = target.module.type("listStruct1")
|
|
|
|
self.assertEqual( "listStruct1", ti.next.deref().name() )
|
2012-01-19 18:16:07 +08:00
|
|
|
|
2012-01-10 14:54:25 +08:00
|
|
|
ti = target.module.type("listStruct1*")
|
|
|
|
self.assertEqual( "listStruct1", ti.deref().name() )
|
2012-01-19 18:16:07 +08:00
|
|
|
|
2012-01-10 14:54:25 +08:00
|
|
|
ti = target.module.type("classChild")
|
2012-01-18 00:30:15 +08:00
|
|
|
self.assertRaises( pykd.BaseException, ti.deref );
|
2012-01-19 18:16:07 +08:00
|
|
|
|
|
|
|
def testNestedStruct( self ):
|
|
|
|
ti = target.module.type("StructWithNested")
|
|
|
|
self.assertTrue( hasattr( ti, "m_field" ) )
|
2013-04-17 17:34:42 +08:00
|
|
|
self.assertTrue( hasattr( ti, "m_field2" ) )
|
2012-01-19 18:16:07 +08:00
|
|
|
self.assertFalse( hasattr( ti, "m_nestedFiled" ) )
|
|
|
|
|
|
|
|
ti = target.module.type("StructWithNested::Nested")
|
|
|
|
self.assertTrue( hasattr( ti, "m_nestedFiled" ) )
|
2012-07-20 23:01:13 +08:00
|
|
|
|
2012-03-16 14:40:15 +08:00
|
|
|
def testPrint(self):
|
|
|
|
self.assertTrue( str(target.module.type( "g_ucharValue" ) ) )
|
|
|
|
self.assertTrue( str(target.module.type( "g_ushortValue" ) ) )
|
|
|
|
self.assertTrue( str(target.module.type( "g_ulongValue" ) ) )
|
|
|
|
self.assertTrue( str(target.module.type( "g_ulonglongValue" ) ) )
|
|
|
|
self.assertTrue( str(target.module.type( "g_structWithBits" ) ) )
|
|
|
|
self.assertTrue( str(target.module.type( "g_structTest" ) ) )
|
|
|
|
self.assertTrue( str(target.module.type( "g_structTest1" ) ) )
|
|
|
|
self.assertTrue( str(target.module.type( "g_testArray" ) ) )
|
|
|
|
self.assertTrue( str(target.module.type( "g_structTestPtr" ) ) )
|
|
|
|
self.assertTrue( str(target.module.type( "g_structTestPtrPtr" ) ) )
|
|
|
|
self.assertTrue( str(target.module.type( "longlongArray" ) ) )
|
|
|
|
self.assertTrue( str(target.module.type( "intMatrix4" ) ) )
|
|
|
|
self.assertTrue( str(target.module.type( "ptrIntMatrix" ) ) )
|
|
|
|
self.assertTrue( str(target.module.type( "g_classChild" ) ) )
|
|
|
|
self.assertTrue( str(target.module.type( "g_struct3" ) ) )
|
|
|
|
self.assertTrue( str(target.module.type( "g_listHead" ) ) )
|
|
|
|
self.assertTrue( str(target.module.type( "g_voidPtr" ) ) )
|
|
|
|
self.assertTrue( str(target.module.type( "g_arrOfPtrToFunc" ) ) )
|
|
|
|
self.assertTrue( str(target.module.type( "g_unTypedPtrToFunction" ) ) )
|
|
|
|
|
2012-04-11 00:48:51 +08:00
|
|
|
def testTypedef(self):
|
|
|
|
self.assertEqual( "structTest", pykd.typeInfo( "g_structTypeDef" ).name() )
|
|
|
|
self.assertEqual( "structTest", pykd.typeInfo( "structTestTypeDef" ).name() )
|
2012-07-20 23:01:13 +08:00
|
|
|
|
2012-04-18 15:39:33 +08:00
|
|
|
def testStaticField(self):
|
|
|
|
ti = pykd.typeInfo( "g_classChild" )
|
2012-12-21 15:06:53 +08:00
|
|
|
self.assertNotEqual( 0, ti.staticOffset( "m_staticField" ) )
|
|
|
|
self.assertNotEqual( 0, ti.staticOffset("m_stdstr") )
|
|
|
|
if not ti.staticOffset("m_staticConst"):
|
2012-07-20 23:01:13 +08:00
|
|
|
self.assertFalse( "MS DIA bug: https://connect.microsoft.com/VisualStudio/feedback/details/737430" )
|
2012-12-21 15:06:53 +08:00
|
|
|
|
|
|
|
def testVfnTable(self):
|
|
|
|
ti = pykd.typeInfo( "g_classChild" )
|
|
|
|
self.assertTrue( hasattr( ti, "__VFN_table" ) )
|
2012-05-17 22:24:31 +08:00
|
|
|
|
2012-05-22 19:46:58 +08:00
|
|
|
def testUdtSubscribe(self):
|
2012-12-06 14:28:59 +08:00
|
|
|
ti = pykd.typeInfo( "g_virtChild" )
|
|
|
|
self.assertEqual( 5, len(ti) )
|
|
|
|
for field in ti:
|
2012-05-22 19:46:58 +08:00
|
|
|
str( field )
|
2012-12-06 14:28:59 +08:00
|
|
|
|
|
|
|
def testStructNullSize(self):
|
|
|
|
ti = target.module.type("structNullSize")
|
|
|
|
self.assertEqual( 0, len(ti) )
|
|
|
|
|
2012-12-21 15:06:53 +08:00
|
|
|
def testDerefName(self):
|
|
|
|
entry = pykd.typedVar("entry1").Flink
|
|
|
|
self.assertEqual( "_LIST_ENTRY*", entry.type().name() )
|
|
|
|
|
2012-12-27 17:35:16 +08:00
|
|
|
def testPtrTo(self):
|
|
|
|
ti = pykd.typeInfo("UInt8B").ptrTo()
|
|
|
|
self.assertTrue( "UInt8B*", ti.name() )
|
2013-01-10 19:20:57 +08:00
|
|
|
self.assertNotEqual( 0, ti.size() )
|
|
|
|
|
2012-12-27 17:35:16 +08:00
|
|
|
def testArrayOf(self):
|
|
|
|
ti = pykd.typeInfo("UInt8B").arrayOf(10)
|
|
|
|
self.assertTrue( "UInt8B[10]", ti.name() )
|
2012-12-21 15:06:53 +08:00
|
|
|
|