def setUp(self): _, self.obj = heap._create_class(self, self.names['obj'], None, {}, ('shadow', )) _, self.cls = heap._create_class(self, self.names['cls'], self.obj, {}, ('secret', )) _, self.lst = heap._create_class(self, self.names['lst'], self.obj, {}, ('next', )) _, self.inr = heap._create_class(self, self.names['inn'], self.obj, {}, ('this$0', )) _, self.shd = heap._create_class(self, self.names['shd'], self.lst, {}, ('shadow', 'unique'))
def test_prim_array_deferred_short(self): _, sacls = heap._create_class(self, self.names['Sar'], self.obj, {}, (), ()) data = hprof.heap._DeferredArrayData( jtype.short, b'\x23\x10\xff\x10\x00\x00\x21\x78') sarr = sacls(8, data) self.assertEqual(sarr._hprof_id, 8) self.assertEqual(len(sarr), 4) self.assertEqual(sarr[0], 0x2310) self.assertEqual(sarr[1], 0xff10 - 0x10000) self.assertEqual(sarr[2], 0) self.assertEqual(sarr[3], 0x2178) sarr._hprof_array_data = data self.assertEqual(sarr._hprof_id, 8) self.assertEqual(sarr[1], 0xff10 - 0x10000) self.assertEqual(sarr[3], 0x2178) self.assertEqual(len(sarr), 4) self.assertEqual(sarr[2], 0) self.assertEqual(sarr[0], 0x2310) with self.assertRaises(IndexError): sarr[4] self.assertEqual(str(sarr), 'short[4] {8976, -240, 0, 8568}') self.assertEqual(repr(sarr), '<short[4] 0x8>')
def test_double_dollar(self): _, lambdacls = heap._create_class(self, self.names['lam'], self.obj, {'line': 79}, ('closure_x', 'closure_y'), (jtype.int, jtype.int)) self.assertEqual(str(lambdacls), 'com.example.Vehicle$$Lambda$1/455659002') lambdaobj = lambdacls(33) self.obj._hprof_ifieldvals.__set__(lambdaobj, (11, )) lambdacls._hprof_ifieldvals.__set__(lambdaobj, (10, 20)) with self.assertRaises(AttributeError): lambdaobj.missing with self.assertRaises(AttributeError): lambdaobj.missing = 3 with self.assertRaises(AttributeError): lambdaobj.closure_x = 3 self.assertEqual(lambdaobj._hprof_id, 33) self.assertEqual(lambdaobj.shadow, 11) self.assertEqual(lambdaobj.closure_x, 10) self.assertEqual(lambdaobj.closure_y, 20) self.assertEqual(lambdaobj.line, 79) self.assertIsInstance(lambdaobj, heap.JavaObject) self.assertIsInstance(lambdaobj, self.obj) self.assertIsInstance(lambdaobj, lambdacls) self.assertEqual(str(lambdaobj), 'Vehicle$$Lambda$1/455659002@21') self.assertEqual(repr(lambdaobj), '<com.example.Vehicle$$Lambda$1/455659002 0x21>') self.assertCountEqual(dir(lambdaobj), ('shadow', 'closure_x', 'closure_y', 'line'))
def c(name, supercls): name, cls = _create_class(self.heap.classtree, name, supercls, {}, (), ()) self.heap._instances[cls] = [] if name not in self.heap.classes: self.heap.classes[name] = [] self.heap.classes[name].append(cls) return cls
def test_refs_to_class(self): _, string = heap._create_class(self, self.names['str'], self.obj, {}, ('chars', ), (jtype.object, )) o = hprof.cast(string, self.obj) c = hprof.cast(string, self.cls) self.assertIs(o, string) self.assertIs(c, string) with self.assertRaises(TypeError): hprof.cast(string, string) with self.assertRaises(TypeError): hprof.cast(string, self.lst)
def test_prim_array(self): _, sacls = heap._create_class(self, self.names['Sar'], self.obj, {}, (), ()) self.assertEqual(str(sacls), 'short[]') self.assertEqual(repr(sacls), "<JavaClass 'short[]'>") self.assertTrue(isinstance(sacls, heap.JavaClass)) self.assertTrue(isinstance(sacls, heap.JavaArrayClass)) self.assertTrue(issubclass(sacls, heap.JavaObject)) self.assertTrue(issubclass(sacls, heap.JavaArray)) self.assertTrue(issubclass(sacls, self.obj)) sarr = sacls(1, (1, 2, 9)) self.obj._hprof_ifieldvals.__set__(sarr, (0xf00d, )) self.assertCountEqual(dir(sarr), ('shadow', )) self.assertEqual(sarr._hprof_id, 1) self.assertEqual(sarr.shadow, 0xf00d) self.assertEqual(len(sarr), 3) self.assertEqual(sarr[0], 1) self.assertEqual(sarr[1], 2) self.assertEqual(sarr[2], 9) self.assertEqual(sarr[-1], 9) self.assertEqual(sarr[-2], 2) self.assertEqual(sarr[-3], 1) self.assertEqual(sarr[:], (1, 2, 9)) self.assertEqual(sarr[1:], (2, 9)) self.assertEqual(sarr[:2], (1, 2)) self.assertEqual(sarr[:-1], (1, 2)) self.assertEqual(sarr[2:], (9, )) self.assertEqual(sarr[:0], ()) self.assertEqual(sarr[:1], (1, )) with self.assertRaises(IndexError): sarr[3] with self.assertRaises(IndexError): sarr[-4] with self.assertRaises(TypeError): sarr['hello'] self.assertIn(1, sarr) self.assertIn(2, sarr) self.assertIn(9, sarr) self.assertNotIn(3, sarr) self.assertNotIn(4, sarr) self.assertNotIn(5, sarr) self.assertNotIn(-1, sarr) for i, x in enumerate(sarr): self.assertEqual(x, sarr[i]) self.assertEqual(i, 2) self.assertEqual(str(sarr), 'short[3] {1, 2, 9}') self.assertEqual(repr(sarr), '<short[3] 0x1>')
def test_prim_array_deferred_double(self): _, acls = heap._create_class(self, self.names['Dar'], self.obj, {}, ()) arr = acls(1) data = hprof.heap._DeferredArrayData( hprof.jtype.double, b'\x23\x10\xff\x80\x00\x00\x7f\x78\x84\x25\x66\x76\x12\x34\x56\x78' ) arr._hprof_array_data = data self.assertEqual(len(arr), 2) self.assertEqual(arr[0], 8.921154138878651e-140) self.assertEqual(arr[1], -1.0979758629196027e-288) with self.assertRaises(IndexError): arr[2]
def test_prim_array_deferred_float(self): _, acls = heap._create_class(self, self.names['Far'], self.obj, {}, ()) arr = acls(1) data = hprof.heap._DeferredArrayData( hprof.jtype.float, b'\x23\x10\xff\x80\x00\x00\x7f\x78\x84\x25\x66\x76') arr._hprof_array_data = data self.assertEqual(len(arr), 3) self.assertEqual(arr[0], 7.8603598714015e-18) self.assertEqual(arr[1], 4.572717148784743e-41) self.assertEqual(arr[2], -1.944270454372837e-36) with self.assertRaises(IndexError): arr[3]
def test_prim_array_deferred_long(self): _, acls = heap._create_class(self, self.names['Jar'], self.obj, {}, ()) arr = acls(1) data = hprof.heap._DeferredArrayData( hprof.jtype.long, b'\x23\x10\xff\x80\x00\x00\x7f\x78\x84\x25\x66\x76\x12\x34\x56\x78' ) arr._hprof_array_data = data self.assertEqual(len(arr), 2) self.assertEqual(arr[0], 0x2310ff8000007f78) self.assertEqual(arr[1], 0x8425667612345678 - 0x10000000000000000) with self.assertRaises(IndexError): arr[2]
def test_prim_array_deferred_int(self): _, acls = heap._create_class(self, self.names['Iar'], self.obj, {}, ()) arr = acls(1) data = hprof.heap._DeferredArrayData( hprof.jtype.int, b'\x23\x10\xff\x80\x00\x00\x7f\x78\x84\x25\x66\x76') arr._hprof_array_data = data self.assertEqual(len(arr), 3) self.assertEqual(arr[0], 0x2310ff80) self.assertEqual(arr[1], 0x00007f78) self.assertEqual(arr[2], 0x84256676 - 0x100000000) with self.assertRaises(IndexError): arr[3]
def test_dollar_prefix_class_name(self): for clsname in ('java.reflect.$Proxy2', '$Proxy3'): with self.subTest(clsname): outname, proxy_class = heap._create_class( self, clsname, self.obj, {'I_AM_A_PROXY': True}, ('proxied', ), (jtype.object, )) self.assertTrue(issubclass(proxy_class, self.obj)) self.assertFalse(issubclass(self.obj, proxy_class)) self.assertEqual(outname, clsname) self.assertIs(proxy_class.I_AM_A_PROXY, True) self.assertIsInstance(self.java, heap.JavaPackage) self.assertIsInstance(self.java.reflect, heap.JavaPackage) self.assertIsInstance(getattr(self.java.reflect, '$Proxy2'), heap.JavaClassName) self.assertIsInstance(getattr(self, '$Proxy3'), heap.JavaClassName)
def test_prim_array_deferred_int(self): _, acls = heap._create_class(self, self.names['Iar'], self.obj, {}, (), ()) data = hprof.heap._DeferredArrayData( jtype.int, b'\x23\x10\xff\x80\x00\x00\x7f\x78\x84\x25\x66\x76') arr = acls(16, data) self.assertEqual(arr._hprof_id, 16) self.assertEqual(len(arr), 3) self.assertEqual(arr[0], 0x2310ff80) self.assertEqual(arr[1], 0x00007f78) self.assertEqual(arr[2], 0x84256676 - 0x100000000) with self.assertRaises(IndexError): arr[3] self.assertEqual(str(arr), 'int[3] {588316544, 32632, -2077923722}') self.assertEqual(repr(arr), '<int[3] 0x10>')
def test_prim_array_deferred_bool(self): _, acls = heap._create_class(self, self.names['Zar'], self.obj, {}, ()) arr = acls(1) data = hprof.heap._DeferredArrayData( hprof.jtype.boolean, b'\x23\x10\xff\x10\x00\x00\x21\x78') arr._hprof_array_data = data self.assertEqual(len(arr), 8) self.assertIs(arr[0], True) self.assertIs(arr[1], True) self.assertIs(arr[2], True) self.assertIs(arr[3], True) self.assertIs(arr[4], False) self.assertIs(arr[5], False) self.assertIs(arr[6], True) self.assertIs(arr[7], True) with self.assertRaises(IndexError): arr[8]
def test_prim_array_deferred_char(self): _, acls = heap._create_class(self, self.names['Car'], self.obj, {}, ()) arr = acls(1) data = hprof.heap._DeferredArrayData( hprof.jtype.char, b'\0\x57\0\xf6\0\x72\0\x6c\xd8\x01\xdc\x00\0\x21') arr._hprof_array_data = data self.assertEqual(len(arr), 7) self.assertEqual(arr[0], 'W') self.assertEqual(arr[1], 'ö') self.assertEqual(arr[2], 'r') self.assertEqual(arr[3], 'l') self.assertEqual(arr[4], '\ud801') self.assertEqual(arr[5], '\udc00') self.assertEqual(arr[6], '!') with self.assertRaises(IndexError): arr[7]
def test_prim_array_deferred_long(self): _, acls = heap._create_class(self, self.names['Jar'], self.obj, {}, (), ()) data = hprof.heap._DeferredArrayData( jtype.long, b'\x23\x10\xff\x80\x00\x00\x7f\x78\x84\x25\x66\x76\x12\x34\x56\x78' ) arr = acls(15, data) self.assertEqual(arr._hprof_id, 15) self.assertEqual(len(arr), 2) self.assertEqual(arr[0], 0x2310ff8000007f78) self.assertEqual(arr[1], 0x8425667612345678 - 0x10000000000000000) with self.assertRaises(IndexError): arr[2] self.assertEqual( str(arr), 'long[2] {2526800316175777656, -8924614429267175816}') self.assertEqual(repr(arr), '<long[2] 0xf>')
def test_prim_array_deferred_byte(self): _, acls = heap._create_class(self, self.names['Bar'], self.obj, {}, ()) arr = acls(1) data = hprof.heap._DeferredArrayData( hprof.jtype.byte, b'\x23\x10\xff\x80\x00\x00\x7f\x78\x84') arr._hprof_array_data = data self.assertEqual(len(arr), 9) self.assertEqual(arr[0], 0x23) self.assertEqual(arr[1], 0x10) self.assertEqual(arr[2], -1) self.assertEqual(arr[3], -128) self.assertEqual(arr[4], 0x00) self.assertEqual(arr[5], 0x00) self.assertEqual(arr[6], 127) self.assertEqual(arr[7], 0x78) self.assertEqual(arr[8], -124) with self.assertRaises(IndexError): arr[9]
def test_prim_array_deferred_char(self): _, acls = heap._create_class(self, self.names['Car'], self.obj, {}, (), ()) data = hprof.heap._DeferredArrayData( jtype.char, b'\0\x57\0\xf6\0\x72\0\x6c\xd8\x01\xdc\x00\0\x21') arr = acls(2, data) self.assertEqual(arr._hprof_id, 2) self.assertEqual(len(arr), 7) self.assertEqual(arr[0], 'W') self.assertEqual(arr[1], 'ö') self.assertEqual(arr[2], 'r') self.assertEqual(arr[3], 'l') self.assertEqual(arr[4], '\ud801') self.assertEqual(arr[5], '\udc00') self.assertEqual(arr[6], '!') with self.assertRaises(IndexError): arr[7] self.assertEqual( str(arr), "char[7] {'W', 'ö', 'r', 'l', '\\ud801', '\\udc00', '!'}") self.assertEqual(repr(arr), '<char[7] 0x2>')
def test_prim_array_deferred_short(self): _, sacls = heap._create_class(self, self.names['Sar'], self.obj, {}, ()) sarr = sacls(1) data = hprof.heap._DeferredArrayData( hprof.jtype.short, b'\x23\x10\xff\x10\x00\x00\x21\x78') sarr._hprof_array_data = data self.assertEqual(len(sarr), 4) self.assertEqual(sarr[0], 0x2310) self.assertEqual(sarr[1], 0xff10 - 0x10000) self.assertEqual(sarr[2], 0) self.assertEqual(sarr[3], 0x2178) sarr._hprof_array_data = data self.assertEqual(sarr[1], 0xff10 - 0x10000) self.assertEqual(sarr[3], 0x2178) self.assertEqual(len(sarr), 4) self.assertEqual(sarr[2], 0) self.assertEqual(sarr[0], 0x2310) with self.assertRaises(IndexError): sarr[4]
def test_prim_array_deferred_byte(self): _, acls = heap._create_class(self, self.names['Bar'], self.obj, {}, (), ()) data = hprof.heap._DeferredArrayData( jtype.byte, b'\x23\x10\xff\x80\x00\x00\x7f\x78\x84') arr = acls(4, data) self.assertEqual(arr._hprof_id, 4) self.assertEqual(len(arr), 9) self.assertEqual(arr[0], 0x23) self.assertEqual(arr[1], 0x10) self.assertEqual(arr[2], -1) self.assertEqual(arr[3], -128) self.assertEqual(arr[4], 0x00) self.assertEqual(arr[5], 0x00) self.assertEqual(arr[6], 127) self.assertEqual(arr[7], 0x78) self.assertEqual(arr[8], -124) with self.assertRaises(IndexError): arr[9] self.assertEqual(str(arr), 'byte[9] {35, 16, -1, -128, 0, 0, 127, 120, -124}') self.assertEqual(repr(arr), '<byte[9] 0x4>')
def test_prim_array_deferred_bool(self): _, acls = heap._create_class(self, self.names['Zar'], self.obj, {}, (), ()) data = hprof.heap._DeferredArrayData( jtype.boolean, b'\x23\x10\xff\x10\x00\x00\x21\x78') arr = acls(1, data) self.assertEqual(arr._hprof_id, 1) self.assertEqual(len(arr), 8) self.assertIs(arr[0], True) self.assertIs(arr[1], True) self.assertIs(arr[2], True) self.assertIs(arr[3], True) self.assertIs(arr[4], False) self.assertIs(arr[5], False) self.assertIs(arr[6], True) self.assertIs(arr[7], True) with self.assertRaises(IndexError): arr[8] self.assertEqual( str(arr), 'boolean[8] {True, True, True, True, False, False, True, True}') self.assertEqual(repr(arr), '<boolean[8] 0x1>')
def test_duplicate_class(self): old = self.java.lang.Class _, newcls = heap._create_class(self, self.names['cls'], self.obj, {}, ('secret', ), (jtype.int, )) self.assertIs(old, self.java.lang.Class) # same name object self.assertIsNot(newcls, self.cls)
def test_refs(self): _, extraclass = heap._create_class(self, self.names['ext'], self.shd, {}, ('shadow', ), (jtype.int, )) e = extraclass(0xbadf00d) self.obj._hprof_ifieldvals.__set__(e, (1111, )) self.lst._hprof_ifieldvals.__set__(e, (708, )) self.shd._hprof_ifieldvals.__set__(e, (2223, 33)) extraclass._hprof_ifieldvals.__set__(e, (10, )) self.assertEqual(e.shadow, 10) self.assertEqual(e.unique, 33) self.assertEqual(e.next, 708) self.assertCountEqual(dir(e), ('shadow', 'unique', 'next')) self.assertEqual(str(e), 'Extra@badf00d') self.assertEqual(repr(e), '<Extra 0xbadf00d>') r = heap.Ref(e, extraclass) self.assertIs(r, e) # no reason to use Ref when reftype matches exactly. s = hprof.cast(e, self.shd) self.assertEqual(s, e) self.assertEqual(s.shadow, 2223) self.assertEqual(s.unique, 33) self.assertEqual(s.next, 708) self.assertCountEqual(dir(s), ('shadow', 'unique', 'next')) self.assertEqual(str(s), '<Ref of type Shadower to Extra 0xbadf00d>') self.assertEqual(repr(s), str(s)) self.assertIsInstance(s, self.obj) self.assertIsInstance(s, self.lst) self.assertIsInstance(s, self.shd) self.assertIsInstance(s, extraclass) self.assertNotIsInstance(s, self.cls) l = hprof.cast(e, self.lst) self.assertEqual(l.shadow, 1111) self.assertEqual(l, e) with self.assertRaises(AttributeError): self.assertEqual(l.unique, 33) self.assertEqual(l.next, 708) self.assertCountEqual(dir(l), ('shadow', 'next')) self.assertEqual(str(l), '<Ref of type java.util.List to Extra 0xbadf00d>') self.assertEqual(repr(l), str(l)) self.assertIsInstance(l, self.obj) self.assertIsInstance(l, self.lst) self.assertIsInstance(l, self.shd) self.assertIsInstance(l, extraclass) self.assertNotIsInstance(l, self.cls) o = hprof.cast(e, self.obj) self.assertEqual(o, e) self.assertEqual(o.shadow, 1111) with self.assertRaises(AttributeError): self.assertEqual(o.unique, 33) with self.assertRaises(AttributeError): self.assertEqual(o.next, 708) self.assertCountEqual(dir(o), ('shadow', )) self.assertEqual(str(o), '<Ref of type java.lang.Object to Extra 0xbadf00d>') self.assertEqual(repr(o), str(o)) self.assertIsInstance(o, self.obj) self.assertIsInstance(o, self.lst) self.assertIsInstance(o, self.shd) self.assertIsInstance(o, extraclass) self.assertNotIsInstance(o, self.cls)
def check(name, expected): clsname, cls = heap._create_class(self, name, self.obj, {}, (), ()) self.assertIsNone(cls.__module__) self.assertEqual(clsname, expected) self.assertEqual(str(cls), expected) self.assertEqual(repr(cls), "<JavaClass '%s'>" % expected)
def test_obj_array(self): # the base array class... _, oacls = heap._create_class(self, self.names['oar'], self.obj, {}, ('extrastuff', ), (jtype.int, )) self.assertEqual(str(oacls), 'java.lang.Object[]') self.assertEqual(repr(oacls), "<JavaClass 'java.lang.Object[]'>") self.assertTrue(isinstance(oacls, heap.JavaClass)) self.assertTrue(isinstance(oacls, heap.JavaArrayClass)) self.assertTrue(issubclass(oacls, heap.JavaObject)) self.assertTrue(issubclass(oacls, heap.JavaArray)) self.assertTrue(issubclass(oacls, self.obj)) oarr = oacls(73, "dummy") oarr._hprof_array_data = (oarr, oacls, 33) # self-referential! self.obj._hprof_ifieldvals.__set__(oarr, (0xbeef, )) oarr._hprof_ifieldvals = (49, ) self.assertEqual(len(oarr), 3) self.assertEqual(oarr[0], oarr) self.assertEqual(oarr[1], oacls) self.assertEqual(oarr[2], 33) self.assertEqual(oarr[-1], 33) self.assertEqual(oarr[-2], oacls) self.assertEqual(oarr[-3], oarr) self.assertEqual(oarr[:], (oarr, oacls, 33)) self.assertEqual(oarr[1:], (oacls, 33)) self.assertEqual(oarr[:2], (oarr, oacls)) self.assertEqual(oarr[:-1], (oarr, oacls)) self.assertEqual(oarr[2:], (33, )) self.assertEqual(oarr[:0], ()) self.assertEqual(oarr[:1], (oarr, )) with self.assertRaises(IndexError): oarr[3] with self.assertRaises(IndexError): oarr[-4] with self.assertRaises(TypeError): oarr['hello'] self.assertIn(oarr, oarr) self.assertIn(oacls, oarr) self.assertIn(33, oarr) self.assertNotIn(11, oarr) self.assertNotIn(12, oarr) self.assertNotIn(49, oarr) self.assertNotIn(32, oarr) for i, x in enumerate(oarr): self.assertEqual(x, oarr[i]) self.assertEqual(i, 2) self.assertCountEqual(dir(oarr), ('shadow', 'extrastuff')) self.assertEqual(oarr._hprof_id, 73) self.assertEqual(oarr.shadow, 0xbeef) self.assertEqual(oarr.extrastuff, 49) self.assertEqual( str(oarr), 'Object[3] {<java.lang.Object[3] 0x49>, <JavaClass \'java.lang.Object[]\'>, 33}' ) self.assertEqual(repr(oarr), '<java.lang.Object[3] 0x49>') # ...and a subclass _, lacls = heap._create_class(self, self.names['lar'], oacls, {}, ('more', ), (jtype.int, )) self.assertEqual(str(lacls), 'List$$lambda[]') self.assertEqual(repr(lacls), "<JavaClass 'List$$lambda[]'>") self.assertTrue(isinstance(lacls, heap.JavaClass)) self.assertTrue(isinstance(lacls, heap.JavaArrayClass)) self.assertTrue(issubclass(lacls, heap.JavaObject)) self.assertTrue(issubclass(lacls, self.obj)) self.assertTrue(issubclass(lacls, oacls)) larr = lacls(97, (1, 3, 5, 7, 9)) oacls._hprof_ifieldvals.__set__(larr, (56, )) lacls._hprof_ifieldvals.__set__(larr, (99, )) self.assertEqual(len(larr), 5) self.assertEqual(larr[0], 1) self.assertEqual(larr[1], 3) self.assertEqual(larr[2], 5) self.assertEqual(larr[3], 7) self.assertEqual(larr[4], 9) self.assertEqual(larr[-1], 9) self.assertEqual(larr[-2], 7) self.assertEqual(larr[-3], 5) self.assertEqual(larr[-4], 3) self.assertEqual(larr[-5], 1) self.assertEqual(larr[:], (1, 3, 5, 7, 9)) self.assertEqual(larr[1:], (3, 5, 7, 9)) self.assertEqual(larr[:2], (1, 3)) self.assertEqual(larr[:-1], (1, 3, 5, 7)) self.assertEqual(larr[2:], (5, 7, 9)) self.assertEqual(larr[:0], ()) self.assertEqual(larr[:1], (1, )) with self.assertRaises(IndexError): larr[5] with self.assertRaises(IndexError): larr[-6] with self.assertRaises(TypeError): larr['world'] self.assertIn(1, larr) self.assertIn(3, larr) self.assertIn(5, larr) self.assertIn(7, larr) self.assertIn(9, larr) self.assertNotIn(0, larr) self.assertNotIn(2, larr) self.assertNotIn(4, larr) self.assertNotIn(6, larr) self.assertNotIn(8, larr) self.assertNotIn(100, larr) for i, x in enumerate(larr): self.assertEqual(x, larr[i]) self.assertEqual(i, 4) self.assertEqual(larr._hprof_id, 97) self.assertEqual(larr.extrastuff, 56) self.assertEqual(larr.more, 99) self.assertEqual(str(larr), 'List$$lambda[5] {1, 3, 5, 7, 9}') self.assertEqual(repr(larr), '<List$$lambda[5] 0x61>')