1d7b3845f3d3f3498c2adc542b4b20003ac7d3ab0Hal Canary/*
2d7b3845f3d3f3498c2adc542b4b20003ac7d3ab0Hal Canary * Copyright 2017 Google Inc.
3d7b3845f3d3f3498c2adc542b4b20003ac7d3ab0Hal Canary *
4d7b3845f3d3f3498c2adc542b4b20003ac7d3ab0Hal Canary * Use of this source code is governed by a BSD-style license that can be
5d7b3845f3d3f3498c2adc542b4b20003ac7d3ab0Hal Canary * found in the LICENSE file.
6d7b3845f3d3f3498c2adc542b4b20003ac7d3ab0Hal Canary */
7d7b3845f3d3f3498c2adc542b4b20003ac7d3ab0Hal Canary
8a9de760a217cf48c974d6c51b4ba88f08c269bbeHal Canary#include <sys/stat.h>
9a9de760a217cf48c974d6c51b4ba88f08c269bbeHal Canary
102a7f0aa9ebfd66c902dcf1a0ca86ced9fde60d5aHal Canary#include "gm_knowledge.h"
11d7b3845f3d3f3498c2adc542b4b20003ac7d3ab0Hal Canary#include "gm_runner.h"
12d7b3845f3d3f3498c2adc542b4b20003ac7d3ab0Hal Canary
13d7b3845f3d3f3498c2adc542b4b20003ac7d3ab0Hal Canary#ifdef __clang__
14d7b3845f3d3f3498c2adc542b4b20003ac7d3ab0Hal Canary#pragma clang diagnostic push
15d7b3845f3d3f3498c2adc542b4b20003ac7d3ab0Hal Canary#pragma clang diagnostic ignored "-Wused-but-marked-unused"
16d7b3845f3d3f3498c2adc542b4b20003ac7d3ab0Hal Canary#endif
17d7b3845f3d3f3498c2adc542b4b20003ac7d3ab0Hal Canary
18d7b3845f3d3f3498c2adc542b4b20003ac7d3ab0Hal Canary#include "gtest/gtest.h"
19d7b3845f3d3f3498c2adc542b4b20003ac7d3ab0Hal Canary
20d7b3845f3d3f3498c2adc542b4b20003ac7d3ab0Hal Canary#ifdef __clang__
21d7b3845f3d3f3498c2adc542b4b20003ac7d3ab0Hal Canary#pragma clang diagnostic pop
22d7b3845f3d3f3498c2adc542b4b20003ac7d3ab0Hal Canary#endif
23d7b3845f3d3f3498c2adc542b4b20003ac7d3ab0Hal Canary
24537d9c0229b296a1b19f678432011d748d73cf18Hal Canary#include "Resources.h"
25d7b3845f3d3f3498c2adc542b4b20003ac7d3ab0Hal Canary#include "SkStream.h"
26d7b3845f3d3f3498c2adc542b4b20003ac7d3ab0Hal Canary#include "SkString.h"
27d7b3845f3d3f3498c2adc542b4b20003ac7d3ab0Hal Canary
28d7b3845f3d3f3498c2adc542b4b20003ac7d3ab0Hal Canary////////////////////////////////////////////////////////////////////////////////
29d7b3845f3d3f3498c2adc542b4b20003ac7d3ab0Hal Canary
30d7b3845f3d3f3498c2adc542b4b20003ac7d3ab0Hal Canarystatic std::string gReportDirectoryPath;
31d7b3845f3d3f3498c2adc542b4b20003ac7d3ab0Hal Canarystatic std::unique_ptr<skqp::AssetManager> gAssetMgr;
32d7b3845f3d3f3498c2adc542b4b20003ac7d3ab0Hal Canary
33d7b3845f3d3f3498c2adc542b4b20003ac7d3ab0Hal Canary////////////////////////////////////////////////////////////////////////////////
34d7b3845f3d3f3498c2adc542b4b20003ac7d3ab0Hal Canary
35d7b3845f3d3f3498c2adc542b4b20003ac7d3ab0Hal Canarystruct GMTestCase {
36d7b3845f3d3f3498c2adc542b4b20003ac7d3ab0Hal Canary    gm_runner::GMFactory fGMFactory;
37d7b3845f3d3f3498c2adc542b4b20003ac7d3ab0Hal Canary    gm_runner::SkiaBackend fBackend;
38d7b3845f3d3f3498c2adc542b4b20003ac7d3ab0Hal Canary};
39d7b3845f3d3f3498c2adc542b4b20003ac7d3ab0Hal Canary
40d7b3845f3d3f3498c2adc542b4b20003ac7d3ab0Hal Canarystruct GMTest : public testing::Test {
41d7b3845f3d3f3498c2adc542b4b20003ac7d3ab0Hal Canary    GMTestCase fTest;
42d7b3845f3d3f3498c2adc542b4b20003ac7d3ab0Hal Canary    GMTest(GMTestCase t) : fTest(t) {}
43d7b3845f3d3f3498c2adc542b4b20003ac7d3ab0Hal Canary    void TestBody() override {
44d7b3845f3d3f3498c2adc542b4b20003ac7d3ab0Hal Canary        float result;
45d7b3845f3d3f3498c2adc542b4b20003ac7d3ab0Hal Canary        gm_runner::Error error;
46d7b3845f3d3f3498c2adc542b4b20003ac7d3ab0Hal Canary        std::tie(result, error) =
47d7b3845f3d3f3498c2adc542b4b20003ac7d3ab0Hal Canary                gm_runner::EvaluateGM(fTest.fBackend, fTest.fGMFactory,
48d7b3845f3d3f3498c2adc542b4b20003ac7d3ab0Hal Canary                                      gAssetMgr.get(), gReportDirectoryPath.c_str());
49d7b3845f3d3f3498c2adc542b4b20003ac7d3ab0Hal Canary        EXPECT_EQ(error, gm_runner::Error::None);
50d7b3845f3d3f3498c2adc542b4b20003ac7d3ab0Hal Canary        if (gm_runner::Error::None == error) {
51d7b3845f3d3f3498c2adc542b4b20003ac7d3ab0Hal Canary            EXPECT_EQ(result, 0);
52d7b3845f3d3f3498c2adc542b4b20003ac7d3ab0Hal Canary        }
53d7b3845f3d3f3498c2adc542b4b20003ac7d3ab0Hal Canary    }
54d7b3845f3d3f3498c2adc542b4b20003ac7d3ab0Hal Canary};
55d7b3845f3d3f3498c2adc542b4b20003ac7d3ab0Hal Canary
56d7b3845f3d3f3498c2adc542b4b20003ac7d3ab0Hal Canarystruct GMTestFactory : public testing::internal::TestFactoryBase {
57d7b3845f3d3f3498c2adc542b4b20003ac7d3ab0Hal Canary    GMTestCase fTest;
58d7b3845f3d3f3498c2adc542b4b20003ac7d3ab0Hal Canary    GMTestFactory(GMTestCase t) : fTest(t) {}
59d7b3845f3d3f3498c2adc542b4b20003ac7d3ab0Hal Canary    testing::Test* CreateTest() override { return new GMTest(fTest); }
60d7b3845f3d3f3498c2adc542b4b20003ac7d3ab0Hal Canary};
61d7b3845f3d3f3498c2adc542b4b20003ac7d3ab0Hal Canary
62d7b3845f3d3f3498c2adc542b4b20003ac7d3ab0Hal Canary////////////////////////////////////////////////////////////////////////////////
63d7b3845f3d3f3498c2adc542b4b20003ac7d3ab0Hal Canary
64d7b3845f3d3f3498c2adc542b4b20003ac7d3ab0Hal Canarystruct UnitTestTest : public testing::Test {
65d7b3845f3d3f3498c2adc542b4b20003ac7d3ab0Hal Canary    gm_runner::UnitTest fTest;
66d7b3845f3d3f3498c2adc542b4b20003ac7d3ab0Hal Canary    UnitTestTest(gm_runner::UnitTest test) : fTest(test) {}
67d7b3845f3d3f3498c2adc542b4b20003ac7d3ab0Hal Canary    void TestBody() override {
68d7b3845f3d3f3498c2adc542b4b20003ac7d3ab0Hal Canary        std::vector<std::string> errors = gm_runner::ExecuteTest(fTest);
69d7b3845f3d3f3498c2adc542b4b20003ac7d3ab0Hal Canary        for (const std::string& error : errors) {
70d7b3845f3d3f3498c2adc542b4b20003ac7d3ab0Hal Canary            GTEST_NONFATAL_FAILURE_(error.c_str());
71d7b3845f3d3f3498c2adc542b4b20003ac7d3ab0Hal Canary        }
72d7b3845f3d3f3498c2adc542b4b20003ac7d3ab0Hal Canary    }
73d7b3845f3d3f3498c2adc542b4b20003ac7d3ab0Hal Canary};
74d7b3845f3d3f3498c2adc542b4b20003ac7d3ab0Hal Canary
75d7b3845f3d3f3498c2adc542b4b20003ac7d3ab0Hal Canarystruct UnitTestFactory : public testing::internal::TestFactoryBase {
76d7b3845f3d3f3498c2adc542b4b20003ac7d3ab0Hal Canary    gm_runner::UnitTest fTest;
77d7b3845f3d3f3498c2adc542b4b20003ac7d3ab0Hal Canary    UnitTestFactory(gm_runner::UnitTest test) : fTest(test) {}
78d7b3845f3d3f3498c2adc542b4b20003ac7d3ab0Hal Canary    testing::Test* CreateTest() override { return new UnitTestTest(fTest); }
79d7b3845f3d3f3498c2adc542b4b20003ac7d3ab0Hal Canary};
80d7b3845f3d3f3498c2adc542b4b20003ac7d3ab0Hal Canary
81d7b3845f3d3f3498c2adc542b4b20003ac7d3ab0Hal Canary////////////////////////////////////////////////////////////////////////////////
82d7b3845f3d3f3498c2adc542b4b20003ac7d3ab0Hal Canary
83d7b3845f3d3f3498c2adc542b4b20003ac7d3ab0Hal Canarystatic void reg_test(const char* test, const char* testCase,
84d7b3845f3d3f3498c2adc542b4b20003ac7d3ab0Hal Canary                     testing::internal::TestFactoryBase* fact) {
85d7b3845f3d3f3498c2adc542b4b20003ac7d3ab0Hal Canary    testing::internal::MakeAndRegisterTestInfo(test,
86d7b3845f3d3f3498c2adc542b4b20003ac7d3ab0Hal Canary                                               testCase,
87d7b3845f3d3f3498c2adc542b4b20003ac7d3ab0Hal Canary                                               nullptr,
88d7b3845f3d3f3498c2adc542b4b20003ac7d3ab0Hal Canary                                               nullptr,
89d7b3845f3d3f3498c2adc542b4b20003ac7d3ab0Hal Canary                                               testing::internal::CodeLocation(__FILE__, __LINE__),
90d7b3845f3d3f3498c2adc542b4b20003ac7d3ab0Hal Canary                                               testing::internal::GetTestTypeId(),
91d7b3845f3d3f3498c2adc542b4b20003ac7d3ab0Hal Canary                                               testing::Test::SetUpTestCase,
92d7b3845f3d3f3498c2adc542b4b20003ac7d3ab0Hal Canary                                               testing::Test::TearDownTestCase,
93d7b3845f3d3f3498c2adc542b4b20003ac7d3ab0Hal Canary                                               fact);
94d7b3845f3d3f3498c2adc542b4b20003ac7d3ab0Hal Canary}
95d7b3845f3d3f3498c2adc542b4b20003ac7d3ab0Hal Canary
96d7b3845f3d3f3498c2adc542b4b20003ac7d3ab0Hal Canary
97d7b3845f3d3f3498c2adc542b4b20003ac7d3ab0Hal Canaryvoid register_skia_tests() {
98a9de760a217cf48c974d6c51b4ba88f08c269bbeHal Canary    gm_runner::InitSkia(gm_runner::Mode::kCompatibilityTestMode, gAssetMgr.get());
99d7b3845f3d3f3498c2adc542b4b20003ac7d3ab0Hal Canary
100d7b3845f3d3f3498c2adc542b4b20003ac7d3ab0Hal Canary    // Rendering Tests
101d7b3845f3d3f3498c2adc542b4b20003ac7d3ab0Hal Canary    std::vector<gm_runner::SkiaBackend> backends = gm_runner::GetSupportedBackends();
102d7b3845f3d3f3498c2adc542b4b20003ac7d3ab0Hal Canary    std::vector<gm_runner::GMFactory> gms = gm_runner::GetGMFactories(gAssetMgr.get());
103d7b3845f3d3f3498c2adc542b4b20003ac7d3ab0Hal Canary    for (auto backend : backends) {
104d7b3845f3d3f3498c2adc542b4b20003ac7d3ab0Hal Canary        const char* backendName = GetBackendName(backend);
105d7b3845f3d3f3498c2adc542b4b20003ac7d3ab0Hal Canary        std::string test = std::string("SkiaGM_") + backendName;
106d7b3845f3d3f3498c2adc542b4b20003ac7d3ab0Hal Canary        for (auto gmFactory : gms) {
107d7b3845f3d3f3498c2adc542b4b20003ac7d3ab0Hal Canary            std::string gmName = gm_runner::GetGMName(gmFactory);
108d7b3845f3d3f3498c2adc542b4b20003ac7d3ab0Hal Canary            reg_test(test.c_str(), gmName.c_str(),
109d7b3845f3d3f3498c2adc542b4b20003ac7d3ab0Hal Canary                     new GMTestFactory(GMTestCase{gmFactory, backend}));
110d7b3845f3d3f3498c2adc542b4b20003ac7d3ab0Hal Canary        }
111d7b3845f3d3f3498c2adc542b4b20003ac7d3ab0Hal Canary    }
112d7b3845f3d3f3498c2adc542b4b20003ac7d3ab0Hal Canary
113d7b3845f3d3f3498c2adc542b4b20003ac7d3ab0Hal Canary    for (gm_runner::UnitTest test : gm_runner::GetUnitTests()) {
114d7b3845f3d3f3498c2adc542b4b20003ac7d3ab0Hal Canary        reg_test("Skia_Unit_Tests", gm_runner::GetUnitTestName(test), new UnitTestFactory{test});
115d7b3845f3d3f3498c2adc542b4b20003ac7d3ab0Hal Canary    }
116d7b3845f3d3f3498c2adc542b4b20003ac7d3ab0Hal Canary}
117d7b3845f3d3f3498c2adc542b4b20003ac7d3ab0Hal Canary
118d7b3845f3d3f3498c2adc542b4b20003ac7d3ab0Hal Canarynamespace {
119d7b3845f3d3f3498c2adc542b4b20003ac7d3ab0Hal Canarystruct StdAssetManager : public skqp::AssetManager {
120d7b3845f3d3f3498c2adc542b4b20003ac7d3ab0Hal Canary    SkString fPrefix;
121d7b3845f3d3f3498c2adc542b4b20003ac7d3ab0Hal Canary    StdAssetManager(const char* p) : fPrefix(p) {}
122d7b3845f3d3f3498c2adc542b4b20003ac7d3ab0Hal Canary    std::unique_ptr<SkStreamAsset> open(const char* path) override {
123d7b3845f3d3f3498c2adc542b4b20003ac7d3ab0Hal Canary        SkString fullPath = fPrefix.isEmpty()
124d7b3845f3d3f3498c2adc542b4b20003ac7d3ab0Hal Canary                          ? SkString(path)
125d7b3845f3d3f3498c2adc542b4b20003ac7d3ab0Hal Canary                          : SkStringPrintf("%s/%s", fPrefix.c_str(), path);
126d7b3845f3d3f3498c2adc542b4b20003ac7d3ab0Hal Canary        return SkStream::MakeFromFile(fullPath.c_str());
127d7b3845f3d3f3498c2adc542b4b20003ac7d3ab0Hal Canary    }
128d7b3845f3d3f3498c2adc542b4b20003ac7d3ab0Hal Canary};
129d7b3845f3d3f3498c2adc542b4b20003ac7d3ab0Hal Canary}
130d7b3845f3d3f3498c2adc542b4b20003ac7d3ab0Hal Canary
131d7b3845f3d3f3498c2adc542b4b20003ac7d3ab0Hal Canaryint main(int argc, char** argv) {
132d7b3845f3d3f3498c2adc542b4b20003ac7d3ab0Hal Canary    testing::InitGoogleTest(&argc, argv);
133d7b3845f3d3f3498c2adc542b4b20003ac7d3ab0Hal Canary    if (argc < 2) {
134d7b3845f3d3f3498c2adc542b4b20003ac7d3ab0Hal Canary        std::cerr << "Usage:\n  " << argv[0]
135d7b3845f3d3f3498c2adc542b4b20003ac7d3ab0Hal Canary                  << " [GTEST_ARGUMENTS] GMKB_DIRECTORY_PATH GMKB_REPORT_PATH\n\n";
136d7b3845f3d3f3498c2adc542b4b20003ac7d3ab0Hal Canary        return 1;
137d7b3845f3d3f3498c2adc542b4b20003ac7d3ab0Hal Canary    }
138537d9c0229b296a1b19f678432011d748d73cf18Hal Canary    SetResourcePath((std::string(argv[1]) + "/resources").c_str());
139d7b3845f3d3f3498c2adc542b4b20003ac7d3ab0Hal Canary    gAssetMgr.reset(new StdAssetManager(argv[1]));
140d7b3845f3d3f3498c2adc542b4b20003ac7d3ab0Hal Canary    if (argc > 2) {
141d7b3845f3d3f3498c2adc542b4b20003ac7d3ab0Hal Canary        gReportDirectoryPath = argv[2];
142a9de760a217cf48c974d6c51b4ba88f08c269bbeHal Canary        (void)mkdir(gReportDirectoryPath.c_str(), 0777);
143d7b3845f3d3f3498c2adc542b4b20003ac7d3ab0Hal Canary    }
144d7b3845f3d3f3498c2adc542b4b20003ac7d3ab0Hal Canary    register_skia_tests();
1452a7f0aa9ebfd66c902dcf1a0ca86ced9fde60d5aHal Canary    int ret = RUN_ALL_TESTS();
1462a7f0aa9ebfd66c902dcf1a0ca86ced9fde60d5aHal Canary    (void)gmkb::MakeReport(gReportDirectoryPath.c_str());
1472a7f0aa9ebfd66c902dcf1a0ca86ced9fde60d5aHal Canary    return ret;
148d7b3845f3d3f3498c2adc542b4b20003ac7d3ab0Hal Canary}
149