blob: 1410ddf8c1a04d5e937c7893aa3f1f455d56f88c [file] [log] [blame]
Pavel Maltseve2603e32016-10-25 16:03:23 -07001/*
2 * Copyright (C) 2016 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 <unordered_map>
18#include <iostream>
19
20#include <gtest/gtest.h>
21
22#include <vehicle_hal_manager/VehiclePropConfigIndex.h>
23#include <VehicleHal.h>
24#include <vehicle_hal_manager/VehicleHalManager.h>
25#include "vehicle_hal_manager/SubscriptionManager.h"
26
27#include "VehicleHalTestUtils.h"
28
29namespace android {
30namespace hardware {
31namespace vehicle {
32namespace V2_0 {
33
34namespace {
35
36using namespace std::placeholders;
37
38class MockedVehicleHal : public VehicleHal {
39public:
40 MockedVehicleHal() {
41 mConfigs.assign(std::begin(kVehicleProperties),
42 std::end(kVehicleProperties));
43 }
44
45 std::vector<VehiclePropConfig> listProperties() override {
46 return mConfigs;
47 }
48
49 VehiclePropValuePtr get(VehicleProperty property,
50 int32_t areaId,
51 status_t* outStatus) override {
52 *outStatus = OK;
53 return getValuePool()->obtain(mValues[property]);
54 }
55
56 status_t set(const VehiclePropValue& propValue) override {
57 mValues[propValue.prop] = propValue;
58 return OK;
59 }
60
61 status_t subscribe(VehicleProperty property,
62 int32_t areas,
63 float sampleRate) override {
64 return OK;
65 }
66
67 status_t unsubscribe(VehicleProperty property) override {
68 return OK;
69 }
70
71 void sendPropEvent(recyclable_ptr<VehiclePropValue> value) {
72 doHalEvent(std::move(value));
73 }
74
75private:
76 std::vector<VehiclePropConfig> mConfigs;
77 std::unordered_map<VehicleProperty, VehiclePropValue> mValues;
78};
79
80class VehicleHalManagerTest : public ::testing::Test {
81protected:
82 void SetUp() override {
83 hal.reset(new MockedVehicleHal);
84 manager.reset(new VehicleHalManager(hal.get()));
85
86 objectPool = hal->getValuePool();
87 }
88
89 void TearDown() override {
90 manager.reset(nullptr);
91 hal.reset(nullptr);
92 }
93
94public:
95 VehiclePropValuePool* objectPool;
96 std::unique_ptr<MockedVehicleHal> hal;
97 std::unique_ptr<VehicleHalManager> manager;
98};
99
100class HalClientVectorTest : public ::testing::Test {
101public:
102 HalClientVector clients;
103};
104
105TEST_F(VehicleHalManagerTest, getPropConfigs) {
106 hidl_vec<VehicleProperty> properties = init_hidl_vec(
107 { VehicleProperty::HVAC_FAN_SPEED,VehicleProperty::INFO_MAKE} );
108 bool called = false;
109 manager->getPropConfigs(properties,
110 [&called] (const hidl_vec<VehiclePropConfig>& c) {
111 ASSERT_EQ(2u, c.size());
112 called = true;
113 });
114 ASSERT_TRUE(called); // Verify callback received.
115
116 called = false;
117 manager->getPropConfigs(init_hidl_vec({VehicleProperty::HVAC_FAN_SPEED}),
118 [&called] (const hidl_vec<VehiclePropConfig>& c) {
119 ASSERT_EQ(1u, c.size());
120 ASSERT_EQ(toString(kVehicleProperties[1]), toString(c[0]));
121 called = true;
122 });
123 ASSERT_TRUE(called); // Verify callback received.
124}
125
126TEST_F(VehicleHalManagerTest, getAllPropConfigs) {
127 bool called = false;
128 manager->getAllPropConfigs(
129 [&called] (const hidl_vec<VehiclePropConfig>& propConfigs) {
130 ASSERT_EQ(arraysize(kVehicleProperties), propConfigs.size());
131
132 for (size_t i = 0; i < propConfigs.size(); i++) {
133 ASSERT_EQ(toString(kVehicleProperties[i]),
134 toString(propConfigs[i]));
135 }
136 called = true;
137 });
138 ASSERT_TRUE(called); // Verify callback received.
139}
140
141TEST_F(VehicleHalManagerTest, subscribe) {
142 const VehicleProperty PROP = VehicleProperty::DISPLAY_BRIGHTNESS;
143
144 sp<MockedVehicleCallback> cb = new MockedVehicleCallback();
145
146 hidl_vec<SubscribeOptions> options = init_hidl_vec(
147 {
148 SubscribeOptions {
149 .propId = PROP,
150 .flags = SubscribeFlags::DEFAULT
151 },
152 });
153
154 StatusCode res = manager->subscribe(cb, options);
155 ASSERT_EQ(StatusCode::OK, res);
156
157 auto unsubscribedValue = objectPool->obtain(VehiclePropertyType::INT32);
158 unsubscribedValue->prop = VehicleProperty::HVAC_FAN_SPEED;
159
160 hal->sendPropEvent(std::move(unsubscribedValue));
161 auto& receivedEnvents = cb->getReceivedEvents();
162
163 ASSERT_TRUE(cb->waitForExpectedEvents(0)) << " Unexpected events received: "
164 << receivedEnvents.size()
165 << (receivedEnvents.size() > 0
166 ? toString(receivedEnvents.front()[0]) : "");
167
168 auto subscribedValue = objectPool->obtain(VehiclePropertyType::INT32);
169 subscribedValue->prop = PROP;
170 subscribedValue->value.int32Values[0] = 42;
171
172 cb->reset();
173 VehiclePropValue actualValue(*subscribedValue.get());
174 hal->sendPropEvent(std::move(subscribedValue));
175
176 ASSERT_TRUE(cb->waitForExpectedEvents(1)) << "Events received: "
177 << receivedEnvents.size();
178
179 ASSERT_EQ(toString(actualValue),
180 toString(cb->getReceivedEvents().front()[0]));
181}
182
183TEST_F(HalClientVectorTest, basic) {
184 sp<IVehicleCallback> callback1 = new MockedVehicleCallback();
185
186 sp<HalClient> c1 = new HalClient(callback1, 10, 20);
187 sp<HalClient> c2 = new HalClient(callback1, 10, 20);
188
189 clients.addOrUpdate(c1);
190 clients.addOrUpdate(c1);
191 clients.addOrUpdate(c2);
192 ASSERT_EQ(2u, clients.size());
193 ASSERT_FALSE(clients.isEmpty());
194 ASSERT_GE(0, clients.indexOf(c1));
195 ASSERT_GE(0, clients.remove(c1));
196 ASSERT_GE(0, clients.indexOf(c1));
197 ASSERT_GE(0, clients.remove(c1));
198 ASSERT_GE(0, clients.remove(c2));
199
200 ASSERT_TRUE(clients.isEmpty());
201}
202
203} // namespace anonymous
204
205} // namespace V2_0
206} // namespace vehicle
207} // namespace hardware
208} // namespace android