def testGetVersionInfoComplexOrder(self): """Tests pack.GetVersionInfo() using a struct whose definition order, ordinal order and pack order for fields are all different. """ struct = mojom.Struct('test') struct.AddField('field_3', mojom.BOOL, ordinal=3, attributes={'MinVersion': 3}) struct.AddField('field_0', mojom.INT32, ordinal=0) struct.AddField('field_1', mojom.INT64, ordinal=1, attributes={'MinVersion': 2}) struct.AddField('field_2', mojom.INT64, ordinal=2, attributes={'MinVersion': 3}) ps = pack.PackedStruct(struct) versions = pack.GetVersionInfo(ps) self.assertEquals(3, len(versions)) self.assertEquals(0, versions[0].version) self.assertEquals(1, versions[0].num_fields) self.assertEquals(16, versions[0].num_bytes) self.assertEquals(2, versions[1].version) self.assertEquals(2, versions[1].num_fields) self.assertEquals(24, versions[1].num_bytes) self.assertEquals(3, versions[2].version) self.assertEquals(4, versions[2].num_fields) self.assertEquals(32, versions[2].num_bytes)
def testBools(self): struct = mojom.Struct('test') struct.AddField('bit0', mojom.BOOL) struct.AddField('bit1', mojom.BOOL) struct.AddField('int', mojom.INT32) struct.AddField('bit2', mojom.BOOL) struct.AddField('bit3', mojom.BOOL) struct.AddField('bit4', mojom.BOOL) struct.AddField('bit5', mojom.BOOL) struct.AddField('bit6', mojom.BOOL) struct.AddField('bit7', mojom.BOOL) struct.AddField('bit8', mojom.BOOL) ps = pack.PackedStruct(struct) self.assertEqual(10, len(ps.packed_fields)) # First 8 bits packed together. for i in range(8): pf = ps.packed_fields[i] self.assertEqual(0, pf.offset) self.assertEqual("bit%d" % i, pf.field.mojom_name) self.assertEqual(i, pf.bit) # Ninth bit goes into second byte. self.assertEqual("bit8", ps.packed_fields[8].field.mojom_name) self.assertEqual(1, ps.packed_fields[8].offset) self.assertEqual(0, ps.packed_fields[8].bit) # int comes last. self.assertEqual("int", ps.packed_fields[9].field.mojom_name) self.assertEqual(4, ps.packed_fields[9].offset)
def testOrdinalOrder(self): struct = mojom.Struct('test') struct.AddField('testfield1', mojom.INT32, 2) struct.AddField('testfield2', mojom.INT32, 1) ps = pack.PackedStruct(struct) self.assertEqual(2, len(ps.packed_fields)) self.assertEqual('testfield2', ps.packed_fields[0].field.mojom_name) self.assertEqual('testfield1', ps.packed_fields[1].field.mojom_name)
def GetResponseStructFromMethod(method): params_class = "%s_%s_ResponseParams" % (GetNameForElement(method.interface), GetNameForElement(method)) struct = mojom.Struct(params_class, module=method.interface.module) for param in method.response_parameters: struct.AddField("out%s" % GetNameForElement(param), param.kind, param.ordinal) struct.packed = pack.PackedStruct(struct) struct.bytes = pack.GetByteLayout(struct.packed) struct.versions = pack.GetVersionInfo(struct.packed) return struct
def testGetVersionInfoEmptyStruct(self): """Tests that pack.GetVersionInfo() never returns an empty list, even for empty structs. """ struct = mojom.Struct('test') ps = pack.PackedStruct(struct) versions = pack.GetVersionInfo(ps) self.assertEquals(1, len(versions)) self.assertEquals(0, versions[0].version) self.assertEquals(0, versions[0].num_fields) self.assertEquals(8, versions[0].num_bytes)
def testMinVersion(self): """Tests that |min_version| is properly set for packed fields.""" struct = mojom.Struct('test') struct.AddField('field_2', mojom.BOOL, 2) struct.AddField('field_0', mojom.INT32, 0) struct.AddField('field_1', mojom.INT64, 1) ps = pack.PackedStruct(struct) self.assertEquals('field_0', ps.packed_fields[0].field.name) self.assertEquals('field_2', ps.packed_fields[1].field.name) self.assertEquals('field_1', ps.packed_fields[2].field.name) self.assertEquals(0, ps.packed_fields[0].min_version) self.assertEquals(0, ps.packed_fields[1].min_version) self.assertEquals(0, ps.packed_fields[2].min_version) struct.fields[0].attributes = {'MinVersion': 1} ps = pack.PackedStruct(struct) self.assertEquals(0, ps.packed_fields[0].min_version) self.assertEquals(1, ps.packed_fields[1].min_version) self.assertEquals(0, ps.packed_fields[2].min_version)
def testPaddingPackedOutOfOrderByOrdinal(self): struct = mojom.Struct('test') struct.AddField('testfield1', mojom.INT8) struct.AddField('testfield3', mojom.UINT8, 3) struct.AddField('testfield2', mojom.INT32, 2) ps = pack.PackedStruct(struct) self.assertEqual(3, len(ps.packed_fields)) # Second byte should be packed in behind first, altering order. self.assertEqual('testfield1', ps.packed_fields[0].field.mojom_name) self.assertEqual('testfield3', ps.packed_fields[1].field.mojom_name) self.assertEqual('testfield2', ps.packed_fields[2].field.mojom_name) # Second byte should be packed with first. self.assertEqual(0, ps.packed_fields[0].offset) self.assertEqual(1, ps.packed_fields[1].offset) self.assertEqual(4, ps.packed_fields[2].offset)
def _CheckPackSequence(self, kinds, fields, offsets): """Checks the pack order and offsets of a sequence of mojom.Kinds. Args: kinds: A sequence of mojom.Kinds that specify the fields that are to be created. fields: The expected order of the resulting fields, with the integer "1" first. offsets: The expected order of offsets, with the integer "0" first. """ struct = mojom.Struct('test') index = 1 for kind in kinds: struct.AddField('%d' % index, kind) index += 1 ps = pack.PackedStruct(struct) num_fields = len(ps.packed_fields) self.assertEquals(len(kinds), num_fields) for i in xrange(num_fields): self.assertEquals('%d' % fields[i], ps.packed_fields[i].field.name) self.assertEquals(offsets[i], ps.packed_fields[i].offset)
def _AddStructComputedData(exported, struct): struct.packed = pack.PackedStruct(struct) struct.bytes = pack.GetByteLayout(struct.packed) struct.versions = pack.GetVersionInfo(struct.packed) struct.exported = exported
def testOneField(self): struct = mojom.Struct('test') struct.AddField('testfield1', mojom.INT8) ps = pack.PackedStruct(struct) self.assertEqual(1, len(ps.packed_fields))
def testZeroFields(self): struct = mojom.Struct('test') ps = pack.PackedStruct(struct) self.assertEqual(0, len(ps.packed_fields))