OLD | NEW |
1 <!DOCTYPE html> | 1 <!DOCTYPE html> |
2 <!-- | 2 <!-- |
3 Copyright (c) 2012 The Chromium Authors. All rights reserved. | 3 Copyright (c) 2012 The Chromium Authors. All rights reserved. |
4 Use of this source code is governed by a BSD-style license that can be | 4 Use of this source code is governed by a BSD-style license that can be |
5 found in the LICENSE file. | 5 found in the LICENSE file. |
6 --> | 6 --> |
7 <html> | 7 <html> |
8 <head> | 8 <head> |
9 <title> | 9 <title> |
10 NativeClient browser test runner | 10 NativeClient browser test runner |
(...skipping 26 matching lines...) Expand all Loading... |
37 // http://code.google.com/p/chromium/issues/detail?id=103588 | 37 // http://code.google.com/p/chromium/issues/detail?id=103588 |
38 ForcePluginLoadOnTimeout(embed, tester, 15000); | 38 ForcePluginLoadOnTimeout(embed, tester, 15000); |
39 | 39 |
40 var div = document.createElement('div'); | 40 var div = document.createElement('div'); |
41 div.appendChild(embed); | 41 div.appendChild(embed); |
42 | 42 |
43 var cleanup = function() { | 43 var cleanup = function() { |
44 document.getElementById('scratch_space').removeChild(div); | 44 document.getElementById('scratch_space').removeChild(div); |
45 }; | 45 }; |
46 | 46 |
47 // This is the prefix prepended by NaCl's unofficial | |
48 // "dev://postmessage" feature. | |
49 var stdout_prefix = 'DEBUG_POSTMESSAGE:'; | |
50 | |
51 // NaCl's "dev://postmessage" feature is unsynchronized, in the | |
52 // sense that the DEBUG_POSTMESSAGE messages can arrive after the | |
53 // test result event. As a workaround, we look for an | |
54 // "END_OF_LOG" string that the nexe prints. | |
55 var saw_end_of_log = false; | |
56 var end_of_log_callbacks = []; | |
57 | |
58 var runEndOfLogCallbacks = function() { | |
59 if (!saw_end_of_log) { | |
60 saw_end_of_log = true; | |
61 for (var i = 0; i < end_of_log_callbacks.length; i++) { | |
62 end_of_log_callbacks[i](); | |
63 } | |
64 end_of_log_callbacks = []; | |
65 } | |
66 }; | |
67 | |
68 var callAtEndOfLog = function(func) { | |
69 if (saw_end_of_log) { | |
70 func(); | |
71 } else { | |
72 end_of_log_callbacks.push(func); | |
73 // If we do not see the end of the log soon, end the test | |
74 // anyway. This will happen if the nexe crashes or exits. | |
75 window.setTimeout(status.wrap(function() { | |
76 status.log('Did not see the END_OF_LOG message after timeout; ' + | |
77 'continuing anyway'); | |
78 runEndOfLogCallbacks(); | |
79 }), 500); | |
80 } | |
81 }; | |
82 | |
83 // Set up an event listener for success messages. | 47 // Set up an event listener for success messages. |
84 div.addEventListener('message', status.wrap(function(message_event) { | 48 div.addEventListener('message', status.wrap(function(message_event) { |
85 if (message_event.data.substr(0, stdout_prefix.length) == stdout_prefix) { | 49 status.assertEqual(message_event.data, 'passed'); |
86 var msg = message_event.data.substr(stdout_prefix.length); | 50 cleanup(); |
87 if (msg == '\nEND_OF_LOG\n') { | 51 status.pass(); |
88 runEndOfLogCallbacks(); | |
89 } else { | |
90 status.log(msg.replace(/\n/g, '\\n')); | |
91 } | |
92 } else { | |
93 callAtEndOfLog(function() { | |
94 status.assertEqual(message_event.data, 'passed'); | |
95 cleanup(); | |
96 status.pass(); | |
97 }); | |
98 } | |
99 }), true); | 52 }), true); |
100 | 53 |
101 // Wait for the load event, which indicates successful loading. | 54 // Wait for the load event, which indicates successful loading. |
102 div.addEventListener('load', status.wrap(function(e) { | 55 div.addEventListener('load', status.wrap(function(e) { |
103 status.log('Loaded ' + embed.src); | 56 status.log('Loaded ' + embed.src); |
104 // Start tests in the module. | 57 // Start tests in the module. |
105 embed.postMessage('run_tests'); | 58 embed.postMessage('run_tests'); |
106 }), true); | 59 }), true); |
107 | 60 |
108 var onError = status.wrap(function(e) { | 61 var onError = status.wrap(function(e) { |
109 callAtEndOfLog(function() { | 62 cleanup(); |
110 cleanup(); | 63 status.fail(embed.lastError); |
111 status.fail(embed.lastError); | |
112 }); | |
113 }); | 64 }); |
114 | 65 |
115 div.addEventListener('error', onError, true); | 66 div.addEventListener('error', onError, true); |
116 div.addEventListener('crash', onError, true); | 67 div.addEventListener('crash', onError, true); |
117 | 68 |
118 // Insert div into the DOM. This starts the load of the nacl plugin, etc. | 69 // Insert div into the DOM. This starts the load of the nacl plugin, etc. |
119 document.getElementById('scratch_space').appendChild(div); | 70 document.getElementById('scratch_space').appendChild(div); |
120 }); | 71 }); |
121 } | 72 } |
122 | 73 |
123 // Remove the "failed to load" message. | 74 // Remove the "failed to load" message. |
124 document.getElementById('load_warning').innerHTML = ''; | 75 document.getElementById('load_warning').innerHTML = ''; |
125 | 76 |
126 var tester = new Tester(); | 77 var tester = new Tester(); |
127 for (var i = 0; i < G_NMF_TEST_LIST.length; i++) { | 78 for (var i = 0; i < G_NMF_TEST_LIST.length; i++) { |
128 addTest(tester, G_NMF_TEST_LIST[i]); | 79 addTest(tester, G_NMF_TEST_LIST[i]); |
129 } | 80 } |
130 | 81 |
131 var args = getTestArguments({'parallel': '0'}); | 82 var args = getTestArguments({'parallel': '0'}); |
132 | 83 |
133 if (parseInt(args['parallel'])) { | 84 if (parseInt(args['parallel'])) { |
134 tester.runParallel(); | 85 tester.runParallel(); |
135 } else { | 86 } else { |
136 tester.run(); | 87 tester.run(); |
137 } | 88 } |
138 | 89 |
139 </script> | 90 </script> |
140 </body> | 91 </body> |
141 </html> | 92 </html> |
OLD | NEW |