180bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru 280bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru/* 380bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru * Copyright 2011 Google Inc. 480bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru * 580bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru * Use of this source code is governed by a BSD-style license that can be 680bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru * found in the LICENSE file. 780bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru */ 880bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru#include "Test.h" 980bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru 107839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger#include "SkString.h" 117839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger#include "SkTArray.h" 127839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger#include "SkTime.h" 137839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger#include "SkError.h" 1480bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru 1580bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru#if SK_SUPPORT_GPU 1680bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru#include "GrContext.h" 1780bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru#include "gl/SkNativeGLContext.h" 1880bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru#else 1980bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queruclass GrContext; 2080bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru#endif 2180bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru 2280bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste QueruSK_DEFINE_INST_COUNT(skiatest::Reporter) 2380bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru 2480bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queruusing namespace skiatest; 2580bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru 267839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek SollenbergerReporter::Reporter() : fTestCount(0) { 2780bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru} 2880bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru 2980bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queruvoid Reporter::startTest(Test* test) { 307839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger this->bumpTestCount(); 3180bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru this->onStart(test); 3280bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru} 3380bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru 3458190644c30e1c4aa8e527f3503c58f841e0fcf3Derek Sollenbergervoid Reporter::reportFailed(const SkString& desc) { 3558190644c30e1c4aa8e527f3503c58f841e0fcf3Derek Sollenberger this->onReportFailed(desc); 3680bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru} 3780bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru 3880bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queruvoid Reporter::endTest(Test* test) { 3980bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru this->onEnd(test); 4080bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru} 4180bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru 4280bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru/////////////////////////////////////////////////////////////////////////////// 4380bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru 447839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek SollenbergerTest::Test() : fReporter(NULL), fPassed(true) {} 4580bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru 4680bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste QueruTest::~Test() { 4780bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru SkSafeUnref(fReporter); 4880bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru} 4980bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru 5080bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queruvoid Test::setReporter(Reporter* r) { 5180bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru SkRefCnt_SafeAssign(fReporter, r); 5280bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru} 5380bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru 5480bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queruconst char* Test::getName() { 5580bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru if (fName.size() == 0) { 5680bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru this->onGetName(&fName); 5780bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru } 5880bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru return fName.c_str(); 5980bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru} 6080bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru 617839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenbergernamespace { 627839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger class LocalReporter : public Reporter { 637839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger public: 647839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger explicit LocalReporter(Reporter* reporterToMimic) : fReporter(reporterToMimic) {} 657839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger 667839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger int failure_size() const { return fFailures.count(); } 6758190644c30e1c4aa8e527f3503c58f841e0fcf3Derek Sollenberger const SkString& failure(int i) const { return fFailures[i]; } 687839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger 697839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger protected: 7058190644c30e1c4aa8e527f3503c58f841e0fcf3Derek Sollenberger void onReportFailed(const SkString& desc) SK_OVERRIDE { 7158190644c30e1c4aa8e527f3503c58f841e0fcf3Derek Sollenberger fFailures.push_back(desc); 727839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger } 737839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger 747839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger // Proxy down to fReporter. We assume these calls are threadsafe. 757839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger virtual bool allowExtendedTest() const SK_OVERRIDE { 767839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger return fReporter->allowExtendedTest(); 777839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger } 787839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger 797839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger virtual bool allowThreaded() const SK_OVERRIDE { 807839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger return fReporter->allowThreaded(); 817839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger } 827839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger 837839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger virtual void bumpTestCount() SK_OVERRIDE { 847839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger fReporter->bumpTestCount(); 857839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger } 867839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger 8758190644c30e1c4aa8e527f3503c58f841e0fcf3Derek Sollenberger virtual bool verbose() const SK_OVERRIDE { 8858190644c30e1c4aa8e527f3503c58f841e0fcf3Derek Sollenberger return fReporter->verbose(); 8958190644c30e1c4aa8e527f3503c58f841e0fcf3Derek Sollenberger } 9058190644c30e1c4aa8e527f3503c58f841e0fcf3Derek Sollenberger 917839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger private: 927839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger Reporter* fReporter; // Unowned. 937839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger SkTArray<SkString> fFailures; 947839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger }; 957839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger} // namespace 967839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger 977839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenbergervoid Test::run() { 987839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger // Clear the Skia error callback before running any test, to ensure that tests 997839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger // don't have unintended side effects when running more than one. 1007839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger SkSetErrorCallback( NULL, NULL ); 1017839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger 1027839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger // Tell (likely shared) fReporter that this test has started. 10380bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru fReporter->startTest(this); 1047839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger 1057839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger const SkMSec start = SkTime::GetMSecs(); 1067839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger // Run the test into a LocalReporter so we know if it's passed or failed without interference 1077839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger // from other tests that might share fReporter. 1087839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger LocalReporter local(fReporter); 1097839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger this->onRun(&local); 1107839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger fPassed = local.failure_size() == 0; 1117839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger fElapsed = SkTime::GetMSecs() - start; 1127839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger 1137839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger // Now tell fReporter about any failures and wrap up. 1147839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger for (int i = 0; i < local.failure_size(); i++) { 11558190644c30e1c4aa8e527f3503c58f841e0fcf3Derek Sollenberger fReporter->reportFailed(local.failure(i)); 1167839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger } 11780bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru fReporter->endTest(this); 1187839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger 11980bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru} 12080bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru 12180bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru/////////////////////////////////////////////////////////////////////////////// 12280bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru 12380bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru#if SK_SUPPORT_GPU 124096defe64d408e54474fe19f418c95bf1a554fc7Derek Sollenberger#include "GrContextFactory.h" 125096defe64d408e54474fe19f418c95bf1a554fc7Derek SollenbergerGrContextFactory gGrContextFactory; 126363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger#endif 127363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger 128096defe64d408e54474fe19f418c95bf1a554fc7Derek SollenbergerGrContextFactory* GpuTest::GetGrContextFactory() { 129363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger#if SK_SUPPORT_GPU 130096defe64d408e54474fe19f418c95bf1a554fc7Derek Sollenberger return &gGrContextFactory; 131096defe64d408e54474fe19f418c95bf1a554fc7Derek Sollenberger#else 132096defe64d408e54474fe19f418c95bf1a554fc7Derek Sollenberger return NULL; 133363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger#endif 134363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger} 135363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger 136096defe64d408e54474fe19f418c95bf1a554fc7Derek Sollenbergervoid GpuTest::DestroyContexts() { 137363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger#if SK_SUPPORT_GPU 138096defe64d408e54474fe19f418c95bf1a554fc7Derek Sollenberger gGrContextFactory.destroyContexts(); 13980bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru#endif 14080bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru} 141