blob: 863142ef24469230de2af7744ca5078c976d2061 [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
Pavel Maltseve2603e32016-10-25 16:03:23 -070022#include "vehicle_hal_manager/SubscriptionManager.h"
23
24#include "VehicleHalTestUtils.h"
25
26namespace android {
27namespace hardware {
28namespace vehicle {
29namespace V2_0 {
30
31namespace {
32
33using namespace std::placeholders;
34
35class SubscriptionManagerTest : public ::testing::Test {
36public:
37 SubscriptionManager manager;
38
39 const VehicleProperty PROP1 = VehicleProperty::HVAC_FAN_SPEED;
40 const VehicleProperty PROP2 = VehicleProperty::DISPLAY_BRIGHTNESS;
41
42 sp<IVehicleCallback> cb1 = new MockedVehicleCallback();
43 sp<IVehicleCallback> cb2 = new MockedVehicleCallback();
44 sp<IVehicleCallback> cb3 = new MockedVehicleCallback();
45
Pavel Maltsev0e0a9252016-12-05 11:03:52 -080046 hidl_vec<SubscribeOptions> subscrToProp1 = {
47 SubscribeOptions {
48 .propId = PROP1,
49 .vehicleAreas = toInt(VehicleAreaZone::ROW_1_LEFT),
50 .flags = SubscribeFlags::HAL_EVENT
51 },
52 };
Pavel Maltseve2603e32016-10-25 16:03:23 -070053
Pavel Maltsev0e0a9252016-12-05 11:03:52 -080054 hidl_vec<SubscribeOptions> subscrToProp2 = {
55 SubscribeOptions {
56 .propId = PROP2,
57 .flags = SubscribeFlags::HAL_EVENT
58 },
59 };
Pavel Maltseve2603e32016-10-25 16:03:23 -070060
Pavel Maltsev0e0a9252016-12-05 11:03:52 -080061 hidl_vec<SubscribeOptions> subscrToProp1and2 = {
62 SubscribeOptions {
63 .propId = PROP1,
64 .vehicleAreas = toInt(VehicleAreaZone::ROW_1_LEFT),
65 .flags = SubscribeFlags::HAL_EVENT
66 },
67 SubscribeOptions {
68 .propId = PROP2,
69 .flags = SubscribeFlags::HAL_EVENT
70 },
71 };
Pavel Maltseve2603e32016-10-25 16:03:23 -070072
73 static std::list<sp<IVehicleCallback>> extractCallbacks(
74 const std::list<sp<HalClient>>& clients) {
75 std::list<sp<IVehicleCallback>> callbacks;
76 for (auto c : clients) {
77 callbacks.push_back(c->getCallback());
78 }
79 return callbacks;
80 }
81
82 std::list<sp<HalClient>> clientsToProp1() {
83 return manager.getSubscribedClients(PROP1,
Pavel Maltsevdb179c52016-10-27 15:43:06 -070084 toInt(VehicleAreaZone::ROW_1_LEFT),
Pavel Maltseve2603e32016-10-25 16:03:23 -070085 SubscribeFlags::DEFAULT);
86 }
87
88 std::list<sp<HalClient>> clientsToProp2() {
89 return manager.getSubscribedClients(PROP2, 0,
90 SubscribeFlags::DEFAULT);
91 }
92};
93
94
95TEST_F(SubscriptionManagerTest, multipleClients) {
96 manager.addOrUpdateSubscription(cb1, subscrToProp1);
97 manager.addOrUpdateSubscription(cb2, subscrToProp1);
98
99 auto clients = manager.getSubscribedClients(
100 PROP1,
Pavel Maltsevdb179c52016-10-27 15:43:06 -0700101 toInt(VehicleAreaZone::ROW_1_LEFT),
Pavel Maltseve2603e32016-10-25 16:03:23 -0700102 SubscribeFlags::HAL_EVENT);
103
104 ASSERT_ALL_EXISTS({cb1, cb2}, extractCallbacks(clients));
105}
106
107TEST_F(SubscriptionManagerTest, negativeCases) {
108 manager.addOrUpdateSubscription(cb1, subscrToProp1);
109
110 // Wrong zone
111 auto clients = manager.getSubscribedClients(
112 PROP1,
Pavel Maltsevdb179c52016-10-27 15:43:06 -0700113 toInt(VehicleAreaZone::ROW_2_LEFT),
Pavel Maltseve2603e32016-10-25 16:03:23 -0700114 SubscribeFlags::HAL_EVENT);
115 ASSERT_TRUE(clients.empty());
116
117 // Wrong prop
118 clients = manager.getSubscribedClients(
119 VehicleProperty::AP_POWER_BOOTUP_REASON,
Pavel Maltsevdb179c52016-10-27 15:43:06 -0700120 toInt(VehicleAreaZone::ROW_1_LEFT),
Pavel Maltseve2603e32016-10-25 16:03:23 -0700121 SubscribeFlags::HAL_EVENT);
122 ASSERT_TRUE(clients.empty());
123
124 // Wrong flag
125 clients = manager.getSubscribedClients(
126 PROP1,
Pavel Maltsevdb179c52016-10-27 15:43:06 -0700127 toInt(VehicleAreaZone::ROW_1_LEFT),
Pavel Maltseve2603e32016-10-25 16:03:23 -0700128 SubscribeFlags::SET_CALL);
129 ASSERT_TRUE(clients.empty());
130}
131
132TEST_F(SubscriptionManagerTest, mulipleSubscriptions) {
133 manager.addOrUpdateSubscription(cb1, subscrToProp1);
134
135 auto clients = manager.getSubscribedClients(
136 PROP1,
Pavel Maltsevdb179c52016-10-27 15:43:06 -0700137 toInt(VehicleAreaZone::ROW_1_LEFT),
Pavel Maltseve2603e32016-10-25 16:03:23 -0700138 SubscribeFlags::DEFAULT);
139 ASSERT_EQ((size_t) 1, clients.size());
140 ASSERT_EQ(cb1, clients.front()->getCallback());
141
142 // Same property, but different zone, to make sure we didn't unsubscribe
143 // from previous zone.
Pavel Maltsev0e0a9252016-12-05 11:03:52 -0800144 manager.addOrUpdateSubscription(cb1, {
145 SubscribeOptions {
Pavel Maltseve2603e32016-10-25 16:03:23 -0700146 .propId = PROP1,
Pavel Maltsevdb179c52016-10-27 15:43:06 -0700147 .vehicleAreas = toInt(VehicleAreaZone::ROW_2),
Pavel Maltseve2603e32016-10-25 16:03:23 -0700148 .flags = SubscribeFlags::DEFAULT
149 }
Pavel Maltsev0e0a9252016-12-05 11:03:52 -0800150 });
Pavel Maltseve2603e32016-10-25 16:03:23 -0700151
152 clients = manager.getSubscribedClients(PROP1,
Pavel Maltsevdb179c52016-10-27 15:43:06 -0700153 toInt(VehicleAreaZone::ROW_1_LEFT),
Pavel Maltseve2603e32016-10-25 16:03:23 -0700154 SubscribeFlags::DEFAULT);
155 ASSERT_ALL_EXISTS({cb1}, extractCallbacks(clients));
156
157 clients = manager.getSubscribedClients(PROP1,
Pavel Maltsevdb179c52016-10-27 15:43:06 -0700158 toInt(VehicleAreaZone::ROW_2),
Pavel Maltseve2603e32016-10-25 16:03:23 -0700159 SubscribeFlags::DEFAULT);
160 ASSERT_ALL_EXISTS({cb1}, extractCallbacks(clients));
161}
162
163TEST_F(SubscriptionManagerTest, unsubscribe) {
164 manager.addOrUpdateSubscription(cb1, subscrToProp1);
165 manager.addOrUpdateSubscription(cb2, subscrToProp2);
166 manager.addOrUpdateSubscription(cb3, subscrToProp1and2);
167
168 ASSERT_ALL_EXISTS({cb1, cb3}, extractCallbacks(clientsToProp1()));
169 ASSERT_ALL_EXISTS({cb2, cb3}, extractCallbacks(clientsToProp2()));
170
171 ASSERT_FALSE(manager.unsubscribe(cb1, PROP1));
172 ASSERT_ALL_EXISTS({cb3}, extractCallbacks(clientsToProp1()));
173
174 // Make sure nothing changed in PROP2 so far.
175 ASSERT_ALL_EXISTS({cb2, cb3}, extractCallbacks(clientsToProp2()));
176
177 // No one subscribed to PROP1, subscription for PROP2 is not affected.
178 ASSERT_TRUE(manager.unsubscribe(cb3, PROP1));
179 ASSERT_ALL_EXISTS({cb2, cb3}, extractCallbacks(clientsToProp2()));
180
181 ASSERT_FALSE(manager.unsubscribe(cb3, PROP2));
182 ASSERT_ALL_EXISTS({cb2}, extractCallbacks(clientsToProp2()));
183
184 // The last client unsubscribed from this property.
185 ASSERT_TRUE(manager.unsubscribe(cb2, PROP2));
186
187 // No one was subscribed, return false.
188 ASSERT_FALSE(manager.unsubscribe(cb1, PROP1));
189}
190
191} // namespace anonymous
192
193} // namespace V2_0
194} // namespace vehicle
195} // namespace hardware
196} // namespace android