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
830e6e2af14e84216b1c113fd7500d0822bc81daamtklein#include "CrashHandler.h"
98f6884aab8aecd7657cf3f9cdbc682f0deca29c5tfarina@chromium.org#include "OverwriteLine.h"
10bcbc1788b478b1e54079318ad073e8490aa66faetfarina#include "Resources.h"
1162a69c26b3a34c259918d6c97b4dea76b6285b67herb#include "SkAtomics.h"
1217f0b6df7248b9bbdaddacc3a6c9c6efe4ae278ecaryclark#include "SkCommonFlags.h"
135e5adfd12cc2cb194db971708cd7f34ff47e10b4reed@android.com#include "SkGraphics.h"
140506b9d7d531fdfc9536895481d789a48626a86bcommit-bot@chromium.org#include "SkOSFile.h"
15ab87d7abf1df007c90bef2e916294ca325d81c81Cary Clark#include "SkPathOpsDebug.h"
16197845ae157da0175bb8dd05c4fd9eb9cd935e54commit-bot@chromium.org#include "SkTArray.h"
17406654be7a930b484159f5bca107d3b11d8a9edemtklein#include "SkTaskGroup.h"
18197845ae157da0175bb8dd05c4fd9eb9cd935e54commit-bot@chromium.org#include "SkTemplates.h"
190506b9d7d531fdfc9536895481d789a48626a86bcommit-bot@chromium.org#include "SkTime.h"
20ed673310e2551e64d8196f7776d7d4c92085f8c2reed@android.com#include "Test.h"
21ed673310e2551e64d8196f7776d7d4c92085f8c2reed@android.com
22bdb1be599436a894ab88dfc323d14c0afb496a6frobertphillips@google.com#if SK_SUPPORT_GPU
23bdb1be599436a894ab88dfc323d14c0afb496a6frobertphillips@google.com#include "GrContext.h"
240dc5bd149a8b69e8dc6d3b4713b827659c9b0a6bcommit-bot@chromium.org#include "GrContextFactory.h"
25bdb1be599436a894ab88dfc323d14c0afb496a6frobertphillips@google.com#endif
26bdb1be599436a894ab88dfc323d14c0afb496a6frobertphillips@google.com
27ed673310e2551e64d8196f7776d7d4c92085f8c2reed@android.comusing namespace skiatest;
283724e574a744491b7cfb8187ac865a70ef3d4528bsalomonusing namespace sk_gpu_test;
29ed673310e2551e64d8196f7776d7d4c92085f8c2reed@android.com
301326068147ee60de138061a3fc1157fcfd5d017bcaryclarkDEFINE_bool2(dumpOp, d, false, "dump the pathOps to a file to recover mid-crash.");
31261c66668269588a26757a0bfe28a3a3eac07665commit-bot@chromium.orgDEFINE_bool2(extendedTest, x, false, "run extended tests for pathOps.");
3259d5a0e3f560da40e0ae7036a01d7d58ce3718d8Cary ClarkDEFINE_bool2(runFail, f, false, "check for success on tests known to fail.");
331326068147ee60de138061a3fc1157fcfd5d017bcaryclarkDEFINE_bool2(verifyOp, y, false, "compare the pathOps result against a region.");
341326068147ee60de138061a3fc1157fcfd5d017bcaryclark
35ab87d7abf1df007c90bef2e916294ca325d81c81Cary Clark#if DEBUG_COIN
36ab87d7abf1df007c90bef2e916294ca325d81c81Cary ClarkDEFINE_bool2(coinTest, c, false, "detect unused coincidence algorithms.");
37ab87d7abf1df007c90bef2e916294ca325d81c81Cary Clark#endif
38261c66668269588a26757a0bfe28a3a3eac07665commit-bot@chromium.org
39d252db03d9650013b545ef9781fe993c07f8f314reed@android.com// need to explicitly declare this, or we get some weird infinite loop llist
40d252db03d9650013b545ef9781fe993c07f8f314reed@android.comtemplate TestRegistry* TestRegistry::gHead;
4126ad22ab61539e3d3b6bc5e0da8dcebbd52a53decaryclarkvoid (*gVerboseFinalize)() = nullptr;
42d252db03d9650013b545ef9781fe993c07f8f314reed@android.com
4387f3ba4847aa575016eb3a21e944197d757df8c0halcanary// The threads report back to this object when they are done.
4487f3ba4847aa575016eb3a21e944197d757df8c0halcanaryclass Status {
45ed673310e2551e64d8196f7776d7d4c92085f8c2reed@android.compublic:
4687f3ba4847aa575016eb3a21e944197d757df8c0halcanary    explicit Status(int total)
4787f3ba4847aa575016eb3a21e944197d757df8c0halcanary        : fDone(0), fTestCount(0), fFailCount(0), fTotal(total) {}
4887f3ba4847aa575016eb3a21e944197d757df8c0halcanary    // Threadsafe.
4987f3ba4847aa575016eb3a21e944197d757df8c0halcanary    void endTest(const char* testName,
5087f3ba4847aa575016eb3a21e944197d757df8c0halcanary                 bool success,
5187f3ba4847aa575016eb3a21e944197d757df8c0halcanary                 SkMSec elapsed,
5287f3ba4847aa575016eb3a21e944197d757df8c0halcanary                 int testCount) {
53261c66668269588a26757a0bfe28a3a3eac07665commit-bot@chromium.org        const int done = 1 + sk_atomic_inc(&fDone);
5487f3ba4847aa575016eb3a21e944197d757df8c0halcanary        for (int i = 0; i < testCount; ++i) {
5587f3ba4847aa575016eb3a21e944197d757df8c0halcanary            sk_atomic_inc(&fTestCount);
5687f3ba4847aa575016eb3a21e944197d757df8c0halcanary        }
5787f3ba4847aa575016eb3a21e944197d757df8c0halcanary        if (!success) {
5887f3ba4847aa575016eb3a21e944197d757df8c0halcanary            SkDebugf("\n---- %s FAILED", testName);
590506b9d7d531fdfc9536895481d789a48626a86bcommit-bot@chromium.org        }
600506b9d7d531fdfc9536895481d789a48626a86bcommit-bot@chromium.org
61261c66668269588a26757a0bfe28a3a3eac07665commit-bot@chromium.org        SkString prefix(kSkOverwriteLine);
62261c66668269588a26757a0bfe28a3a3eac07665commit-bot@chromium.org        SkString time;
63261c66668269588a26757a0bfe28a3a3eac07665commit-bot@chromium.org        if (FLAGS_verbose) {
64261c66668269588a26757a0bfe28a3a3eac07665commit-bot@chromium.org            prefix.printf("\n");
6587f3ba4847aa575016eb3a21e944197d757df8c0halcanary            time.printf("%5dms ", elapsed);
66eeb3b7ff9813600b6cab662e1a0174ee2e279cacreed@android.com        }
6787f3ba4847aa575016eb3a21e944197d757df8c0halcanary        SkDebugf("%s[%3d/%3d] %s%s", prefix.c_str(), done, fTotal, time.c_str(),
6887f3ba4847aa575016eb3a21e944197d757df8c0halcanary                 testName);
69eeb3b7ff9813600b6cab662e1a0174ee2e279cacreed@android.com    }
70197845ae157da0175bb8dd05c4fd9eb9cd935e54commit-bot@chromium.org
7187f3ba4847aa575016eb3a21e944197d757df8c0halcanary    void reportFailure() { sk_atomic_inc(&fFailCount); }
7287f3ba4847aa575016eb3a21e944197d757df8c0halcanary
7387f3ba4847aa575016eb3a21e944197d757df8c0halcanary    int32_t testCount() { return fTestCount; }
7487f3ba4847aa575016eb3a21e944197d757df8c0halcanary    int32_t failCount() { return fFailCount; }
7587f3ba4847aa575016eb3a21e944197d757df8c0halcanary
76f4d1b3911831d2111a351b2742b3a94a9d17f92edjsollen@google.comprivate:
77261c66668269588a26757a0bfe28a3a3eac07665commit-bot@chromium.org    int32_t fDone;  // atomic
7887f3ba4847aa575016eb3a21e944197d757df8c0halcanary    int32_t fTestCount;  // atomic
7987f3ba4847aa575016eb3a21e944197d757df8c0halcanary    int32_t fFailCount;  // atomic
80261c66668269588a26757a0bfe28a3a3eac07665commit-bot@chromium.org    const int fTotal;
81ed673310e2551e64d8196f7776d7d4c92085f8c2reed@android.com};
82ed673310e2551e64d8196f7776d7d4c92085f8c2reed@android.com
83048494c1e236c4db9d18952de83d2602c1abc7c3mtkleinclass SkTestRunnable {
84197845ae157da0175bb8dd05c4fd9eb9cd935e54commit-bot@chromium.orgpublic:
8587f3ba4847aa575016eb3a21e944197d757df8c0halcanary    SkTestRunnable(const Test& test,
8687f3ba4847aa575016eb3a21e944197d757df8c0halcanary                   Status* status,
8796fcdcc219d2a0d3579719b84b28bede76efba64halcanary                   GrContextFactory* grContextFactory = nullptr)
8887f3ba4847aa575016eb3a21e944197d757df8c0halcanary        : fTest(test), fStatus(status), fGrContextFactory(grContextFactory) {}
89197845ae157da0175bb8dd05c4fd9eb9cd935e54commit-bot@chromium.org
90048494c1e236c4db9d18952de83d2602c1abc7c3mtklein  void operator()() {
9187f3ba4847aa575016eb3a21e944197d757df8c0halcanary      struct TestReporter : public skiatest::Reporter {
9287f3ba4847aa575016eb3a21e944197d757df8c0halcanary      public:
93a35c68d52ad2694ef6f620a166baf93d4ef45b5bCary Clark          TestReporter() : fStats(nullptr), fError(false), fTestCount(0) {}
9436352bf5e38f45a70ee4f4fc132a38048d38206dmtklein          void bumpTestCount() override { ++fTestCount; }
9536352bf5e38f45a70ee4f4fc132a38048d38206dmtklein          bool allowExtendedTest() const override {
9687f3ba4847aa575016eb3a21e944197d757df8c0halcanary              return FLAGS_extendedTest;
9787f3ba4847aa575016eb3a21e944197d757df8c0halcanary          }
9836352bf5e38f45a70ee4f4fc132a38048d38206dmtklein          bool verbose() const override { return FLAGS_veryVerbose; }
9936352bf5e38f45a70ee4f4fc132a38048d38206dmtklein          void reportFailed(const skiatest::Failure& failure) override {
10087f3ba4847aa575016eb3a21e944197d757df8c0halcanary              SkDebugf("\nFAILED: %s", failure.toString().c_str());
10187f3ba4847aa575016eb3a21e944197d757df8c0halcanary              fError = true;
10287f3ba4847aa575016eb3a21e944197d757df8c0halcanary          }
103f114a9bb4ea1169ce9ad59938403aabca105fdeecaryclark          void* stats() const override { return fStats; }
104ab87d7abf1df007c90bef2e916294ca325d81c81Cary Clark          void* fStats;
10587f3ba4847aa575016eb3a21e944197d757df8c0halcanary          bool fError;
10687f3ba4847aa575016eb3a21e944197d757df8c0halcanary          int fTestCount;
10787f3ba4847aa575016eb3a21e944197d757df8c0halcanary      } reporter;
10887f3ba4847aa575016eb3a21e944197d757df8c0halcanary
109ec4d4d784dbb250e572f8e04d18d0fd2ebeee851benjaminwagner      const Timer timer;
11087f3ba4847aa575016eb3a21e944197d757df8c0halcanary      fTest.proc(&reporter, fGrContextFactory);
111ec4d4d784dbb250e572f8e04d18d0fd2ebeee851benjaminwagner      SkMSec elapsed = timer.elapsedMsInt();
11287f3ba4847aa575016eb3a21e944197d757df8c0halcanary      if (reporter.fError) {
11387f3ba4847aa575016eb3a21e944197d757df8c0halcanary          fStatus->reportFailure();
114197845ae157da0175bb8dd05c4fd9eb9cd935e54commit-bot@chromium.org      }
11587f3ba4847aa575016eb3a21e944197d757df8c0halcanary      fStatus->endTest(fTest.name, !reporter.fError, elapsed,
11687f3ba4847aa575016eb3a21e944197d757df8c0halcanary                       reporter.fTestCount);
117197845ae157da0175bb8dd05c4fd9eb9cd935e54commit-bot@chromium.org  }
118197845ae157da0175bb8dd05c4fd9eb9cd935e54commit-bot@chromium.org
119197845ae157da0175bb8dd05c4fd9eb9cd935e54commit-bot@chromium.orgprivate:
12087f3ba4847aa575016eb3a21e944197d757df8c0halcanary    Test fTest;
12187f3ba4847aa575016eb3a21e944197d757df8c0halcanary    Status* fStatus;
12287f3ba4847aa575016eb3a21e944197d757df8c0halcanary    GrContextFactory* fGrContextFactory;
123197845ae157da0175bb8dd05c4fd9eb9cd935e54commit-bot@chromium.org};
124ba59d64b05b13081060a266c999158efab575b61commit-bot@chromium.org
1255a47b09fe8fff1439510f1839722e24ed6a91eaecommit-bot@chromium.orgstatic bool should_run(const char* testName, bool isGPUTest) {
1265a47b09fe8fff1439510f1839722e24ed6a91eaecommit-bot@chromium.org    if (SkCommandLineFlags::ShouldSkip(FLAGS_match, testName)) {
1275a47b09fe8fff1439510f1839722e24ed6a91eaecommit-bot@chromium.org        return false;
1285a47b09fe8fff1439510f1839722e24ed6a91eaecommit-bot@chromium.org    }
1295a47b09fe8fff1439510f1839722e24ed6a91eaecommit-bot@chromium.org    if (!FLAGS_cpu && !isGPUTest) {
1305a47b09fe8fff1439510f1839722e24ed6a91eaecommit-bot@chromium.org        return false;
1315a47b09fe8fff1439510f1839722e24ed6a91eaecommit-bot@chromium.org    }
1325a47b09fe8fff1439510f1839722e24ed6a91eaecommit-bot@chromium.org    if (!FLAGS_gpu && isGPUTest) {
1335a47b09fe8fff1439510f1839722e24ed6a91eaecommit-bot@chromium.org        return false;
1345a47b09fe8fff1439510f1839722e24ed6a91eaecommit-bot@chromium.org    }
1355a47b09fe8fff1439510f1839722e24ed6a91eaecommit-bot@chromium.org    return true;
1365a47b09fe8fff1439510f1839722e24ed6a91eaecommit-bot@chromium.org}
1375a47b09fe8fff1439510f1839722e24ed6a91eaecommit-bot@chromium.org
138be28ee2974474800323ce4fabf62a839018be591Mike Kleinint main(int argc, char** argv) {
139be28ee2974474800323ce4fabf62a839018be591Mike Klein    SkCommandLineFlags::Parse(argc, argv);
140918fb1fe6ff5349a2d1e5fb6872139f5fb931480Cary Clark#if DEBUG_DUMP_VERIFY
1411326068147ee60de138061a3fc1157fcfd5d017bcaryclark    SkPathOpsDebug::gDumpOp = FLAGS_dumpOp;
1421326068147ee60de138061a3fc1157fcfd5d017bcaryclark    SkPathOpsDebug::gVerifyOp = FLAGS_verifyOp;
1431326068147ee60de138061a3fc1157fcfd5d017bcaryclark#endif
14459d5a0e3f560da40e0ae7036a01d7d58ce3718d8Cary Clark    SkPathOpsDebug::gRunFail = FLAGS_runFail;
1451326068147ee60de138061a3fc1157fcfd5d017bcaryclark    SkPathOpsDebug::gVeryVerbose = FLAGS_veryVerbose;
14630e6e2af14e84216b1c113fd7500d0822bc81daamtklein    SetupCrashHandler();
147ba59d64b05b13081060a266c999158efab575b61commit-bot@chromium.org
148a71d3af100baa6756a87f7ef42a0ae5f4cb0991atfarina    SkAutoGraphics ag;
1495af16f8d670b3ce1c7644a4737e02e2e2257614ebungeman@google.com
15091d449ebf895d3c412a051272af3175be6976872reed@google.com    {
15191d449ebf895d3c412a051272af3175be6976872reed@google.com        SkString header("Skia UnitTests:");
1529aff14831b45a7e31e46ebec482df9db6f125745reed@google.com        if (!FLAGS_match.isEmpty()) {
153b631eec0e6c698b71423947d43199c33bc096a2fcaryclark@google.com            header.appendf(" --match");
154b631eec0e6c698b71423947d43199c33bc096a2fcaryclark@google.com            for (int index = 0; index < FLAGS_match.count(); ++index) {
155b631eec0e6c698b71423947d43199c33bc096a2fcaryclark@google.com                header.appendf(" %s", FLAGS_match[index]);
156b631eec0e6c698b71423947d43199c33bc096a2fcaryclark@google.com            }
15791d449ebf895d3c412a051272af3175be6976872reed@google.com        }
15887f3ba4847aa575016eb3a21e944197d757df8c0halcanary        SkString tmpDir = skiatest::GetTmpDir();
159c76218d5edf08f1b73dc06a92e3af52ed268e7bascroggo@google.com        if (!tmpDir.isEmpty()) {
160c76218d5edf08f1b73dc06a92e3af52ed268e7bascroggo@google.com            header.appendf(" --tmpDir %s", tmpDir.c_str());
161cb62650ecfd323a1ac215103a4d3106faad3c3cddjsollen@google.com        }
162bcbc1788b478b1e54079318ad073e8490aa66faetfarina        SkString resourcePath = GetResourcePath();
163c76218d5edf08f1b73dc06a92e3af52ed268e7bascroggo@google.com        if (!resourcePath.isEmpty()) {
164c76218d5edf08f1b73dc06a92e3af52ed268e7bascroggo@google.com            header.appendf(" --resourcePath %s", resourcePath.c_str());
165789c6f291ecfff925086015360da525d6de1c835reed@google.com        }
1661326068147ee60de138061a3fc1157fcfd5d017bcaryclark#if DEBUG_COIN
1671326068147ee60de138061a3fc1157fcfd5d017bcaryclark        if (FLAGS_coinTest) {
1681326068147ee60de138061a3fc1157fcfd5d017bcaryclark            header.appendf(" -c");
1691326068147ee60de138061a3fc1157fcfd5d017bcaryclark        }
1701326068147ee60de138061a3fc1157fcfd5d017bcaryclark#endif
1711326068147ee60de138061a3fc1157fcfd5d017bcaryclark        if (FLAGS_dumpOp) {
1721326068147ee60de138061a3fc1157fcfd5d017bcaryclark            header.appendf(" -d");
1731326068147ee60de138061a3fc1157fcfd5d017bcaryclark        }
17459d5a0e3f560da40e0ae7036a01d7d58ce3718d8Cary Clark#ifdef SK_DEBUG
17559d5a0e3f560da40e0ae7036a01d7d58ce3718d8Cary Clark        if (FLAGS_runFail) {
17659d5a0e3f560da40e0ae7036a01d7d58ce3718d8Cary Clark            header.appendf(" -f");
17759d5a0e3f560da40e0ae7036a01d7d58ce3718d8Cary Clark        }
17859d5a0e3f560da40e0ae7036a01d7d58ce3718d8Cary Clark#endif
1791326068147ee60de138061a3fc1157fcfd5d017bcaryclark        if (FLAGS_verbose) {
1801326068147ee60de138061a3fc1157fcfd5d017bcaryclark            header.appendf(" -v");
1811326068147ee60de138061a3fc1157fcfd5d017bcaryclark        }
1821326068147ee60de138061a3fc1157fcfd5d017bcaryclark        if (FLAGS_veryVerbose) {
1831326068147ee60de138061a3fc1157fcfd5d017bcaryclark            header.appendf(" -V");
1841326068147ee60de138061a3fc1157fcfd5d017bcaryclark        }
1851326068147ee60de138061a3fc1157fcfd5d017bcaryclark        if (FLAGS_extendedTest) {
1861326068147ee60de138061a3fc1157fcfd5d017bcaryclark            header.appendf(" -x");
1871326068147ee60de138061a3fc1157fcfd5d017bcaryclark        }
1881326068147ee60de138061a3fc1157fcfd5d017bcaryclark        if (FLAGS_verifyOp) {
1891326068147ee60de138061a3fc1157fcfd5d017bcaryclark            header.appendf(" -y");
1901326068147ee60de138061a3fc1157fcfd5d017bcaryclark        }
19191d449ebf895d3c412a051272af3175be6976872reed@google.com#ifdef SK_DEBUG
19291d449ebf895d3c412a051272af3175be6976872reed@google.com        header.append(" SK_DEBUG");
19391d449ebf895d3c412a051272af3175be6976872reed@google.com#else
19491d449ebf895d3c412a051272af3175be6976872reed@google.com        header.append(" SK_RELEASE");
19591d449ebf895d3c412a051272af3175be6976872reed@google.com#endif
1964431e7757cfcb8cfa99535eed0e9f156dabf95c2commit-bot@chromium.org        if (FLAGS_veryVerbose) {
1974431e7757cfcb8cfa99535eed0e9f156dabf95c2commit-bot@chromium.org            header.appendf("\n");
1984431e7757cfcb8cfa99535eed0e9f156dabf95c2commit-bot@chromium.org        }
199297aaf97a32ac16a2bc3f4bbc231d5de859ac02dkkinnunen        SkDebugf("%s", header.c_str());
20091d449ebf895d3c412a051272af3175be6976872reed@google.com    }
20191d449ebf895d3c412a051272af3175be6976872reed@google.com
20280e39a77b16f4396eed230efea1d0b2fc8cbfb00reed@android.com
2030506b9d7d531fdfc9536895481d789a48626a86bcommit-bot@chromium.org    // Count tests first.
2040506b9d7d531fdfc9536895481d789a48626a86bcommit-bot@chromium.org    int total = 0;
2050506b9d7d531fdfc9536895481d789a48626a86bcommit-bot@chromium.org    int toRun = 0;
206586db93c447b753364d50fadc5426de4fef9a759sglez@google.com
20787f3ba4847aa575016eb3a21e944197d757df8c0halcanary    for (const TestRegistry* iter = TestRegistry::Head(); iter;
20887f3ba4847aa575016eb3a21e944197d757df8c0halcanary         iter = iter->next()) {
20987f3ba4847aa575016eb3a21e944197d757df8c0halcanary        const Test& test = iter->factory();
21087f3ba4847aa575016eb3a21e944197d757df8c0halcanary        if (should_run(test.name, test.needsGpu)) {
2110506b9d7d531fdfc9536895481d789a48626a86bcommit-bot@chromium.org            toRun++;
2120506b9d7d531fdfc9536895481d789a48626a86bcommit-bot@chromium.org        }
2130506b9d7d531fdfc9536895481d789a48626a86bcommit-bot@chromium.org        total++;
2140506b9d7d531fdfc9536895481d789a48626a86bcommit-bot@chromium.org    }
2150506b9d7d531fdfc9536895481d789a48626a86bcommit-bot@chromium.org
2160506b9d7d531fdfc9536895481d789a48626a86bcommit-bot@chromium.org    // Now run them.
2175af16f8d670b3ce1c7644a4737e02e2e2257614ebungeman@google.com    int skipCount = 0;
218197845ae157da0175bb8dd05c4fd9eb9cd935e54commit-bot@chromium.org
219406654be7a930b484159f5bca107d3b11d8a9edemtklein    SkTaskGroup::Enabler enabled(FLAGS_threads);
220406654be7a930b484159f5bca107d3b11d8a9edemtklein    SkTaskGroup cpuTests;
22187f3ba4847aa575016eb3a21e944197d757df8c0halcanary    SkTArray<const Test*> gpuTests;
222261c66668269588a26757a0bfe28a3a3eac07665commit-bot@chromium.org
22387f3ba4847aa575016eb3a21e944197d757df8c0halcanary    Status status(toRun);
22487f3ba4847aa575016eb3a21e944197d757df8c0halcanary    for (const TestRegistry* iter = TestRegistry::Head(); iter;
22587f3ba4847aa575016eb3a21e944197d757df8c0halcanary         iter = iter->next()) {
22687f3ba4847aa575016eb3a21e944197d757df8c0halcanary        const Test& test = iter->factory();
22787f3ba4847aa575016eb3a21e944197d757df8c0halcanary        if (!should_run(test.name, test.needsGpu)) {
2285af16f8d670b3ce1c7644a4737e02e2e2257614ebungeman@google.com            ++skipCount;
22987f3ba4847aa575016eb3a21e944197d757df8c0halcanary        } else if (test.needsGpu) {
23087f3ba4847aa575016eb3a21e944197d757df8c0halcanary            gpuTests.push_back(&test);
2315af16f8d670b3ce1c7644a4737e02e2e2257614ebungeman@google.com        } else {
232048494c1e236c4db9d18952de83d2602c1abc7c3mtklein            cpuTests.add(SkTestRunnable(test, &status));
2335af16f8d670b3ce1c7644a4737e02e2e2257614ebungeman@google.com        }
234ed673310e2551e64d8196f7776d7d4c92085f8c2reed@android.com    }
235eeb3b7ff9813600b6cab662e1a0174ee2e279cacreed@android.com
23696fcdcc219d2a0d3579719b84b28bede76efba64halcanary    GrContextFactory* grContextFactoryPtr = nullptr;
2370dc5bd149a8b69e8dc6d3b4713b827659c9b0a6bcommit-bot@chromium.org#if SK_SUPPORT_GPU
2380dc5bd149a8b69e8dc6d3b4713b827659c9b0a6bcommit-bot@chromium.org    // Give GPU tests a context factory if that makes sense on this machine.
2390dc5bd149a8b69e8dc6d3b4713b827659c9b0a6bcommit-bot@chromium.org    GrContextFactory grContextFactory;
24087f3ba4847aa575016eb3a21e944197d757df8c0halcanary    grContextFactoryPtr = &grContextFactory;
24187f3ba4847aa575016eb3a21e944197d757df8c0halcanary
2420dc5bd149a8b69e8dc6d3b4713b827659c9b0a6bcommit-bot@chromium.org#endif
2430dc5bd149a8b69e8dc6d3b4713b827659c9b0a6bcommit-bot@chromium.org
2440dc5bd149a8b69e8dc6d3b4713b827659c9b0a6bcommit-bot@chromium.org    // Run GPU tests on this thread.
2450dc5bd149a8b69e8dc6d3b4713b827659c9b0a6bcommit-bot@chromium.org    for (int i = 0; i < gpuTests.count(); i++) {
246048494c1e236c4db9d18952de83d2602c1abc7c3mtklein        SkTestRunnable(*gpuTests[i], &status, grContextFactoryPtr)();
247197845ae157da0175bb8dd05c4fd9eb9cd935e54commit-bot@chromium.org    }
248197845ae157da0175bb8dd05c4fd9eb9cd935e54commit-bot@chromium.org
249a7538baeae619a513437f89b60cf738ee2de463dcommit-bot@chromium.org    // Block until threaded tests finish.
250406654be7a930b484159f5bca107d3b11d8a9edemtklein    cpuTests.wait();
251197845ae157da0175bb8dd05c4fd9eb9cd935e54commit-bot@chromium.org
252261c66668269588a26757a0bfe28a3a3eac07665commit-bot@chromium.org    if (FLAGS_verbose) {
25387f3ba4847aa575016eb3a21e944197d757df8c0halcanary        SkDebugf(
25487f3ba4847aa575016eb3a21e944197d757df8c0halcanary                "\nFinished %d tests, %d failures, %d skipped. "
25587f3ba4847aa575016eb3a21e944197d757df8c0halcanary                "(%d internal tests)",
25687f3ba4847aa575016eb3a21e944197d757df8c0halcanary                toRun, status.failCount(), skipCount, status.testCount());
25726ad22ab61539e3d3b6bc5e0da8dcebbd52a53decaryclark        if (gVerboseFinalize) {
25826ad22ab61539e3d3b6bc5e0da8dcebbd52a53decaryclark            (*gVerboseFinalize)();
25926ad22ab61539e3d3b6bc5e0da8dcebbd52a53decaryclark        }
260d54e1e9751eea63b528a6e62d919d06929c9bd8fcaryclark@google.com    }
261a276975a62ef4d9941e40c831fdfe7852e0e243ereed@google.com
262261c66668269588a26757a0bfe28a3a3eac07665commit-bot@chromium.org    SkDebugf("\n");
263ab87d7abf1df007c90bef2e916294ca325d81c81Cary Clark#if DEBUG_COIN
264ab87d7abf1df007c90bef2e916294ca325d81c81Cary Clark    if (FLAGS_coinTest) {
265ab87d7abf1df007c90bef2e916294ca325d81c81Cary Clark        SkPathOpsDebug::DumpCoinDict();
266ab87d7abf1df007c90bef2e916294ca325d81c81Cary Clark    }
267ab87d7abf1df007c90bef2e916294ca325d81c81Cary Clark#endif
268ab87d7abf1df007c90bef2e916294ca325d81c81Cary Clark
26987f3ba4847aa575016eb3a21e944197d757df8c0halcanary    return (status.failCount() == 0) ? 0 : 1;
270ed673310e2551e64d8196f7776d7d4c92085f8c2reed@android.com}
271