skia_test.cpp revision 391ca66276b27464f255c371e7e95f56f9042042
1ec3ed6a5ebf6f2c406d7bcf94b6bc34fcaeb976eepoger@google.com
2ec3ed6a5ebf6f2c406d7bcf94b6bc34fcaeb976eepoger@google.com/*
3ec3ed6a5ebf6f2c406d7bcf94b6bc34fcaeb976eepoger@google.com * Copyright 2011 Google Inc.
4ec3ed6a5ebf6f2c406d7bcf94b6bc34fcaeb976eepoger@google.com *
5ec3ed6a5ebf6f2c406d7bcf94b6bc34fcaeb976eepoger@google.com * Use of this source code is governed by a BSD-style license that can be
6ec3ed6a5ebf6f2c406d7bcf94b6bc34fcaeb976eepoger@google.com * found in the LICENSE file.
7ec3ed6a5ebf6f2c406d7bcf94b6bc34fcaeb976eepoger@google.com */
85e5adfd12cc2cb194db971708cd7f34ff47e10b4reed@android.com#include "SkGraphics.h"
9ed673310e2551e64d8196f7776d7d4c92085f8c2reed@android.com#include "Test.h"
10789c6f291ecfff925086015360da525d6de1c835reed@google.com#include "SkOSFile.h"
11ed673310e2551e64d8196f7776d7d4c92085f8c2reed@android.com
12bdb1be599436a894ab88dfc323d14c0afb496a6frobertphillips@google.com#if SK_SUPPORT_GPU
13bdb1be599436a894ab88dfc323d14c0afb496a6frobertphillips@google.com#include "GrContext.h"
14bdb1be599436a894ab88dfc323d14c0afb496a6frobertphillips@google.com#endif
15bdb1be599436a894ab88dfc323d14c0afb496a6frobertphillips@google.com
16ed673310e2551e64d8196f7776d7d4c92085f8c2reed@android.comusing namespace skiatest;
17ed673310e2551e64d8196f7776d7d4c92085f8c2reed@android.com
18d252db03d9650013b545ef9781fe993c07f8f314reed@android.com// need to explicitly declare this, or we get some weird infinite loop llist
19d252db03d9650013b545ef9781fe993c07f8f314reed@android.comtemplate TestRegistry* TestRegistry::gHead;
20d252db03d9650013b545ef9781fe993c07f8f314reed@android.com
21ed673310e2551e64d8196f7776d7d4c92085f8c2reed@android.comclass Iter {
22ed673310e2551e64d8196f7776d7d4c92085f8c2reed@android.compublic:
23ed673310e2551e64d8196f7776d7d4c92085f8c2reed@android.com    Iter(Reporter* r) : fReporter(r) {
24ed673310e2551e64d8196f7776d7d4c92085f8c2reed@android.com        r->ref();
25ed673310e2551e64d8196f7776d7d4c92085f8c2reed@android.com        fReg = TestRegistry::Head();
26ed673310e2551e64d8196f7776d7d4c92085f8c2reed@android.com    }
2780e39a77b16f4396eed230efea1d0b2fc8cbfb00reed@android.com
28ed673310e2551e64d8196f7776d7d4c92085f8c2reed@android.com    ~Iter() {
29ed673310e2551e64d8196f7776d7d4c92085f8c2reed@android.com        fReporter->unref();
30ed673310e2551e64d8196f7776d7d4c92085f8c2reed@android.com    }
3180e39a77b16f4396eed230efea1d0b2fc8cbfb00reed@android.com
32ed673310e2551e64d8196f7776d7d4c92085f8c2reed@android.com    Test* next() {
33ed673310e2551e64d8196f7776d7d4c92085f8c2reed@android.com        if (fReg) {
34ed673310e2551e64d8196f7776d7d4c92085f8c2reed@android.com            TestRegistry::Factory fact = fReg->factory();
35ed673310e2551e64d8196f7776d7d4c92085f8c2reed@android.com            fReg = fReg->next();
36ed673310e2551e64d8196f7776d7d4c92085f8c2reed@android.com            Test* test = fact(NULL);
37ed673310e2551e64d8196f7776d7d4c92085f8c2reed@android.com            test->setReporter(fReporter);
38ed673310e2551e64d8196f7776d7d4c92085f8c2reed@android.com            return test;
39ed673310e2551e64d8196f7776d7d4c92085f8c2reed@android.com        }
40ed673310e2551e64d8196f7776d7d4c92085f8c2reed@android.com        return NULL;
41ed673310e2551e64d8196f7776d7d4c92085f8c2reed@android.com    }
4280e39a77b16f4396eed230efea1d0b2fc8cbfb00reed@android.com
4357b799e951064b9328b5c676dcc3b4cb4477cc2breed@android.com    static int Count() {
4457b799e951064b9328b5c676dcc3b4cb4477cc2breed@android.com        const TestRegistry* reg = TestRegistry::Head();
4557b799e951064b9328b5c676dcc3b4cb4477cc2breed@android.com        int count = 0;
4657b799e951064b9328b5c676dcc3b4cb4477cc2breed@android.com        while (reg) {
4757b799e951064b9328b5c676dcc3b4cb4477cc2breed@android.com            count += 1;
4857b799e951064b9328b5c676dcc3b4cb4477cc2breed@android.com            reg = reg->next();
4957b799e951064b9328b5c676dcc3b4cb4477cc2breed@android.com        }
5057b799e951064b9328b5c676dcc3b4cb4477cc2breed@android.com        return count;
5157b799e951064b9328b5c676dcc3b4cb4477cc2breed@android.com    }
5280e39a77b16f4396eed230efea1d0b2fc8cbfb00reed@android.com
53ed673310e2551e64d8196f7776d7d4c92085f8c2reed@android.comprivate:
54ed673310e2551e64d8196f7776d7d4c92085f8c2reed@android.com    Reporter* fReporter;
55ed673310e2551e64d8196f7776d7d4c92085f8c2reed@android.com    const TestRegistry* fReg;
56ed673310e2551e64d8196f7776d7d4c92085f8c2reed@android.com};
57ed673310e2551e64d8196f7776d7d4c92085f8c2reed@android.com
58ed673310e2551e64d8196f7776d7d4c92085f8c2reed@android.comstatic const char* result2string(Reporter::Result result) {
59ed673310e2551e64d8196f7776d7d4c92085f8c2reed@android.com    return result == Reporter::kPassed ? "passed" : "FAILED";
60ed673310e2551e64d8196f7776d7d4c92085f8c2reed@android.com}
61ed673310e2551e64d8196f7776d7d4c92085f8c2reed@android.com
62d252db03d9650013b545ef9781fe993c07f8f314reed@android.comclass DebugfReporter : public Reporter {
6357b799e951064b9328b5c676dcc3b4cb4477cc2breed@android.compublic:
64d54e1e9751eea63b528a6e62d919d06929c9bd8fcaryclark@google.com    DebugfReporter(bool allowExtendedTest)
65d54e1e9751eea63b528a6e62d919d06929c9bd8fcaryclark@google.com        : fIndex(0)
66d54e1e9751eea63b528a6e62d919d06929c9bd8fcaryclark@google.com        , fTotal(0)
67d54e1e9751eea63b528a6e62d919d06929c9bd8fcaryclark@google.com        , fAllowExtendedTest(allowExtendedTest) {
68d54e1e9751eea63b528a6e62d919d06929c9bd8fcaryclark@google.com    }
69eeb3b7ff9813600b6cab662e1a0174ee2e279cacreed@android.com
7057b799e951064b9328b5c676dcc3b4cb4477cc2breed@android.com    void setIndexOfTotal(int index, int total) {
7157b799e951064b9328b5c676dcc3b4cb4477cc2breed@android.com        fIndex = index;
7257b799e951064b9328b5c676dcc3b4cb4477cc2breed@android.com        fTotal = total;
7357b799e951064b9328b5c676dcc3b4cb4477cc2breed@android.com    }
74d54e1e9751eea63b528a6e62d919d06929c9bd8fcaryclark@google.com
75d54e1e9751eea63b528a6e62d919d06929c9bd8fcaryclark@google.com    virtual bool allowExtendedTest() const {
76391ca66276b27464f255c371e7e95f56f9042042skia.committer@gmail.com        return fAllowExtendedTest;
77d54e1e9751eea63b528a6e62d919d06929c9bd8fcaryclark@google.com    }
78d54e1e9751eea63b528a6e62d919d06929c9bd8fcaryclark@google.com
79ed673310e2551e64d8196f7776d7d4c92085f8c2reed@android.comprotected:
80ed673310e2551e64d8196f7776d7d4c92085f8c2reed@android.com    virtual void onStart(Test* test) {
81f4d1b3911831d2111a351b2742b3a94a9d17f92edjsollen@google.com        SkDebugf("[%d/%d] %s...\n", fIndex+1, fTotal, test->getName());
82ed673310e2551e64d8196f7776d7d4c92085f8c2reed@android.com    }
83ed673310e2551e64d8196f7776d7d4c92085f8c2reed@android.com    virtual void onReport(const char desc[], Reporter::Result result) {
84f4d1b3911831d2111a351b2742b3a94a9d17f92edjsollen@google.com        SkDebugf("\t%s: %s\n", result2string(result), desc);
85eeb3b7ff9813600b6cab662e1a0174ee2e279cacreed@android.com    }
8654f0d1b7113cb0dc184e522539aab1030a28a421sugoi@google.com    virtual void onEnd(Test*) {
87f4d1b3911831d2111a351b2742b3a94a9d17f92edjsollen@google.com        if (!this->getCurrSuccess()) {
88f4d1b3911831d2111a351b2742b3a94a9d17f92edjsollen@google.com            SkDebugf("---- FAILED\n");
89eeb3b7ff9813600b6cab662e1a0174ee2e279cacreed@android.com        }
90eeb3b7ff9813600b6cab662e1a0174ee2e279cacreed@android.com    }
91f4d1b3911831d2111a351b2742b3a94a9d17f92edjsollen@google.comprivate:
9257b799e951064b9328b5c676dcc3b4cb4477cc2breed@android.com    int fIndex, fTotal;
93d54e1e9751eea63b528a6e62d919d06929c9bd8fcaryclark@google.com    bool fAllowExtendedTest;
94ed673310e2551e64d8196f7776d7d4c92085f8c2reed@android.com};
95ed673310e2551e64d8196f7776d7d4c92085f8c2reed@android.com
96789c6f291ecfff925086015360da525d6de1c835reed@google.comstatic const char* make_canonical_dir_path(const char* path, SkString* storage) {
97789c6f291ecfff925086015360da525d6de1c835reed@google.com    if (path) {
98789c6f291ecfff925086015360da525d6de1c835reed@google.com        // clean it up so it always has a trailing searator
99789c6f291ecfff925086015360da525d6de1c835reed@google.com        size_t len = strlen(path);
100789c6f291ecfff925086015360da525d6de1c835reed@google.com        if (0 == len) {
101789c6f291ecfff925086015360da525d6de1c835reed@google.com            path = NULL;
102789c6f291ecfff925086015360da525d6de1c835reed@google.com        } else if (SkPATH_SEPARATOR != path[len - 1]) {
103789c6f291ecfff925086015360da525d6de1c835reed@google.com            // resize to len + 1, to make room for searator
104789c6f291ecfff925086015360da525d6de1c835reed@google.com            storage->set(path, len + 1);
105789c6f291ecfff925086015360da525d6de1c835reed@google.com            storage->writable_str()[len] = SkPATH_SEPARATOR;
106789c6f291ecfff925086015360da525d6de1c835reed@google.com            path = storage->c_str();
107789c6f291ecfff925086015360da525d6de1c835reed@google.com        }
108789c6f291ecfff925086015360da525d6de1c835reed@google.com    }
109789c6f291ecfff925086015360da525d6de1c835reed@google.com    return path;
110789c6f291ecfff925086015360da525d6de1c835reed@google.com}
111789c6f291ecfff925086015360da525d6de1c835reed@google.com
112cb62650ecfd323a1ac215103a4d3106faad3c3cddjsollen@google.comstatic SkString gTmpDir;
113789c6f291ecfff925086015360da525d6de1c835reed@google.com
114cb62650ecfd323a1ac215103a4d3106faad3c3cddjsollen@google.comconst SkString& Test::GetTmpDir() {
115789c6f291ecfff925086015360da525d6de1c835reed@google.com    return gTmpDir;
116789c6f291ecfff925086015360da525d6de1c835reed@google.com}
117789c6f291ecfff925086015360da525d6de1c835reed@google.com
118cb62650ecfd323a1ac215103a4d3106faad3c3cddjsollen@google.comstatic SkString gResourcePath;
119cb62650ecfd323a1ac215103a4d3106faad3c3cddjsollen@google.com
120cb62650ecfd323a1ac215103a4d3106faad3c3cddjsollen@google.comconst SkString& Test::GetResourcePath() {
121cb62650ecfd323a1ac215103a4d3106faad3c3cddjsollen@google.com    return gResourcePath;
122cb62650ecfd323a1ac215103a4d3106faad3c3cddjsollen@google.com}
123cb62650ecfd323a1ac215103a4d3106faad3c3cddjsollen@google.com
1245987f58036574ccf23049b5fe71f29a441d0641dcaryclark@google.comint tool_main(int argc, char** argv);
1255987f58036574ccf23049b5fe71f29a441d0641dcaryclark@google.comint tool_main(int argc, char** argv) {
1264e23068b374023d43c4c725138d523721d975892bsalomon@google.com#if SK_ENABLE_INST_COUNT
127a276975a62ef4d9941e40c831fdfe7852e0e243ereed@google.com    gPrintInstCount = true;
128a276975a62ef4d9941e40c831fdfe7852e0e243ereed@google.com#endif
129d54e1e9751eea63b528a6e62d919d06929c9bd8fcaryclark@google.com    bool allowExtendedTest = false;
130d54e1e9751eea63b528a6e62d919d06929c9bd8fcaryclark@google.com    bool verboseOutput = false;
131d54e1e9751eea63b528a6e62d919d06929c9bd8fcaryclark@google.com
132a276975a62ef4d9941e40c831fdfe7852e0e243ereed@google.com    SkGraphics::Init();
1335af16f8d670b3ce1c7644a4737e02e2e2257614ebungeman@google.com
1345af16f8d670b3ce1c7644a4737e02e2e2257614ebungeman@google.com    const char* matchStr = NULL;
1355af16f8d670b3ce1c7644a4737e02e2e2257614ebungeman@google.com
1365af16f8d670b3ce1c7644a4737e02e2e2257614ebungeman@google.com    char* const* stop = argv + argc;
1375af16f8d670b3ce1c7644a4737e02e2e2257614ebungeman@google.com    for (++argv; argv < stop; ++argv) {
138d54e1e9751eea63b528a6e62d919d06929c9bd8fcaryclark@google.com        if (0 == strcmp(*argv, "--match") || 0 == strcmp(*argv, "-m")) {
1395af16f8d670b3ce1c7644a4737e02e2e2257614ebungeman@google.com            ++argv;
1405af16f8d670b3ce1c7644a4737e02e2e2257614ebungeman@google.com            if (argv < stop && **argv) {
1415af16f8d670b3ce1c7644a4737e02e2e2257614ebungeman@google.com                matchStr = *argv;
142789c6f291ecfff925086015360da525d6de1c835reed@google.com            } else {
143789c6f291ecfff925086015360da525d6de1c835reed@google.com                SkDebugf("no following argument to --match\n");
144789c6f291ecfff925086015360da525d6de1c835reed@google.com                return -1;
145789c6f291ecfff925086015360da525d6de1c835reed@google.com            }
146d54e1e9751eea63b528a6e62d919d06929c9bd8fcaryclark@google.com        } else if (0 == strcmp(*argv, "--tmpDir") || 0 == strcmp(*argv, "-t")) {
147789c6f291ecfff925086015360da525d6de1c835reed@google.com            ++argv;
148789c6f291ecfff925086015360da525d6de1c835reed@google.com            if (argv < stop && **argv) {
149cb62650ecfd323a1ac215103a4d3106faad3c3cddjsollen@google.com                make_canonical_dir_path(*argv, &gTmpDir);
150789c6f291ecfff925086015360da525d6de1c835reed@google.com            } else {
151789c6f291ecfff925086015360da525d6de1c835reed@google.com                SkDebugf("no following argument to --tmpDir\n");
152789c6f291ecfff925086015360da525d6de1c835reed@google.com                return -1;
1535af16f8d670b3ce1c7644a4737e02e2e2257614ebungeman@google.com            }
154d54e1e9751eea63b528a6e62d919d06929c9bd8fcaryclark@google.com        } else if (0 == strcmp(*argv, "--resourcePath") || 0 == strcmp(*argv, "-i")) {
155cb62650ecfd323a1ac215103a4d3106faad3c3cddjsollen@google.com            argv++;
156cb62650ecfd323a1ac215103a4d3106faad3c3cddjsollen@google.com            if (argv < stop && **argv) {
157cb62650ecfd323a1ac215103a4d3106faad3c3cddjsollen@google.com                make_canonical_dir_path(*argv, &gResourcePath);
158cb62650ecfd323a1ac215103a4d3106faad3c3cddjsollen@google.com            }
159d54e1e9751eea63b528a6e62d919d06929c9bd8fcaryclark@google.com        } else if (0 == strcmp(*argv, "--extendedTest") || 0 == strcmp(*argv, "-x")) {
160d54e1e9751eea63b528a6e62d919d06929c9bd8fcaryclark@google.com            allowExtendedTest = true;
161d54e1e9751eea63b528a6e62d919d06929c9bd8fcaryclark@google.com        } else if (0 == strcmp(*argv, "--verbose") || 0 == strcmp(*argv, "-v")) {
162d54e1e9751eea63b528a6e62d919d06929c9bd8fcaryclark@google.com            verboseOutput = true;
163d54e1e9751eea63b528a6e62d919d06929c9bd8fcaryclark@google.com        } else {
164d54e1e9751eea63b528a6e62d919d06929c9bd8fcaryclark@google.com            if (0 != strcmp(*argv, "--help") && 0 != strcmp(*argv, "-h")
165d54e1e9751eea63b528a6e62d919d06929c9bd8fcaryclark@google.com                    && 0 != strcmp(*argv, "-?")) {
166d54e1e9751eea63b528a6e62d919d06929c9bd8fcaryclark@google.com                SkDebugf("Unknown option %s. ", *argv);
167d54e1e9751eea63b528a6e62d919d06929c9bd8fcaryclark@google.com            }
168d54e1e9751eea63b528a6e62d919d06929c9bd8fcaryclark@google.com            SkDebugf("Skia UnitTests options are:\n");
169d54e1e9751eea63b528a6e62d919d06929c9bd8fcaryclark@google.com            SkDebugf("  -m --match [test-name-substring]\n");
170d54e1e9751eea63b528a6e62d919d06929c9bd8fcaryclark@google.com            SkDebugf("  -t --tmpDir [dir]\n");
171d54e1e9751eea63b528a6e62d919d06929c9bd8fcaryclark@google.com            SkDebugf("  -i --resourcePath [dir]\n");
172d54e1e9751eea63b528a6e62d919d06929c9bd8fcaryclark@google.com            SkDebugf("  -x --extendedTest\n");
173d54e1e9751eea63b528a6e62d919d06929c9bd8fcaryclark@google.com            SkDebugf("  -v --verbose\n");
174d54e1e9751eea63b528a6e62d919d06929c9bd8fcaryclark@google.com            return 1;
175eeb3b7ff9813600b6cab662e1a0174ee2e279cacreed@android.com        }
176eeb3b7ff9813600b6cab662e1a0174ee2e279cacreed@android.com    }
1775e5adfd12cc2cb194db971708cd7f34ff47e10b4reed@android.com
17891d449ebf895d3c412a051272af3175be6976872reed@google.com    {
17991d449ebf895d3c412a051272af3175be6976872reed@google.com        SkString header("Skia UnitTests:");
18091d449ebf895d3c412a051272af3175be6976872reed@google.com        if (matchStr) {
18191d449ebf895d3c412a051272af3175be6976872reed@google.com            header.appendf(" --match %s", matchStr);
18291d449ebf895d3c412a051272af3175be6976872reed@google.com        }
183cb62650ecfd323a1ac215103a4d3106faad3c3cddjsollen@google.com        if (!gTmpDir.isEmpty()) {
184cb62650ecfd323a1ac215103a4d3106faad3c3cddjsollen@google.com            header.appendf(" --tmpDir %s", gTmpDir.c_str());
185cb62650ecfd323a1ac215103a4d3106faad3c3cddjsollen@google.com        }
186cb62650ecfd323a1ac215103a4d3106faad3c3cddjsollen@google.com        if (!gResourcePath.isEmpty()) {
187cb62650ecfd323a1ac215103a4d3106faad3c3cddjsollen@google.com            header.appendf(" --resourcePath %s", gResourcePath.c_str());
188789c6f291ecfff925086015360da525d6de1c835reed@google.com        }
18991d449ebf895d3c412a051272af3175be6976872reed@google.com#ifdef SK_DEBUG
19091d449ebf895d3c412a051272af3175be6976872reed@google.com        header.append(" SK_DEBUG");
19191d449ebf895d3c412a051272af3175be6976872reed@google.com#else
19291d449ebf895d3c412a051272af3175be6976872reed@google.com        header.append(" SK_RELEASE");
19391d449ebf895d3c412a051272af3175be6976872reed@google.com#endif
19491d449ebf895d3c412a051272af3175be6976872reed@google.com#ifdef SK_SCALAR_IS_FIXED
19591d449ebf895d3c412a051272af3175be6976872reed@google.com        header.append(" SK_SCALAR_IS_FIXED");
19691d449ebf895d3c412a051272af3175be6976872reed@google.com#else
19791d449ebf895d3c412a051272af3175be6976872reed@google.com        header.append(" SK_SCALAR_IS_FLOAT");
19891d449ebf895d3c412a051272af3175be6976872reed@google.com#endif
199f4d1b3911831d2111a351b2742b3a94a9d17f92edjsollen@google.com        SkDebugf("%s\n", header.c_str());
20091d449ebf895d3c412a051272af3175be6976872reed@google.com    }
20191d449ebf895d3c412a051272af3175be6976872reed@google.com
202d54e1e9751eea63b528a6e62d919d06929c9bd8fcaryclark@google.com    DebugfReporter reporter(allowExtendedTest);
203ed673310e2551e64d8196f7776d7d4c92085f8c2reed@android.com    Iter iter(&reporter);
204ed673310e2551e64d8196f7776d7d4c92085f8c2reed@android.com    Test* test;
20580e39a77b16f4396eed230efea1d0b2fc8cbfb00reed@android.com
20657b799e951064b9328b5c676dcc3b4cb4477cc2breed@android.com    const int count = Iter::Count();
20757b799e951064b9328b5c676dcc3b4cb4477cc2breed@android.com    int index = 0;
2085af16f8d670b3ce1c7644a4737e02e2e2257614ebungeman@google.com    int failCount = 0;
2095af16f8d670b3ce1c7644a4737e02e2e2257614ebungeman@google.com    int skipCount = 0;
210ed673310e2551e64d8196f7776d7d4c92085f8c2reed@android.com    while ((test = iter.next()) != NULL) {
21157b799e951064b9328b5c676dcc3b4cb4477cc2breed@android.com        reporter.setIndexOfTotal(index, count);
2125af16f8d670b3ce1c7644a4737e02e2e2257614ebungeman@google.com        if (NULL != matchStr && !strstr(test->getName(), matchStr)) {
2135af16f8d670b3ce1c7644a4737e02e2e2257614ebungeman@google.com            ++skipCount;
2145af16f8d670b3ce1c7644a4737e02e2e2257614ebungeman@google.com        } else {
2155af16f8d670b3ce1c7644a4737e02e2e2257614ebungeman@google.com            if (!test->run()) {
2165af16f8d670b3ce1c7644a4737e02e2e2257614ebungeman@google.com                ++failCount;
2175af16f8d670b3ce1c7644a4737e02e2e2257614ebungeman@google.com            }
2185af16f8d670b3ce1c7644a4737e02e2e2257614ebungeman@google.com        }
219ed673310e2551e64d8196f7776d7d4c92085f8c2reed@android.com        SkDELETE(test);
22057b799e951064b9328b5c676dcc3b4cb4477cc2breed@android.com        index += 1;
221ed673310e2551e64d8196f7776d7d4c92085f8c2reed@android.com    }
222eeb3b7ff9813600b6cab662e1a0174ee2e279cacreed@android.com
223f4d1b3911831d2111a351b2742b3a94a9d17f92edjsollen@google.com    SkDebugf("Finished %d tests, %d failures, %d skipped.\n",
224f4d1b3911831d2111a351b2742b3a94a9d17f92edjsollen@google.com             count, failCount, skipCount);
225d54e1e9751eea63b528a6e62d919d06929c9bd8fcaryclark@google.com    int testCount = reporter.countTests();
226d54e1e9751eea63b528a6e62d919d06929c9bd8fcaryclark@google.com    if (verboseOutput && testCount > 0) {
227d54e1e9751eea63b528a6e62d919d06929c9bd8fcaryclark@google.com        SkDebugf("Ran %d Internal tests.\n", testCount);
228d54e1e9751eea63b528a6e62d919d06929c9bd8fcaryclark@google.com    }
229bdb1be599436a894ab88dfc323d14c0afb496a6frobertphillips@google.com#if SK_SUPPORT_GPU
230bdb1be599436a894ab88dfc323d14c0afb496a6frobertphillips@google.com
231bdb1be599436a894ab88dfc323d14c0afb496a6frobertphillips@google.com#if GR_CACHE_STATS
232bdb1be599436a894ab88dfc323d14c0afb496a6frobertphillips@google.com    GrContext *gr = GpuTest::GetContext();
233bdb1be599436a894ab88dfc323d14c0afb496a6frobertphillips@google.com
234bdb1be599436a894ab88dfc323d14c0afb496a6frobertphillips@google.com    gr->printCacheStats();
235bdb1be599436a894ab88dfc323d14c0afb496a6frobertphillips@google.com#endif
236bdb1be599436a894ab88dfc323d14c0afb496a6frobertphillips@google.com
237bdb1be599436a894ab88dfc323d14c0afb496a6frobertphillips@google.com#endif
238bdb1be599436a894ab88dfc323d14c0afb496a6frobertphillips@google.com
239a276975a62ef4d9941e40c831fdfe7852e0e243ereed@google.com    SkGraphics::Term();
24067b915de99e6b89d476907930ac8c27afb64d10ebsalomon@google.com    GpuTest::DestroyContexts();
241a276975a62ef4d9941e40c831fdfe7852e0e243ereed@google.com
2425af16f8d670b3ce1c7644a4737e02e2e2257614ebungeman@google.com    return (failCount == 0) ? 0 : 1;
243ed673310e2551e64d8196f7776d7d4c92085f8c2reed@android.com}
2445987f58036574ccf23049b5fe71f29a441d0641dcaryclark@google.com
2457158e6acca1b1ecc321d4d514a31cba11b5ead60borenet@google.com#if !defined(SK_BUILD_FOR_IOS) && !defined(SK_BUILD_FOR_NACL)
2465987f58036574ccf23049b5fe71f29a441d0641dcaryclark@google.comint main(int argc, char * const argv[]) {
2475987f58036574ccf23049b5fe71f29a441d0641dcaryclark@google.com    return tool_main(argc, (char**) argv);
2485987f58036574ccf23049b5fe71f29a441d0641dcaryclark@google.com}
2495987f58036574ccf23049b5fe71f29a441d0641dcaryclark@google.com#endif
250