1*c8dee2aaSAndroid Build Coastguard Worker /* 2*c8dee2aaSAndroid Build Coastguard Worker * Copyright 2011 Google Inc. 3*c8dee2aaSAndroid Build Coastguard Worker * 4*c8dee2aaSAndroid Build Coastguard Worker * Use of this source code is governed by a BSD-style license that can be 5*c8dee2aaSAndroid Build Coastguard Worker * found in the LICENSE file. 6*c8dee2aaSAndroid Build Coastguard Worker */ 7*c8dee2aaSAndroid Build Coastguard Worker 8*c8dee2aaSAndroid Build Coastguard Worker #include "tests/Test.h" 9*c8dee2aaSAndroid Build Coastguard Worker 10*c8dee2aaSAndroid Build Coastguard Worker #include "include/core/SkString.h" 11*c8dee2aaSAndroid Build Coastguard Worker #include "src/base/SkTime.h" 12*c8dee2aaSAndroid Build Coastguard Worker #include "tools/flags/CommandLineFlags.h" 13*c8dee2aaSAndroid Build Coastguard Worker #include "tools/timer/TimeUtils.h" 14*c8dee2aaSAndroid Build Coastguard Worker 15*c8dee2aaSAndroid Build Coastguard Worker #include <cstdlib> 16*c8dee2aaSAndroid Build Coastguard Worker #include <cstring> 17*c8dee2aaSAndroid Build Coastguard Worker 18*c8dee2aaSAndroid Build Coastguard Worker static DEFINE_string2(tmpDir, t, nullptr, "Temp directory to use."); 19*c8dee2aaSAndroid Build Coastguard Worker bumpTestCount()20*c8dee2aaSAndroid Build Coastguard Workervoid skiatest::Reporter::bumpTestCount() {} 21*c8dee2aaSAndroid Build Coastguard Worker allowExtendedTest() const22*c8dee2aaSAndroid Build Coastguard Workerbool skiatest::Reporter::allowExtendedTest() const { return false; } 23*c8dee2aaSAndroid Build Coastguard Worker verbose() const24*c8dee2aaSAndroid Build Coastguard Workerbool skiatest::Reporter::verbose() const { return false; } 25*c8dee2aaSAndroid Build Coastguard Worker 26*c8dee2aaSAndroid Build Coastguard Worker template skiatest::TestRegistry* skiatest::TestRegistry::gHead; 27*c8dee2aaSAndroid Build Coastguard Worker reportFailedWithContext(const skiatest::Failure & f)28*c8dee2aaSAndroid Build Coastguard Workervoid skiatest::Reporter::reportFailedWithContext(const skiatest::Failure& f) { 29*c8dee2aaSAndroid Build Coastguard Worker SkString fullMessage = f.message; 30*c8dee2aaSAndroid Build Coastguard Worker if (!fContextStack.empty()) { 31*c8dee2aaSAndroid Build Coastguard Worker fullMessage.append(" ["); 32*c8dee2aaSAndroid Build Coastguard Worker for (int i = 0; i < fContextStack.size(); ++i) { 33*c8dee2aaSAndroid Build Coastguard Worker if (i > 0) { 34*c8dee2aaSAndroid Build Coastguard Worker fullMessage.append(", "); 35*c8dee2aaSAndroid Build Coastguard Worker } 36*c8dee2aaSAndroid Build Coastguard Worker fullMessage.append(fContextStack[i]); 37*c8dee2aaSAndroid Build Coastguard Worker } 38*c8dee2aaSAndroid Build Coastguard Worker fullMessage.append("]"); 39*c8dee2aaSAndroid Build Coastguard Worker } 40*c8dee2aaSAndroid Build Coastguard Worker this->reportFailed(skiatest::Failure(f.fileName, f.lineNo, f.condition, fullMessage)); 41*c8dee2aaSAndroid Build Coastguard Worker } 42*c8dee2aaSAndroid Build Coastguard Worker toString() const43*c8dee2aaSAndroid Build Coastguard WorkerSkString skiatest::Failure::toString() const { 44*c8dee2aaSAndroid Build Coastguard Worker SkString result = SkStringPrintf("%s:%d\t", this->fileName, this->lineNo); 45*c8dee2aaSAndroid Build Coastguard Worker if (!this->message.isEmpty()) { 46*c8dee2aaSAndroid Build Coastguard Worker result.append(this->message); 47*c8dee2aaSAndroid Build Coastguard Worker if (strlen(this->condition) > 0) { 48*c8dee2aaSAndroid Build Coastguard Worker result.append(": "); 49*c8dee2aaSAndroid Build Coastguard Worker } 50*c8dee2aaSAndroid Build Coastguard Worker } 51*c8dee2aaSAndroid Build Coastguard Worker result.append(this->condition); 52*c8dee2aaSAndroid Build Coastguard Worker return result; 53*c8dee2aaSAndroid Build Coastguard Worker } 54*c8dee2aaSAndroid Build Coastguard Worker GetTmpDir()55*c8dee2aaSAndroid Build Coastguard WorkerSkString skiatest::GetTmpDir() { 56*c8dee2aaSAndroid Build Coastguard Worker if (!FLAGS_tmpDir.isEmpty()) { 57*c8dee2aaSAndroid Build Coastguard Worker return SkString(FLAGS_tmpDir[0]); 58*c8dee2aaSAndroid Build Coastguard Worker } 59*c8dee2aaSAndroid Build Coastguard Worker #ifdef SK_BUILD_FOR_ANDROID 60*c8dee2aaSAndroid Build Coastguard Worker const char* environmentVariable = "TMPDIR"; 61*c8dee2aaSAndroid Build Coastguard Worker const char* defaultValue = "/data/local/tmp"; 62*c8dee2aaSAndroid Build Coastguard Worker #elif defined(SK_BUILD_FOR_MAC) || defined(SK_BUILD_FOR_UNIX) 63*c8dee2aaSAndroid Build Coastguard Worker const char* environmentVariable = "TMPDIR"; 64*c8dee2aaSAndroid Build Coastguard Worker const char* defaultValue = "/tmp"; 65*c8dee2aaSAndroid Build Coastguard Worker #elif defined(SK_BUILD_FOR_WIN) 66*c8dee2aaSAndroid Build Coastguard Worker const char* environmentVariable = "TEMP"; 67*c8dee2aaSAndroid Build Coastguard Worker const char* defaultValue = nullptr; 68*c8dee2aaSAndroid Build Coastguard Worker #else 69*c8dee2aaSAndroid Build Coastguard Worker const char* environmentVariable = nullptr; 70*c8dee2aaSAndroid Build Coastguard Worker const char* defaultValue = nullptr; 71*c8dee2aaSAndroid Build Coastguard Worker #endif 72*c8dee2aaSAndroid Build Coastguard Worker const char* tmpdir = environmentVariable ? getenv(environmentVariable) : nullptr; 73*c8dee2aaSAndroid Build Coastguard Worker return SkString(tmpdir ? tmpdir : defaultValue); 74*c8dee2aaSAndroid Build Coastguard Worker } 75*c8dee2aaSAndroid Build Coastguard Worker Timer()76*c8dee2aaSAndroid Build Coastguard Workerskiatest::Timer::Timer() : fStartNanos(SkTime::GetNSecs()) {} 77*c8dee2aaSAndroid Build Coastguard Worker elapsedNs() const78*c8dee2aaSAndroid Build Coastguard Workerdouble skiatest::Timer::elapsedNs() const { 79*c8dee2aaSAndroid Build Coastguard Worker return SkTime::GetNSecs() - fStartNanos; 80*c8dee2aaSAndroid Build Coastguard Worker } 81*c8dee2aaSAndroid Build Coastguard Worker elapsedMs() const82*c8dee2aaSAndroid Build Coastguard Workerdouble skiatest::Timer::elapsedMs() const { return this->elapsedNs() * 1e-6; } 83*c8dee2aaSAndroid Build Coastguard Worker elapsedMsInt() const84*c8dee2aaSAndroid Build Coastguard WorkerTimeUtils::MSec skiatest::Timer::elapsedMsInt() const { 85*c8dee2aaSAndroid Build Coastguard Worker const double elapsedMs = this->elapsedMs(); 86*c8dee2aaSAndroid Build Coastguard Worker SkASSERT(TimeUtils::MSecMax >= elapsedMs); 87*c8dee2aaSAndroid Build Coastguard Worker return static_cast<TimeUtils::MSec>(elapsedMs); 88*c8dee2aaSAndroid Build Coastguard Worker } 89