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