1*c8dee2aaSAndroid Build Coastguard Worker /* 2*c8dee2aaSAndroid Build Coastguard Worker * Copyright 2022 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 #ifndef CtsEnforcement_DEFINED 9*c8dee2aaSAndroid Build Coastguard Worker #define CtsEnforcement_DEFINED 10*c8dee2aaSAndroid Build Coastguard Worker 11*c8dee2aaSAndroid Build Coastguard Worker #include "include/core/SkTypes.h" 12*c8dee2aaSAndroid Build Coastguard Worker 13*c8dee2aaSAndroid Build Coastguard Worker #include <climits> 14*c8dee2aaSAndroid Build Coastguard Worker #include <cstdint> 15*c8dee2aaSAndroid Build Coastguard Worker 16*c8dee2aaSAndroid Build Coastguard Worker /** 17*c8dee2aaSAndroid Build Coastguard Worker * Determines how unit tests are enforced by CTS. Depending on the ApiLevel, a test will be run 18*c8dee2aaSAndroid Build Coastguard Worker * in one of 3 states: run without workarounds, run with workarounds or skipped. 19*c8dee2aaSAndroid Build Coastguard Worker */ 20*c8dee2aaSAndroid Build Coastguard Worker class CtsEnforcement { 21*c8dee2aaSAndroid Build Coastguard Worker public: 22*c8dee2aaSAndroid Build Coastguard Worker enum ApiLevel : int32_t { 23*c8dee2aaSAndroid Build Coastguard Worker /* When used as fStrictVersion, always skip this test. It is not relevant to CTS. 24*c8dee2aaSAndroid Build Coastguard Worker * When used as fWorkaroundsVersion, there are no api levels that should run the 25*c8dee2aaSAndroid Build Coastguard Worker * test with workarounds. 26*c8dee2aaSAndroid Build Coastguard Worker */ 27*c8dee2aaSAndroid Build Coastguard Worker kNever = INT32_MAX, 28*c8dee2aaSAndroid Build Coastguard Worker /* The kApiLevel_* values are directly correlated with Android API levels. Every new 29*c8dee2aaSAndroid Build Coastguard Worker * CTS/SkQP release has a corresponding Android API level that will be captured by these 30*c8dee2aaSAndroid Build Coastguard Worker * enum values. 31*c8dee2aaSAndroid Build Coastguard Worker */ 32*c8dee2aaSAndroid Build Coastguard Worker kApiLevel_T = 33, 33*c8dee2aaSAndroid Build Coastguard Worker kApiLevel_U = 34, 34*c8dee2aaSAndroid Build Coastguard Worker kApiLevel_V = 35, 35*c8dee2aaSAndroid Build Coastguard Worker /* kNextRelease is a placeholder value that all new unit tests should use. It implies that 36*c8dee2aaSAndroid Build Coastguard Worker * this test will be enforced in the next Android release. At the time of the release a 37*c8dee2aaSAndroid Build Coastguard Worker * new kApiLevel_* value will be added and all current kNextRelease values will be replaced 38*c8dee2aaSAndroid Build Coastguard Worker * with that new value. 39*c8dee2aaSAndroid Build Coastguard Worker */ 40*c8dee2aaSAndroid Build Coastguard Worker kNextRelease = kApiLevel_V + 1 41*c8dee2aaSAndroid Build Coastguard Worker }; 42*c8dee2aaSAndroid Build Coastguard Worker 43*c8dee2aaSAndroid Build Coastguard Worker /** 44*c8dee2aaSAndroid Build Coastguard Worker * Tests will run in strict (no workarounds) mode if the device API level is >= strictVersion 45*c8dee2aaSAndroid Build Coastguard Worker */ CtsEnforcement(ApiLevel strictVersion)46*c8dee2aaSAndroid Build Coastguard Worker constexpr CtsEnforcement(ApiLevel strictVersion) 47*c8dee2aaSAndroid Build Coastguard Worker : fStrictVersion(strictVersion), fWorkaroundsVersion(kNever) {} 48*c8dee2aaSAndroid Build Coastguard Worker 49*c8dee2aaSAndroid Build Coastguard Worker /** 50*c8dee2aaSAndroid Build Coastguard Worker * Test will run with workarounds if the device API level is >= workaroundVersion 51*c8dee2aaSAndroid Build Coastguard Worker * and < strictVersion 52*c8dee2aaSAndroid Build Coastguard Worker */ withWorkarounds(ApiLevel workaroundVersion)53*c8dee2aaSAndroid Build Coastguard Worker constexpr CtsEnforcement& withWorkarounds(ApiLevel workaroundVersion) { 54*c8dee2aaSAndroid Build Coastguard Worker SkASSERT(workaroundVersion <= fStrictVersion); 55*c8dee2aaSAndroid Build Coastguard Worker fWorkaroundsVersion = workaroundVersion; 56*c8dee2aaSAndroid Build Coastguard Worker return *this; 57*c8dee2aaSAndroid Build Coastguard Worker } 58*c8dee2aaSAndroid Build Coastguard Worker 59*c8dee2aaSAndroid Build Coastguard Worker enum class RunMode { kSkip = 0, kRunWithWorkarounds = 1, kRunStrict = 2 }; 60*c8dee2aaSAndroid Build Coastguard Worker RunMode eval(int apiLevel) const; 61*c8dee2aaSAndroid Build Coastguard Worker 62*c8dee2aaSAndroid Build Coastguard Worker private: 63*c8dee2aaSAndroid Build Coastguard Worker ApiLevel fStrictVersion; 64*c8dee2aaSAndroid Build Coastguard Worker ApiLevel fWorkaroundsVersion; 65*c8dee2aaSAndroid Build Coastguard Worker }; 66*c8dee2aaSAndroid Build Coastguard Worker 67*c8dee2aaSAndroid Build Coastguard Worker #endif 68