OLD | NEW |
---|---|
1 // Copyright (c) 2011 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2011 The Chromium Authors. All rights reserved. |
2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
4 | 4 |
5 #include "ppapi/tests/testing_instance.h" | 5 #include "ppapi/tests/testing_instance.h" |
6 | 6 |
7 #include <algorithm> | 7 #include <algorithm> |
8 #include <cstring> | 8 #include <cstring> |
9 #include <sstream> | |
9 #include <vector> | 10 #include <vector> |
10 | 11 |
11 #include "ppapi/cpp/module.h" | 12 #include "ppapi/cpp/module.h" |
12 #include "ppapi/cpp/var.h" | 13 #include "ppapi/cpp/var.h" |
13 #include "ppapi/tests/test_case.h" | 14 #include "ppapi/tests/test_case.h" |
14 | 15 |
15 TestCaseFactory* TestCaseFactory::head_ = NULL; | 16 TestCaseFactory* TestCaseFactory::head_ = NULL; |
16 | 17 |
18 // Cookie value we use to signal "we're still working." See the comment above | |
19 // the class declaration for how this works. | |
20 static const char kProgressCookie[] = "..."; | |
polina
2011/08/22 23:53:58
s/kProgressCookie/kProgressSignal/
Otherwise, it g
| |
21 | |
17 // Returns a new heap-allocated test case for the given test, or NULL on | 22 // Returns a new heap-allocated test case for the given test, or NULL on |
18 // failure. | 23 // failure. |
19 TestingInstance::TestingInstance(PP_Instance instance) | 24 TestingInstance::TestingInstance(PP_Instance instance) |
20 #if (defined __native_client__) | 25 #if (defined __native_client__) |
21 : pp::Instance(instance), | 26 : pp::Instance(instance), |
22 #else | 27 #else |
23 : pp::InstancePrivate(instance), | 28 : pp::InstancePrivate(instance), |
24 #endif | 29 #endif |
25 current_case_(NULL), | 30 current_case_(NULL), |
31 progress_number_(0), | |
26 executed_tests_(false), | 32 executed_tests_(false), |
27 nacl_mode_(false) { | 33 nacl_mode_(false) { |
28 callback_factory_.Initialize(this); | 34 callback_factory_.Initialize(this); |
29 } | 35 } |
30 | 36 |
31 TestingInstance::~TestingInstance() { | 37 TestingInstance::~TestingInstance() { |
32 if (current_case_) | 38 if (current_case_) |
33 delete current_case_; | 39 delete current_case_; |
34 } | 40 } |
35 | 41 |
(...skipping 44 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
80 if (!executed_tests_) { | 86 if (!executed_tests_) { |
81 executed_tests_ = true; | 87 executed_tests_ = true; |
82 pp::Module::Get()->core()->CallOnMainThread( | 88 pp::Module::Get()->core()->CallOnMainThread( |
83 0, | 89 0, |
84 callback_factory_.NewCallback(&TestingInstance::ExecuteTests)); | 90 callback_factory_.NewCallback(&TestingInstance::ExecuteTests)); |
85 } | 91 } |
86 } | 92 } |
87 | 93 |
88 void TestingInstance::LogTest(const std::string& test_name, | 94 void TestingInstance::LogTest(const std::string& test_name, |
89 const std::string& error_message) { | 95 const std::string& error_message) { |
96 // Tell the browser we're still working. | |
97 ReportProgress(kProgressCookie); | |
98 | |
90 std::string html; | 99 std::string html; |
91 html.append("<div class=\"test_line\"><span class=\"test_name\">"); | 100 html.append("<div class=\"test_line\"><span class=\"test_name\">"); |
92 html.append(test_name); | 101 html.append(test_name); |
93 html.append("</span> "); | 102 html.append("</span> "); |
94 if (error_message.empty()) { | 103 if (error_message.empty()) { |
95 html.append("<span class=\"pass\">PASS</span>"); | 104 html.append("<span class=\"pass\">PASS</span>"); |
96 } else { | 105 } else { |
97 html.append("<span class=\"fail\">FAIL</span>: <span class=\"err_msg\">"); | 106 html.append("<span class=\"fail\">FAIL</span>: <span class=\"err_msg\">"); |
98 html.append(error_message); | 107 html.append(error_message); |
99 html.append("</span>"); | 108 html.append("</span>"); |
100 | 109 |
101 if (!errors_.empty()) | 110 if (!errors_.empty()) |
102 errors_.append(", "); // Separator for different error messages. | 111 errors_.append(", "); // Separator for different error messages. |
103 errors_.append(test_name + " FAIL: " + error_message); | 112 errors_.append(test_name + " FAIL: " + error_message); |
104 } | 113 } |
105 html.append("</div>"); | 114 html.append("</div>"); |
106 LogHTML(html); | 115 LogHTML(html); |
107 } | 116 } |
108 | 117 |
109 void TestingInstance::AppendError(const std::string& message) { | 118 void TestingInstance::AppendError(const std::string& message) { |
110 if (!errors_.empty()) | 119 if (!errors_.empty()) |
111 errors_.append(", "); | 120 errors_.append(", "); |
112 errors_.append(message); | 121 errors_.append(message); |
113 } | 122 } |
114 | 123 |
115 void TestingInstance::ExecuteTests(int32_t unused) { | 124 void TestingInstance::ExecuteTests(int32_t unused) { |
116 SetCookie("STARTUP_COOKIE", "STARTED"); | 125 ReportProgress(kProgressCookie); |
117 | 126 |
118 // Clear the console. | 127 // Clear the console. |
119 PostMessage(pp::Var("TESTING_MESSAGE:ClearConsole")); | 128 PostMessage(pp::Var("TESTING_MESSAGE:ClearConsole")); |
120 | 129 |
121 if (!errors_.empty()) { | 130 if (!errors_.empty()) { |
122 // Catch initialization errors and output the current error string to | 131 // Catch initialization errors and output the current error string to |
123 // the console. | 132 // the console. |
124 LogError("Plugin initialization failed: " + errors_); | 133 LogError("Plugin initialization failed: " + errors_); |
125 } else if (!current_case_) { | 134 } else if (!current_case_) { |
126 LogAvailableTests(); | 135 LogAvailableTests(); |
127 errors_.append("FAIL: Only listed tests"); | 136 errors_.append("FAIL: Only listed tests"); |
128 } else { | 137 } else { |
129 current_case_->RunTest(); | 138 current_case_->RunTest(); |
130 // Automated PyAuto tests rely on finding the exact strings below. | 139 // Automated PyAuto tests rely on finding the exact strings below. |
131 LogHTML(errors_.empty() ? | 140 LogHTML(errors_.empty() ? |
132 "<span class=\"pass\">[SHUTDOWN]</span> All tests passed." : | 141 "<span class=\"pass\">[SHUTDOWN]</span> All tests passed." : |
133 "<span class=\"fail\">[SHUTDOWN]</span> Some tests failed."); | 142 "<span class=\"fail\">[SHUTDOWN]</span> Some tests failed."); |
134 } | 143 } |
135 | 144 |
136 // Declare we're done by setting a cookie to either "PASS" or the errors. | 145 // Declare we're done by setting a cookie to either "PASS" or the errors. |
137 SetCookie("COMPLETION_COOKIE", errors_.empty() ? "PASS" : errors_); | 146 ReportProgress(errors_.empty() ? "PASS" : errors_); |
138 PostMessage(pp::Var("TESTING_MESSAGE:DidExecuteTests")); | 147 PostMessage(pp::Var("TESTING_MESSAGE:DidExecuteTests")); |
139 } | 148 } |
140 | 149 |
141 TestCase* TestingInstance::CaseForTestName(const char* name) { | 150 TestCase* TestingInstance::CaseForTestName(const char* name) { |
142 TestCaseFactory* iter = TestCaseFactory::head_; | 151 TestCaseFactory* iter = TestCaseFactory::head_; |
143 while (iter != NULL) { | 152 while (iter != NULL) { |
144 if (std::strcmp(name, iter->name_) == 0) | 153 if (std::strcmp(name, iter->name_) == 0) |
145 return iter->method_(this); | 154 return iter->method_(this); |
146 iter = iter->next_; | 155 iter = iter->next_; |
147 } | 156 } |
(...skipping 34 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
182 html.append("</span>"); | 191 html.append("</span>"); |
183 LogHTML(html); | 192 LogHTML(html); |
184 } | 193 } |
185 | 194 |
186 void TestingInstance::LogHTML(const std::string& html) { | 195 void TestingInstance::LogHTML(const std::string& html) { |
187 std::string message("TESTING_MESSAGE:LogHTML:"); | 196 std::string message("TESTING_MESSAGE:LogHTML:"); |
188 message.append(html); | 197 message.append(html); |
189 PostMessage(pp::Var(message)); | 198 PostMessage(pp::Var(message)); |
190 } | 199 } |
191 | 200 |
201 void TestingInstance::ReportProgress(const std::string& progress_value) { | |
202 // Use streams since nacl doesn't compile base yet (for stringprintf). | |
polina
2011/08/22 23:53:58
StringPrintf?
| |
203 std::ostringstream cookie_name; | |
204 cookie_name << "PPAPI_PROGRESS_" << progress_number_; | |
205 SetCookie(cookie_name.str(), progress_value); | |
206 progress_number_++; | |
207 } | |
208 | |
192 void TestingInstance::SetCookie(const std::string& name, | 209 void TestingInstance::SetCookie(const std::string& name, |
193 const std::string& value) { | 210 const std::string& value) { |
194 std::string message("TESTING_MESSAGE:SetCookie:"); | 211 std::string message("TESTING_MESSAGE:SetCookie:"); |
195 message.append(name); | 212 message.append(name); |
196 message.append("="); | 213 message.append("="); |
197 message.append(value); | 214 message.append(value); |
198 PostMessage(pp::Var(message)); | 215 PostMessage(pp::Var(message)); |
199 } | 216 } |
200 | 217 |
201 class Module : public pp::Module { | 218 class Module : public pp::Module { |
202 public: | 219 public: |
203 Module() : pp::Module() {} | 220 Module() : pp::Module() {} |
204 virtual ~Module() {} | 221 virtual ~Module() {} |
205 | 222 |
206 virtual pp::Instance* CreateInstance(PP_Instance instance) { | 223 virtual pp::Instance* CreateInstance(PP_Instance instance) { |
207 return new TestingInstance(instance); | 224 return new TestingInstance(instance); |
208 } | 225 } |
209 }; | 226 }; |
210 | 227 |
211 namespace pp { | 228 namespace pp { |
212 | 229 |
213 Module* CreateModule() { | 230 Module* CreateModule() { |
214 return new ::Module(); | 231 return new ::Module(); |
215 } | 232 } |
216 | 233 |
217 } // namespace pp | 234 } // namespace pp |
OLD | NEW |