1 /*
2  * Copyright (C) 2017 The Android Open Source Project
3  *
4  * Licensed under the Apache License, Version 2.0 (the "License");
5  * you may not use this file except in compliance with the License.
6  * You may obtain a copy of the License at
7  *
8  *      http://www.apache.org/licenses/LICENSE-2.0
9  *
10  * Unless required by applicable law or agreed to in writing, software
11  * distributed under the License is distributed on an "AS IS" BASIS,
12  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13  * See the License for the specific language governing permissions and
14  * limitations under the License.
15  */
16 
17 #ifndef __VTS_HAL_HIDL_TARGET_TEST_ENV_BASE_H
18 #define __VTS_HAL_HIDL_TARGET_TEST_ENV_BASE_H
19 
20 #include <gtest/gtest.h>
21 
22 static constexpr const char* kDefaultServiceName = "default";
23 
24 using namespace std;
25 
26 namespace testing {
27 
28 // Enum class indicates the required combination mode for registered services.
29 enum HalServiceCombMode {
30   // Get the full permutation of all the registered service instances.
31   // E.g. Hal service s1 with instances (n1, n2) and s2 with instances (n3, n4),
32   // Return combination (s1/n1, s2/n3), (s1/n1, s2/n4), (s1/n2, s2/n3),
33   // (s1/n2, s2/n4).
34   FULL_PERMUTATION = 0,
35   // Get the registered service instances with the same service name.
36   // E.g. Hal service s1 with instances (n1, n2) and s2 with instances (n1, n2),
37   // Return combination (s1/n1, s2/n1), (s1/n2, s2/n2).
38   NAME_MATCH,
39   // Do not return the service instance combinations. This is used in cases when
40   // the test logic specifically handles the testing instances. E.g. drm tests.
41   NO_COMBINATION,
42 };
43 
44 // A class for test environment setup
45 class VtsHalHidlTargetTestEnvBase : public ::testing::Environment {
46  public:
VtsHalHidlTargetTestEnvBase()47   VtsHalHidlTargetTestEnvBase() {}
48 
49   /*
50    * SetUp process, should not be overridden by the test.
51    */
52   void SetUp() final;
53 
54   /*
55    * TearDown process, should not be overridden by the test.
56    */
57   void TearDown() final;
58 
59   /*
60    * Test should override this method for any custom setup process.
61    */
HidlSetUp()62   virtual void HidlSetUp() {}
63 
64   /*
65    * Test should override this method for any custom teardown process.
66    */
HidlTearDown()67   virtual void HidlTearDown() {}
68 
69   /*
70    * Test should override this method to register hal services used in the test.
71    */
registerTestServices()72   virtual void registerTestServices() {}
73 
74   /* Parses the command line argument, extracts the vts reserved flags and
75    * leaves other options untouched.
76    * Must be called when the test environment is created is registered.
77    */
78   void init(int* argc, char** argv);
79 
80   /*
81    * Adds a hal sevice identified into registeredHalServices_.
82    */
83   template <class T>
registerTestService()84   void registerTestService() {
85     registerTestService(T::descriptor);
86   }
87 
88   /*
89    * Gets the service name for a hal instance. Returns defaultName if the hal
90    * instance is unkonwn (not in hal_instances_).
91    */
92   template <class T>
93   string getServiceName(const string& defaultName = kDefaultServiceName) {
94     return getServiceName(T::descriptor, defaultName);
95   }
96 
setServiceCombMode(HalServiceCombMode mode)97   void setServiceCombMode(HalServiceCombMode mode) { mode_ = mode; }
98 
99  private:
100   /*
101    * Parses VTS specific flags, currently support two flags:
102    * --list_registered_services to print all registered service.
103    * --hal_service_instance to pass a running service instance. e.g.
104    * --hal_service_instance=android.hardware.vibrator@1.0::IVibrator/default
105    * It is possible to have mulitple --hal_service_instance options passed if
106    * mutliple hal service is used in the test.
107    * Returns true if successfully pased the given arg, false if arg is null or
108    * unknown flag.
109    */
110   bool parseVtsTestOption(const char* arg);
111 
112   /*
113    * Prints all registered sercives.
114    */
115   void listRegisteredServices();
116 
117   /*
118    * Internal method to get the service name for a hal instance.
119    */
120   string getServiceName(const string& instanceName, const string& defaultName);
121 
122   /*
123    * Internal method to register a HAL sevice identified with the FQName.
124    */
125   void registerTestService(const string& FQName);
126 
127   /*
128    * Internal method to add a hal service instance.
129    */
130   void addHalServiceInstance(const string& halServiceInstance);
131 
132   /*
133    * Helper method to check whether the given halServiceInstance is well
134    * formatted.
135    */
136   bool isValidInstance(const string& halServiceInstance);
137 
138   // Map of hal instances with their correpoding service names.
139   map<string, string> halServiceInstances_;
140   // Set of all hal services used in the test.
141   set<string> registeredHalServices_;
142   // Flag to print registered hal services and exit the process.
143   bool listService_ = false;
144   // Flag whether init is called.
145   bool inited_ = false;
146   // Required combination mode for hal service instances.
147   HalServiceCombMode mode_ = HalServiceCombMode::FULL_PERMUTATION;
148 };
149 
150 }  // namespace testing
151 
152 #endif  // __VTS_HAL_HIDL_TARGET_TEST_ENV_BASE_H
153