blob: e1afe763ee70d2d15721e8504791e48b2f2dabf0 [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.org0dc5bd12014-02-26 16:31:22 +000010#include "SkCommandLineFlags.h"
tfarina@chromium.org8f6884a2014-01-24 20:56:26 +000011#include "SkError.h"
commit-bot@chromium.org197845a2013-04-19 13:24:28 +000012#include "SkString.h"
13#include "SkTArray.h"
commit-bot@chromium.org0506b9d2013-04-22 16:43:07 +000014#include "SkTime.h"
bsalomon@google.comcf8fb1f2012-08-02 14:03:32 +000015
16#if SK_SUPPORT_GPU
bsalomon@google.coma8e686e2011-08-16 15:45:58 +000017#include "GrContext.h"
tomhudson@google.com6bf38b52012-02-14 15:11:59 +000018#include "gl/SkNativeGLContext.h"
bsalomon@google.comcf8fb1f2012-08-02 14:03:32 +000019#else
20class GrContext;
21#endif
bsalomon@google.coma8e686e2011-08-16 15:45:58 +000022
commit-bot@chromium.org0dc5bd12014-02-26 16:31:22 +000023DEFINE_string2(tmpDir, t, NULL, "tmp directory for tests to use.");
24
reed@android.comed673312009-02-27 16:24:51 +000025using namespace skiatest;
26
commit-bot@chromium.org197845a2013-04-19 13:24:28 +000027Reporter::Reporter() : fTestCount(0) {
reed@android.comed673312009-02-27 16:24:51 +000028}
29
30void Reporter::startTest(Test* test) {
commit-bot@chromium.org197845a2013-04-19 13:24:28 +000031 this->bumpTestCount();
reed@android.comed673312009-02-27 16:24:51 +000032 this->onStart(test);
reed@android.comed673312009-02-27 16:24:51 +000033}
34
commit-bot@chromium.org1f792862013-06-18 20:50:34 +000035void Reporter::reportFailed(const SkString& desc) {
36 this->onReportFailed(desc);
reed@android.comed673312009-02-27 16:24:51 +000037}
38
39void Reporter::endTest(Test* test) {
reed@android.comed673312009-02-27 16:24:51 +000040 this->onEnd(test);
reed@android.comed673312009-02-27 16:24:51 +000041}
42
43///////////////////////////////////////////////////////////////////////////////
44
commit-bot@chromium.org197845a2013-04-19 13:24:28 +000045Test::Test() : fReporter(NULL), fPassed(true) {}
reed@android.comed673312009-02-27 16:24:51 +000046
47Test::~Test() {
reed@google.com82065d62011-02-07 15:30:46 +000048 SkSafeUnref(fReporter);
reed@android.comed673312009-02-27 16:24:51 +000049}
50
51void Test::setReporter(Reporter* r) {
52 SkRefCnt_SafeAssign(fReporter, r);
53}
54
55const char* Test::getName() {
56 if (fName.size() == 0) {
57 this->onGetName(&fName);
58 }
59 return fName.c_str();
60}
61
tfarina@chromium.org58674812014-01-21 23:39:22 +000062class LocalReporter : public Reporter {
63public:
64 explicit LocalReporter(Reporter* reporterToMimic) : fReporter(reporterToMimic) {}
commit-bot@chromium.org197845a2013-04-19 13:24:28 +000065
tfarina@chromium.org58674812014-01-21 23:39:22 +000066 int numFailures() const { return fFailures.count(); }
67 const SkString& failure(int i) const { return fFailures[i]; }
commit-bot@chromium.org197845a2013-04-19 13:24:28 +000068
tfarina@chromium.org58674812014-01-21 23:39:22 +000069protected:
70 virtual void onReportFailed(const SkString& desc) SK_OVERRIDE {
71 fFailures.push_back(desc);
72 }
commit-bot@chromium.org197845a2013-04-19 13:24:28 +000073
tfarina@chromium.org58674812014-01-21 23:39:22 +000074 // Proxy down to fReporter. We assume these calls are threadsafe.
75 virtual bool allowExtendedTest() const SK_OVERRIDE {
76 return fReporter->allowExtendedTest();
77 }
commit-bot@chromium.orge1c54292013-04-22 17:35:55 +000078
tfarina@chromium.org58674812014-01-21 23:39:22 +000079 virtual bool allowThreaded() const SK_OVERRIDE {
80 return fReporter->allowThreaded();
81 }
commit-bot@chromium.orgc7e08bd2013-04-23 11:16:32 +000082
tfarina@chromium.org58674812014-01-21 23:39:22 +000083 virtual void bumpTestCount() SK_OVERRIDE {
84 fReporter->bumpTestCount();
85 }
commit-bot@chromium.orge1c54292013-04-22 17:35:55 +000086
tfarina@chromium.org58674812014-01-21 23:39:22 +000087 virtual bool verbose() const SK_OVERRIDE {
88 return fReporter->verbose();
89 }
caryclark@google.com8d0a5242013-07-16 16:11:16 +000090
tfarina@chromium.org58674812014-01-21 23:39:22 +000091private:
92 Reporter* fReporter; // Unowned.
93 SkTArray<SkString> fFailures;
94};
commit-bot@chromium.org197845a2013-04-19 13:24:28 +000095
96void Test::run() {
humper@google.com8dd94f02013-04-25 18:33:49 +000097 // Clear the Skia error callback before running any test, to ensure that tests
98 // don't have unintended side effects when running more than one.
99 SkSetErrorCallback( NULL, NULL );
100
commit-bot@chromium.org197845a2013-04-19 13:24:28 +0000101 // Tell (likely shared) fReporter that this test has started.
reed@android.comed673312009-02-27 16:24:51 +0000102 fReporter->startTest(this);
commit-bot@chromium.org197845a2013-04-19 13:24:28 +0000103
commit-bot@chromium.org0506b9d2013-04-22 16:43:07 +0000104 const SkMSec start = SkTime::GetMSecs();
commit-bot@chromium.org197845a2013-04-19 13:24:28 +0000105 // Run the test into a LocalReporter so we know if it's passed or failed without interference
106 // from other tests that might share fReporter.
commit-bot@chromium.orgc7e08bd2013-04-23 11:16:32 +0000107 LocalReporter local(fReporter);
commit-bot@chromium.org197845a2013-04-19 13:24:28 +0000108 this->onRun(&local);
tfarina@chromium.org58674812014-01-21 23:39:22 +0000109 fPassed = local.numFailures() == 0;
commit-bot@chromium.org0506b9d2013-04-22 16:43:07 +0000110 fElapsed = SkTime::GetMSecs() - start;
commit-bot@chromium.org197845a2013-04-19 13:24:28 +0000111
112 // Now tell fReporter about any failures and wrap up.
tfarina@chromium.org58674812014-01-21 23:39:22 +0000113 for (int i = 0; i < local.numFailures(); i++) {
commit-bot@chromium.org1f792862013-06-18 20:50:34 +0000114 fReporter->reportFailed(local.failure(i));
commit-bot@chromium.org197845a2013-04-19 13:24:28 +0000115 }
reed@android.comed673312009-02-27 16:24:51 +0000116 fReporter->endTest(this);
humper@google.com8dd94f02013-04-25 18:33:49 +0000117
reed@android.comed673312009-02-27 16:24:51 +0000118}
119
commit-bot@chromium.org0dc5bd12014-02-26 16:31:22 +0000120SkString Test::GetTmpDir() {
121 const char* tmpDir = FLAGS_tmpDir.isEmpty() ? NULL : FLAGS_tmpDir[0];
122 return SkString(tmpDir);
djsollen@google.com0945bde2012-11-29 15:28:45 +0000123}
124
commit-bot@chromium.org0dc5bd12014-02-26 16:31:22 +0000125static const char* gResourcePath = NULL;
126void Test::SetResourcePath(const char* resourcePath) { gResourcePath = resourcePath; }
127
128SkString Test::GetResourcePath() {
129 return SkString(gResourcePath);
bsalomon@google.coma8e686e2011-08-16 15:45:58 +0000130}