xref: /aosp_15_r20/external/angle/src/tests/test_expectations/GPUTestExpectationsParser.h (revision 8975f5c5ed3d1c378011245431ada316dfb6f244)
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