xref: /aosp_15_r20/external/OpenCL-CTS/test_common/harness/propertyHelpers.cpp (revision 6467f958c7de8070b317fc65bcb0f6472e388d82)
1*6467f958SSadaf Ebrahimi //
2*6467f958SSadaf Ebrahimi // Copyright (c) 2020 The Khronos Group Inc.
3*6467f958SSadaf Ebrahimi //
4*6467f958SSadaf Ebrahimi // Licensed under the Apache License, Version 2.0 (the "License");
5*6467f958SSadaf Ebrahimi // you may not use this file except in compliance with the License.
6*6467f958SSadaf Ebrahimi // You may obtain a copy of the License at
7*6467f958SSadaf Ebrahimi //
8*6467f958SSadaf Ebrahimi //    http://www.apache.org/licenses/LICENSE-2.0
9*6467f958SSadaf Ebrahimi //
10*6467f958SSadaf Ebrahimi // Unless required by applicable law or agreed to in writing, software
11*6467f958SSadaf Ebrahimi // distributed under the License is distributed on an "AS IS" BASIS,
12*6467f958SSadaf Ebrahimi // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13*6467f958SSadaf Ebrahimi // See the License for the specific language governing permissions and
14*6467f958SSadaf Ebrahimi // limitations under the License.
15*6467f958SSadaf Ebrahimi //
16*6467f958SSadaf Ebrahimi #include "propertyHelpers.h"
17*6467f958SSadaf Ebrahimi #include "errorHelpers.h"
18*6467f958SSadaf Ebrahimi 
19*6467f958SSadaf Ebrahimi #include <assert.h>
20*6467f958SSadaf Ebrahimi 
21*6467f958SSadaf Ebrahimi #include <algorithm>
22*6467f958SSadaf Ebrahimi #include <cinttypes>
23*6467f958SSadaf Ebrahimi #include <vector>
24*6467f958SSadaf Ebrahimi 
findProperty(const std::vector<cl_properties> & props,cl_properties prop,cl_properties & value)25*6467f958SSadaf Ebrahimi static bool findProperty(const std::vector<cl_properties>& props,
26*6467f958SSadaf Ebrahimi                          cl_properties prop, cl_properties& value)
27*6467f958SSadaf Ebrahimi {
28*6467f958SSadaf Ebrahimi     // This function assumes properties are valid:
29*6467f958SSadaf Ebrahimi     assert(props.size() == 0 || props.back() == 0);
30*6467f958SSadaf Ebrahimi     assert(props.size() == 0 || props.size() % 2 == 1);
31*6467f958SSadaf Ebrahimi 
32*6467f958SSadaf Ebrahimi     for (cl_uint i = 0; i < props.size(); i = i + 2)
33*6467f958SSadaf Ebrahimi     {
34*6467f958SSadaf Ebrahimi         cl_properties check_prop = props[i];
35*6467f958SSadaf Ebrahimi 
36*6467f958SSadaf Ebrahimi         if (check_prop == 0)
37*6467f958SSadaf Ebrahimi         {
38*6467f958SSadaf Ebrahimi             break;
39*6467f958SSadaf Ebrahimi         }
40*6467f958SSadaf Ebrahimi 
41*6467f958SSadaf Ebrahimi         if (check_prop == prop)
42*6467f958SSadaf Ebrahimi         {
43*6467f958SSadaf Ebrahimi             value = props[i + 1];
44*6467f958SSadaf Ebrahimi             return true;
45*6467f958SSadaf Ebrahimi         }
46*6467f958SSadaf Ebrahimi     }
47*6467f958SSadaf Ebrahimi 
48*6467f958SSadaf Ebrahimi     return false;
49*6467f958SSadaf Ebrahimi }
50*6467f958SSadaf Ebrahimi 
compareProperties(const std::vector<cl_properties> & queried,const std::vector<cl_properties> & check)51*6467f958SSadaf Ebrahimi int compareProperties(const std::vector<cl_properties>& queried,
52*6467f958SSadaf Ebrahimi                       const std::vector<cl_properties>& check)
53*6467f958SSadaf Ebrahimi {
54*6467f958SSadaf Ebrahimi     if (queried.size() != 0)
55*6467f958SSadaf Ebrahimi     {
56*6467f958SSadaf Ebrahimi         if (queried.back() != 0)
57*6467f958SSadaf Ebrahimi         {
58*6467f958SSadaf Ebrahimi             log_error("ERROR: queried properties do not end with 0!\n");
59*6467f958SSadaf Ebrahimi             return TEST_FAIL;
60*6467f958SSadaf Ebrahimi         }
61*6467f958SSadaf Ebrahimi         if (queried.size() % 2 != 1)
62*6467f958SSadaf Ebrahimi         {
63*6467f958SSadaf Ebrahimi             log_error("ERROR: queried properties does not consist of "
64*6467f958SSadaf Ebrahimi                       "property-value pairs!\n");
65*6467f958SSadaf Ebrahimi             return TEST_FAIL;
66*6467f958SSadaf Ebrahimi         }
67*6467f958SSadaf Ebrahimi     }
68*6467f958SSadaf Ebrahimi     if (check.size() != 0)
69*6467f958SSadaf Ebrahimi     {
70*6467f958SSadaf Ebrahimi         if (check.back() != 0)
71*6467f958SSadaf Ebrahimi         {
72*6467f958SSadaf Ebrahimi             log_error("ERROR: check properties do not end with 0!\n");
73*6467f958SSadaf Ebrahimi             return TEST_FAIL;
74*6467f958SSadaf Ebrahimi         }
75*6467f958SSadaf Ebrahimi         if (check.size() % 2 != 1)
76*6467f958SSadaf Ebrahimi         {
77*6467f958SSadaf Ebrahimi             log_error("ERROR: check properties does not consist of "
78*6467f958SSadaf Ebrahimi                       "property-value pairs!\n");
79*6467f958SSadaf Ebrahimi             return TEST_FAIL;
80*6467f958SSadaf Ebrahimi         }
81*6467f958SSadaf Ebrahimi     }
82*6467f958SSadaf Ebrahimi 
83*6467f958SSadaf Ebrahimi     if (queried != check)
84*6467f958SSadaf Ebrahimi     {
85*6467f958SSadaf Ebrahimi         for (cl_uint i = 0; i < check.size(); i = i + 2)
86*6467f958SSadaf Ebrahimi         {
87*6467f958SSadaf Ebrahimi             cl_properties check_prop = check[i];
88*6467f958SSadaf Ebrahimi 
89*6467f958SSadaf Ebrahimi             if (check_prop == 0)
90*6467f958SSadaf Ebrahimi             {
91*6467f958SSadaf Ebrahimi                 break;
92*6467f958SSadaf Ebrahimi             }
93*6467f958SSadaf Ebrahimi 
94*6467f958SSadaf Ebrahimi             cl_properties check_value = check[i + 1];
95*6467f958SSadaf Ebrahimi             cl_properties queried_value = 0;
96*6467f958SSadaf Ebrahimi 
97*6467f958SSadaf Ebrahimi             bool found = findProperty(queried, check_prop, queried_value);
98*6467f958SSadaf Ebrahimi 
99*6467f958SSadaf Ebrahimi             if (!found)
100*6467f958SSadaf Ebrahimi             {
101*6467f958SSadaf Ebrahimi                 log_error("ERROR: expected property 0x%" PRIx64 " not found!\n",
102*6467f958SSadaf Ebrahimi                           check_prop);
103*6467f958SSadaf Ebrahimi                 return TEST_FAIL;
104*6467f958SSadaf Ebrahimi             }
105*6467f958SSadaf Ebrahimi             else if (check_value != queried_value)
106*6467f958SSadaf Ebrahimi             {
107*6467f958SSadaf Ebrahimi                 log_error("ERROR: mis-matched value for property 0x%" PRIx64
108*6467f958SSadaf Ebrahimi                           ": wanted "
109*6467f958SSadaf Ebrahimi                           "0x%" PRIx64 ", got 0x%" PRIx64 "\n",
110*6467f958SSadaf Ebrahimi                           check_prop, check_value, queried_value);
111*6467f958SSadaf Ebrahimi                 return TEST_FAIL;
112*6467f958SSadaf Ebrahimi             }
113*6467f958SSadaf Ebrahimi         }
114*6467f958SSadaf Ebrahimi 
115*6467f958SSadaf Ebrahimi         if (queried.size() > check.size())
116*6467f958SSadaf Ebrahimi         {
117*6467f958SSadaf Ebrahimi             log_error("ERROR: all properties found but there are extra "
118*6467f958SSadaf Ebrahimi                       "properties: expected %zu, got %zu.\n",
119*6467f958SSadaf Ebrahimi                       check.size(), queried.size());
120*6467f958SSadaf Ebrahimi             return TEST_FAIL;
121*6467f958SSadaf Ebrahimi         }
122*6467f958SSadaf Ebrahimi 
123*6467f958SSadaf Ebrahimi         log_error("ERROR: properties were returned in the wrong order.\n");
124*6467f958SSadaf Ebrahimi         return TEST_FAIL;
125*6467f958SSadaf Ebrahimi     }
126*6467f958SSadaf Ebrahimi 
127*6467f958SSadaf Ebrahimi     return TEST_PASS;
128*6467f958SSadaf Ebrahimi }
129