blob: 19b11e6b72e2e89f5712eaf639156d4f50204c1a [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 SubscriptionManagerTest : public ::testing::Test {
39public:
40 SubscriptionManager manager;
41
42 const VehicleProperty PROP1 = VehicleProperty::HVAC_FAN_SPEED;
43 const VehicleProperty PROP2 = VehicleProperty::DISPLAY_BRIGHTNESS;
44
45 sp<IVehicleCallback> cb1 = new MockedVehicleCallback();
46 sp<IVehicleCallback> cb2 = new MockedVehicleCallback();
47 sp<IVehicleCallback> cb3 = new MockedVehicleCallback();
48
49 hidl_vec<SubscribeOptions> subscrToProp1 = init_hidl_vec(
50 {
51 SubscribeOptions {
52 .propId = PROP1,
Pavel Maltsevdb179c52016-10-27 15:43:06 -070053 .vehicleAreas = toInt(VehicleAreaZone::ROW_1_LEFT),
Pavel Maltseve2603e32016-10-25 16:03:23 -070054 .flags = SubscribeFlags::HAL_EVENT
55 },
56 });
57
58 hidl_vec<SubscribeOptions> subscrToProp2 = init_hidl_vec(
59 {
60 SubscribeOptions {
61 .propId = PROP2,
62 .flags = SubscribeFlags::HAL_EVENT
63 },
64 });
65
66 hidl_vec<SubscribeOptions> subscrToProp1and2 = init_hidl_vec(
67 {
68 SubscribeOptions {
69 .propId = PROP1,
Pavel Maltsevdb179c52016-10-27 15:43:06 -070070 .vehicleAreas = toInt(VehicleAreaZone::ROW_1_LEFT),
Pavel Maltseve2603e32016-10-25 16:03:23 -070071 .flags = SubscribeFlags::HAL_EVENT
72 },
73 SubscribeOptions {
74 .propId = PROP2,
75 .flags = SubscribeFlags::HAL_EVENT
76 },
77 });
78
79 static std::list<sp<IVehicleCallback>> extractCallbacks(
80 const std::list<sp<HalClient>>& clients) {
81 std::list<sp<IVehicleCallback>> callbacks;
82 for (auto c : clients) {
83 callbacks.push_back(c->getCallback());
84 }
85 return callbacks;
86 }
87
88 std::list<sp<HalClient>> clientsToProp1() {
89 return manager.getSubscribedClients(PROP1,
Pavel Maltsevdb179c52016-10-27 15:43:06 -070090 toInt(VehicleAreaZone::ROW_1_LEFT),
Pavel Maltseve2603e32016-10-25 16:03:23 -070091 SubscribeFlags::DEFAULT);
92 }
93
94 std::list<sp<HalClient>> clientsToProp2() {
95 return manager.getSubscribedClients(PROP2, 0,
96 SubscribeFlags::DEFAULT);
97 }
98};
99
100
101TEST_F(SubscriptionManagerTest, multipleClients) {
102 manager.addOrUpdateSubscription(cb1, subscrToProp1);
103 manager.addOrUpdateSubscription(cb2, subscrToProp1);
104
105 auto clients = manager.getSubscribedClients(
106 PROP1,
Pavel Maltsevdb179c52016-10-27 15:43:06 -0700107 toInt(VehicleAreaZone::ROW_1_LEFT),
Pavel Maltseve2603e32016-10-25 16:03:23 -0700108 SubscribeFlags::HAL_EVENT);
109
110 ASSERT_ALL_EXISTS({cb1, cb2}, extractCallbacks(clients));
111}
112
113TEST_F(SubscriptionManagerTest, negativeCases) {
114 manager.addOrUpdateSubscription(cb1, subscrToProp1);
115
116 // Wrong zone
117 auto clients = manager.getSubscribedClients(
118 PROP1,
Pavel Maltsevdb179c52016-10-27 15:43:06 -0700119 toInt(VehicleAreaZone::ROW_2_LEFT),
Pavel Maltseve2603e32016-10-25 16:03:23 -0700120 SubscribeFlags::HAL_EVENT);
121 ASSERT_TRUE(clients.empty());
122
123 // Wrong prop
124 clients = manager.getSubscribedClients(
125 VehicleProperty::AP_POWER_BOOTUP_REASON,
Pavel Maltsevdb179c52016-10-27 15:43:06 -0700126 toInt(VehicleAreaZone::ROW_1_LEFT),
Pavel Maltseve2603e32016-10-25 16:03:23 -0700127 SubscribeFlags::HAL_EVENT);
128 ASSERT_TRUE(clients.empty());
129
130 // Wrong flag
131 clients = manager.getSubscribedClients(
132 PROP1,
Pavel Maltsevdb179c52016-10-27 15:43:06 -0700133 toInt(VehicleAreaZone::ROW_1_LEFT),
Pavel Maltseve2603e32016-10-25 16:03:23 -0700134 SubscribeFlags::SET_CALL);
135 ASSERT_TRUE(clients.empty());
136}
137
138TEST_F(SubscriptionManagerTest, mulipleSubscriptions) {
139 manager.addOrUpdateSubscription(cb1, subscrToProp1);
140
141 auto clients = manager.getSubscribedClients(
142 PROP1,
Pavel Maltsevdb179c52016-10-27 15:43:06 -0700143 toInt(VehicleAreaZone::ROW_1_LEFT),
Pavel Maltseve2603e32016-10-25 16:03:23 -0700144 SubscribeFlags::DEFAULT);
145 ASSERT_EQ((size_t) 1, clients.size());
146 ASSERT_EQ(cb1, clients.front()->getCallback());
147
148 // Same property, but different zone, to make sure we didn't unsubscribe
149 // from previous zone.
150 manager.addOrUpdateSubscription(cb1, init_hidl_vec(
151 {
152 SubscribeOptions {
153 .propId = PROP1,
Pavel Maltsevdb179c52016-10-27 15:43:06 -0700154 .vehicleAreas = toInt(VehicleAreaZone::ROW_2),
Pavel Maltseve2603e32016-10-25 16:03:23 -0700155 .flags = SubscribeFlags::DEFAULT
156 }
157 }));
158
159 clients = manager.getSubscribedClients(PROP1,
Pavel Maltsevdb179c52016-10-27 15:43:06 -0700160 toInt(VehicleAreaZone::ROW_1_LEFT),
Pavel Maltseve2603e32016-10-25 16:03:23 -0700161 SubscribeFlags::DEFAULT);
162 ASSERT_ALL_EXISTS({cb1}, extractCallbacks(clients));
163
164 clients = manager.getSubscribedClients(PROP1,
Pavel Maltsevdb179c52016-10-27 15:43:06 -0700165 toInt(VehicleAreaZone::ROW_2),
Pavel Maltseve2603e32016-10-25 16:03:23 -0700166 SubscribeFlags::DEFAULT);
167 ASSERT_ALL_EXISTS({cb1}, extractCallbacks(clients));
168}
169
170TEST_F(SubscriptionManagerTest, unsubscribe) {
171 manager.addOrUpdateSubscription(cb1, subscrToProp1);
172 manager.addOrUpdateSubscription(cb2, subscrToProp2);
173 manager.addOrUpdateSubscription(cb3, subscrToProp1and2);
174
175 ASSERT_ALL_EXISTS({cb1, cb3}, extractCallbacks(clientsToProp1()));
176 ASSERT_ALL_EXISTS({cb2, cb3}, extractCallbacks(clientsToProp2()));
177
178 ASSERT_FALSE(manager.unsubscribe(cb1, PROP1));
179 ASSERT_ALL_EXISTS({cb3}, extractCallbacks(clientsToProp1()));
180
181 // Make sure nothing changed in PROP2 so far.
182 ASSERT_ALL_EXISTS({cb2, cb3}, extractCallbacks(clientsToProp2()));
183
184 // No one subscribed to PROP1, subscription for PROP2 is not affected.
185 ASSERT_TRUE(manager.unsubscribe(cb3, PROP1));
186 ASSERT_ALL_EXISTS({cb2, cb3}, extractCallbacks(clientsToProp2()));
187
188 ASSERT_FALSE(manager.unsubscribe(cb3, PROP2));
189 ASSERT_ALL_EXISTS({cb2}, extractCallbacks(clientsToProp2()));
190
191 // The last client unsubscribed from this property.
192 ASSERT_TRUE(manager.unsubscribe(cb2, PROP2));
193
194 // No one was subscribed, return false.
195 ASSERT_FALSE(manager.unsubscribe(cb1, PROP1));
196}
197
198} // namespace anonymous
199
200} // namespace V2_0
201} // namespace vehicle
202} // namespace hardware
203} // namespace android