1*8975f5c5SAndroid Build Coastguard Worker // 2*8975f5c5SAndroid Build Coastguard Worker // Copyright 2019 The ANGLE Project Authors. All rights reserved. 3*8975f5c5SAndroid Build Coastguard Worker // Use of this source code is governed by a BSD-style license that can be 4*8975f5c5SAndroid Build Coastguard Worker // found in the LICENSE file. 5*8975f5c5SAndroid Build Coastguard Worker // 6*8975f5c5SAndroid Build Coastguard Worker 7*8975f5c5SAndroid Build Coastguard Worker #ifndef TEST_EXPECTATIONS_GPU_TEST_EXPECTATIONS_PARSER_H_ 8*8975f5c5SAndroid Build Coastguard Worker #define TEST_EXPECTATIONS_GPU_TEST_EXPECTATIONS_PARSER_H_ 9*8975f5c5SAndroid Build Coastguard Worker 10*8975f5c5SAndroid Build Coastguard Worker #include <stddef.h> 11*8975f5c5SAndroid Build Coastguard Worker #include <stdint.h> 12*8975f5c5SAndroid Build Coastguard Worker 13*8975f5c5SAndroid Build Coastguard Worker #include <string> 14*8975f5c5SAndroid Build Coastguard Worker #include <vector> 15*8975f5c5SAndroid Build Coastguard Worker 16*8975f5c5SAndroid Build Coastguard Worker #include "GPUTestConfig.h" 17*8975f5c5SAndroid Build Coastguard Worker 18*8975f5c5SAndroid Build Coastguard Worker namespace angle 19*8975f5c5SAndroid Build Coastguard Worker { 20*8975f5c5SAndroid Build Coastguard Worker struct GPUTestConfig; 21*8975f5c5SAndroid Build Coastguard Worker 22*8975f5c5SAndroid Build Coastguard Worker class GPUTestExpectationsParser 23*8975f5c5SAndroid Build Coastguard Worker { 24*8975f5c5SAndroid Build Coastguard Worker public: 25*8975f5c5SAndroid Build Coastguard Worker enum GPUTestExpectation 26*8975f5c5SAndroid Build Coastguard Worker { 27*8975f5c5SAndroid Build Coastguard Worker kGpuTestPass = 1 << 0, 28*8975f5c5SAndroid Build Coastguard Worker kGpuTestFail = 1 << 1, 29*8975f5c5SAndroid Build Coastguard Worker kGpuTestFlaky = 1 << 2, 30*8975f5c5SAndroid Build Coastguard Worker kGpuTestTimeout = 1 << 3, 31*8975f5c5SAndroid Build Coastguard Worker kGpuTestSkip = 1 << 4, 32*8975f5c5SAndroid Build Coastguard Worker }; 33*8975f5c5SAndroid Build Coastguard Worker 34*8975f5c5SAndroid Build Coastguard Worker GPUTestExpectationsParser(); 35*8975f5c5SAndroid Build Coastguard Worker ~GPUTestExpectationsParser(); 36*8975f5c5SAndroid Build Coastguard Worker 37*8975f5c5SAndroid Build Coastguard Worker // Parse the text expectations, and if no error is encountered, 38*8975f5c5SAndroid Build Coastguard Worker // save all the entries. Otherwise, generate error messages. 39*8975f5c5SAndroid Build Coastguard Worker // Return true if parsing succeeds. 40*8975f5c5SAndroid Build Coastguard Worker bool loadTestExpectations(const GPUTestConfig &config, const std::string &data); 41*8975f5c5SAndroid Build Coastguard Worker bool loadTestExpectationsFromFile(const GPUTestConfig &config, const std::string &path); 42*8975f5c5SAndroid Build Coastguard Worker bool loadAllTestExpectations(const std::string &data); 43*8975f5c5SAndroid Build Coastguard Worker bool loadAllTestExpectationsFromFile(const std::string &path); 44*8975f5c5SAndroid Build Coastguard Worker 45*8975f5c5SAndroid Build Coastguard Worker // Query error messages from the last LoadTestExpectations() call. 46*8975f5c5SAndroid Build Coastguard Worker const std::vector<std::string> &getErrorMessages() const; 47*8975f5c5SAndroid Build Coastguard Worker 48*8975f5c5SAndroid Build Coastguard Worker // Query error messages from any expectations that weren't used before being queried. 49*8975f5c5SAndroid Build Coastguard Worker std::vector<std::string> getUnusedExpectationsMessages() const; 50*8975f5c5SAndroid Build Coastguard Worker 51*8975f5c5SAndroid Build Coastguard Worker // Get the test expectation of a given test on a given bot. 52*8975f5c5SAndroid Build Coastguard Worker int32_t getTestExpectation(const std::string &testName); 53*8975f5c5SAndroid Build Coastguard Worker int32_t getTestExpectationWithConfig(const GPUTestConfig &config, const std::string &testName); setTestExpectationsAllowMask(uint32_t mask)54*8975f5c5SAndroid Build Coastguard Worker void setTestExpectationsAllowMask(uint32_t mask) { mExpectationsAllowMask = mask; } 55*8975f5c5SAndroid Build Coastguard Worker 56*8975f5c5SAndroid Build Coastguard Worker private: 57*8975f5c5SAndroid Build Coastguard Worker struct GPUTestExpectationEntry 58*8975f5c5SAndroid Build Coastguard Worker { 59*8975f5c5SAndroid Build Coastguard Worker GPUTestExpectationEntry(); 60*8975f5c5SAndroid Build Coastguard Worker 61*8975f5c5SAndroid Build Coastguard Worker std::string testName; 62*8975f5c5SAndroid Build Coastguard Worker int32_t testExpectation; 63*8975f5c5SAndroid Build Coastguard Worker size_t lineNumber; 64*8975f5c5SAndroid Build Coastguard Worker bool used; 65*8975f5c5SAndroid Build Coastguard Worker GPUTestConfig::ConditionArray conditions; 66*8975f5c5SAndroid Build Coastguard Worker }; 67*8975f5c5SAndroid Build Coastguard Worker 68*8975f5c5SAndroid Build Coastguard Worker // Parse a line of text. If we have a valid entry, save it; otherwise, 69*8975f5c5SAndroid Build Coastguard Worker // generate error messages. 70*8975f5c5SAndroid Build Coastguard Worker bool parseLine(const GPUTestConfig *config, const std::string &lineData, size_t lineNumber); 71*8975f5c5SAndroid Build Coastguard Worker 72*8975f5c5SAndroid Build Coastguard Worker // Check a the condition assigned to a particular token. 73*8975f5c5SAndroid Build Coastguard Worker bool checkTokenCondition(const GPUTestConfig &config, 74*8975f5c5SAndroid Build Coastguard Worker bool &err, 75*8975f5c5SAndroid Build Coastguard Worker int32_t token, 76*8975f5c5SAndroid Build Coastguard Worker size_t lineNumber); 77*8975f5c5SAndroid Build Coastguard Worker 78*8975f5c5SAndroid Build Coastguard Worker // Check if two entries' config overlap with each other. May generate an 79*8975f5c5SAndroid Build Coastguard Worker // error message. 80*8975f5c5SAndroid Build Coastguard Worker bool detectConflictsBetweenEntries(); 81*8975f5c5SAndroid Build Coastguard Worker 82*8975f5c5SAndroid Build Coastguard Worker // Query a list of any expectations that were's used before being queried. 83*8975f5c5SAndroid Build Coastguard Worker std::vector<GPUTestExpectationEntry> getUnusedExpectations() const; 84*8975f5c5SAndroid Build Coastguard Worker 85*8975f5c5SAndroid Build Coastguard Worker // Save an error message, which can be queried later. 86*8975f5c5SAndroid Build Coastguard Worker void pushErrorMessage(const std::string &message, size_t lineNumber); 87*8975f5c5SAndroid Build Coastguard Worker void pushErrorMessage(const std::string &message, 88*8975f5c5SAndroid Build Coastguard Worker size_t entry1LineNumber, 89*8975f5c5SAndroid Build Coastguard Worker size_t entry2LineNumber); 90*8975f5c5SAndroid Build Coastguard Worker 91*8975f5c5SAndroid Build Coastguard Worker // Config is optional. 92*8975f5c5SAndroid Build Coastguard Worker bool loadTestExpectationsFromFileImpl(const GPUTestConfig *config, const std::string &path); 93*8975f5c5SAndroid Build Coastguard Worker bool loadTestExpectationsImpl(const GPUTestConfig *config, const std::string &data); 94*8975f5c5SAndroid Build Coastguard Worker 95*8975f5c5SAndroid Build Coastguard Worker int32_t getTestExpectationImpl(const GPUTestConfig *config, const std::string &testName); 96*8975f5c5SAndroid Build Coastguard Worker 97*8975f5c5SAndroid Build Coastguard Worker std::vector<GPUTestExpectationEntry> mEntries; 98*8975f5c5SAndroid Build Coastguard Worker std::vector<std::string> mErrorMessages; 99*8975f5c5SAndroid Build Coastguard Worker 100*8975f5c5SAndroid Build Coastguard Worker uint32_t mExpectationsAllowMask; 101*8975f5c5SAndroid Build Coastguard Worker }; 102*8975f5c5SAndroid Build Coastguard Worker 103*8975f5c5SAndroid Build Coastguard Worker const char *GetConditionName(uint32_t condition); 104*8975f5c5SAndroid Build Coastguard Worker 105*8975f5c5SAndroid Build Coastguard Worker } // namespace angle 106*8975f5c5SAndroid Build Coastguard Worker 107*8975f5c5SAndroid Build Coastguard Worker #endif // TEST_EXPECTATIONS_GPU_TEST_EXPECTATIONS_PARSER_H_ 108