blob: fe0f7c4a6b8f8b4631e030b9478abb3d4019c3fd [file] [log] [blame]
epoger@google.comec3ed6a2011-07-28 14:26:00 +00001
2/*
3 * Copyright 2011 Google Inc.
4 *
5 * Use of this source code is governed by a BSD-style license that can be
6 * found in the LICENSE file.
7 */
reed@android.comed673312009-02-27 16:24:51 +00008#include "Test.h"
9
commit-bot@chromium.org197845a2013-04-19 13:24:28 +000010#include "SkString.h"
11#include "SkTArray.h"
commit-bot@chromium.org0506b9d2013-04-22 16:43:07 +000012#include "SkTime.h"
humper@google.com8dd94f02013-04-25 18:33:49 +000013#include "SkError.h"
bsalomon@google.comcf8fb1f2012-08-02 14:03:32 +000014
15#if SK_SUPPORT_GPU
bsalomon@google.coma8e686e2011-08-16 15:45:58 +000016#include "GrContext.h"
tomhudson@google.com6bf38b52012-02-14 15:11:59 +000017#include "gl/SkNativeGLContext.h"
bsalomon@google.comcf8fb1f2012-08-02 14:03:32 +000018#else
19class GrContext;
20#endif
bsalomon@google.coma8e686e2011-08-16 15:45:58 +000021
reed@android.comed673312009-02-27 16:24:51 +000022using namespace skiatest;
23
commit-bot@chromium.org197845a2013-04-19 13:24:28 +000024Reporter::Reporter() : fTestCount(0) {
reed@android.comed673312009-02-27 16:24:51 +000025}
26
27void Reporter::startTest(Test* test) {
commit-bot@chromium.org197845a2013-04-19 13:24:28 +000028 this->bumpTestCount();
reed@android.comed673312009-02-27 16:24:51 +000029 this->onStart(test);
reed@android.comed673312009-02-27 16:24:51 +000030}
31
commit-bot@chromium.org1f792862013-06-18 20:50:34 +000032void Reporter::reportFailed(const SkString& desc) {
33 this->onReportFailed(desc);
reed@android.comed673312009-02-27 16:24:51 +000034}
35
36void Reporter::endTest(Test* test) {
reed@android.comed673312009-02-27 16:24:51 +000037 this->onEnd(test);
reed@android.comed673312009-02-27 16:24:51 +000038}
39
40///////////////////////////////////////////////////////////////////////////////
41
commit-bot@chromium.org197845a2013-04-19 13:24:28 +000042Test::Test() : fReporter(NULL), fPassed(true) {}
reed@android.comed673312009-02-27 16:24:51 +000043
44Test::~Test() {
reed@google.com82065d62011-02-07 15:30:46 +000045 SkSafeUnref(fReporter);
reed@android.comed673312009-02-27 16:24:51 +000046}
47
48void Test::setReporter(Reporter* r) {
49 SkRefCnt_SafeAssign(fReporter, r);
50}
51
52const char* Test::getName() {
53 if (fName.size() == 0) {
54 this->onGetName(&fName);
55 }
56 return fName.c_str();
57}
58
commit-bot@chromium.org197845a2013-04-19 13:24:28 +000059namespace {
60 class LocalReporter : public Reporter {
61 public:
commit-bot@chromium.orgc7e08bd2013-04-23 11:16:32 +000062 explicit LocalReporter(Reporter* reporterToMimic) : fReporter(reporterToMimic) {}
commit-bot@chromium.org197845a2013-04-19 13:24:28 +000063
64 int failure_size() const { return fFailures.count(); }
commit-bot@chromium.org1f792862013-06-18 20:50:34 +000065 const SkString& failure(int i) const { return fFailures[i]; }
commit-bot@chromium.org197845a2013-04-19 13:24:28 +000066
67 protected:
commit-bot@chromium.org1f792862013-06-18 20:50:34 +000068 void onReportFailed(const SkString& desc) SK_OVERRIDE {
69 fFailures.push_back(desc);
commit-bot@chromium.org197845a2013-04-19 13:24:28 +000070 }
71
commit-bot@chromium.orgc7e08bd2013-04-23 11:16:32 +000072 // Proxy down to fReporter. We assume these calls are threadsafe.
commit-bot@chromium.orge1c54292013-04-22 17:35:55 +000073 virtual bool allowExtendedTest() const SK_OVERRIDE {
commit-bot@chromium.orgc7e08bd2013-04-23 11:16:32 +000074 return fReporter->allowExtendedTest();
commit-bot@chromium.orge1c54292013-04-22 17:35:55 +000075 }
76
77 virtual bool allowThreaded() const SK_OVERRIDE {
commit-bot@chromium.orgc7e08bd2013-04-23 11:16:32 +000078 return fReporter->allowThreaded();
79 }
80
81 virtual void bumpTestCount() SK_OVERRIDE {
82 fReporter->bumpTestCount();
commit-bot@chromium.orge1c54292013-04-22 17:35:55 +000083 }
84
caryclark@google.com8d0a5242013-07-16 16:11:16 +000085 virtual bool verbose() const SK_OVERRIDE {
86 return fReporter->verbose();
87 }
88
commit-bot@chromium.org197845a2013-04-19 13:24:28 +000089 private:
commit-bot@chromium.orgc7e08bd2013-04-23 11:16:32 +000090 Reporter* fReporter; // Unowned.
commit-bot@chromium.org197845a2013-04-19 13:24:28 +000091 SkTArray<SkString> fFailures;
92 };
93} // namespace
94
95void Test::run() {
humper@google.com8dd94f02013-04-25 18:33:49 +000096 // Clear the Skia error callback before running any test, to ensure that tests
97 // don't have unintended side effects when running more than one.
98 SkSetErrorCallback( NULL, NULL );
99
commit-bot@chromium.org197845a2013-04-19 13:24:28 +0000100 // Tell (likely shared) fReporter that this test has started.
reed@android.comed673312009-02-27 16:24:51 +0000101 fReporter->startTest(this);
commit-bot@chromium.org197845a2013-04-19 13:24:28 +0000102
commit-bot@chromium.org0506b9d2013-04-22 16:43:07 +0000103 const SkMSec start = SkTime::GetMSecs();
commit-bot@chromium.org197845a2013-04-19 13:24:28 +0000104 // Run the test into a LocalReporter so we know if it's passed or failed without interference
105 // from other tests that might share fReporter.
commit-bot@chromium.orgc7e08bd2013-04-23 11:16:32 +0000106 LocalReporter local(fReporter);
commit-bot@chromium.org197845a2013-04-19 13:24:28 +0000107 this->onRun(&local);
108 fPassed = local.failure_size() == 0;
commit-bot@chromium.org0506b9d2013-04-22 16:43:07 +0000109 fElapsed = SkTime::GetMSecs() - start;
commit-bot@chromium.org197845a2013-04-19 13:24:28 +0000110
111 // Now tell fReporter about any failures and wrap up.
112 for (int i = 0; i < local.failure_size(); i++) {
commit-bot@chromium.org1f792862013-06-18 20:50:34 +0000113 fReporter->reportFailed(local.failure(i));
commit-bot@chromium.org197845a2013-04-19 13:24:28 +0000114 }
reed@android.comed673312009-02-27 16:24:51 +0000115 fReporter->endTest(this);
humper@google.com8dd94f02013-04-25 18:33:49 +0000116
reed@android.comed673312009-02-27 16:24:51 +0000117}
118
bsalomon@google.coma8e686e2011-08-16 15:45:58 +0000119///////////////////////////////////////////////////////////////////////////////
120
djsollen@google.com0945bde2012-11-29 15:28:45 +0000121#if SK_SUPPORT_GPU
bsalomon@google.com67b915d2013-02-04 16:13:32 +0000122#include "GrContextFactory.h"
123GrContextFactory gGrContextFactory;
djsollen@google.com0945bde2012-11-29 15:28:45 +0000124#endif
125
bsalomon@google.com67b915d2013-02-04 16:13:32 +0000126GrContextFactory* GpuTest::GetGrContextFactory() {
djsollen@google.com0945bde2012-11-29 15:28:45 +0000127#if SK_SUPPORT_GPU
bsalomon@google.com67b915d2013-02-04 16:13:32 +0000128 return &gGrContextFactory;
129#else
130 return NULL;
djsollen@google.com0945bde2012-11-29 15:28:45 +0000131#endif
132}
133
bsalomon@google.com67b915d2013-02-04 16:13:32 +0000134void GpuTest::DestroyContexts() {
bsalomon@google.comcf8fb1f2012-08-02 14:03:32 +0000135#if SK_SUPPORT_GPU
bsalomon@google.com67b915d2013-02-04 16:13:32 +0000136 gGrContextFactory.destroyContexts();
bsalomon@google.comcf8fb1f2012-08-02 14:03:32 +0000137#endif
bsalomon@google.coma8e686e2011-08-16 15:45:58 +0000138}