diff --git a/test/scripts/diatest.py b/test/scripts/diatest.py index 1287a50..77a3e4d 100644 --- a/test/scripts/diatest.py +++ b/test/scripts/diatest.py @@ -6,6 +6,8 @@ import unittest import target import pykd +from sets import Set + class DiaTest( unittest.TestCase ): def testCtor(self): @@ -14,225 +16,164 @@ class DiaTest( unittest.TestCase ): except RuntimeError: pass def testFind(self): - try: - gScope = pykd.diaLoadPdb( str(target.module.pdb()) ) - self.assertNotEqual(0, len(gScope)) - symFunction = gScope.find("FuncWithName0") - self.assertTrue(1 == len( symFunction )) - symFunction = gScope.findEx(pykd.SymTagNull, - "FuNc*Name?", - pykd.nsCaseInRegularExpression) - self.assertTrue(len(symFunction) > 1) - except pykd.DiaException as diaExcept: - print diaExcept - self.assertTrue(False) + gScope = pykd.diaLoadPdb( str(target.module.pdb()) ) + self.assertNotEqual(0, len(gScope)) + symFunction = gScope.find("FuncWithName0") + self.assertTrue(1 == len( symFunction )) + symFunction = gScope.findEx(pykd.SymTagNull, + "FuNc*Name?", + pykd.nsCaseInRegularExpression) + self.assertTrue(len(symFunction) > 1) def testSize(self): - try: - gScope = pykd.diaLoadPdb( str(target.module.pdb()) ) - self.assertEqual(1, gScope["g_ucharValue"].type().size()) - self.assertEqual(2, gScope["g_ushortValue"].type().size()) - self.assertEqual(4, gScope["g_ulongValue"].type().size()) - self.assertEqual(8, gScope["g_ulonglongValue"].type().size()) - except pykd.DiaException as diaExcept: - print diaExcept - self.assertTrue(False) + gScope = pykd.diaLoadPdb( str(target.module.pdb()) ) + self.assertEqual(1, gScope["g_ucharValue"].type().size()) + self.assertEqual(2, gScope["g_ushortValue"].type().size()) + self.assertEqual(4, gScope["g_ulongValue"].type().size()) + self.assertEqual(8, gScope["g_ulonglongValue"].type().size()) def testValue(self): - try: - gScope = pykd.diaLoadPdb( str(target.module.pdb()) ) - self.assertEqual(0x5555, gScope["g_constNumValue"].value()) - self.assertEqual(True, gScope["g_constBoolValue"].value()) - except pykd.DiaException as diaExcept: - print diaExcept - self.assertTrue(False) + gScope = pykd.diaLoadPdb( str(target.module.pdb()) ) + self.assertEqual(0x5555, gScope["g_constNumValue"].value()) + self.assertEqual(True, gScope["g_constBoolValue"].value()) def testName(self): - try: - gScope = pykd.diaLoadPdb( str(target.module.pdb()) ) - self.assertEqual( "g_constNumValue", - gScope["g_constNumValue"].name() ) - self.assertEqual( "FuncWithName0", - gScope["FuncWithName0"].name() ) - except pykd.DiaException as diaExcept: - print diaExcept - self.assertTrue(False) + gScope = pykd.diaLoadPdb( str(target.module.pdb()) ) + self.assertEqual( "g_constNumValue", + gScope["g_constNumValue"].name() ) + self.assertEqual( "FuncWithName0", + gScope["FuncWithName0"].name() ) def testRva(self): - try: - gScope = pykd.diaLoadPdb( str(target.module.pdb()) ) - _rva = gScope["FuncWithName0"].rva() - self.assertNotEqual(0, _rva) - modLen = target.module.end() - target.module.begin() - self.assertTrue( _rva < modLen ) - _rva = gScope["g_string"].rva() - self.assertNotEqual(0, _rva) - self.assertTrue( _rva < modLen ) - except pykd.DiaException as diaExcept: - print diaExcept - self.assertTrue(False) + gScope = pykd.diaLoadPdb( str(target.module.pdb()) ) + _rva = gScope["FuncWithName0"].rva() + self.assertNotEqual(0, _rva) + modLen = target.module.end() - target.module.begin() + self.assertTrue( _rva < modLen ) + _rva = gScope["g_string"].rva() + self.assertNotEqual(0, _rva) + self.assertTrue( _rva < modLen ) def testSymTag(self): - try: - gScope = pykd.diaLoadPdb( str(target.module.pdb()) ) - self.assertEqual( pykd.SymTagFunction, - gScope["FuncWithName0"].symTag() ) - self.assertEqual( pykd.SymTagData, - gScope["g_string"].symTag() ) - except pykd.DiaException as diaExcept: - print diaExcept - self.assertTrue(False) + gScope = pykd.diaLoadPdb( str(target.module.pdb()) ) + self.assertEqual( pykd.SymTagFunction, + gScope["FuncWithName0"].symTag() ) + self.assertEqual( pykd.SymTagData, + gScope["g_string"].symTag() ) def testLocType(self): - try: - gScope = pykd.diaLoadPdb( str(target.module.pdb()) ) - self.assertEqual( pykd.LocIsConstant, - gScope["g_constNumValue"].locType() ) - self.assertEqual( pykd.LocIsStatic, - gScope["FuncWithName1"].locType() ) - except pykd.DiaException as diaExcept: - print diaExcept - self.assertTrue(False) - - def testBasicType(self): - try: - gScope = pykd.diaLoadPdb( str(target.module.pdb()) ) - self.assertFalse(gScope["g_string"].type().isBasic()) - self.assertEqual( pykd.btBool, - gScope["g_constBoolValue"].type().baseType() ) - self.assertEqual( pykd.btULong, - gScope["g_ulongValue"].type().baseType() ) + gScope = pykd.diaLoadPdb( str(target.module.pdb()) ) + self.assertEqual( pykd.LocIsConstant, + gScope["g_constNumValue"].locType() ) + self.assertEqual( pykd.LocIsStatic, + gScope["FuncWithName1"].locType() ) + + def testBasicType(self): + gScope = pykd.diaLoadPdb( str(target.module.pdb()) ) + self.assertFalse(gScope["g_string"].type().isBasic()) + self.assertEqual( pykd.btBool, + gScope["g_constBoolValue"].type().baseType() ) + self.assertEqual( pykd.btULong, + gScope["g_ulongValue"].type().baseType() ) - except pykd.DiaException as diaExcept: - print diaExcept - self.assertTrue(False) - def testBasicName(self): - self.assertEqual( "NoType", pykd.diaBasicType[ pykd.btNoType ] ) - self.assertEqual( "Void", pykd.diaBasicType[ pykd.btVoid ] ) - self.assertEqual( "Char", pykd.diaBasicType[ pykd.btChar ] ) - self.assertEqual( "WChar", pykd.diaBasicType[ pykd.btWChar ] ) - self.assertEqual( "Int", pykd.diaBasicType[ pykd.btInt ] ) - self.assertEqual( "UInt", pykd.diaBasicType[ pykd.btUInt ] ) - self.assertEqual( "Float", pykd.diaBasicType[ pykd.btFloat ] ) - self.assertEqual( "BCD", pykd.diaBasicType[ pykd.btBCD ] ) - self.assertEqual( "Bool", pykd.diaBasicType[ pykd.btBool ] ) - self.assertEqual( "Long", pykd.diaBasicType[ pykd.btLong ] ) - self.assertEqual( "ULong", pykd.diaBasicType[ pykd.btULong ] ) - self.assertEqual( "Currency", pykd.diaBasicType[ pykd.btCurrency ] ) - self.assertEqual( "Date", pykd.diaBasicType[ pykd.btDate ] ) - self.assertEqual( "Variant", pykd.diaBasicType[ pykd.btVariant ] ) - self.assertEqual( "Complex", pykd.diaBasicType[ pykd.btComplex ] ) - self.assertEqual( "Bit", pykd.diaBasicType[ pykd.btBit ] ) - self.assertEqual( "BSTR", pykd.diaBasicType[ pykd.btBSTR ] ) - self.assertEqual( "Hresult", pykd.diaBasicType[ pykd.btHresult ] ) + self.assertEqual( "NoType", pykd.diaBasicType[ pykd.btNoType ] ) + self.assertEqual( "Void", pykd.diaBasicType[ pykd.btVoid ] ) + self.assertEqual( "Char", pykd.diaBasicType[ pykd.btChar ] ) + self.assertEqual( "WChar", pykd.diaBasicType[ pykd.btWChar ] ) + self.assertEqual( "Int", pykd.diaBasicType[ pykd.btInt ] ) + self.assertEqual( "UInt", pykd.diaBasicType[ pykd.btUInt ] ) + self.assertEqual( "Float", pykd.diaBasicType[ pykd.btFloat ] ) + self.assertEqual( "BCD", pykd.diaBasicType[ pykd.btBCD ] ) + self.assertEqual( "Bool", pykd.diaBasicType[ pykd.btBool ] ) + self.assertEqual( "Long", pykd.diaBasicType[ pykd.btLong ] ) + self.assertEqual( "ULong", pykd.diaBasicType[ pykd.btULong ] ) + self.assertEqual( "Currency", pykd.diaBasicType[ pykd.btCurrency ] ) + self.assertEqual( "Date", pykd.diaBasicType[ pykd.btDate ] ) + self.assertEqual( "Variant", pykd.diaBasicType[ pykd.btVariant ] ) + self.assertEqual( "Complex", pykd.diaBasicType[ pykd.btComplex ] ) + self.assertEqual( "Bit", pykd.diaBasicType[ pykd.btBit ] ) + self.assertEqual( "BSTR", pykd.diaBasicType[ pykd.btBSTR ] ) + self.assertEqual( "Hresult", pykd.diaBasicType[ pykd.btHresult ] ) def testBits(self): - try: - gScope = pykd.diaLoadPdb( str(target.module.pdb()) ) - structWithBits = gScope["structWithBits"] - bitField = structWithBits["m_bit0_4"] - self.assertEqual(pykd.LocIsBitField, bitField.locType()) - self.assertEqual(0, bitField.bitPos()) - self.assertEqual(5, bitField.size()) - bitField = structWithBits["m_bit5"] - self.assertEqual(pykd.LocIsBitField, bitField.locType()) - self.assertEqual(5, bitField.bitPos()) - self.assertEqual(1, bitField.size()) - bitField = structWithBits["m_bit6_7"] - self.assertEqual(pykd.LocIsBitField, bitField.locType()) - self.assertEqual(6, bitField.bitPos()) - self.assertEqual(2, bitField.size()) - except pykd.DiaException as diaExcept: - print diaExcept - self.assertTrue(False) + gScope = pykd.diaLoadPdb( str(target.module.pdb()) ) + structWithBits = gScope["structWithBits"] + bitField = structWithBits["m_bit0_4"] + self.assertEqual(pykd.LocIsBitField, bitField.locType()) + self.assertEqual(0, bitField.bitPos()) + self.assertEqual(5, bitField.size()) + bitField = structWithBits["m_bit5"] + self.assertEqual(pykd.LocIsBitField, bitField.locType()) + self.assertEqual(5, bitField.bitPos()) + self.assertEqual(1, bitField.size()) + bitField = structWithBits["m_bit6_7"] + self.assertEqual(pykd.LocIsBitField, bitField.locType()) + self.assertEqual(6, bitField.bitPos()) + self.assertEqual(2, bitField.size()) def testIndexId(self): - try: - gScope = pykd.diaLoadPdb( str(target.module.pdb()) ) - self.assertNotEqual( gScope["classChild"].indexId(), - gScope["classBase"].indexId() ) - self.assertNotEqual( gScope["FuncWithName0"].indexId(), - gScope["FuncWithName1"].indexId() ) - except pykd.DiaException as diaExcept: - print diaExcept - self.assertTrue(False) + gScope = pykd.diaLoadPdb( str(target.module.pdb()) ) + self.assertNotEqual( gScope["classChild"].indexId(), + gScope["classBase"].indexId() ) + self.assertNotEqual( gScope["FuncWithName0"].indexId(), + gScope["FuncWithName1"].indexId() ) def testUdtKind(self): - try: - gScope = pykd.diaLoadPdb( str(target.module.pdb()) ) - self.assertEqual(pykd.UdtStruct, gScope["structTest"].udtKind()) - self.assertEqual(pykd.UdtUnion, gScope["unionTest"].udtKind()) - self.assertEqual(pykd.UdtClass, gScope["classBase"].udtKind()) - except pykd.DiaException as diaExcept: - print diaExcept - self.assertTrue(False) + gScope = pykd.diaLoadPdb( str(target.module.pdb()) ) + self.assertEqual(pykd.UdtStruct, gScope["structTest"].udtKind()) + self.assertEqual(pykd.UdtUnion, gScope["unionTest"].udtKind()) + self.assertEqual(pykd.UdtClass, gScope["classBase"].udtKind()) def testOffset(self): - try: - gScope = pykd.diaLoadPdb( str(target.module.pdb()) ) - structTest = gScope["structTest"] - self.assertEqual( 0, structTest["m_field0"].offset() ) - self.assertTrue( structTest["m_field0"].offset() < - structTest["m_field1"].offset() ) - self.assertTrue( structTest["m_field1"].offset() < - structTest["m_field2"].offset() ) - self.assertTrue( structTest["m_field2"].offset() < - structTest["m_field3"].offset() ) - self.assertTrue( structTest["m_field3"].offset() < - structTest.size() ) - except pykd.DiaException as diaExcept: - print diaExcept - self.assertTrue(False) + gScope = pykd.diaLoadPdb( str(target.module.pdb()) ) + structTest = gScope["structTest"] + self.assertEqual( 0, structTest["m_field0"].offset() ) + self.assertTrue( structTest["m_field0"].offset() < + structTest["m_field1"].offset() ) + self.assertTrue( structTest["m_field1"].offset() < + structTest["m_field2"].offset() ) + self.assertTrue( structTest["m_field2"].offset() < + structTest["m_field3"].offset() ) + self.assertTrue( structTest["m_field3"].offset() < + structTest.size() ) def testMachine(self): - try: - gScope = pykd.diaLoadPdb( str(target.module.pdb()) ) - machine = gScope.machineType() - self.assertTrue( (machine == pykd.IMAGE_FILE_MACHINE_I386) or - (machine == pykd.IMAGE_FILE_MACHINE_AMD64) ) - except pykd.DiaException as diaExcept: - print diaExcept - self.assertTrue(False) + gScope = pykd.diaLoadPdb( str(target.module.pdb()) ) + machine = gScope.machineType() + self.assertTrue( (machine == pykd.IMAGE_FILE_MACHINE_I386) or + (machine == pykd.IMAGE_FILE_MACHINE_AMD64) ) def testFindByRva(self): - try: - gScope = pykd.diaLoadPdb( str(target.module.pdb()) ) - func = gScope["FuncWithName0"] - tplSymOffset = gScope.findByRva(func.rva(), pykd.SymTagFunction) - self.assertEqual(tplSymOffset[0].indexId(), func.indexId()) - self.assertEqual(tplSymOffset[1], 0) - tplSymOffset = gScope.findByRva(func.rva()+2, pykd.SymTagFunction) - self.assertEqual(tplSymOffset[0].indexId(), func.indexId()) - self.assertEqual(tplSymOffset[1], 2) - except pykd.DiaException as diaExcept: - print diaExcept - self.assertTrue(False) + gScope = pykd.diaLoadPdb( str(target.module.pdb()) ) + func = gScope["FuncWithName0"] + tplSymOffset = gScope.findByRva(func.rva(), pykd.SymTagFunction) + self.assertEqual(tplSymOffset[0].indexId(), func.indexId()) + self.assertEqual(tplSymOffset[1], 0) + tplSymOffset = gScope.findByRva(func.rva()+2, pykd.SymTagFunction) + self.assertEqual(tplSymOffset[0].indexId(), func.indexId()) + self.assertEqual(tplSymOffset[1], 2) def testSymbolById(self): - try: - gScope = pykd.diaLoadPdb( str(target.module.pdb()) ) - func = gScope["FuncWithName0"] - self.assertEqual( gScope.symbolById(func.indexId()).indexId(), - func.indexId()) - except pykd.DiaException as diaExcept: - print diaExcept - self.assertTrue(False) + gScope = pykd.diaLoadPdb( str(target.module.pdb()) ) + func = gScope["FuncWithName0"] + self.assertEqual( gScope.symbolById(func.indexId()).indexId(), + func.indexId()) def testCount(self): - try: - gScope = pykd.diaLoadPdb( str(target.module.pdb()) ) - var = gScope["FuncWithName1"]["_unionTest"] - self.assertEqual( 2, var.type().count() ) - except pykd.DiaException as diaExcept: - print diaExcept - self.assertTrue(False) + gScope = pykd.diaLoadPdb( str(target.module.pdb()) ) + var = gScope["FuncWithName1"]["_unionTest"] + self.assertEqual( 2, var.type().count() ) def testDataKind(self): - try: - gScope = pykd.diaLoadPdb( str(target.module.pdb()) ) - self.assertEqual( pykd.DataIsGlobal, gScope["g_structTest"].dataKind() ) - self.assertEqual( pykd.DataIsParam, gScope["EnumWindowsProc1"]["hWindow"].dataKind() ) - except pykd.DiaException as diaExcept: - print diaExcept - self.assertTrue(False) + gScope = pykd.diaLoadPdb( str(target.module.pdb()) ) + self.assertEqual( pykd.DataIsGlobal, gScope["g_structTest"].dataKind() ) + self.assertEqual( pykd.DataIsParam, gScope["EnumWindowsProc1"]["hWindow"].dataKind() ) + + def testSymbolHash(self): + """Test set of DIA symbols""" + gScope = pykd.diaLoadPdb( str(target.module.pdb()) ) + symSet = set([ gScope["g_structTest"], gScope["EnumWindowsProc1"], gScope["g_structTest"] ]) + self.assertEqual( 2, len(symSet) ) + self.assertTrue( gScope["g_structTest"] in symSet ) + self.assertFalse( gScope["EnumWindowsProc2"] in symSet )