skia_test.cpp revision 261c66668269588a26757a0bfe28a3a3eac07665
1ec3ed6a5ebf6f2c406d7bcf94b6bc34fcaeb976eepoger@google.com/*
2ec3ed6a5ebf6f2c406d7bcf94b6bc34fcaeb976eepoger@google.com * Copyright 2011 Google Inc.
3ec3ed6a5ebf6f2c406d7bcf94b6bc34fcaeb976eepoger@google.com *
4ec3ed6a5ebf6f2c406d7bcf94b6bc34fcaeb976eepoger@google.com * Use of this source code is governed by a BSD-style license that can be
5ec3ed6a5ebf6f2c406d7bcf94b6bc34fcaeb976eepoger@google.com * found in the LICENSE file.
6ec3ed6a5ebf6f2c406d7bcf94b6bc34fcaeb976eepoger@google.com */
7ba59d64b05b13081060a266c999158efab575b61commit-bot@chromium.org
85a6324e3140eb16cd5255867eae02a2c88d54271scroggo@google.com#include "SkCommandLineFlags.h"
95e5adfd12cc2cb194db971708cd7f34ff47e10b4reed@android.com#include "SkGraphics.h"
100506b9d7d531fdfc9536895481d789a48626a86bcommit-bot@chromium.org#include "SkOSFile.h"
11197845ae157da0175bb8dd05c4fd9eb9cd935e54commit-bot@chromium.org#include "SkTArray.h"
12197845ae157da0175bb8dd05c4fd9eb9cd935e54commit-bot@chromium.org#include "SkTemplates.h"
130506b9d7d531fdfc9536895481d789a48626a86bcommit-bot@chromium.org#include "SkThreadPool.h"
140506b9d7d531fdfc9536895481d789a48626a86bcommit-bot@chromium.org#include "SkTime.h"
15ed673310e2551e64d8196f7776d7d4c92085f8c2reed@android.com#include "Test.h"
16261c66668269588a26757a0bfe28a3a3eac07665commit-bot@chromium.org#include "OverwriteLine.h"
17ed673310e2551e64d8196f7776d7d4c92085f8c2reed@android.com
18bdb1be599436a894ab88dfc323d14c0afb496a6frobertphillips@google.com#if SK_SUPPORT_GPU
19bdb1be599436a894ab88dfc323d14c0afb496a6frobertphillips@google.com#include "GrContext.h"
20bdb1be599436a894ab88dfc323d14c0afb496a6frobertphillips@google.com#endif
21bdb1be599436a894ab88dfc323d14c0afb496a6frobertphillips@google.com
22ed673310e2551e64d8196f7776d7d4c92085f8c2reed@android.comusing namespace skiatest;
23ed673310e2551e64d8196f7776d7d4c92085f8c2reed@android.com
24261c66668269588a26757a0bfe28a3a3eac07665commit-bot@chromium.orgDEFINE_string2(match, m, NULL, "[~][^]substring[$] [...] of test name to run.\n" \
25261c66668269588a26757a0bfe28a3a3eac07665commit-bot@chromium.org                               "Multiple matches may be separated by spaces.\n" \
26261c66668269588a26757a0bfe28a3a3eac07665commit-bot@chromium.org                               "~ causes a matching test to always be skipped\n" \
27261c66668269588a26757a0bfe28a3a3eac07665commit-bot@chromium.org                               "^ requires the start of the test to match\n" \
28261c66668269588a26757a0bfe28a3a3eac07665commit-bot@chromium.org                               "$ requires the end of the test to match\n" \
29261c66668269588a26757a0bfe28a3a3eac07665commit-bot@chromium.org                               "^ and $ requires an exact match\n" \
30261c66668269588a26757a0bfe28a3a3eac07665commit-bot@chromium.org                               "If a test does not match any list entry,\n" \
31261c66668269588a26757a0bfe28a3a3eac07665commit-bot@chromium.org                               "it is skipped unless some list entry starts with ~");
32261c66668269588a26757a0bfe28a3a3eac07665commit-bot@chromium.orgDEFINE_string2(tmpDir, t, NULL, "tmp directory for tests to use.");
33261c66668269588a26757a0bfe28a3a3eac07665commit-bot@chromium.orgDEFINE_string2(resourcePath, i, "resources", "directory for test resources.");
34261c66668269588a26757a0bfe28a3a3eac07665commit-bot@chromium.orgDEFINE_bool2(extendedTest, x, false, "run extended tests for pathOps.");
35261c66668269588a26757a0bfe28a3a3eac07665commit-bot@chromium.orgDEFINE_bool2(single, z, false, "run tests on a single thread internally.");
36261c66668269588a26757a0bfe28a3a3eac07665commit-bot@chromium.orgDEFINE_bool2(verbose, v, false, "enable verbose output.");
37261c66668269588a26757a0bfe28a3a3eac07665commit-bot@chromium.orgDEFINE_int32(threads, SkThreadPool::kThreadPerCore,
38261c66668269588a26757a0bfe28a3a3eac07665commit-bot@chromium.org             "Run threadsafe tests on a threadpool with this many threads.");
39261c66668269588a26757a0bfe28a3a3eac07665commit-bot@chromium.org
40d252db03d9650013b545ef9781fe993c07f8f314reed@android.com// need to explicitly declare this, or we get some weird infinite loop llist
41d252db03d9650013b545ef9781fe993c07f8f314reed@android.comtemplate TestRegistry* TestRegistry::gHead;
42d252db03d9650013b545ef9781fe993c07f8f314reed@android.com
43ed673310e2551e64d8196f7776d7d4c92085f8c2reed@android.comclass Iter {
44ed673310e2551e64d8196f7776d7d4c92085f8c2reed@android.compublic:
45261c66668269588a26757a0bfe28a3a3eac07665commit-bot@chromium.org    Iter() { this->reset(); }
46261c66668269588a26757a0bfe28a3a3eac07665commit-bot@chromium.org    void reset() { fReg = TestRegistry::Head(); }
4780e39a77b16f4396eed230efea1d0b2fc8cbfb00reed@android.com
48261c66668269588a26757a0bfe28a3a3eac07665commit-bot@chromium.org    Test* next(Reporter* r) {
49ed673310e2551e64d8196f7776d7d4c92085f8c2reed@android.com        if (fReg) {
50ed673310e2551e64d8196f7776d7d4c92085f8c2reed@android.com            TestRegistry::Factory fact = fReg->factory();
51ed673310e2551e64d8196f7776d7d4c92085f8c2reed@android.com            fReg = fReg->next();
52ed673310e2551e64d8196f7776d7d4c92085f8c2reed@android.com            Test* test = fact(NULL);
53261c66668269588a26757a0bfe28a3a3eac07665commit-bot@chromium.org            test->setReporter(r);
54ed673310e2551e64d8196f7776d7d4c92085f8c2reed@android.com            return test;
55ed673310e2551e64d8196f7776d7d4c92085f8c2reed@android.com        }
56ed673310e2551e64d8196f7776d7d4c92085f8c2reed@android.com        return NULL;
57ed673310e2551e64d8196f7776d7d4c92085f8c2reed@android.com    }
5880e39a77b16f4396eed230efea1d0b2fc8cbfb00reed@android.com
59ed673310e2551e64d8196f7776d7d4c92085f8c2reed@android.comprivate:
60ed673310e2551e64d8196f7776d7d4c92085f8c2reed@android.com    const TestRegistry* fReg;
61ed673310e2551e64d8196f7776d7d4c92085f8c2reed@android.com};
62ed673310e2551e64d8196f7776d7d4c92085f8c2reed@android.com
63d252db03d9650013b545ef9781fe993c07f8f314reed@android.comclass DebugfReporter : public Reporter {
6457b799e951064b9328b5c676dcc3b4cb4477cc2breed@android.compublic:
65261c66668269588a26757a0bfe28a3a3eac07665commit-bot@chromium.org    explicit DebugfReporter(int total) : fDone(0), fTotal(total) {}
66eeb3b7ff9813600b6cab662e1a0174ee2e279cacreed@android.com
67261c66668269588a26757a0bfe28a3a3eac07665commit-bot@chromium.org    virtual bool allowExtendedTest() const SK_OVERRIDE { return FLAGS_extendedTest; }
68261c66668269588a26757a0bfe28a3a3eac07665commit-bot@chromium.org    virtual bool allowThreaded()     const SK_OVERRIDE { return !FLAGS_single; }
69261c66668269588a26757a0bfe28a3a3eac07665commit-bot@chromium.org    virtual bool verbose()           const SK_OVERRIDE { return FLAGS_verbose; }
7007e97fccd2d85076cd22ef411b0773ab92a18abecaryclark@google.com
71ed673310e2551e64d8196f7776d7d4c92085f8c2reed@android.comprotected:
72261c66668269588a26757a0bfe28a3a3eac07665commit-bot@chromium.org    virtual void onReportFailed(const SkString& desc) SK_OVERRIDE {
73261c66668269588a26757a0bfe28a3a3eac07665commit-bot@chromium.org        SkDebugf("\nFAILED: %s", desc.c_str());
74ed673310e2551e64d8196f7776d7d4c92085f8c2reed@android.com    }
75f6842e7c7b581ed55e859b37c1081836008393c5commit-bot@chromium.org
76261c66668269588a26757a0bfe28a3a3eac07665commit-bot@chromium.org    virtual void onEnd(Test* test) SK_OVERRIDE {
77261c66668269588a26757a0bfe28a3a3eac07665commit-bot@chromium.org        const int done = 1 + sk_atomic_inc(&fDone);
78197845ae157da0175bb8dd05c4fd9eb9cd935e54commit-bot@chromium.org
79197845ae157da0175bb8dd05c4fd9eb9cd935e54commit-bot@chromium.org        if (!test->passed()) {
80261c66668269588a26757a0bfe28a3a3eac07665commit-bot@chromium.org            SkDebugf("\n---- %s FAILED", test->getName());
810506b9d7d531fdfc9536895481d789a48626a86bcommit-bot@chromium.org        }
820506b9d7d531fdfc9536895481d789a48626a86bcommit-bot@chromium.org
83261c66668269588a26757a0bfe28a3a3eac07665commit-bot@chromium.org        SkString prefix(kSkOverwriteLine);
84261c66668269588a26757a0bfe28a3a3eac07665commit-bot@chromium.org        SkString time;
85261c66668269588a26757a0bfe28a3a3eac07665commit-bot@chromium.org        if (FLAGS_verbose) {
86261c66668269588a26757a0bfe28a3a3eac07665commit-bot@chromium.org            prefix.printf("\n");
87261c66668269588a26757a0bfe28a3a3eac07665commit-bot@chromium.org            time.printf("%5dms ", test->elapsedMs());
88eeb3b7ff9813600b6cab662e1a0174ee2e279cacreed@android.com        }
89261c66668269588a26757a0bfe28a3a3eac07665commit-bot@chromium.org        SkDebugf("%s[%3d/%3d] %s%s", prefix.c_str(), done, fTotal, time.c_str(), test->getName());
90eeb3b7ff9813600b6cab662e1a0174ee2e279cacreed@android.com    }
91197845ae157da0175bb8dd05c4fd9eb9cd935e54commit-bot@chromium.org
92f4d1b3911831d2111a351b2742b3a94a9d17f92edjsollen@google.comprivate:
93261c66668269588a26757a0bfe28a3a3eac07665commit-bot@chromium.org    int32_t fDone;  // atomic
94261c66668269588a26757a0bfe28a3a3eac07665commit-bot@chromium.org    const int fTotal;
95ed673310e2551e64d8196f7776d7d4c92085f8c2reed@android.com};
96ed673310e2551e64d8196f7776d7d4c92085f8c2reed@android.com
97c76218d5edf08f1b73dc06a92e3af52ed268e7bascroggo@google.comSkString Test::GetTmpDir() {
98c76218d5edf08f1b73dc06a92e3af52ed268e7bascroggo@google.com    const char* tmpDir = FLAGS_tmpDir.isEmpty() ? NULL : FLAGS_tmpDir[0];
99c76218d5edf08f1b73dc06a92e3af52ed268e7bascroggo@google.com    return SkString(tmpDir);
100c76218d5edf08f1b73dc06a92e3af52ed268e7bascroggo@google.com}
101c76218d5edf08f1b73dc06a92e3af52ed268e7bascroggo@google.com
102c76218d5edf08f1b73dc06a92e3af52ed268e7bascroggo@google.comSkString Test::GetResourcePath() {
103c76218d5edf08f1b73dc06a92e3af52ed268e7bascroggo@google.com    const char* resourcePath = FLAGS_resourcePath.isEmpty() ? NULL : FLAGS_resourcePath[0];
104c76218d5edf08f1b73dc06a92e3af52ed268e7bascroggo@google.com    return SkString(resourcePath);
105c76218d5edf08f1b73dc06a92e3af52ed268e7bascroggo@google.com}
106c76218d5edf08f1b73dc06a92e3af52ed268e7bascroggo@google.com
107197845ae157da0175bb8dd05c4fd9eb9cd935e54commit-bot@chromium.org// Deletes self when run.
108197845ae157da0175bb8dd05c4fd9eb9cd935e54commit-bot@chromium.orgclass SkTestRunnable : public SkRunnable {
109197845ae157da0175bb8dd05c4fd9eb9cd935e54commit-bot@chromium.orgpublic:
110197845ae157da0175bb8dd05c4fd9eb9cd935e54commit-bot@chromium.org  // Takes ownership of test.
111197845ae157da0175bb8dd05c4fd9eb9cd935e54commit-bot@chromium.org  SkTestRunnable(Test* test, int32_t* failCount) : fTest(test), fFailCount(failCount) {}
112197845ae157da0175bb8dd05c4fd9eb9cd935e54commit-bot@chromium.org
113197845ae157da0175bb8dd05c4fd9eb9cd935e54commit-bot@chromium.org  virtual void run() {
114197845ae157da0175bb8dd05c4fd9eb9cd935e54commit-bot@chromium.org      fTest->run();
115197845ae157da0175bb8dd05c4fd9eb9cd935e54commit-bot@chromium.org      if(!fTest->passed()) {
116197845ae157da0175bb8dd05c4fd9eb9cd935e54commit-bot@chromium.org          sk_atomic_inc(fFailCount);
117197845ae157da0175bb8dd05c4fd9eb9cd935e54commit-bot@chromium.org      }
118197845ae157da0175bb8dd05c4fd9eb9cd935e54commit-bot@chromium.org      SkDELETE(this);
119197845ae157da0175bb8dd05c4fd9eb9cd935e54commit-bot@chromium.org  }
120197845ae157da0175bb8dd05c4fd9eb9cd935e54commit-bot@chromium.org
121197845ae157da0175bb8dd05c4fd9eb9cd935e54commit-bot@chromium.orgprivate:
122197845ae157da0175bb8dd05c4fd9eb9cd935e54commit-bot@chromium.org    SkAutoTDelete<Test> fTest;
123197845ae157da0175bb8dd05c4fd9eb9cd935e54commit-bot@chromium.org    int32_t* fFailCount;
124197845ae157da0175bb8dd05c4fd9eb9cd935e54commit-bot@chromium.org};
125ba59d64b05b13081060a266c999158efab575b61commit-bot@chromium.org
1265987f58036574ccf23049b5fe71f29a441d0641dcaryclark@google.comint tool_main(int argc, char** argv);
1275987f58036574ccf23049b5fe71f29a441d0641dcaryclark@google.comint tool_main(int argc, char** argv) {
128ba59d64b05b13081060a266c999158efab575b61commit-bot@chromium.org    SkCommandLineFlags::SetUsage("");
129ba59d64b05b13081060a266c999158efab575b61commit-bot@chromium.org    SkCommandLineFlags::Parse(argc, argv);
130ba59d64b05b13081060a266c999158efab575b61commit-bot@chromium.org
1314e23068b374023d43c4c725138d523721d975892bsalomon@google.com#if SK_ENABLE_INST_COUNT
132a276975a62ef4d9941e40c831fdfe7852e0e243ereed@google.com    gPrintInstCount = true;
133a276975a62ef4d9941e40c831fdfe7852e0e243ereed@google.com#endif
134d54e1e9751eea63b528a6e62d919d06929c9bd8fcaryclark@google.com
135a276975a62ef4d9941e40c831fdfe7852e0e243ereed@google.com    SkGraphics::Init();
1365af16f8d670b3ce1c7644a4737e02e2e2257614ebungeman@google.com
13791d449ebf895d3c412a051272af3175be6976872reed@google.com    {
13891d449ebf895d3c412a051272af3175be6976872reed@google.com        SkString header("Skia UnitTests:");
1399aff14831b45a7e31e46ebec482df9db6f125745reed@google.com        if (!FLAGS_match.isEmpty()) {
140b631eec0e6c698b71423947d43199c33bc096a2fcaryclark@google.com            header.appendf(" --match");
141b631eec0e6c698b71423947d43199c33bc096a2fcaryclark@google.com            for (int index = 0; index < FLAGS_match.count(); ++index) {
142b631eec0e6c698b71423947d43199c33bc096a2fcaryclark@google.com                header.appendf(" %s", FLAGS_match[index]);
143b631eec0e6c698b71423947d43199c33bc096a2fcaryclark@google.com            }
14491d449ebf895d3c412a051272af3175be6976872reed@google.com        }
145c76218d5edf08f1b73dc06a92e3af52ed268e7bascroggo@google.com        SkString tmpDir = Test::GetTmpDir();
146c76218d5edf08f1b73dc06a92e3af52ed268e7bascroggo@google.com        if (!tmpDir.isEmpty()) {
147c76218d5edf08f1b73dc06a92e3af52ed268e7bascroggo@google.com            header.appendf(" --tmpDir %s", tmpDir.c_str());
148cb62650ecfd323a1ac215103a4d3106faad3c3cddjsollen@google.com        }
149c76218d5edf08f1b73dc06a92e3af52ed268e7bascroggo@google.com        SkString resourcePath = Test::GetResourcePath();
150c76218d5edf08f1b73dc06a92e3af52ed268e7bascroggo@google.com        if (!resourcePath.isEmpty()) {
151c76218d5edf08f1b73dc06a92e3af52ed268e7bascroggo@google.com            header.appendf(" --resourcePath %s", resourcePath.c_str());
152789c6f291ecfff925086015360da525d6de1c835reed@google.com        }
15391d449ebf895d3c412a051272af3175be6976872reed@google.com#ifdef SK_DEBUG
15491d449ebf895d3c412a051272af3175be6976872reed@google.com        header.append(" SK_DEBUG");
15591d449ebf895d3c412a051272af3175be6976872reed@google.com#else
15691d449ebf895d3c412a051272af3175be6976872reed@google.com        header.append(" SK_RELEASE");
15791d449ebf895d3c412a051272af3175be6976872reed@google.com#endif
1585696baa16bc3cfbf99b9abfcdd178d0afe3213dareed@google.com        header.appendf(" skia_arch_width=%d", (int)sizeof(void*) * 8);
159261c66668269588a26757a0bfe28a3a3eac07665commit-bot@chromium.org        SkDebugf(header.c_str());
16091d449ebf895d3c412a051272af3175be6976872reed@google.com    }
16191d449ebf895d3c412a051272af3175be6976872reed@google.com
16280e39a77b16f4396eed230efea1d0b2fc8cbfb00reed@android.com
1630506b9d7d531fdfc9536895481d789a48626a86bcommit-bot@chromium.org    // Count tests first.
1640506b9d7d531fdfc9536895481d789a48626a86bcommit-bot@chromium.org    int total = 0;
1650506b9d7d531fdfc9536895481d789a48626a86bcommit-bot@chromium.org    int toRun = 0;
1660506b9d7d531fdfc9536895481d789a48626a86bcommit-bot@chromium.org    Test* test;
167586db93c447b753364d50fadc5426de4fef9a759sglez@google.com
168261c66668269588a26757a0bfe28a3a3eac07665commit-bot@chromium.org    Iter iter;
169261c66668269588a26757a0bfe28a3a3eac07665commit-bot@chromium.org    while ((test = iter.next(NULL/*reporter not needed*/)) != NULL) {
1700506b9d7d531fdfc9536895481d789a48626a86bcommit-bot@chromium.org        SkAutoTDelete<Test> owned(test);
171586db93c447b753364d50fadc5426de4fef9a759sglez@google.com
172a6f37e77c1c95f0a06ac55ff659cb7b8dfabefcfcommit-bot@chromium.org        if(!SkCommandLineFlags::ShouldSkip(FLAGS_match, test->getName())) {
1730506b9d7d531fdfc9536895481d789a48626a86bcommit-bot@chromium.org            toRun++;
1740506b9d7d531fdfc9536895481d789a48626a86bcommit-bot@chromium.org        }
1750506b9d7d531fdfc9536895481d789a48626a86bcommit-bot@chromium.org        total++;
1760506b9d7d531fdfc9536895481d789a48626a86bcommit-bot@chromium.org    }
1770506b9d7d531fdfc9536895481d789a48626a86bcommit-bot@chromium.org
1780506b9d7d531fdfc9536895481d789a48626a86bcommit-bot@chromium.org    // Now run them.
1790506b9d7d531fdfc9536895481d789a48626a86bcommit-bot@chromium.org    iter.reset();
180197845ae157da0175bb8dd05c4fd9eb9cd935e54commit-bot@chromium.org    int32_t failCount = 0;
1815af16f8d670b3ce1c7644a4737e02e2e2257614ebungeman@google.com    int skipCount = 0;
182197845ae157da0175bb8dd05c4fd9eb9cd935e54commit-bot@chromium.org
183a7538baeae619a513437f89b60cf738ee2de463dcommit-bot@chromium.org    SkThreadPool threadpool(FLAGS_threads);
184197845ae157da0175bb8dd05c4fd9eb9cd935e54commit-bot@chromium.org    SkTArray<Test*> unsafeTests;  // Always passes ownership to an SkTestRunnable
185261c66668269588a26757a0bfe28a3a3eac07665commit-bot@chromium.org
186261c66668269588a26757a0bfe28a3a3eac07665commit-bot@chromium.org    DebugfReporter reporter(toRun);
1870506b9d7d531fdfc9536895481d789a48626a86bcommit-bot@chromium.org    for (int i = 0; i < total; i++) {
188261c66668269588a26757a0bfe28a3a3eac07665commit-bot@chromium.org        SkAutoTDelete<Test> test(iter.next(&reporter));
189a6f37e77c1c95f0a06ac55ff659cb7b8dfabefcfcommit-bot@chromium.org        if (SkCommandLineFlags::ShouldSkip(FLAGS_match, test->getName())) {
1905af16f8d670b3ce1c7644a4737e02e2e2257614ebungeman@google.com            ++skipCount;
191197845ae157da0175bb8dd05c4fd9eb9cd935e54commit-bot@chromium.org        } else if (!test->isThreadsafe()) {
192197845ae157da0175bb8dd05c4fd9eb9cd935e54commit-bot@chromium.org            unsafeTests.push_back() = test.detach();
1935af16f8d670b3ce1c7644a4737e02e2e2257614ebungeman@google.com        } else {
194a7538baeae619a513437f89b60cf738ee2de463dcommit-bot@chromium.org            threadpool.add(SkNEW_ARGS(SkTestRunnable, (test.detach(), &failCount)));
1955af16f8d670b3ce1c7644a4737e02e2e2257614ebungeman@google.com        }
196ed673310e2551e64d8196f7776d7d4c92085f8c2reed@android.com    }
197eeb3b7ff9813600b6cab662e1a0174ee2e279cacreed@android.com
198197845ae157da0175bb8dd05c4fd9eb9cd935e54commit-bot@chromium.org    // Run the tests that aren't threadsafe.
199197845ae157da0175bb8dd05c4fd9eb9cd935e54commit-bot@chromium.org    for (int i = 0; i < unsafeTests.count(); i++) {
200197845ae157da0175bb8dd05c4fd9eb9cd935e54commit-bot@chromium.org        SkNEW_ARGS(SkTestRunnable, (unsafeTests[i], &failCount))->run();
201197845ae157da0175bb8dd05c4fd9eb9cd935e54commit-bot@chromium.org    }
202197845ae157da0175bb8dd05c4fd9eb9cd935e54commit-bot@chromium.org
203a7538baeae619a513437f89b60cf738ee2de463dcommit-bot@chromium.org    // Block until threaded tests finish.
204a7538baeae619a513437f89b60cf738ee2de463dcommit-bot@chromium.org    threadpool.wait();
205197845ae157da0175bb8dd05c4fd9eb9cd935e54commit-bot@chromium.org
206261c66668269588a26757a0bfe28a3a3eac07665commit-bot@chromium.org    if (FLAGS_verbose) {
207261c66668269588a26757a0bfe28a3a3eac07665commit-bot@chromium.org        SkDebugf("\nFinished %d tests, %d failures, %d skipped. (%d internal tests)",
208261c66668269588a26757a0bfe28a3a3eac07665commit-bot@chromium.org                 toRun, failCount, skipCount, reporter.countTests());
209d54e1e9751eea63b528a6e62d919d06929c9bd8fcaryclark@google.com    }
210a276975a62ef4d9941e40c831fdfe7852e0e243ereed@google.com    SkGraphics::Term();
21167b915de99e6b89d476907930ac8c27afb64d10ebsalomon@google.com    GpuTest::DestroyContexts();
212a276975a62ef4d9941e40c831fdfe7852e0e243ereed@google.com
213261c66668269588a26757a0bfe28a3a3eac07665commit-bot@chromium.org    SkDebugf("\n");
2145af16f8d670b3ce1c7644a4737e02e2e2257614ebungeman@google.com    return (failCount == 0) ? 0 : 1;
215ed673310e2551e64d8196f7776d7d4c92085f8c2reed@android.com}
2165987f58036574ccf23049b5fe71f29a441d0641dcaryclark@google.com
2177158e6acca1b1ecc321d4d514a31cba11b5ead60borenet@google.com#if !defined(SK_BUILD_FOR_IOS) && !defined(SK_BUILD_FOR_NACL)
2185987f58036574ccf23049b5fe71f29a441d0641dcaryclark@google.comint main(int argc, char * const argv[]) {
2195987f58036574ccf23049b5fe71f29a441d0641dcaryclark@google.com    return tool_main(argc, (char**) argv);
2205987f58036574ccf23049b5fe71f29a441d0641dcaryclark@google.com}
2215987f58036574ccf23049b5fe71f29a441d0641dcaryclark@google.com#endif
222