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