1 // Copyright (c) 2012 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 #ifndef PPAPI_TESTS_TEST_CASE_H_
6 #define PPAPI_TESTS_TEST_CASE_H_
7
8 #include <cmath>
9 #include <limits>
10 #include <map>
11 #include <set>
12 #include <sstream>
13 #include <string>
14
15 #include "ppapi/c/pp_resource.h"
16 #include "ppapi/c/pp_time.h"
17 #include "ppapi/c/private/ppb_testing_private.h"
18 #include "ppapi/cpp/dev/scrollbar_dev.h"
19 #include "ppapi/cpp/message_loop.h"
20 #include "ppapi/cpp/view.h"
21 #include "ppapi/tests/test_utils.h"
22 #include "ppapi/tests/testing_instance.h"
23
24 #if (defined __native_client__)
25 #include "ppapi/cpp/var.h"
26 #else
27 #include "ppapi/cpp/private/var_private.h"
28 #endif
29
30 class TestingInstance;
31
32 namespace pp {
33 namespace deprecated {
34 class ScriptableObject;
35 }
36 }
37
38 // Individual classes of tests derive from this generic test case.
39 class TestCase {
40 public:
41 explicit TestCase(TestingInstance* instance);
42 virtual ~TestCase();
43
44 // Optionally override to do testcase specific initialization.
45 // Default implementation just returns true.
46 virtual bool Init();
47
48 // Override to implement the test case. It will be called after the plugin is
49 // first displayed, passing a string. If the string is empty, RunTests should
50 // run all tests for this test case. Otherwise, it must be a comma-delimited
51 // list of test names, possibly prefixed. E.g.:
52 // "Foo_GoodTest,DISABLED_Foo_BadTest,Foo_OtherGoodTest"
53 // All listed tests which are not prefixed will be run.
54 //
55 // This should generally be implemented in a TestCase subclass using the
56 // RUN_TEST* macros.
57 virtual void RunTests(const std::string& test_filter) = 0;
58
59 static std::string MakeFailureMessage(const char* file, int line,
60 const char* cmd);
61
62 #if !(defined __native_client__)
63 // Returns the scriptable test object for the current test, if any.
64 // Internally, this uses CreateTestObject which each test overrides.
65 pp::VarPrivate GetTestObject();
ResetTestObject()66 void ResetTestObject() { test_object_ = pp::VarPrivate(); }
67 #endif
68
69 // A function that is invoked whenever HandleMessage is called on the
70 // associated TestingInstance. Default implementation does nothing. TestCases
71 // that want to handle incoming postMessage events should override this
72 // method.
73 virtual void HandleMessage(const pp::Var& message_data);
74
75 // A function that is invoked whenever DidChangeView is called on the
76 // associated TestingInstance. Default implementation does nothing. TestCases
77 // that want to handle view changes should override this method.
78 virtual void DidChangeView(const pp::View& view);
79
80 // A function that is invoked whenever HandleInputEvent is called on the
81 // associated TestingInstance. Default implementation returns false. TestCases
82 // that want to handle view changes should override this method.
83 virtual bool HandleInputEvent(const pp::InputEvent& event);
84
85 void IgnoreLeakedVar(int64_t id);
86
instance()87 TestingInstance* instance() { return instance_; }
88
testing_interface()89 const PPB_Testing_Private* testing_interface() { return testing_interface_; }
90
91 static void QuitMainMessageLoop(PP_Instance instance);
92
remaining_tests()93 const std::map<std::string, bool>& remaining_tests() {
94 return remaining_tests_;
95 }
skipped_tests()96 const std::set<std::string>& skipped_tests() {
97 return skipped_tests_;
98 }
99
100 protected:
101 #if !(defined __native_client__)
102 // Overridden by each test to supply a ScriptableObject corresponding to the
103 // test. There can only be one object created for all tests in a given class,
104 // so be sure your object is designed to be re-used.
105 //
106 // This object should be created on the heap. Ownership will be passed to the
107 // caller. Return NULL if there is no supported test object (the default).
108 virtual pp::deprecated::ScriptableObject* CreateTestObject();
109 #endif
110
111 // Checks whether the testing interface is available. Returns true if it is,
112 // false otherwise. If it is not available, adds a descriptive error. This is
113 // for use by tests that require the testing interface.
114 bool CheckTestingInterface();
115
116 // Makes sure the test is run over HTTP.
117 bool EnsureRunningOverHTTP();
118
119 // Returns true if |filter| only contains a TestCase name, which normally
120 // means "run all tests". Some TestCases require special setup for individual
121 // tests, and can use this function to decide whether to ignore those tests.
122 bool ShouldRunAllTests(const std::string& filter);
123
124 // Return true if the given test name matches the filter. This is true if
125 // (a) filter is empty or (b) test_name matches a test name listed in filter
126 // exactly.
127 bool ShouldRunTest(const std::string& test_name, const std::string& filter);
128
129 // Check for leaked resources and vars at the end of the test. If any exist,
130 // return a string with some information about the error. Otherwise, return
131 // an empty string.
132 //
133 // You should pass the error string from the test so far; if it is non-empty,
134 // CheckResourcesAndVars will do nothing and return the same string.
135 std::string CheckResourcesAndVars(std::string errors);
136
137 PP_TimeTicks NowInTimeTicks();
138
139 // Run the given test method on a background thread and return the result.
140 template <class T>
RunOnThread(std::string (T::* test_to_run)())141 std::string RunOnThread(std::string(T::*test_to_run)()) {
142 if (!testing_interface_) {
143 return "Testing blocking callbacks requires the testing interface. In "
144 "Chrome, use the --enable-pepper-testing flag.";
145 }
146 // These tests are only valid if running out-of-process (threading is not
147 // supported in-process). For in-process, just consider it a pass.
148 if (!testing_interface_->IsOutOfProcess())
149 return std::string();
150 pp::MessageLoop background_loop(instance_);
151 ThreadedTestRunner<T> runner(instance_->pp_instance(),
152 static_cast<T*>(this), test_to_run, background_loop);
153 RunOnThreadInternal(&ThreadedTestRunner<T>::ThreadFunction, &runner,
154 testing_interface_);
155 return runner.result();
156 }
157
158 // Pointer to the instance that owns us.
159 TestingInstance* instance_;
160
161 // NULL unless InitTestingInterface is called.
162 const PPB_Testing_Private* testing_interface_;
163
set_callback_type(CallbackType callback_type)164 void set_callback_type(CallbackType callback_type) {
165 callback_type_ = callback_type;
166 }
callback_type()167 CallbackType callback_type() const {
168 return callback_type_;
169 }
170
171 private:
172 template <class T>
173 class ThreadedTestRunner {
174 public:
175 typedef std::string(T::*TestMethodType)();
ThreadedTestRunner(PP_Instance instance,T * test_case,TestMethodType test_to_run,pp::MessageLoop loop)176 ThreadedTestRunner(PP_Instance instance,
177 T* test_case,
178 TestMethodType test_to_run,
179 pp::MessageLoop loop)
180 : instance_(instance),
181 test_case_(test_case),
182 test_to_run_(test_to_run),
183 loop_(loop) {
184 }
result()185 const std::string& result() { return result_; }
ThreadFunction(void * runner)186 static void ThreadFunction(void* runner) {
187 static_cast<ThreadedTestRunner<T>*>(runner)->Run();
188 }
189
190 private:
Run()191 void Run() {
192 int32_t result = loop_.AttachToCurrentThread();
193 static_cast<void>(result); // result is not used in the RELEASE build.
194 PP_DCHECK(PP_OK == result);
195 result_ = (test_case_->*test_to_run_)();
196 // Now give the loop a chance to clean up.
197 loop_.PostQuit(true /* should_destroy */);
198 loop_.Run();
199 // Tell the main thread to quit its nested message loop, now that the test
200 // is complete.
201 TestCase::QuitMainMessageLoop(instance_);
202 }
203
204 std::string result_;
205 PP_Instance instance_;
206 T* test_case_;
207 TestMethodType test_to_run_;
208 pp::MessageLoop loop_;
209 };
210
211 // The internals for RunOnThread. This allows us to avoid including
212 // pp_thread.h in this header file, since it includes system headers like
213 // windows.h.
214 // RunOnThreadInternal launches a new thread to run |thread_func|, waits
215 // for it to complete using RunMessageLoop(), then joins.
216 void RunOnThreadInternal(void (*thread_func)(void*),
217 void* thread_param,
218 const PPB_Testing_Private* testing_interface);
219
220 static void DoQuitMainMessageLoop(void* pp_instance, int32_t result);
221
222 // Passed when creating completion callbacks in some tests. This determines
223 // what kind of callback we use for the test.
224 CallbackType callback_type_;
225
226 // Var ids that should be ignored when checking for leaks on shutdown.
227 std::set<int64_t> ignored_leaked_vars_;
228
229 // The tests that were found in test_filter. The bool indicates whether the
230 // test should be run (i.e., it will be false if the test name was prefixed in
231 // the test_filter string).
232 //
233 // This is initialized lazily the first time that ShouldRunTest is called.
234 std::map<std::string, bool> filter_tests_;
235 // Flag indicating whether we have populated filter_tests_ yet.
236 bool have_populated_filter_tests_;
237 // This is initialized with the contents of filter_tests_. As each test is
238 // run, it is removed from remaining_tests_. When RunTests is finished,
239 // remaining_tests_ should be empty. Any remaining tests are tests that were
240 // listed in the test_filter but didn't match any calls to ShouldRunTest,
241 // meaning it was probably a typo. TestingInstance should log this and
242 // consider it a failure.
243 std::map<std::string, bool> remaining_tests_;
244
245 // If ShouldRunTest is called but the given test name doesn't match anything
246 // in the test_filter, the test name will be added here. This allows
247 // TestingInstance to detect when not all tests were listed.
248 std::set<std::string> skipped_tests_;
249
250 #if !(defined __native_client__)
251 // Holds the test object, if any was retrieved from CreateTestObject.
252 pp::VarPrivate test_object_;
253 #endif
254 };
255
256 // This class is an implementation detail.
257 class TestCaseFactory {
258 public:
259 typedef TestCase* (*Method)(TestingInstance* instance);
260
TestCaseFactory(const char * name,Method method)261 TestCaseFactory(const char* name, Method method)
262 : next_(head_),
263 name_(name),
264 method_(method) {
265 head_ = this;
266 }
267
268 private:
269 friend class TestingInstance;
270
271 TestCaseFactory* next_;
272 const char* name_;
273 Method method_;
274
275 static TestCaseFactory* head_;
276 };
277
278 namespace internal {
279
280 // The internal namespace contains implementation details that are used by
281 // the ASSERT macros.
282
283 // This base class provides a ToString that works for classes that can be
284 // converted to a string using std::stringstream. Later, we'll do
285 // specializations for types that we know will work with this approach.
286 template <class T>
287 struct StringinatorBase {
ToStringStringinatorBase288 static std::string ToString(const T& value) {
289 std::stringstream stream;
290 stream << value;
291 return stream.str();
292 }
293 protected:
294 // Not implemented, do not use.
295 // Note, these are protected because Windows complains if I make these private
296 // and then inherit StringinatorBase (even though they're never used).
297 StringinatorBase();
298 ~StringinatorBase();
299 };
300
301 // This default class template is for types that we don't recognize as
302 // something we can convert into a string using stringstream. Types that we
303 // know *can* be turned to a string should have specializations below.
304 template <class T>
305 struct Stringinator {
ToStringStringinator306 static std::string ToString(const T& value) {
307 return std::string();
308 }
309 private:
310 // Not implemented, do not use.
311 Stringinator();
312 ~Stringinator();
313 };
314
315 // Define some full specializations for types that can just use stringstream.
316 #define DEFINE_STRINGINATOR_FOR_TYPE(type) \
317 template <> \
318 struct Stringinator<type> : public StringinatorBase<type> {};
319 DEFINE_STRINGINATOR_FOR_TYPE(int32_t);
320 DEFINE_STRINGINATOR_FOR_TYPE(uint32_t);
321 DEFINE_STRINGINATOR_FOR_TYPE(int64_t);
322 DEFINE_STRINGINATOR_FOR_TYPE(uint64_t);
323 DEFINE_STRINGINATOR_FOR_TYPE(float);
324 DEFINE_STRINGINATOR_FOR_TYPE(double);
325 DEFINE_STRINGINATOR_FOR_TYPE(bool);
326 DEFINE_STRINGINATOR_FOR_TYPE(std::string);
327 #undef DEFINE_STRINGINATOR_FOR_TYPE
328
329 template <class T>
ToString(const T & param)330 std::string ToString(const T& param) {
331 return Stringinator<T>::ToString(param);
332 }
333
334 // This overload is necessary to allow enum values (such as those from
335 // pp_errors.h, including PP_OK) to work. They won't automatically convert to
336 // an integral type to instantiate the above function template.
ToString(int32_t param)337 inline std::string ToString(int32_t param) {
338 return Stringinator<int32_t>::ToString(param);
339 }
340
ToString(const char * c_string)341 inline std::string ToString(const char* c_string) {
342 return std::string(c_string);
343 }
344
345 // This overload deals with pointers.
346 template <class T>
ToString(const T * ptr)347 std::string ToString(const T* ptr) {
348 uintptr_t ptr_val = reinterpret_cast<uintptr_t>(ptr);
349 std::stringstream stream;
350 stream << ptr_val;
351 return stream.str();
352 }
353
354 // ComparisonHelper classes wrap the left-hand parameter of a binary comparison
355 // ASSERT. The correct class gets chosen based on whether or not it's a NULL or
356 // 0 literal. If it is a NULL/0 literal, we use NullLiteralComparisonHelper.
357 // For all other parameters, we use ComparisonHelper. There's also a
358 // specialization of ComparisonHelper for int below (see below for why
359 // that is.)
360 //
361 // ComparisonHelper does two things for the left param:
362 // 1) Provides all the appropriate CompareXX functions (CompareEQ, etc).
363 // 2) Provides ToString.
364 template <class T>
365 struct ComparisonHelper {
ComparisonHelperComparisonHelper366 explicit ComparisonHelper(const T& param) : value(param) {}
367 template <class U>
CompareEQComparisonHelper368 bool CompareEQ(const U& right) const {
369 return value == right;
370 }
371 template <class U>
CompareNEComparisonHelper372 bool CompareNE(const U& right) const {
373 return value != right;
374 }
375 template <class U>
CompareLTComparisonHelper376 bool CompareLT(const U& right) const {
377 return value < right;
378 }
379 template <class U>
CompareGTComparisonHelper380 bool CompareGT(const U& right) const {
381 return value > right;
382 }
383 template <class U>
CompareLEComparisonHelper384 bool CompareLE(const U& right) const {
385 return value <= right;
386 }
387 template <class U>
CompareGEComparisonHelper388 bool CompareGE(const U& right) const {
389 return value >= right;
390 }
ToStringComparisonHelper391 std::string ToString() const {
392 return internal::ToString(value);
393 }
394 const T& value;
395 };
396
397 // Used for NULL or 0.
398 struct NullLiteralComparisonHelper {
NullLiteralComparisonHelperNullLiteralComparisonHelper399 NullLiteralComparisonHelper() : value(0) {}
400 template <class U>
CompareEQNullLiteralComparisonHelper401 bool CompareEQ(const U& right) const {
402 return 0 == right;
403 }
404 template <class U>
CompareNENullLiteralComparisonHelper405 bool CompareNE(const U& right) const {
406 return 0 != right;
407 }
408 template <class U>
CompareLTNullLiteralComparisonHelper409 bool CompareLT(const U& right) const {
410 return 0 < right;
411 }
412 template <class U>
CompareGTNullLiteralComparisonHelper413 bool CompareGT(const U& right) const {
414 return 0 > right;
415 }
416 template <class U>
CompareLENullLiteralComparisonHelper417 bool CompareLE(const U& right) const {
418 return 0 <= right;
419 }
420 template <class U>
CompareGENullLiteralComparisonHelper421 bool CompareGE(const U& right) const {
422 return 0 >= right;
423 }
ToStringNullLiteralComparisonHelper424 std::string ToString() const {
425 return std::string("0");
426 }
427 const int value;
428 };
429
430 // This class makes it safe to use an integer literal (like 5, or 123) when
431 // comparing with an unsigned. For example:
432 // ASSERT_EQ(1, some_vector.size());
433 // We do a lot of those comparisons, so this makes it easy to get it right
434 // (rather than forcing assertions to use unsigned literals like 5u or 123u).
435 //
436 // This is slightly risky; we're static_casting an int to whatever's on the
437 // right. If the left value is negative and the right hand side is a large
438 // unsigned value, it's possible that the comparison will succeed when maybe
439 // it shouldn't have.
440 // TODO(dmichael): It should be possible to fix this and upgrade int32_t and
441 // uint32_t to int64_t for the comparison, and make any unsafe
442 // comparisons into compile errors.
443 template <>
444 struct ComparisonHelper<int> {
445 explicit ComparisonHelper(int param) : value(param) {}
446 template <class U>
447 bool CompareEQ(const U& right) const {
448 return static_cast<U>(value) == right;
449 }
450 template <class U>
451 bool CompareNE(const U& right) const {
452 return static_cast<U>(value) != right;
453 }
454 template <class U>
455 bool CompareLT(const U& right) const {
456 return static_cast<U>(value) < right;
457 }
458 template <class U>
459 bool CompareGT(const U& right) const {
460 return static_cast<U>(value) > right;
461 }
462 template <class U>
463 bool CompareLE(const U& right) const {
464 return static_cast<U>(value) <= right;
465 }
466 template <class U>
467 bool CompareGE(const U& right) const {
468 return static_cast<U>(value) >= right;
469 }
470 std::string ToString() const {
471 return internal::ToString(value);
472 }
473 const int value;
474 private:
475 };
476
477 // The default is for the case there the parameter is *not* a NULL or 0 literal.
478 template <bool is_null_literal>
479 struct ParameterWrapper {
480 template <class T>
481 static ComparisonHelper<T> WrapValue(const T& value) {
482 return ComparisonHelper<T>(value);
483 }
484 // This overload is so that we can deal with values from anonymous enums,
485 // like the one in pp_errors.h. The function template above won't be
486 // considered a match by the compiler.
487 static ComparisonHelper<int> WrapValue(int value) {
488 return ComparisonHelper<int>(value);
489 }
490 };
491
492 // The parameter to WrapValue *is* a NULL or 0 literal.
493 template <>
494 struct ParameterWrapper<true> {
495 // We just use "..." and ignore the parameter. This sidesteps some problems we
496 // would run in to (not all compilers have the same set of constraints).
497 // - We can't use a pointer type, because int and enums won't convert.
498 // - We can't use an integral type, because pointers won't convert.
499 // - We can't overload, because it will sometimes be ambiguous.
500 // - We can't templatize and deduce the parameter. Some compilers will deduce
501 // int for NULL, and then refuse to convert NULL to an int.
502 //
503 // We know in this case that the value is 0, so there's no need to capture the
504 // value. We also know it's a fundamental type, so it's safe to pass to "...".
505 // (It's illegal to pass non-POD types to ...).
506 static NullLiteralComparisonHelper WrapValue(...) {
507 return NullLiteralComparisonHelper();
508 }
509 };
510
511 // IS_NULL_LITERAL(type) is a little template metaprogramming for determining
512 // if a type is a null or zero literal (NULL or 0 or a constant that evaluates
513 // to one of those).
514 // The idea is that for NULL or 0, any pointer type is always a better match
515 // than "...". But no other pointer types or literals should convert
516 // automatically to InternalDummyClass.
517 struct InternalDummyClass {};
518 char TestNullLiteral(const InternalDummyClass*);
519 struct BiggerThanChar { char dummy[2]; };
520 BiggerThanChar TestNullLiteral(...);
521 // If the compiler chooses the overload of TestNullLiteral which returns char,
522 // then we know the value converts automatically to InternalDummyClass*, which
523 // should only be true of NULL and 0 constants.
524 #define IS_NULL_LITERAL(a) sizeof(internal::TestNullLiteral(a)) == sizeof(char)
525
526 template <class T, class U>
527 static std::string MakeBinaryComparisonFailureMessage(
528 const char* comparator,
529 const T& left,
530 const U& right,
531 const char* left_precompiler_string,
532 const char* right_precompiler_string,
533 const char* file_name,
534 int line_number) {
535 std::string error_msg =
536 std::string("Failed ASSERT_") + comparator + "(" +
537 left_precompiler_string + ", " + right_precompiler_string + ")";
538 std::string left_string(left.ToString());
539 std::string right_string(ToString(right));
540 if (!left_string.empty())
541 error_msg += " Left: (" + left_string + ")";
542
543 if (!right_string.empty())
544 error_msg += " Right: (" + right_string + ")";
545
546 return TestCase::MakeFailureMessage(file_name, line_number,
547 error_msg.c_str());
548 }
549
550 // The Comparison function templates allow us to pass the parameter for
551 // ASSERT macros below and have them be evaluated only once. This is important
552 // for cases where the parameter might be an expression with side-effects, like
553 // a function call.
554 #define DEFINE_COMPARE_FUNCTION(comparator_name) \
555 template <class T, class U> \
556 std::string Compare ## comparator_name ( \
557 const T& left, \
558 const U& right, \
559 const char* left_precompiler_string, \
560 const char* right_precompiler_string, \
561 const char* file_name, \
562 int line_num) { \
563 if (!(left.Compare##comparator_name(right))) { \
564 return MakeBinaryComparisonFailureMessage(#comparator_name, \
565 left, \
566 right, \
567 left_precompiler_string, \
568 right_precompiler_string, \
569 file_name, \
570 line_num); \
571 } \
572 return std::string(); \
573 }
574 DEFINE_COMPARE_FUNCTION(EQ)
575 DEFINE_COMPARE_FUNCTION(NE)
576 DEFINE_COMPARE_FUNCTION(LT)
577 DEFINE_COMPARE_FUNCTION(LE)
578 DEFINE_COMPARE_FUNCTION(GT)
579 DEFINE_COMPARE_FUNCTION(GE)
580 #undef DEFINE_COMPARE_FUNCTION
581 inline std::string CompareDoubleEq(ComparisonHelper<double> left,
582 double right,
583 const char* left_precompiler_string,
584 const char* right_precompiler_string,
585 const char* file_name,
586 int linu_num) {
587 if (!(std::fabs(left.value - right) <=
588 std::numeric_limits<double>::epsilon())) {
589 return MakeBinaryComparisonFailureMessage(
590 "~=", left, right, left_precompiler_string, right_precompiler_string,
591 __FILE__, __LINE__);
592 }
593 return std::string();
594 }
595
596 } // namespace internal
597
598 // Use the REGISTER_TEST_CASE macro in your TestCase implementation file to
599 // register your TestCase. If your test is named TestFoo, then add the
600 // following to test_foo.cc:
601 //
602 // REGISTER_TEST_CASE(Foo);
603 //
604 // This will cause your test to be included in the set of known tests.
605 //
606 #define REGISTER_TEST_CASE(name) \
607 static TestCase* Test##name##_FactoryMethod(TestingInstance* instance) { \
608 return new Test##name(instance); \
609 } \
610 static TestCaseFactory g_Test##name_factory( \
611 #name, &Test##name##_FactoryMethod \
612 )
613
614 // Helper macro for calling functions implementing specific tests in the
615 // RunTest function. This assumes the function name is TestFoo where Foo is the
616 // test |name|.
617 #define RUN_TEST(name, test_filter) \
618 if (ShouldRunTest(#name, test_filter)) { \
619 set_callback_type(PP_OPTIONAL); \
620 PP_TimeTicks start_time(NowInTimeTicks()); \
621 instance_->LogTest(#name, \
622 CheckResourcesAndVars(Test##name()), \
623 start_time); \
624 }
625
626 // Like RUN_TEST above but forces functions taking callbacks to complete
627 // asynchronously on success or error.
628 #define RUN_TEST_FORCEASYNC(name, test_filter) \
629 if (ShouldRunTest(#name, test_filter)) { \
630 set_callback_type(PP_REQUIRED); \
631 PP_TimeTicks start_time(NowInTimeTicks()); \
632 instance_->LogTest(#name"ForceAsync", \
633 CheckResourcesAndVars(Test##name()), \
634 start_time); \
635 }
636
637 #define RUN_TEST_BLOCKING(test_case, name, test_filter) \
638 if (ShouldRunTest(#name, test_filter)) { \
639 set_callback_type(PP_BLOCKING); \
640 PP_TimeTicks start_time(NowInTimeTicks()); \
641 instance_->LogTest( \
642 #name"Blocking", \
643 CheckResourcesAndVars(RunOnThread(&test_case::Test##name)), \
644 start_time); \
645 }
646
647 #define RUN_TEST_BACKGROUND(test_case, name, test_filter) \
648 if (ShouldRunTest(#name, test_filter)) { \
649 PP_TimeTicks start_time(NowInTimeTicks()); \
650 instance_->LogTest( \
651 #name"Background", \
652 CheckResourcesAndVars(RunOnThread(&test_case::Test##name)), \
653 start_time); \
654 }
655
656 #define RUN_TEST_FORCEASYNC_AND_NOT(name, test_filter) \
657 do { \
658 RUN_TEST_FORCEASYNC(name, test_filter); \
659 RUN_TEST(name, test_filter); \
660 } while (false)
661
662 // Run a test with all possible callback types.
663 #define RUN_CALLBACK_TEST(test_case, name, test_filter) \
664 do { \
665 RUN_TEST_FORCEASYNC(name, test_filter); \
666 RUN_TEST(name, test_filter); \
667 RUN_TEST_BLOCKING(test_case, name, test_filter); \
668 RUN_TEST_BACKGROUND(test_case, name, test_filter); \
669 } while (false)
670
671 #define RUN_TEST_WITH_REFERENCE_CHECK(name, test_filter) \
672 if (ShouldRunTest(#name, test_filter)) { \
673 set_callback_type(PP_OPTIONAL); \
674 uint32_t objects = testing_interface_->GetLiveObjectsForInstance( \
675 instance_->pp_instance()); \
676 std::string error_message = Test##name(); \
677 if (error_message.empty() && \
678 testing_interface_->GetLiveObjectsForInstance( \
679 instance_->pp_instance()) != objects) \
680 error_message = MakeFailureMessage(__FILE__, __LINE__, \
681 "reference leak check"); \
682 PP_TimeTicks start_time(NowInTimeTicks()); \
683 instance_->LogTest(#name, \
684 CheckResourcesAndVars(error_message), \
685 start_time); \
686 }
687 // TODO(dmichael): Add CheckResourcesAndVars above when Windows tests pass
688 // cleanly. crbug.com/173503
689
690 // Helper macros for checking values in tests, and returning a location
691 // description of the test fails.
692 #define ASSERT_TRUE(cmd) \
693 do { \
694 if (!(cmd)) \
695 return MakeFailureMessage(__FILE__, __LINE__, #cmd); \
696 } while (false)
697 #define ASSERT_FALSE(cmd) ASSERT_TRUE(!(cmd))
698 #define COMPARE_BINARY_INTERNAL(comparison_type, a, b) \
699 internal::Compare##comparison_type( \
700 internal::ParameterWrapper<IS_NULL_LITERAL(a)>::WrapValue(a), \
701 (b), \
702 #a, \
703 #b, \
704 __FILE__, \
705 __LINE__)
706 #define ASSERT_BINARY_INTERNAL(comparison_type, a, b) \
707 do { \
708 std::string internal_assert_result_string = \
709 COMPARE_BINARY_INTERNAL(comparison_type, a, b); \
710 if (!internal_assert_result_string.empty()) { \
711 return internal_assert_result_string; \
712 } \
713 } while(false)
714 #define ASSERT_EQ(a, b) ASSERT_BINARY_INTERNAL(EQ, a, b)
715 #define ASSERT_NE(a, b) ASSERT_BINARY_INTERNAL(NE, a, b)
716 #define ASSERT_LT(a, b) ASSERT_BINARY_INTERNAL(LT, a, b)
717 #define ASSERT_LE(a, b) ASSERT_BINARY_INTERNAL(LE, a, b)
718 #define ASSERT_GT(a, b) ASSERT_BINARY_INTERNAL(GT, a, b)
719 #define ASSERT_GE(a, b) ASSERT_BINARY_INTERNAL(GE, a, b)
720 #define ASSERT_DOUBLE_EQ(a, b) \
721 do { \
722 std::string internal_assert_result_string = \
723 internal::CompareDoubleEq( \
724 internal::ParameterWrapper<IS_NULL_LITERAL(a)>::WrapValue(a), \
725 (b), \
726 #a, \
727 #b, \
728 __FILE__, \
729 __LINE__); \
730 if (!internal_assert_result_string.empty()) { \
731 return internal_assert_result_string; \
732 } \
733 } while(false)
734 // Runs |function| as a subtest and asserts that it has passed.
735 #define ASSERT_SUBTEST_SUCCESS(function) \
736 do { \
737 std::string result = (function); \
738 if (!result.empty()) \
739 return TestCase::MakeFailureMessage(__FILE__, __LINE__, result.c_str()); \
740 } while (false)
741
742 #define PASS() return std::string()
743
744 #endif // PPAPI_TESTS_TEST_CASE_H_
745