OLD | NEW |
1 //===- llvm/unittest/Bitcode/NaClMungedBitcodeTest.cpp -------------------===// | 1 //===- llvm/unittest/Bitcode/NaClMungedBitcodeTest.cpp -------------------===// |
2 // Tests munging NaCl bitcode records. | 2 // Tests munging NaCl bitcode records. |
3 // | 3 // |
4 // The LLVM Compiler Infrastructure | 4 // The LLVM Compiler Infrastructure |
5 // | 5 // |
6 // This file is distributed under the University of Illinois Open Source | 6 // This file is distributed under the University of Illinois Open Source |
7 // License. See LICENSE.TXT for details. | 7 // License. See LICENSE.TXT for details. |
8 // | 8 // |
9 //===----------------------------------------------------------------------===// | 9 //===----------------------------------------------------------------------===// |
10 | 10 |
11 // Tests munging NaCl bitcode records. | 11 // Tests munging NaCl bitcode records. |
12 | 12 |
13 #include "llvm/ADT/STLExtras.h" | 13 #include "NaClMungeTest.h" |
14 #include "llvm/Bitcode/NaCl/NaClBitcodeMungeUtils.h" | |
15 | 14 |
16 #include "gtest/gtest.h" | |
17 #include <limits> | 15 #include <limits> |
18 | 16 |
19 using namespace llvm; | 17 using namespace llvm; |
20 | 18 |
21 namespace { | 19 namespace naclmungetest { |
22 | |
23 static const uint64_t Terminator = 0x5768798008978675LL; | |
24 | |
25 std::string stringify(NaClMungedBitcode &MungedBitcode) { | |
26 std::string Buffer; | |
27 raw_string_ostream StrBuf(Buffer); | |
28 MungedBitcode.print(StrBuf); | |
29 return StrBuf.str(); | |
30 } | |
31 | |
32 } // end of anonymous namespace | |
33 | |
34 #define ARRAY_ARGS(name) name, array_lengthof(name), Terminator | |
35 | |
36 namespace NaClMungedBc { | |
37 | 20 |
38 TEST(NaClMungedBitcodeTest, TestInsertBefore) { | 21 TEST(NaClMungedBitcodeTest, TestInsertBefore) { |
39 const uint64_t Records[] = { | 22 const uint64_t Records[] = { |
40 1, 2, 3, Terminator, | 23 1, 2, 3, Terminator, |
41 4, 5, Terminator, | 24 4, 5, Terminator, |
42 6, 7, 8 , 9, Terminator, | 25 6, 7, 8 , 9, Terminator, |
43 10, 11, Terminator | 26 10, 11, Terminator |
44 }; | 27 }; |
45 NaClMungedBitcode MungedRecords(ARRAY_ARGS(Records)); | 28 NaClMungedBitcode MungedRecords(ARRAY_TERM(Records)); |
46 EXPECT_EQ( | 29 EXPECT_EQ( |
47 " 1: [2, 3]\n" | 30 " 1: [2, 3]\n" |
48 " 4: [5]\n" | 31 " 4: [5]\n" |
49 " 6: [7, 8, 9]\n" | 32 " 6: [7, 8, 9]\n" |
50 " 10: [11]\n", | 33 " 10: [11]\n", |
51 stringify(MungedRecords)); | 34 stringify(MungedRecords)); |
52 | 35 |
53 // Add a record before the second record. | 36 // Add a record before the second record. |
54 const uint64_t BeforeSecond[] = { | 37 const uint64_t BeforeSecond[] = { |
55 1, NaClMungedBitcode::AddBefore, 12, 13, 14, Terminator | 38 1, NaClMungedBitcode::AddBefore, 12, 13, 14, Terminator |
56 }; | 39 }; |
57 MungedRecords.munge(ARRAY_ARGS(BeforeSecond)); | 40 MungedRecords.munge(ARRAY_TERM(BeforeSecond)); |
58 EXPECT_EQ( | 41 EXPECT_EQ( |
59 " 1: [2, 3]\n" | 42 " 1: [2, 3]\n" |
60 " 12: [13, 14]\n" | 43 " 12: [13, 14]\n" |
61 " 4: [5]\n" | 44 " 4: [5]\n" |
62 " 6: [7, 8, 9]\n" | 45 " 6: [7, 8, 9]\n" |
63 " 10: [11]\n", | 46 " 10: [11]\n", |
64 stringify(MungedRecords)); | 47 stringify(MungedRecords)); |
65 | 48 |
66 // Add two more records before the second record. | 49 // Add two more records before the second record. |
67 const uint64_t BeforeSecondMore[] = { | 50 const uint64_t BeforeSecondMore[] = { |
68 1, NaClMungedBitcode::AddBefore, 15, 16, 17, Terminator, | 51 1, NaClMungedBitcode::AddBefore, 15, 16, 17, Terminator, |
69 1, NaClMungedBitcode::AddBefore, 18, 19, Terminator | 52 1, NaClMungedBitcode::AddBefore, 18, 19, Terminator |
70 }; | 53 }; |
71 MungedRecords.munge(ARRAY_ARGS(BeforeSecondMore)); | 54 MungedRecords.munge(ARRAY_TERM(BeforeSecondMore)); |
72 EXPECT_EQ( | 55 EXPECT_EQ( |
73 " 1: [2, 3]\n" | 56 " 1: [2, 3]\n" |
74 " 12: [13, 14]\n" | 57 " 12: [13, 14]\n" |
75 " 15: [16, 17]\n" | 58 " 15: [16, 17]\n" |
76 " 18: [19]\n" | 59 " 18: [19]\n" |
77 " 4: [5]\n" | 60 " 4: [5]\n" |
78 " 6: [7, 8, 9]\n" | 61 " 6: [7, 8, 9]\n" |
79 " 10: [11]\n", | 62 " 10: [11]\n", |
80 stringify(MungedRecords)); | 63 stringify(MungedRecords)); |
81 | 64 |
82 // Add two records before the last record. | 65 // Add two records before the last record. |
83 const uint64_t BeforeLast[] = { | 66 const uint64_t BeforeLast[] = { |
84 3, NaClMungedBitcode::AddBefore, 21, 22, 23, Terminator, | 67 3, NaClMungedBitcode::AddBefore, 21, 22, 23, Terminator, |
85 3, NaClMungedBitcode::AddBefore, 24, 25, 26, 27, Terminator | 68 3, NaClMungedBitcode::AddBefore, 24, 25, 26, 27, Terminator |
86 }; | 69 }; |
87 MungedRecords.munge(ARRAY_ARGS(BeforeLast)); | 70 MungedRecords.munge(ARRAY_TERM(BeforeLast)); |
88 EXPECT_EQ( | 71 EXPECT_EQ( |
89 " 1: [2, 3]\n" | 72 " 1: [2, 3]\n" |
90 " 12: [13, 14]\n" | 73 " 12: [13, 14]\n" |
91 " 15: [16, 17]\n" | 74 " 15: [16, 17]\n" |
92 " 18: [19]\n" | 75 " 18: [19]\n" |
93 " 4: [5]\n" | 76 " 4: [5]\n" |
94 " 6: [7, 8, 9]\n" | 77 " 6: [7, 8, 9]\n" |
95 " 21: [22, 23]\n" | 78 " 21: [22, 23]\n" |
96 " 24: [25, 26, 27]\n" | 79 " 24: [25, 26, 27]\n" |
97 " 10: [11]\n", | 80 " 10: [11]\n", |
98 stringify(MungedRecords)); | 81 stringify(MungedRecords)); |
99 } | 82 } |
100 | 83 |
101 TEST(NaClMungedBitcodeTest, TestInsertAfter) { | 84 TEST(NaClMungedBitcodeTest, TestInsertAfter) { |
102 const uint64_t Records[] = { | 85 const uint64_t Records[] = { |
103 1, 2, 3, Terminator, | 86 1, 2, 3, Terminator, |
104 4, 5, Terminator, | 87 4, 5, Terminator, |
105 6, 7, 8 , 9, Terminator, | 88 6, 7, 8 , 9, Terminator, |
106 10, 11, Terminator | 89 10, 11, Terminator |
107 }; | 90 }; |
108 NaClMungedBitcode MungedRecords(ARRAY_ARGS(Records)); | 91 NaClMungedBitcode MungedRecords(ARRAY_TERM(Records)); |
109 EXPECT_EQ( | 92 EXPECT_EQ( |
110 " 1: [2, 3]\n" | 93 " 1: [2, 3]\n" |
111 " 4: [5]\n" | 94 " 4: [5]\n" |
112 " 6: [7, 8, 9]\n" | 95 " 6: [7, 8, 9]\n" |
113 " 10: [11]\n", | 96 " 10: [11]\n", |
114 stringify(MungedRecords)); | 97 stringify(MungedRecords)); |
115 | 98 |
116 // Add a record after the second record. | 99 // Add a record after the second record. |
117 const uint64_t AfterSecond[] = { | 100 const uint64_t AfterSecond[] = { |
118 1, NaClMungedBitcode::AddAfter, 12, 13, 14, Terminator | 101 1, NaClMungedBitcode::AddAfter, 12, 13, 14, Terminator |
119 }; | 102 }; |
120 MungedRecords.munge(ARRAY_ARGS(AfterSecond)); | 103 MungedRecords.munge(ARRAY_TERM(AfterSecond)); |
121 EXPECT_EQ( | 104 EXPECT_EQ( |
122 " 1: [2, 3]\n" | 105 " 1: [2, 3]\n" |
123 " 4: [5]\n" | 106 " 4: [5]\n" |
124 " 12: [13, 14]\n" | 107 " 12: [13, 14]\n" |
125 " 6: [7, 8, 9]\n" | 108 " 6: [7, 8, 9]\n" |
126 " 10: [11]\n", | 109 " 10: [11]\n", |
127 stringify(MungedRecords)); | 110 stringify(MungedRecords)); |
128 | 111 |
129 // Add two more records after the second record. | 112 // Add two more records after the second record. |
130 const uint64_t AfterSecondMore[] = { | 113 const uint64_t AfterSecondMore[] = { |
131 1, NaClMungedBitcode::AddAfter, 15, 16, 17, Terminator, | 114 1, NaClMungedBitcode::AddAfter, 15, 16, 17, Terminator, |
132 1, NaClMungedBitcode::AddAfter, 18, 19, Terminator | 115 1, NaClMungedBitcode::AddAfter, 18, 19, Terminator |
133 }; | 116 }; |
134 MungedRecords.munge(ARRAY_ARGS(AfterSecondMore)); | 117 MungedRecords.munge(ARRAY_TERM(AfterSecondMore)); |
135 EXPECT_EQ( | 118 EXPECT_EQ( |
136 " 1: [2, 3]\n" | 119 " 1: [2, 3]\n" |
137 " 4: [5]\n" | 120 " 4: [5]\n" |
138 " 12: [13, 14]\n" | 121 " 12: [13, 14]\n" |
139 " 15: [16, 17]\n" | 122 " 15: [16, 17]\n" |
140 " 18: [19]\n" | 123 " 18: [19]\n" |
141 " 6: [7, 8, 9]\n" | 124 " 6: [7, 8, 9]\n" |
142 " 10: [11]\n", | 125 " 10: [11]\n", |
143 stringify(MungedRecords)); | 126 stringify(MungedRecords)); |
144 | 127 |
145 // Add two records after the last record. | 128 // Add two records after the last record. |
146 const uint64_t AfterLast[] = { | 129 const uint64_t AfterLast[] = { |
147 3, NaClMungedBitcode::AddAfter, 21, 22, 23, Terminator, | 130 3, NaClMungedBitcode::AddAfter, 21, 22, 23, Terminator, |
148 3, NaClMungedBitcode::AddAfter, 24, 25, 26, 27, Terminator | 131 3, NaClMungedBitcode::AddAfter, 24, 25, 26, 27, Terminator |
149 }; | 132 }; |
150 MungedRecords.munge(ARRAY_ARGS(AfterLast)); | 133 MungedRecords.munge(ARRAY_TERM(AfterLast)); |
151 EXPECT_EQ( | 134 EXPECT_EQ( |
152 " 1: [2, 3]\n" | 135 " 1: [2, 3]\n" |
153 " 4: [5]\n" | 136 " 4: [5]\n" |
154 " 12: [13, 14]\n" | 137 " 12: [13, 14]\n" |
155 " 15: [16, 17]\n" | 138 " 15: [16, 17]\n" |
156 " 18: [19]\n" | 139 " 18: [19]\n" |
157 " 6: [7, 8, 9]\n" | 140 " 6: [7, 8, 9]\n" |
158 " 10: [11]\n" | 141 " 10: [11]\n" |
159 " 21: [22, 23]\n" | 142 " 21: [22, 23]\n" |
160 " 24: [25, 26, 27]\n", | 143 " 24: [25, 26, 27]\n", |
161 stringify(MungedRecords)); | 144 stringify(MungedRecords)); |
162 } | 145 } |
163 | 146 |
164 TEST(NaClMungedBitcodeTest, TestRemove) { | 147 TEST(NaClMungedBitcodeTest, TestRemove) { |
165 const uint64_t Records[] = { | 148 const uint64_t Records[] = { |
166 1, 2, 3, Terminator, | 149 1, 2, 3, Terminator, |
167 4, 5, Terminator, | 150 4, 5, Terminator, |
168 6, 7, 8 , 9, Terminator, | 151 6, 7, 8 , 9, Terminator, |
169 10, 11, Terminator | 152 10, 11, Terminator |
170 }; | 153 }; |
171 NaClMungedBitcode MungedRecords(ARRAY_ARGS(Records)); | 154 NaClMungedBitcode MungedRecords(ARRAY_TERM(Records)); |
172 EXPECT_EQ( | 155 EXPECT_EQ( |
173 " 1: [2, 3]\n" | 156 " 1: [2, 3]\n" |
174 " 4: [5]\n" | 157 " 4: [5]\n" |
175 " 6: [7, 8, 9]\n" | 158 " 6: [7, 8, 9]\n" |
176 " 10: [11]\n", | 159 " 10: [11]\n", |
177 stringify(MungedRecords)); | 160 stringify(MungedRecords)); |
178 | 161 |
179 // Remove the second record. | 162 // Remove the second record. |
180 const uint64_t RemoveSecond[] = { | 163 const uint64_t RemoveSecond[] = { |
181 1, NaClMungedBitcode::Remove | 164 1, NaClMungedBitcode::Remove |
182 }; | 165 }; |
183 MungedRecords.munge(ARRAY_ARGS(RemoveSecond)); | 166 MungedRecords.munge(ARRAY_TERM(RemoveSecond)); |
184 EXPECT_EQ( | 167 EXPECT_EQ( |
185 " 1: [2, 3]\n" | 168 " 1: [2, 3]\n" |
186 " 6: [7, 8, 9]\n" | 169 " 6: [7, 8, 9]\n" |
187 " 10: [11]\n", | 170 " 10: [11]\n", |
188 stringify(MungedRecords)); | 171 stringify(MungedRecords)); |
189 | 172 |
190 // Remove first and last records. | 173 // Remove first and last records. |
191 const uint64_t RemoveEnds[] = { | 174 const uint64_t RemoveEnds[] = { |
192 0, NaClMungedBitcode::Remove, | 175 0, NaClMungedBitcode::Remove, |
193 3, NaClMungedBitcode::Remove | 176 3, NaClMungedBitcode::Remove |
194 }; | 177 }; |
195 MungedRecords.munge(ARRAY_ARGS(RemoveEnds)); | 178 MungedRecords.munge(ARRAY_TERM(RemoveEnds)); |
196 EXPECT_EQ( | 179 EXPECT_EQ( |
197 " 6: [7, 8, 9]\n", | 180 " 6: [7, 8, 9]\n", |
198 stringify(MungedRecords)); | 181 stringify(MungedRecords)); |
199 | 182 |
200 // Remove remaining record. | 183 // Remove remaining record. |
201 const uint64_t RemoveOther[] = { | 184 const uint64_t RemoveOther[] = { |
202 2, NaClMungedBitcode::Remove | 185 2, NaClMungedBitcode::Remove |
203 }; | 186 }; |
204 MungedRecords.munge(ARRAY_ARGS(RemoveOther)); | 187 MungedRecords.munge(ARRAY_TERM(RemoveOther)); |
205 EXPECT_EQ( | 188 EXPECT_EQ( |
206 "", | 189 "", |
207 stringify(MungedRecords)); | 190 stringify(MungedRecords)); |
208 } | 191 } |
209 | 192 |
210 TEST(NaClMungedBitcodeTest, TestReplace) { | 193 TEST(NaClMungedBitcodeTest, TestReplace) { |
211 const uint64_t Records[] = { | 194 const uint64_t Records[] = { |
212 1, 2, 3, Terminator, | 195 1, 2, 3, Terminator, |
213 4, 5, Terminator, | 196 4, 5, Terminator, |
214 6, 7, 8 , 9, Terminator, | 197 6, 7, 8 , 9, Terminator, |
215 10, 11, Terminator | 198 10, 11, Terminator |
216 }; | 199 }; |
217 NaClMungedBitcode MungedRecords(ARRAY_ARGS(Records)); | 200 NaClMungedBitcode MungedRecords(ARRAY_TERM(Records)); |
218 EXPECT_EQ( | 201 EXPECT_EQ( |
219 " 1: [2, 3]\n" | 202 " 1: [2, 3]\n" |
220 " 4: [5]\n" | 203 " 4: [5]\n" |
221 " 6: [7, 8, 9]\n" | 204 " 6: [7, 8, 9]\n" |
222 " 10: [11]\n", | 205 " 10: [11]\n", |
223 stringify(MungedRecords)); | 206 stringify(MungedRecords)); |
224 | 207 |
225 // Replace the second record. | 208 // Replace the second record. |
226 const uint64_t ReplaceSecond[] = { | 209 const uint64_t ReplaceSecond[] = { |
227 1, NaClMungedBitcode::Replace, 12, 13, 14, Terminator | 210 1, NaClMungedBitcode::Replace, 12, 13, 14, Terminator |
228 }; | 211 }; |
229 MungedRecords.munge(ARRAY_ARGS(ReplaceSecond)); | 212 MungedRecords.munge(ARRAY_TERM(ReplaceSecond)); |
230 EXPECT_EQ( | 213 EXPECT_EQ( |
231 " 1: [2, 3]\n" | 214 " 1: [2, 3]\n" |
232 " 12: [13, 14]\n" | 215 " 12: [13, 14]\n" |
233 " 6: [7, 8, 9]\n" | 216 " 6: [7, 8, 9]\n" |
234 " 10: [11]\n", | 217 " 10: [11]\n", |
235 stringify(MungedRecords)); | 218 stringify(MungedRecords)); |
236 | 219 |
237 // Replace the first and last record. | 220 // Replace the first and last record. |
238 const uint64_t ReplaceEnds[] = { | 221 const uint64_t ReplaceEnds[] = { |
239 0, NaClMungedBitcode::Replace, 15, 16, 17, 18, Terminator, | 222 0, NaClMungedBitcode::Replace, 15, 16, 17, 18, Terminator, |
240 3, NaClMungedBitcode::Replace, 19, 20, Terminator | 223 3, NaClMungedBitcode::Replace, 19, 20, Terminator |
241 }; | 224 }; |
242 MungedRecords.munge(ARRAY_ARGS(ReplaceEnds)); | 225 MungedRecords.munge(ARRAY_TERM(ReplaceEnds)); |
243 EXPECT_EQ( | 226 EXPECT_EQ( |
244 " 15: [16, 17, 18]\n" | 227 " 15: [16, 17, 18]\n" |
245 " 12: [13, 14]\n" | 228 " 12: [13, 14]\n" |
246 " 6: [7, 8, 9]\n" | 229 " 6: [7, 8, 9]\n" |
247 " 19: [20]\n", | 230 " 19: [20]\n", |
248 stringify(MungedRecords)); | 231 stringify(MungedRecords)); |
249 | 232 |
250 // Replace the first three records, which includes two already replaced | 233 // Replace the first three records, which includes two already replaced |
251 // records. | 234 // records. |
252 const uint64_t ReplaceFirst3[] = { | 235 const uint64_t ReplaceFirst3[] = { |
253 0, NaClMungedBitcode::Replace, 21, 22, 23, Terminator, | 236 0, NaClMungedBitcode::Replace, 21, 22, 23, Terminator, |
254 1, NaClMungedBitcode::Replace, 24, 25, Terminator, | 237 1, NaClMungedBitcode::Replace, 24, 25, Terminator, |
255 2, NaClMungedBitcode::Replace, 26, 27, 28, 29, Terminator | 238 2, NaClMungedBitcode::Replace, 26, 27, 28, 29, Terminator |
256 }; | 239 }; |
257 MungedRecords.munge(ARRAY_ARGS(ReplaceFirst3)); | 240 MungedRecords.munge(ARRAY_TERM(ReplaceFirst3)); |
258 EXPECT_EQ( | 241 EXPECT_EQ( |
259 " 21: [22, 23]\n" | 242 " 21: [22, 23]\n" |
260 " 24: [25]\n" | 243 " 24: [25]\n" |
261 " 26: [27, 28, 29]\n" | 244 " 26: [27, 28, 29]\n" |
262 " 19: [20]\n", | 245 " 19: [20]\n", |
263 stringify(MungedRecords)); | 246 stringify(MungedRecords)); |
264 | 247 |
265 // Show that we can remove replaced records. | 248 // Show that we can remove replaced records. |
266 const uint64_t RemoveReplaced[] = { | 249 const uint64_t RemoveReplaced[] = { |
267 1, NaClMungedBitcode::Remove, | 250 1, NaClMungedBitcode::Remove, |
268 3, NaClMungedBitcode::Remove | 251 3, NaClMungedBitcode::Remove |
269 }; | 252 }; |
270 MungedRecords.munge(ARRAY_ARGS(RemoveReplaced)); | 253 MungedRecords.munge(ARRAY_TERM(RemoveReplaced)); |
271 EXPECT_EQ( | 254 EXPECT_EQ( |
272 " 21: [22, 23]\n" | 255 " 21: [22, 23]\n" |
273 " 26: [27, 28, 29]\n", | 256 " 26: [27, 28, 29]\n", |
274 stringify(MungedRecords)); | 257 stringify(MungedRecords)); |
275 } | 258 } |
276 | 259 |
277 TEST(NaClMungedBitcodeTest, TestBlockStructure) { | 260 TEST(NaClMungedBitcodeTest, TestBlockStructure) { |
278 const uint64_t Records[] = { | 261 const uint64_t Records[] = { |
279 1, 2, 3, 4, Terminator, | 262 1, 2, 3, 4, Terminator, |
280 5, naclbitc::BLK_CODE_ENTER, 6, Terminator, | 263 5, naclbitc::BLK_CODE_ENTER, 6, Terminator, |
281 7, 8, Terminator, | 264 7, 8, Terminator, |
282 9, naclbitc::BLK_CODE_ENTER, 10, Terminator, | 265 9, naclbitc::BLK_CODE_ENTER, 10, Terminator, |
283 11, 12, 13, Terminator, | 266 11, 12, 13, Terminator, |
284 14, naclbitc::BLK_CODE_EXIT, Terminator, | 267 14, naclbitc::BLK_CODE_EXIT, Terminator, |
285 15, naclbitc::BLK_CODE_ENTER, 16, Terminator, | 268 15, naclbitc::BLK_CODE_ENTER, 16, Terminator, |
286 17, naclbitc::BLK_CODE_EXIT, 18, Terminator, | 269 17, naclbitc::BLK_CODE_EXIT, 18, Terminator, |
287 19, 20, 21, Terminator, | 270 19, 20, 21, Terminator, |
288 22, naclbitc::BLK_CODE_EXIT, Terminator | 271 22, naclbitc::BLK_CODE_EXIT, Terminator |
289 }; | 272 }; |
290 NaClMungedBitcode MungedRecords(ARRAY_ARGS(Records)); | 273 NaClMungedBitcode MungedRecords(ARRAY_TERM(Records)); |
291 EXPECT_EQ( | 274 EXPECT_EQ( |
292 " 1: [2, 3, 4]\n" | 275 " 1: [2, 3, 4]\n" |
293 " 5: [65535, 6]\n" | 276 " 5: [65535, 6]\n" |
294 " 7: [8]\n" | 277 " 7: [8]\n" |
295 " 9: [65535, 10]\n" | 278 " 9: [65535, 10]\n" |
296 " 11: [12, 13]\n" | 279 " 11: [12, 13]\n" |
297 " 14: [65534]\n" | 280 " 14: [65534]\n" |
298 " 15: [65535, 16]\n" | 281 " 15: [65535, 16]\n" |
299 " 17: [65534, 18]\n" | 282 " 17: [65534, 18]\n" |
300 " 19: [20, 21]\n" | 283 " 19: [20, 21]\n" |
301 " 22: [65534]\n", | 284 " 22: [65534]\n", |
302 stringify(MungedRecords)); | 285 stringify(MungedRecords)); |
303 | 286 |
304 // Show what happens if you have unbalanced blocks. | 287 // Show what happens if you have unbalanced blocks. |
305 const uint64_t ExitEdits[] = { | 288 const uint64_t ExitEdits[] = { |
306 4, NaClMungedBitcode::AddAfter, 0, naclbitc::BLK_CODE_EXIT, Terminator, | 289 4, NaClMungedBitcode::AddAfter, 0, naclbitc::BLK_CODE_EXIT, Terminator, |
307 4, NaClMungedBitcode::AddAfter, 0, naclbitc::BLK_CODE_EXIT, Terminator, | 290 4, NaClMungedBitcode::AddAfter, 0, naclbitc::BLK_CODE_EXIT, Terminator, |
308 2, NaClMungedBitcode::Replace, 0, naclbitc::BLK_CODE_EXIT, Terminator | 291 2, NaClMungedBitcode::Replace, 0, naclbitc::BLK_CODE_EXIT, Terminator |
309 }; | 292 }; |
310 MungedRecords.munge(ARRAY_ARGS(ExitEdits)); | 293 MungedRecords.munge(ARRAY_TERM(ExitEdits)); |
311 EXPECT_EQ( | 294 EXPECT_EQ( |
312 " 1: [2, 3, 4]\n" | 295 " 1: [2, 3, 4]\n" |
313 " 5: [65535, 6]\n" | 296 " 5: [65535, 6]\n" |
314 " 0: [65534]\n" | 297 " 0: [65534]\n" |
315 " 9: [65535, 10]\n" | 298 " 9: [65535, 10]\n" |
316 " 11: [12, 13]\n" | 299 " 11: [12, 13]\n" |
317 " 0: [65534]\n" | 300 " 0: [65534]\n" |
318 " 0: [65534]\n" | 301 " 0: [65534]\n" |
319 " 14: [65534]\n" | 302 " 14: [65534]\n" |
320 " 15: [65535, 16]\n" | 303 " 15: [65535, 16]\n" |
321 " 17: [65534, 18]\n" | 304 " 17: [65534, 18]\n" |
322 " 19: [20, 21]\n" | 305 " 19: [20, 21]\n" |
323 " 22: [65534]\n", | 306 " 22: [65534]\n", |
324 stringify(MungedRecords)); | 307 stringify(MungedRecords)); |
325 } | 308 } |
326 | 309 |
327 // Tests that replace/remove superceed other replace/removes at same | 310 // Tests that replace/remove superceed other replace/removes at same |
328 // record index. | 311 // record index. |
329 TEST(NaClMungedBitcodeTest, TestReplaceRemoveEffects) { | 312 TEST(NaClMungedBitcodeTest, TestReplaceRemoveEffects) { |
330 const uint64_t Records[] = { | 313 const uint64_t Records[] = { |
331 1, 2, 3, Terminator, | 314 1, 2, 3, Terminator, |
332 4, 5, Terminator, | 315 4, 5, Terminator, |
333 6, 7, 8 , 9, Terminator, | 316 6, 7, 8 , 9, Terminator, |
334 10, 11, Terminator | 317 10, 11, Terminator |
335 }; | 318 }; |
336 NaClMungedBitcode MungedRecords(ARRAY_ARGS(Records)); | 319 NaClMungedBitcode MungedRecords(ARRAY_TERM(Records)); |
337 EXPECT_EQ( | 320 EXPECT_EQ( |
338 " 1: [2, 3]\n" | 321 " 1: [2, 3]\n" |
339 " 4: [5]\n" | 322 " 4: [5]\n" |
340 " 6: [7, 8, 9]\n" | 323 " 6: [7, 8, 9]\n" |
341 " 10: [11]\n", | 324 " 10: [11]\n", |
342 stringify(MungedRecords)); | 325 stringify(MungedRecords)); |
343 | 326 |
344 // Remove the second record. | 327 // Remove the second record. |
345 const uint64_t RemoveSecond[] = { | 328 const uint64_t RemoveSecond[] = { |
346 1, NaClMungedBitcode::Remove | 329 1, NaClMungedBitcode::Remove |
347 }; | 330 }; |
348 MungedRecords.munge(ARRAY_ARGS(RemoveSecond)); | 331 MungedRecords.munge(ARRAY_TERM(RemoveSecond)); |
349 EXPECT_EQ( | 332 EXPECT_EQ( |
350 " 1: [2, 3]\n" | 333 " 1: [2, 3]\n" |
351 " 6: [7, 8, 9]\n" | 334 " 6: [7, 8, 9]\n" |
352 " 10: [11]\n", | 335 " 10: [11]\n", |
353 stringify(MungedRecords)); | 336 stringify(MungedRecords)); |
354 | 337 |
355 // Try it again. Should have no effect. | 338 // Try it again. Should have no effect. |
356 MungedRecords.munge(ARRAY_ARGS(RemoveSecond)); | 339 MungedRecords.munge(ARRAY_TERM(RemoveSecond)); |
357 EXPECT_EQ( | 340 EXPECT_EQ( |
358 " 1: [2, 3]\n" | 341 " 1: [2, 3]\n" |
359 " 6: [7, 8, 9]\n" | 342 " 6: [7, 8, 9]\n" |
360 " 10: [11]\n", | 343 " 10: [11]\n", |
361 stringify(MungedRecords)); | 344 stringify(MungedRecords)); |
362 | 345 |
363 // Override removed record with a replacement. | 346 // Override removed record with a replacement. |
364 const uint64_t ReplaceSecond[] = { | 347 const uint64_t ReplaceSecond[] = { |
365 1, NaClMungedBitcode::Replace, 12, 12, 14, 15, Terminator | 348 1, NaClMungedBitcode::Replace, 12, 12, 14, 15, Terminator |
366 }; | 349 }; |
367 MungedRecords.munge(ARRAY_ARGS(ReplaceSecond)); | 350 MungedRecords.munge(ARRAY_TERM(ReplaceSecond)); |
368 EXPECT_EQ( | 351 EXPECT_EQ( |
369 " 1: [2, 3]\n" | 352 " 1: [2, 3]\n" |
370 " 12: [12, 14, 15]\n" | 353 " 12: [12, 14, 15]\n" |
371 " 6: [7, 8, 9]\n" | 354 " 6: [7, 8, 9]\n" |
372 " 10: [11]\n", | 355 " 10: [11]\n", |
373 stringify(MungedRecords)); | 356 stringify(MungedRecords)); |
374 | 357 |
375 // Override replacement with a different replacement. | 358 // Override replacement with a different replacement. |
376 const uint64_t ReplaceSecondAgain[] = { | 359 const uint64_t ReplaceSecondAgain[] = { |
377 1, NaClMungedBitcode::Replace, 16, 17, 18, Terminator | 360 1, NaClMungedBitcode::Replace, 16, 17, 18, Terminator |
378 }; | 361 }; |
379 MungedRecords.munge(ARRAY_ARGS(ReplaceSecondAgain)); | 362 MungedRecords.munge(ARRAY_TERM(ReplaceSecondAgain)); |
380 EXPECT_EQ( | 363 EXPECT_EQ( |
381 " 1: [2, 3]\n" | 364 " 1: [2, 3]\n" |
382 " 16: [17, 18]\n" | 365 " 16: [17, 18]\n" |
383 " 6: [7, 8, 9]\n" | 366 " 6: [7, 8, 9]\n" |
384 " 10: [11]\n", | 367 " 10: [11]\n", |
385 stringify(MungedRecords)); | 368 stringify(MungedRecords)); |
386 | 369 |
387 // Override replacement with a remove. | 370 // Override replacement with a remove. |
388 MungedRecords.munge(ARRAY_ARGS(RemoveSecond)); | 371 MungedRecords.munge(ARRAY_TERM(RemoveSecond)); |
389 EXPECT_EQ( | 372 EXPECT_EQ( |
390 " 1: [2, 3]\n" | 373 " 1: [2, 3]\n" |
391 " 6: [7, 8, 9]\n" | 374 " 6: [7, 8, 9]\n" |
392 " 10: [11]\n", | 375 " 10: [11]\n", |
393 stringify(MungedRecords)); | 376 stringify(MungedRecords)); |
394 } | 377 } |
395 | 378 |
396 // Show how before/after interact between neighboring indices | 379 // Show how before/after interact between neighboring indices |
397 TEST(NaClMungedBitcodeTest, TestBeforeAfterInteraction) { | 380 TEST(NaClMungedBitcodeTest, TestBeforeAfterInteraction) { |
398 const uint64_t Records[] = { | 381 const uint64_t Records[] = { |
399 1, 2, 3, Terminator, | 382 1, 2, 3, Terminator, |
400 4, 5, Terminator, | 383 4, 5, Terminator, |
401 6, 7, 8 , 9, Terminator, | 384 6, 7, 8 , 9, Terminator, |
402 10, 11, Terminator | 385 10, 11, Terminator |
403 }; | 386 }; |
404 NaClMungedBitcode MungedRecords(ARRAY_ARGS(Records)); | 387 NaClMungedBitcode MungedRecords(ARRAY_TERM(Records)); |
405 EXPECT_EQ( | 388 EXPECT_EQ( |
406 " 1: [2, 3]\n" | 389 " 1: [2, 3]\n" |
407 " 4: [5]\n" | 390 " 4: [5]\n" |
408 " 6: [7, 8, 9]\n" | 391 " 6: [7, 8, 9]\n" |
409 " 10: [11]\n", | 392 " 10: [11]\n", |
410 stringify(MungedRecords)); | 393 stringify(MungedRecords)); |
411 | 394 |
412 // Add record before the third record. | 395 // Add record before the third record. |
413 const uint64_t AddBeforeThird[] = { | 396 const uint64_t AddBeforeThird[] = { |
414 2, NaClMungedBitcode::AddBefore, 12, 13, 14, Terminator | 397 2, NaClMungedBitcode::AddBefore, 12, 13, 14, Terminator |
415 }; | 398 }; |
416 MungedRecords.munge(ARRAY_ARGS(AddBeforeThird)); | 399 MungedRecords.munge(ARRAY_TERM(AddBeforeThird)); |
417 EXPECT_EQ( | 400 EXPECT_EQ( |
418 " 1: [2, 3]\n" | 401 " 1: [2, 3]\n" |
419 " 4: [5]\n" | 402 " 4: [5]\n" |
420 " 12: [13, 14]\n" | 403 " 12: [13, 14]\n" |
421 " 6: [7, 8, 9]\n" | 404 " 6: [7, 8, 9]\n" |
422 " 10: [11]\n", | 405 " 10: [11]\n", |
423 stringify(MungedRecords)); | 406 stringify(MungedRecords)); |
424 | 407 |
425 // Add record after the second record. | 408 // Add record after the second record. |
426 const uint64_t AddAfterSecond[] = { | 409 const uint64_t AddAfterSecond[] = { |
427 1, NaClMungedBitcode::AddAfter, 15, 16, 17, 18, Terminator | 410 1, NaClMungedBitcode::AddAfter, 15, 16, 17, 18, Terminator |
428 }; | 411 }; |
429 MungedRecords.munge(ARRAY_ARGS(AddAfterSecond)); | 412 MungedRecords.munge(ARRAY_TERM(AddAfterSecond)); |
430 EXPECT_EQ( | 413 EXPECT_EQ( |
431 " 1: [2, 3]\n" | 414 " 1: [2, 3]\n" |
432 " 4: [5]\n" | 415 " 4: [5]\n" |
433 " 15: [16, 17, 18]\n" | 416 " 15: [16, 17, 18]\n" |
434 " 12: [13, 14]\n" | 417 " 12: [13, 14]\n" |
435 " 6: [7, 8, 9]\n" | 418 " 6: [7, 8, 9]\n" |
436 " 10: [11]\n", | 419 " 10: [11]\n", |
437 stringify(MungedRecords)); | 420 stringify(MungedRecords)); |
438 | 421 |
439 // Add more records before the third record. | 422 // Add more records before the third record. |
440 const uint64_t AddBeforeThirdMore[] = { | 423 const uint64_t AddBeforeThirdMore[] = { |
441 2, NaClMungedBitcode::AddBefore, 19, 20, Terminator, | 424 2, NaClMungedBitcode::AddBefore, 19, 20, Terminator, |
442 2, NaClMungedBitcode::AddBefore, 21, 22, Terminator | 425 2, NaClMungedBitcode::AddBefore, 21, 22, Terminator |
443 }; | 426 }; |
444 MungedRecords.munge(ARRAY_ARGS(AddBeforeThirdMore)); | 427 MungedRecords.munge(ARRAY_TERM(AddBeforeThirdMore)); |
445 EXPECT_EQ( | 428 EXPECT_EQ( |
446 " 1: [2, 3]\n" | 429 " 1: [2, 3]\n" |
447 " 4: [5]\n" | 430 " 4: [5]\n" |
448 " 15: [16, 17, 18]\n" | 431 " 15: [16, 17, 18]\n" |
449 " 12: [13, 14]\n" | 432 " 12: [13, 14]\n" |
450 " 19: [20]\n" | 433 " 19: [20]\n" |
451 " 21: [22]\n" | 434 " 21: [22]\n" |
452 " 6: [7, 8, 9]\n" | 435 " 6: [7, 8, 9]\n" |
453 " 10: [11]\n", | 436 " 10: [11]\n", |
454 stringify(MungedRecords)); | 437 stringify(MungedRecords)); |
455 | 438 |
456 // Add more records after the second record. | 439 // Add more records after the second record. |
457 const uint64_t AddAfterSecondMore[] = { | 440 const uint64_t AddAfterSecondMore[] = { |
458 1, NaClMungedBitcode::AddAfter, 23, 24, 25, Terminator, | 441 1, NaClMungedBitcode::AddAfter, 23, 24, 25, Terminator, |
459 1, NaClMungedBitcode::AddAfter, 26, 27, 28, 29, Terminator | 442 1, NaClMungedBitcode::AddAfter, 26, 27, 28, 29, Terminator |
460 }; | 443 }; |
461 MungedRecords.munge(ARRAY_ARGS(AddAfterSecondMore)); | 444 MungedRecords.munge(ARRAY_TERM(AddAfterSecondMore)); |
462 EXPECT_EQ( | 445 EXPECT_EQ( |
463 " 1: [2, 3]\n" | 446 " 1: [2, 3]\n" |
464 " 4: [5]\n" | 447 " 4: [5]\n" |
465 " 15: [16, 17, 18]\n" | 448 " 15: [16, 17, 18]\n" |
466 " 23: [24, 25]\n" | 449 " 23: [24, 25]\n" |
467 " 26: [27, 28, 29]\n" | 450 " 26: [27, 28, 29]\n" |
468 " 12: [13, 14]\n" | 451 " 12: [13, 14]\n" |
469 " 19: [20]\n" | 452 " 19: [20]\n" |
470 " 21: [22]\n" | 453 " 21: [22]\n" |
471 " 6: [7, 8, 9]\n" | 454 " 6: [7, 8, 9]\n" |
472 " 10: [11]\n", | 455 " 10: [11]\n", |
473 stringify(MungedRecords)); | 456 stringify(MungedRecords)); |
474 } | 457 } |
475 | 458 |
476 // Do a sample combination of all possible edits. | 459 // Do a sample combination of all possible edits. |
477 TEST(NaClMungedBitcodeTest, CombinationEdits) { | 460 TEST(NaClMungedBitcodeTest, CombinationEdits) { |
478 const uint64_t Records[] = { | 461 const uint64_t Records[] = { |
479 1, 2, 3, Terminator, | 462 1, 2, 3, Terminator, |
480 4, 5, Terminator, | 463 4, 5, Terminator, |
481 6, 7, 8 , 9, Terminator, | 464 6, 7, 8 , 9, Terminator, |
482 10, 11, Terminator | 465 10, 11, Terminator |
483 }; | 466 }; |
484 | 467 |
485 NaClMungedBitcode MungedRecords(ARRAY_ARGS(Records)); | 468 NaClMungedBitcode MungedRecords(ARRAY_TERM(Records)); |
486 EXPECT_EQ( | 469 EXPECT_EQ( |
487 " 1: [2, 3]\n" | 470 " 1: [2, 3]\n" |
488 " 4: [5]\n" | 471 " 4: [5]\n" |
489 " 6: [7, 8, 9]\n" | 472 " 6: [7, 8, 9]\n" |
490 " 10: [11]\n", | 473 " 10: [11]\n", |
491 stringify(MungedRecords)); | 474 stringify(MungedRecords)); |
492 | 475 |
493 // Remove First | 476 // Remove First |
494 const uint64_t RemoveFirst[] = { | 477 const uint64_t RemoveFirst[] = { |
495 0, NaClMungedBitcode::Remove | 478 0, NaClMungedBitcode::Remove |
496 }; | 479 }; |
497 MungedRecords.munge(ARRAY_ARGS(RemoveFirst)); | 480 MungedRecords.munge(ARRAY_TERM(RemoveFirst)); |
498 EXPECT_EQ( | 481 EXPECT_EQ( |
499 " 4: [5]\n" | 482 " 4: [5]\n" |
500 " 6: [7, 8, 9]\n" | 483 " 6: [7, 8, 9]\n" |
501 " 10: [11]\n", | 484 " 10: [11]\n", |
502 stringify(MungedRecords)); | 485 stringify(MungedRecords)); |
503 | 486 |
504 // Add records after the first (base) record, which corresponds to | 487 // Add records after the first (base) record, which corresponds to |
505 // before the first record in the munged result. | 488 // before the first record in the munged result. |
506 const uint64_t AddAfterFirst[] = { | 489 const uint64_t AddAfterFirst[] = { |
507 0, NaClMungedBitcode::AddAfter, 12, 13, 14, Terminator, | 490 0, NaClMungedBitcode::AddAfter, 12, 13, 14, Terminator, |
508 0, NaClMungedBitcode::AddAfter, 15, 16, Terminator | 491 0, NaClMungedBitcode::AddAfter, 15, 16, Terminator |
509 }; | 492 }; |
510 MungedRecords.munge(ARRAY_ARGS(AddAfterFirst)); | 493 MungedRecords.munge(ARRAY_TERM(AddAfterFirst)); |
511 EXPECT_EQ( | 494 EXPECT_EQ( |
512 " 12: [13, 14]\n" | 495 " 12: [13, 14]\n" |
513 " 15: [16]\n" | 496 " 15: [16]\n" |
514 " 4: [5]\n" | 497 " 4: [5]\n" |
515 " 6: [7, 8, 9]\n" | 498 " 6: [7, 8, 9]\n" |
516 " 10: [11]\n", | 499 " 10: [11]\n", |
517 stringify(MungedRecords)); | 500 stringify(MungedRecords)); |
518 | 501 |
519 // Add records before the second (base) record, which corresponds to | 502 // Add records before the second (base) record, which corresponds to |
520 // before the third record in the munged result. | 503 // before the third record in the munged result. |
521 const uint64_t AddBeforeSecond[] = { | 504 const uint64_t AddBeforeSecond[] = { |
522 1, NaClMungedBitcode::AddBefore, 17, 18, 19, 20, Terminator, | 505 1, NaClMungedBitcode::AddBefore, 17, 18, 19, 20, Terminator, |
523 1, NaClMungedBitcode::AddBefore, 21, 22, 23, Terminator | 506 1, NaClMungedBitcode::AddBefore, 21, 22, 23, Terminator |
524 }; | 507 }; |
525 MungedRecords.munge(ARRAY_ARGS(AddBeforeSecond)); | 508 MungedRecords.munge(ARRAY_TERM(AddBeforeSecond)); |
526 EXPECT_EQ( | 509 EXPECT_EQ( |
527 " 12: [13, 14]\n" | 510 " 12: [13, 14]\n" |
528 " 15: [16]\n" | 511 " 15: [16]\n" |
529 " 17: [18, 19, 20]\n" | 512 " 17: [18, 19, 20]\n" |
530 " 21: [22, 23]\n" | 513 " 21: [22, 23]\n" |
531 " 4: [5]\n" | 514 " 4: [5]\n" |
532 " 6: [7, 8, 9]\n" | 515 " 6: [7, 8, 9]\n" |
533 " 10: [11]\n", | 516 " 10: [11]\n", |
534 stringify(MungedRecords)); | 517 stringify(MungedRecords)); |
535 | 518 |
536 // Put the first (base) record back, which will also be the first | 519 // Put the first (base) record back, which will also be the first |
537 // record in the munged result. | 520 // record in the munged result. |
538 const uint64_t ReplaceFirst[] = { | 521 const uint64_t ReplaceFirst[] = { |
539 0, NaClMungedBitcode::Replace, 1, 2, 3, Terminator | 522 0, NaClMungedBitcode::Replace, 1, 2, 3, Terminator |
540 }; | 523 }; |
541 MungedRecords.munge(ARRAY_ARGS(ReplaceFirst)); | 524 MungedRecords.munge(ARRAY_TERM(ReplaceFirst)); |
542 EXPECT_EQ( | 525 EXPECT_EQ( |
543 " 1: [2, 3]\n" | 526 " 1: [2, 3]\n" |
544 " 12: [13, 14]\n" | 527 " 12: [13, 14]\n" |
545 " 15: [16]\n" | 528 " 15: [16]\n" |
546 " 17: [18, 19, 20]\n" | 529 " 17: [18, 19, 20]\n" |
547 " 21: [22, 23]\n" | 530 " 21: [22, 23]\n" |
548 " 4: [5]\n" | 531 " 4: [5]\n" |
549 " 6: [7, 8, 9]\n" | 532 " 6: [7, 8, 9]\n" |
550 " 10: [11]\n", | 533 " 10: [11]\n", |
551 stringify(MungedRecords)); | 534 stringify(MungedRecords)); |
552 | 535 |
553 // Add before the first (base) record, which will also be before all | 536 // Add before the first (base) record, which will also be before all |
554 // other records in the munged result. | 537 // other records in the munged result. |
555 const uint64_t AddBeforeFirst[] = { | 538 const uint64_t AddBeforeFirst[] = { |
556 0, NaClMungedBitcode::AddBefore, 24, 25, 26, 27, Terminator, | 539 0, NaClMungedBitcode::AddBefore, 24, 25, 26, 27, Terminator, |
557 0, NaClMungedBitcode::AddBefore, 28, 29, Terminator, | 540 0, NaClMungedBitcode::AddBefore, 28, 29, Terminator, |
558 0, NaClMungedBitcode::AddBefore, 30, 31, 32, Terminator | 541 0, NaClMungedBitcode::AddBefore, 30, 31, 32, Terminator |
559 }; | 542 }; |
560 MungedRecords.munge(ARRAY_ARGS(AddBeforeFirst)); | 543 MungedRecords.munge(ARRAY_TERM(AddBeforeFirst)); |
561 EXPECT_EQ( | 544 EXPECT_EQ( |
562 " 24: [25, 26, 27]\n" | 545 " 24: [25, 26, 27]\n" |
563 " 28: [29]\n" | 546 " 28: [29]\n" |
564 " 30: [31, 32]\n" | 547 " 30: [31, 32]\n" |
565 " 1: [2, 3]\n" | 548 " 1: [2, 3]\n" |
566 " 12: [13, 14]\n" | 549 " 12: [13, 14]\n" |
567 " 15: [16]\n" | 550 " 15: [16]\n" |
568 " 17: [18, 19, 20]\n" | 551 " 17: [18, 19, 20]\n" |
569 " 21: [22, 23]\n" | 552 " 21: [22, 23]\n" |
570 " 4: [5]\n" | 553 " 4: [5]\n" |
571 " 6: [7, 8, 9]\n" | 554 " 6: [7, 8, 9]\n" |
572 " 10: [11]\n", | 555 " 10: [11]\n", |
573 stringify(MungedRecords)); | 556 stringify(MungedRecords)); |
574 } | 557 } |
575 | 558 |
576 } // end of namespace NaClMungedBc | 559 } // end of namespace naclmungetest |
OLD | NEW |