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