• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 /*
2  * Copyright (C) 2018 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 #include <android/hardware/thermal/2.0/IThermal.h>
18 #include <android/hardware/thermal/2.0/IThermalChangedCallback.h>
19 #include <android/hardware/thermal/2.0/types.h>
20 
21 #include <VtsHalHidlTargetCallbackBase.h>
22 #include <VtsHalHidlTargetTestBase.h>
23 #include <VtsHalHidlTargetTestEnvBase.h>
24 
25 using ::android::sp;
26 using ::android::hardware::hidl_enum_range;
27 using ::android::hardware::hidl_vec;
28 using ::android::hardware::Return;
29 using ::android::hardware::Void;
30 using ::android::hardware::thermal::V1_0::ThermalStatus;
31 using ::android::hardware::thermal::V1_0::ThermalStatusCode;
32 using ::android::hardware::thermal::V2_0::CoolingDevice;
33 using ::android::hardware::thermal::V2_0::CoolingType;
34 using ::android::hardware::thermal::V2_0::IThermal;
35 using ::android::hardware::thermal::V2_0::IThermalChangedCallback;
36 using ::android::hardware::thermal::V2_0::Temperature;
37 using ::android::hardware::thermal::V2_0::TemperatureThreshold;
38 using ::android::hardware::thermal::V2_0::TemperatureType;
39 using ::android::hardware::thermal::V2_0::ThrottlingSeverity;
40 
41 constexpr char kCallbackNameNotifyThrottling[] = "notifyThrottling";
42 static const Temperature kThrottleTemp = {
43     .type = TemperatureType::SKIN,
44     .name = "test temperature sensor",
45     .value = 98.6,
46     .throttlingStatus = ThrottlingSeverity::CRITICAL,
47 };
48 
49 class ThermalCallbackArgs {
50    public:
51     Temperature temperature;
52 };
53 
54 // Callback class for receiving thermal event notifications from main class
55 class ThermalCallback : public ::testing::VtsHalHidlTargetCallbackBase<ThermalCallbackArgs>,
56                         public IThermalChangedCallback {
57    public:
notifyThrottling(const Temperature & temperature)58     Return<void> notifyThrottling(const Temperature& temperature) override {
59         ThermalCallbackArgs args;
60         args.temperature = temperature;
61         NotifyFromCallback(kCallbackNameNotifyThrottling, args);
62         return Void();
63     }
64 };
65 
66 // Test environment for Thermal HIDL HAL.
67 class ThermalHidlEnvironment : public ::testing::VtsHalHidlTargetTestEnvBase {
68    public:
69     // get the test environment singleton
Instance()70     static ThermalHidlEnvironment* Instance() {
71         static ThermalHidlEnvironment* instance = new ThermalHidlEnvironment;
72         return instance;
73     }
74 
registerTestServices()75     void registerTestServices() override { registerTestService<IThermal>(); }
76 
77    private:
ThermalHidlEnvironment()78     ThermalHidlEnvironment() {}
79 };
80 
81 // The main test class for THERMAL HIDL HAL 2.0.
82 class ThermalHidlTest : public ::testing::VtsHalHidlTargetTestBase {
83    public:
SetUp()84     virtual void SetUp() override {
85         mThermal = ::testing::VtsHalHidlTargetTestBase::getService<IThermal>(
86             ThermalHidlEnvironment::Instance()->getServiceName<IThermal>());
87         ASSERT_NE(mThermal, nullptr);
88         mThermalCallback = new (std::nothrow) ThermalCallback();
89         ASSERT_NE(mThermalCallback, nullptr);
90         auto ret = mThermal->registerThermalChangedCallback(
91             mThermalCallback, false, TemperatureType::SKIN,
92             [](ThermalStatus status) { EXPECT_EQ(ThermalStatusCode::SUCCESS, status.code); });
93         ASSERT_TRUE(ret.isOk());
94         // Expect to fail if register again
95         ret = mThermal->registerThermalChangedCallback(
96             mThermalCallback, false, TemperatureType::SKIN,
97             [](ThermalStatus status) { EXPECT_NE(ThermalStatusCode::SUCCESS, status.code); });
98         ASSERT_TRUE(ret.isOk());
99     }
100 
TearDown()101     virtual void TearDown() override {
102         auto ret = mThermal->unregisterThermalChangedCallback(
103             mThermalCallback,
104             [](ThermalStatus status) { EXPECT_EQ(ThermalStatusCode::SUCCESS, status.code); });
105         ASSERT_TRUE(ret.isOk());
106         // Expect to fail if unregister again
107         ret = mThermal->unregisterThermalChangedCallback(
108             mThermalCallback,
109             [](ThermalStatus status) { EXPECT_NE(ThermalStatusCode::SUCCESS, status.code); });
110         ASSERT_TRUE(ret.isOk());
111     }
112 
113    protected:
114     sp<IThermal> mThermal;
115     sp<ThermalCallback> mThermalCallback;
116 };  // class ThermalHidlTest
117 
118 // Test ThermalChangedCallback::notifyThrottling().
119 // This just calls into and back from our local ThermalChangedCallback impl.
120 // Note: a real thermal throttling event from the Thermal HAL could be
121 // inadvertently received here.
TEST_F(ThermalHidlTest,NotifyThrottlingTest)122 TEST_F(ThermalHidlTest, NotifyThrottlingTest) {
123     auto ret = mThermalCallback->notifyThrottling(kThrottleTemp);
124     ASSERT_TRUE(ret.isOk());
125     auto res = mThermalCallback->WaitForCallback(kCallbackNameNotifyThrottling);
126     EXPECT_TRUE(res.no_timeout);
127     ASSERT_TRUE(res.args);
128     EXPECT_EQ(kThrottleTemp, res.args->temperature);
129 }
130 
131 // Test Thermal->registerThermalChangedCallback.
TEST_F(ThermalHidlTest,RegisterThermalChangedCallbackTest)132 TEST_F(ThermalHidlTest, RegisterThermalChangedCallbackTest) {
133     // Expect to fail with same callback
134     auto ret = mThermal->registerThermalChangedCallback(
135             mThermalCallback, false, TemperatureType::SKIN,
136             [](ThermalStatus status) { EXPECT_EQ(ThermalStatusCode::FAILURE, status.code); });
137     ASSERT_TRUE(ret.isOk());
138     // Expect to fail with null callback
139     ret = mThermal->registerThermalChangedCallback(
140             nullptr, false, TemperatureType::SKIN,
141             [](ThermalStatus status) { EXPECT_EQ(ThermalStatusCode::FAILURE, status.code); });
142     ASSERT_TRUE(ret.isOk());
143     sp<ThermalCallback> localThermalCallback = new (std::nothrow) ThermalCallback();
144     // Expect to succeed with different callback
145     ret = mThermal->registerThermalChangedCallback(
146         localThermalCallback, false, TemperatureType::SKIN,
147         [](ThermalStatus status) { EXPECT_EQ(ThermalStatusCode::SUCCESS, status.code); });
148     ASSERT_TRUE(ret.isOk());
149     // Remove the local callback
150     ret = mThermal->unregisterThermalChangedCallback(
151         localThermalCallback,
152         [](ThermalStatus status) { EXPECT_EQ(ThermalStatusCode::SUCCESS, status.code); });
153     ASSERT_TRUE(ret.isOk());
154     // Expect to fail with null callback
155     ret = mThermal->unregisterThermalChangedCallback(nullptr, [](ThermalStatus status) {
156         EXPECT_EQ(ThermalStatusCode::FAILURE, status.code);
157     });
158     ASSERT_TRUE(ret.isOk());
159 }
160 
161 // Test Thermal->unregisterThermalChangedCallback.
TEST_F(ThermalHidlTest,UnregisterThermalChangedCallbackTest)162 TEST_F(ThermalHidlTest, UnregisterThermalChangedCallbackTest) {
163     sp<ThermalCallback> localThermalCallback = new (std::nothrow) ThermalCallback();
164     // Expect to fail as the callback was not registered before
165     auto ret = mThermal->unregisterThermalChangedCallback(
166         localThermalCallback,
167         [](ThermalStatus status) { EXPECT_NE(ThermalStatusCode::SUCCESS, status.code); });
168     ASSERT_TRUE(ret.isOk());
169     // Register a local callback
170     ret = mThermal->registerThermalChangedCallback(
171         localThermalCallback, false, TemperatureType::SKIN,
172         [](ThermalStatus status) { EXPECT_EQ(ThermalStatusCode::SUCCESS, status.code); });
173     ASSERT_TRUE(ret.isOk());
174     // Expect to succeed with callback removed
175     ret = mThermal->unregisterThermalChangedCallback(
176         localThermalCallback,
177         [](ThermalStatus status) { EXPECT_EQ(ThermalStatusCode::SUCCESS, status.code); });
178     ASSERT_TRUE(ret.isOk());
179     // Expect to fail as the callback has been unregistered already
180     ret = mThermal->unregisterThermalChangedCallback(
181         localThermalCallback,
182         [](ThermalStatus status) { EXPECT_NE(ThermalStatusCode::SUCCESS, status.code); });
183     ASSERT_TRUE(ret.isOk());
184 }
185 
186 // Sanity test for Thermal::getCurrentTemperatures().
TEST_F(ThermalHidlTest,TemperatureTest)187 TEST_F(ThermalHidlTest, TemperatureTest) {
188     mThermal->getCurrentTemperatures(false, TemperatureType::SKIN,
189                                      [](ThermalStatus status, hidl_vec<Temperature> temperatures) {
190                                          if (temperatures.size()) {
191                                              EXPECT_EQ(ThermalStatusCode::SUCCESS, status.code);
192                                          } else {
193                                              EXPECT_NE(ThermalStatusCode::SUCCESS, status.code);
194                                          }
195                                          for (int i = 0; i < temperatures.size(); ++i) {
196                                              EXPECT_LT(0u, temperatures[i].name.size());
197                                          }
198                                      });
199     auto types = hidl_enum_range<TemperatureType>();
200     for (const auto& type : types) {
201         mThermal->getCurrentTemperatures(
202             true, type, [&type](ThermalStatus status, hidl_vec<Temperature> temperatures) {
203                 if (temperatures.size()) {
204                     EXPECT_EQ(ThermalStatusCode::SUCCESS, status.code);
205                 } else {
206                     EXPECT_NE(ThermalStatusCode::SUCCESS, status.code);
207                 }
208                 for (int i = 0; i < temperatures.size(); ++i) {
209                     EXPECT_EQ(type, temperatures[i].type);
210                     EXPECT_LT(0u, temperatures[i].name.size());
211                 }
212             });
213     }
214 }
215 
216 // Sanity test for Thermal::getTemperatureThresholds().
TEST_F(ThermalHidlTest,TemperatureThresholdTest)217 TEST_F(ThermalHidlTest, TemperatureThresholdTest) {
218     mThermal->getTemperatureThresholds(
219         false, TemperatureType::SKIN,
220         [](ThermalStatus status, hidl_vec<TemperatureThreshold> temperatures) {
221             if (temperatures.size()) {
222                 EXPECT_EQ(ThermalStatusCode::SUCCESS, status.code);
223             } else {
224                 EXPECT_NE(ThermalStatusCode::SUCCESS, status.code);
225             }
226         });
227     for (int i = static_cast<int>(TemperatureType::UNKNOWN);
228          i <= static_cast<int>(TemperatureType::POWER_AMPLIFIER); ++i) {
229         auto type = static_cast<TemperatureType>(i);
230         mThermal->getTemperatureThresholds(
231             true, type, [&type](ThermalStatus status, hidl_vec<TemperatureThreshold> temperatures) {
232                 if (temperatures.size()) {
233                     EXPECT_EQ(ThermalStatusCode::SUCCESS, status.code);
234                 } else {
235                     EXPECT_NE(ThermalStatusCode::SUCCESS, status.code);
236                 }
237                 for (int i = 0; i < temperatures.size(); ++i) {
238                     EXPECT_EQ(type, temperatures[i].type);
239                 }
240             });
241     }
242 }
243 
244 // Sanity test for Thermal::getCurrentCoolingDevices().
TEST_F(ThermalHidlTest,CoolingDeviceTest)245 TEST_F(ThermalHidlTest, CoolingDeviceTest) {
246     mThermal->getCurrentCoolingDevices(
247         false, CoolingType::CPU, [](ThermalStatus status, hidl_vec<CoolingDevice> cooling_devices) {
248             if (cooling_devices.size()) {
249                 EXPECT_EQ(ThermalStatusCode::SUCCESS, status.code);
250             } else {
251                 EXPECT_NE(ThermalStatusCode::SUCCESS, status.code);
252             }
253             for (int i = 0; i < cooling_devices.size(); ++i) {
254                 EXPECT_LT(0u, cooling_devices[i].name.size());
255             }
256         });
257     for (int i = 0; i <= static_cast<int>(CoolingType::COMPONENT); ++i) {
258         auto type = static_cast<CoolingType>(i);
259         mThermal->getCurrentCoolingDevices(
260             true, type, [&type](ThermalStatus status, hidl_vec<CoolingDevice> cooling_devices) {
261                 if (cooling_devices.size()) {
262                     EXPECT_EQ(ThermalStatusCode::SUCCESS, status.code);
263                 } else {
264                     EXPECT_NE(ThermalStatusCode::SUCCESS, status.code);
265                 }
266                 for (int i = 0; i < cooling_devices.size(); ++i) {
267                     EXPECT_EQ(type, cooling_devices[i].type);
268                     EXPECT_LT(0u, cooling_devices[i].name.size());
269                 }
270             });
271     }
272 }
273 
main(int argc,char ** argv)274 int main(int argc, char** argv) {
275     ::testing::AddGlobalTestEnvironment(ThermalHidlEnvironment::Instance());
276     ::testing::InitGoogleTest(&argc, argv);
277     ThermalHidlEnvironment::Instance()->init(&argc, argv);
278     int status = RUN_ALL_TESTS();
279     cout << "Test result = " << status << std::endl;
280     return status;
281 }
282