| OLD | NEW |
| (Empty) |
| 1 # Copyright 2013 The Chromium Authors. All rights reserved. | |
| 2 # Use of this source code is governed by a BSD-style license that can be | |
| 3 # found in the LICENSE file. | |
| 4 | |
| 5 import sys | |
| 6 | |
| 7 import module as mojom | |
| 8 import pack | |
| 9 import test_support | |
| 10 | |
| 11 | |
| 12 EXPECT_EQ = test_support.EXPECT_EQ | |
| 13 EXPECT_TRUE = test_support.EXPECT_TRUE | |
| 14 RunTest = test_support.RunTest | |
| 15 | |
| 16 | |
| 17 def TestOrdinalOrder(): | |
| 18 errors = 0 | |
| 19 struct = mojom.Struct('test') | |
| 20 struct.AddField('testfield1', mojom.INT32, 2) | |
| 21 struct.AddField('testfield2', mojom.INT32, 1) | |
| 22 ps = pack.PackedStruct(struct) | |
| 23 | |
| 24 errors += EXPECT_EQ(2, len(ps.packed_fields)) | |
| 25 errors += EXPECT_EQ('testfield2', ps.packed_fields[0].field.name) | |
| 26 errors += EXPECT_EQ('testfield1', ps.packed_fields[1].field.name) | |
| 27 | |
| 28 return errors | |
| 29 | |
| 30 def TestZeroFields(): | |
| 31 errors = 0 | |
| 32 struct = mojom.Struct('test') | |
| 33 ps = pack.PackedStruct(struct) | |
| 34 errors += EXPECT_EQ(0, len(ps.packed_fields)) | |
| 35 return errors | |
| 36 | |
| 37 | |
| 38 def TestOneField(): | |
| 39 errors = 0 | |
| 40 struct = mojom.Struct('test') | |
| 41 struct.AddField('testfield1', mojom.INT8) | |
| 42 ps = pack.PackedStruct(struct) | |
| 43 errors += EXPECT_EQ(1, len(ps.packed_fields)) | |
| 44 return errors | |
| 45 | |
| 46 # Pass three tuples. | |
| 47 # |kinds| is a sequence of mojom.Kinds that specify the fields that are to | |
| 48 # be created. | |
| 49 # |fields| is the expected order of the resulting fields, with the integer | |
| 50 # "1" first. | |
| 51 # |offsets| is the expected order of offsets, with the integer "0" first. | |
| 52 def TestSequence(kinds, fields, offsets): | |
| 53 errors = 0 | |
| 54 struct = mojom.Struct('test') | |
| 55 index = 1 | |
| 56 for kind in kinds: | |
| 57 struct.AddField("%d" % index, kind) | |
| 58 index += 1 | |
| 59 ps = pack.PackedStruct(struct) | |
| 60 num_fields = len(ps.packed_fields) | |
| 61 errors += EXPECT_EQ(len(kinds), num_fields) | |
| 62 for i in xrange(num_fields): | |
| 63 EXPECT_EQ("%d" % fields[i], ps.packed_fields[i].field.name) | |
| 64 EXPECT_EQ(offsets[i], ps.packed_fields[i].offset) | |
| 65 | |
| 66 return errors | |
| 67 | |
| 68 | |
| 69 def TestPaddingPackedInOrder(): | |
| 70 return TestSequence( | |
| 71 (mojom.INT8, mojom.UINT8, mojom.INT32), | |
| 72 (1, 2, 3), | |
| 73 (0, 1, 4)) | |
| 74 | |
| 75 | |
| 76 def TestPaddingPackedOutOfOrder(): | |
| 77 return TestSequence( | |
| 78 (mojom.INT8, mojom.INT32, mojom.UINT8), | |
| 79 (1, 3, 2), | |
| 80 (0, 1, 4)) | |
| 81 | |
| 82 | |
| 83 def TestPaddingPackedOverflow(): | |
| 84 kinds = (mojom.INT8, mojom.INT32, mojom.INT16, mojom.INT8, mojom.INT8) | |
| 85 # 2 bytes should be packed together first, followed by short, then by int. | |
| 86 fields = (1, 4, 3, 2, 5) | |
| 87 offsets = (0, 1, 2, 4, 8) | |
| 88 return TestSequence(kinds, fields, offsets) | |
| 89 | |
| 90 | |
| 91 def TestNullableTypes(): | |
| 92 kinds = (mojom.STRING.MakeNullableKind(), | |
| 93 mojom.HANDLE.MakeNullableKind(), | |
| 94 mojom.Struct('test_struct').MakeNullableKind(), | |
| 95 mojom.DCPIPE.MakeNullableKind(), | |
| 96 mojom.Array().MakeNullableKind(), | |
| 97 mojom.DPPIPE.MakeNullableKind(), | |
| 98 mojom.Array(length=5).MakeNullableKind(), | |
| 99 mojom.MSGPIPE.MakeNullableKind(), | |
| 100 mojom.Interface('test_inteface').MakeNullableKind(), | |
| 101 mojom.SHAREDBUFFER.MakeNullableKind(), | |
| 102 mojom.InterfaceRequest().MakeNullableKind()) | |
| 103 fields = (1, 2, 4, 3, 5, 6, 8, 7, 9, 10, 11) | |
| 104 offsets = (0, 8, 12, 16, 24, 32, 36, 40, 48, 52, 56) | |
| 105 return TestSequence(kinds, fields, offsets) | |
| 106 | |
| 107 | |
| 108 def TestAllTypes(): | |
| 109 return TestSequence( | |
| 110 (mojom.BOOL, mojom.INT8, mojom.STRING, mojom.UINT8, | |
| 111 mojom.INT16, mojom.DOUBLE, mojom.UINT16, | |
| 112 mojom.INT32, mojom.UINT32, mojom.INT64, | |
| 113 mojom.FLOAT, mojom.STRING, mojom.HANDLE, | |
| 114 mojom.UINT64, mojom.Struct('test'), mojom.Array(), | |
| 115 mojom.STRING.MakeNullableKind()), | |
| 116 (1, 2, 4, 5, 7, 3, 6, 8, 9, 10, 11, 13, 12, 14, 15, 16, 17, 18), | |
| 117 (0, 1, 2, 4, 6, 8, 16, 24, 28, 32, 40, 44, 48, 56, 64, 72, 80, 88)) | |
| 118 | |
| 119 | |
| 120 def TestPaddingPackedOutOfOrderByOrdinal(): | |
| 121 errors = 0 | |
| 122 struct = mojom.Struct('test') | |
| 123 struct.AddField('testfield1', mojom.INT8) | |
| 124 struct.AddField('testfield3', mojom.UINT8, 3) | |
| 125 struct.AddField('testfield2', mojom.INT32, 2) | |
| 126 ps = pack.PackedStruct(struct) | |
| 127 errors += EXPECT_EQ(3, len(ps.packed_fields)) | |
| 128 | |
| 129 # Second byte should be packed in behind first, altering order. | |
| 130 errors += EXPECT_EQ('testfield1', ps.packed_fields[0].field.name) | |
| 131 errors += EXPECT_EQ('testfield3', ps.packed_fields[1].field.name) | |
| 132 errors += EXPECT_EQ('testfield2', ps.packed_fields[2].field.name) | |
| 133 | |
| 134 # Second byte should be packed with first. | |
| 135 errors += EXPECT_EQ(0, ps.packed_fields[0].offset) | |
| 136 errors += EXPECT_EQ(1, ps.packed_fields[1].offset) | |
| 137 errors += EXPECT_EQ(4, ps.packed_fields[2].offset) | |
| 138 | |
| 139 return errors | |
| 140 | |
| 141 | |
| 142 def TestBools(): | |
| 143 errors = 0 | |
| 144 struct = mojom.Struct('test') | |
| 145 struct.AddField('bit0', mojom.BOOL) | |
| 146 struct.AddField('bit1', mojom.BOOL) | |
| 147 struct.AddField('int', mojom.INT32) | |
| 148 struct.AddField('bit2', mojom.BOOL) | |
| 149 struct.AddField('bit3', mojom.BOOL) | |
| 150 struct.AddField('bit4', mojom.BOOL) | |
| 151 struct.AddField('bit5', mojom.BOOL) | |
| 152 struct.AddField('bit6', mojom.BOOL) | |
| 153 struct.AddField('bit7', mojom.BOOL) | |
| 154 struct.AddField('bit8', mojom.BOOL) | |
| 155 ps = pack.PackedStruct(struct) | |
| 156 errors += EXPECT_EQ(10, len(ps.packed_fields)) | |
| 157 | |
| 158 # First 8 bits packed together. | |
| 159 for i in xrange(8): | |
| 160 pf = ps.packed_fields[i] | |
| 161 errors += EXPECT_EQ(0, pf.offset) | |
| 162 errors += EXPECT_EQ("bit%d" % i, pf.field.name) | |
| 163 errors += EXPECT_EQ(i, pf.bit) | |
| 164 | |
| 165 # Ninth bit goes into second byte. | |
| 166 errors += EXPECT_EQ("bit8", ps.packed_fields[8].field.name) | |
| 167 errors += EXPECT_EQ(1, ps.packed_fields[8].offset) | |
| 168 errors += EXPECT_EQ(0, ps.packed_fields[8].bit) | |
| 169 | |
| 170 # int comes last. | |
| 171 errors += EXPECT_EQ("int", ps.packed_fields[9].field.name) | |
| 172 errors += EXPECT_EQ(4, ps.packed_fields[9].offset) | |
| 173 | |
| 174 return errors | |
| 175 | |
| 176 | |
| 177 def Main(args): | |
| 178 errors = 0 | |
| 179 errors += RunTest(TestZeroFields) | |
| 180 errors += RunTest(TestOneField) | |
| 181 errors += RunTest(TestPaddingPackedInOrder) | |
| 182 errors += RunTest(TestPaddingPackedOutOfOrder) | |
| 183 errors += RunTest(TestPaddingPackedOverflow) | |
| 184 errors += RunTest(TestNullableTypes) | |
| 185 errors += RunTest(TestAllTypes) | |
| 186 errors += RunTest(TestPaddingPackedOutOfOrderByOrdinal) | |
| 187 errors += RunTest(TestBools) | |
| 188 | |
| 189 return errors | |
| 190 | |
| 191 | |
| 192 if __name__ == '__main__': | |
| 193 sys.exit(Main(sys.argv[1:])) | |
| OLD | NEW |