Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(174)

Side by Side Diff: third_party/WebKit/LayoutTests/mojo/validation.html

Issue 2745293005: Moving mojo/validation test into LayoutTests (Closed)
Patch Set: Added BUILD action to generate data files list Created 3 years, 9 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
OLDNEW
(Empty)
1 <!DOCTYPE html>
2 <script src="../resources/testharness.js"></script>
3 <script src="../resources/testharnessreport.js"></script>
4 <script src="../resources/mojo-helpers.js"></script>
5 <script src="resources/validation_test_input_parser.js"></script>
6 <script>
7 'use strict';
8
9 setup({ explicit_done: true });
10
11 define(["mojo/public/interfaces/bindings/tests/validation_test_interfaces.mojom" ,
12 "mojo/public/js/bindings",
13 "mojo/public/js/buffer",
14 "mojo/public/js/codec",
15 "mojo/public/js/core",
16 "mojo/resources/validation_test_input_parser",
17 "mojo/public/js/validator",
18 ], function(testInterface,
19 bindings,
20 buffer,
21 codec,
22 core,
23 parser,
24 validator) {
25
26 var noError = validator.validationError.NONE;
27
28 function checkData(data, expectedData, input) {
29 assert_equals(data.byteLength, expectedData.byteLength,
30 "message length (" + data.byteLength + ") doesn't match " +
31 "expected length: " + expectedData.byteLength + " for " + input);
32
33 for (var i = 0; i < data.byteLength; i++) {
34 assert_equals(data.getUint8(i), expectedData.getUint8(i),
35 'message data mismatch at byte offset ' + i + "for" + input);
36 }
37 }
38
39 test(() => {
40 var input = '[f]+.3e9 [d]-10.03';
41 var msg = parser.parseTestMessage(input);
42 var expectedData = new buffer.Buffer(12);
43 expectedData.setFloat32(0, +.3e9);
44 expectedData.setFloat64(4, -10.03);
45 checkData(msg.buffer, expectedData, input);
46 }, 'message parser: float items');
47
48 test(() => {
49 var input = '[u1]0x10// hello world !! \n\r \t [u2]65535 \n' +
50 '[u4]65536 [u8]0xFFFFFFFFFFFFF 0 0Xff';
51 var msg = parser.parseTestMessage(input);
52 var expectedData = new buffer.Buffer(17);
53 expectedData.setUint8(0, 0x10);
54 expectedData.setUint16(1, 65535);
55 expectedData.setUint32(3, 65536);
56 expectedData.setUint64(7, 0xFFFFFFFFFFFFF);
57 expectedData.setUint8(15, 0);
58 expectedData.setUint8(16, 0xff);
59 checkData(msg.buffer, expectedData, input);
60 }, 'message parser: unsigned integer items');
61
62 test(() => {
63 var input = '[s8]-0x800 [s1]-128\t[s2]+0 [s4]-40';
64 var msg = parser.parseTestMessage(input);
65 var expectedData = new buffer.Buffer(15);
66 expectedData.setInt64(0, -0x800);
67 expectedData.setInt8(8, -128);
68 expectedData.setInt16(9, 0);
69 expectedData.setInt32(11, -40);
70 checkData(msg.buffer, expectedData, input);
71 }, 'message parser: signed integer items');
72
73 test(() => {
74 var input = '[b]00001011 [b]10000000 // hello world\n [b]00000000';
75 var msg = parser.parseTestMessage(input);
76 var expectedData = new buffer.Buffer(3);
77 expectedData.setUint8(0, 11);
78 expectedData.setUint8(1, 128);
79 expectedData.setUint8(2, 0);
80 checkData(msg.buffer, expectedData, input);
81 }, 'message parser: byte items');
82
83 test(() => {
84 var input = '[dist4]foo 0 [dist8]bar 0 [anchr]foo [anchr]bar';
85 var msg = parser.parseTestMessage(input);
86 var expectedData = new buffer.Buffer(14);
87 expectedData.setUint32(0, 14);
88 expectedData.setUint8(4, 0);
89 expectedData.setUint64(5, 9);
90 expectedData.setUint8(13, 0);
91 checkData(msg.buffer, expectedData, input);
92 }, 'message parser: anchors');
93
94 test(() => {
95 var input = '// This message has handles! \n[handles]50 [u8]2';
96 var msg = parser.parseTestMessage(input);
97 var expectedData = new buffer.Buffer(8);
98 expectedData.setUint64(0, 2);
99
100 assert_equals(msg.handleCount, 50,
101 'wrong handle count (' + msg.handleConut + ') for ' + input);
102 checkData(msg.buffer, expectedData, input);
103 }, 'message parser: handles');
104
105 test(() => {
106 var msg = parser.parseTestMessage('');
107 assert_equals(msg.buffer.byteLength, 0, 'expected empty message for ');
108 }, 'message parser: empty input');
109
110 test(() => {
111 var input = ' \t // hello world \n\r \t// the answer is 42 ';
112 var msg = parser.parseTestMessage(input);
113 assert_equals(msg.buffer.byteLength, 0, 'expected empty message for ' + inpu t);
114 }, 'message parser: blank input');
115
116 test(() => {
117 function parserShouldFail(input) {
118 assert_throws(new parser.InputError(), function() {
119 parser.parseTestMessage(input);
120 });
121 }
122
123 ['/ hello world',
124 '[u1]x',
125 '[u2]-1000',
126 '[u1]0x100',
127 '[s2]-0x8001',
128 '[b]1',
129 '[b]1111111k',
130 '[dist4]unmatched',
131 '[anchr]hello [dist8]hello',
132 '[dist4]a [dist4]a [anchr]a',
133 // '[dist4]a [anchr]a [dist4]a [anchr]a',
134 '0 [handles]50'
135 ].forEach(parserShouldFail);
136 }, 'message parser: invalid input');
137
138 function fetchLite(url) {
139 return new Promise((resolve, reject) => {
140 var xhr = new XMLHttpRequest();
141 xhr.open('GET', url);
142 xhr.onreadystatechange = () => {
143 if (xhr.readyState != 4) return;
144 resolve(xhr.responseText);
145 };
146 xhr.send();
147 });
148 }
149
150 function getMessageTestFiles(prefix) {
151 fetchLite('/gen/LayoutTests/mojo/data_files.txt');
152 fetchLite('resource/help');
153 return fetchLite('/tmp/LayoutTests/mojo/data_files.txt').then((response) => {
154 console.log(response);
155 assert_not_equals(response, null);
156 var testFiles = response.split('\n');
157 assert_greater_than(testFiles.length, 0);
158 return testFiles.filter(function(s) {
159 return s.substr(-5) == ".data" && s.indexOf(prefix) == 0;
160 }).map(function(s) {
161 return '../../../../mojo/public/interfaces/bindings/tests/data/validatio n/'
162 + s.slice(0, -5);
163 });
164 });
165 }
166
167 function readTestMessage(filename) {
168 return fetchLite(filename + '.data').then((response) => {
169 assert_not_equals(response, null);
170 return parser.parseTestMessage(response);
171 });
172 }
173
174 function readTestExpected(filename) {
175 return fetchLite(filename + '.expected').then((response) => {
176 assert_not_equals(response, null);
177 return response.trim();
178 });
179 }
180
181 async function checkValidationResult(testFile, err) {
182 var actualResult = (err === noError) ? "PASS" : err;
183 var expectedResult = await readTestExpected(testFile);
184 assert_equals(actualResult, expectedResult,
185 "[Test message validation failed: " + testFile + " ]");
186 }
187
188 async function testMessageValidation(prefix, filters) {
189 var testFiles = await getMessageTestFiles(prefix);
190 assert_greater_than(testFiles.length, 0);
191
192 for (var i = 0; i < testFiles.length; i++) {
193 // TODO(hansmuller) Temporarily skipping array pointer overflow tests
194 // because JS numbers are limited to 53 bits.
195 // TODO(rudominer): Temporarily skipping 'no-such-method',
196 // 'invalid_request_flags', and 'invalid_response_flags' until additional
197 // logic in *RequestValidator and *ResponseValidator is ported from
198 // cpp to js.
199 // TODO(crbug/640298): Implement max recursion depth for JS.
200 // TODO(crbug/628104): Support struct map keys for JS.
201 if (testFiles[i].indexOf("overflow") != -1 ||
202 testFiles[i].indexOf("conformance_mthd19") != -1 ||
203 testFiles[i].indexOf("conformance_mthd20") != -1 ||
204 testFiles[i].indexOf("no_such_method") != -1 ||
205 testFiles[i].indexOf("invalid_request_flags") != -1 ||
206 testFiles[i].indexOf("invalid_response_flags") != -1) {
207 console.log("[Skipping " + testFiles[i] + "]");
208 continue;
209 }
210
211 var testMessage = await readTestMessage(testFiles[i]);
212 var handles = new Array(testMessage.handleCount);
213 var message = new codec.Message(testMessage.buffer, handles);
214 var messageValidator = new validator.Validator(message);
215
216 var err = messageValidator.validateMessageHeader();
217 for (var j = 0; err === noError && j < filters.length; ++j)
218 err = filters[j](messageValidator);
219
220 await checkValidationResult(testFiles[i], err);
221 }
222 }
223
224 promise_test(() => {
225 return testMessageValidation("conformance_", [
226 testInterface.ConformanceTestInterface.validateRequest]);
227 }, 'conformance message validation');
228
229 promise_test(() => {
230 return testMessageValidation("boundscheck_", [
231 testInterface.BoundsCheckTestInterface.validateRequest]);
232 }, 'bounds check message validation');
233
234 promise_test(() => {
235 return testMessageValidation("resp_conformance_", [
236 testInterface.ConformanceTestInterface.validateResponse]);
237 }, 'response conformance message validation');
238
239 promise_test(() => {
240 return testMessageValidation("resp_boundscheck_", [
241 testInterface.BoundsCheckTestInterface.validateResponse]);
242 }, 'response bounds check message validation');
243
244 async function testIntegratedMessageValidation(testFilesPattern, endpoint) {
245 var testFiles = await getMessageTestFiles(testFilesPattern);
246 assert_greater_than(testFiles.length, 0);
247
248 var testMessagePipe = core.createMessagePipe();
249 assert_equals(testMessagePipe.result, core.RESULT_OK);
250
251 endpoint.bind(testMessagePipe.handle1);
252 var testingController = endpoint.enableTestingMode();
253
254 var validationError;
255 testingController.setInvalidIncomingMessageHandler(function(error) {
256 validationError = error;
257 });
258
259 for (var i = 0; i < testFiles.length; i++) {
260 validationError = noError;
261 var testMessage = await readTestMessage(testFiles[i]);
262 var handles = new Array(testMessage.handleCount);
263
264 var writeMessageValue = core.writeMessage(
265 testMessagePipe.handle0,
266 new Uint8Array(testMessage.buffer.arrayBuffer),
267 new Array(testMessage.handleCount),
268 core.WRITE_MESSAGE_FLAG_NONE);
269 assert_equals(writeMessageValue, core.RESULT_OK);
270
271 testingController.waitForNextMessage();
272 await checkValidationResult(testFiles[i], validationError);
273 }
274
275 assert_equals(core.close(testMessagePipe.handle0), core.RESULT_OK);
276 }
277
278 promise_test(() => {
279 return testIntegratedMessageValidation(
280 "integration_msghdr",
281 new bindings.Binding(testInterface.IntegrationTestInterface, {})).then(( ) => {
282 return testIntegratedMessageValidation(
283 "integration_msghdr",
284 new testInterface.IntegrationTestInterfacePtr().ptr);
285 });
286 }, 'integrated message header validation');
287
288 promise_test(() => {
289 return testIntegratedMessageValidation(
290 "integration_intf_rqst",
291 new bindings.Binding(testInterface.IntegrationTestInterface, {}));
292 }, 'integrated request message validation');
293
294 promise_test(() => {
295 return testIntegratedMessageValidation(
296 "integration_intf_resp",
297 new testInterface.IntegrationTestInterfacePtr().ptr);
298 }, 'integrated response message validation');
299
300 done();
301 });
302
303 </script>
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698