blob: 4bd54497d2bea19491be7fa2aa354bdbd4ff1ad9 [file] [log] [blame]
Keun-young Park28dd4702015-11-19 18:06:04 -08001/*
2 * Copyright (C) 2015 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 <unistd.h>
18
19#include <gtest/gtest.h>
20#include <binder/IServiceManager.h>
21#include <binder/ProcessState.h>
22#include <utils/threads.h>
23#include <utils/KeyedVector.h>
24#include <utils/String8.h>
25#include <utils/SystemClock.h>
26#include <IVehicleNetwork.h>
27
28#include "TestProperties.h"
29#include "VehicleHalMock.h"
30#include "IVehicleNetworkTestListener.h"
31
32namespace android {
33
34class IVehicleNetworkMockedTest : public testing::Test {
35public:
36 IVehicleNetworkMockedTest() {}
37
38 ~IVehicleNetworkMockedTest() {}
39
40 sp<IVehicleNetwork> connectToService() {
41 sp<IBinder> binder = defaultServiceManager()->getService(
42 String16(IVehicleNetwork::SERVICE_NAME));
43 if (binder != NULL) {
44 sp<IVehicleNetwork> vn(interface_cast<IVehicleNetwork>(binder));
45 return vn;
46 }
47 sp<IVehicleNetwork> dummy;
48 return dummy;
49 }
50
51protected:
52 virtual void SetUp() {
53 ProcessState::self()->startThreadPool();
54 mVN = connectToService();
55 ASSERT_TRUE(mVN.get() != NULL);
56 mHalMock = new VehicleHalMock();
57 }
58
59 virtual void TearDown() {
60 mVN->stopMocking(mHalMock);
61 }
62protected:
63 sp<VehicleHalMock> mHalMock;
64 sp<IVehicleNetwork> mVN;
65};
66
67const nsecs_t WAIT_TIMEOUT_NS = 1000000000;
68
69TEST_F(IVehicleNetworkMockedTest, connect) {
70 sp<IVehicleNetwork> vn = connectToService();
71 ASSERT_TRUE(vn.get() != NULL);
72}
73
74TEST_F(IVehicleNetworkMockedTest, listProperties) {
75 mVN->startMocking(mHalMock);
76 sp<VehiclePropertiesHolder> properties = mVN->listProperties();
77 ASSERT_TRUE(properties.get() != NULL);
78 ASSERT_TRUE(mHalMock->isTheSameProperties(properties));
79}
80
81TEST_F(IVehicleNetworkMockedTest, halRestart) {
82 sp<IVehicleNetworkTestListener> listener(new IVehicleNetworkTestListener());
83 int originalCount = listener->getHalRestartCount();
84 ASSERT_EQ(NO_ERROR, mVN->startHalRestartMonitoring(listener));
85 ASSERT_EQ(NO_ERROR, mVN->startMocking(mHalMock));
86 listener->waitForHalRestart(WAIT_TIMEOUT_NS);
87 ASSERT_EQ(originalCount + 1, listener->getHalRestartCount());
88 mVN->stopMocking(mHalMock);
89 listener->waitForHalRestart(WAIT_TIMEOUT_NS);
90 ASSERT_EQ(originalCount + 2, listener->getHalRestartCount());
91}
92
93TEST_F(IVehicleNetworkMockedTest, halGlobalError) {
94 sp<IVehicleNetworkTestListener> listener(new IVehicleNetworkTestListener());
95 ASSERT_EQ(NO_ERROR, mVN->startErrorListening(listener));
96 ASSERT_EQ(NO_ERROR, mVN->startMocking(mHalMock));
97 const int ERROR_CODE = -123;
98 const int OPERATION_CODE = 4567;
99 ASSERT_EQ(NO_ERROR, mVN->injectHalError(ERROR_CODE, 0, OPERATION_CODE));
100 listener->waitForHalError(WAIT_TIMEOUT_NS);
101 ASSERT_TRUE(listener->isErrorMatching(ERROR_CODE, 0, OPERATION_CODE));
102 mVN->stopErrorListening(listener);
103}
104
105TEST_F(IVehicleNetworkMockedTest, halPropertyError) {
106 sp<IVehicleNetworkTestListener> listener(new IVehicleNetworkTestListener());
107 ASSERT_EQ(NO_ERROR, mVN->startMocking(mHalMock));
Pavel Maltsevb0324b42016-09-27 21:00:41 -0700108 ASSERT_EQ(NO_ERROR, mVN->subscribe(listener, TEST_PROPERTY_ZONED_INT32, 0, 0, 0));
Keun-young Park28dd4702015-11-19 18:06:04 -0800109 const int ERROR_CODE = -123;
110 const int OPERATION_CODE = 4567;
Pavel Maltsevb0324b42016-09-27 21:00:41 -0700111 ASSERT_EQ(NO_ERROR, mVN->injectHalError(
112 ERROR_CODE, TEST_PROPERTY_ZONED_INT32, OPERATION_CODE));
Keun-young Park28dd4702015-11-19 18:06:04 -0800113 listener->waitForHalError(WAIT_TIMEOUT_NS);
Pavel Maltsevb0324b42016-09-27 21:00:41 -0700114 ASSERT_TRUE(listener->isErrorMatching(
115 ERROR_CODE, TEST_PROPERTY_ZONED_INT32, OPERATION_CODE));
116 mVN->unsubscribe(listener, TEST_PROPERTY_ZONED_INT32);
117}
118
119TEST_F(IVehicleNetworkMockedTest, subscribeToSetProperty) {
120 sp<IVehicleNetworkTestListener> listener(new IVehicleNetworkTestListener());
121 ASSERT_EQ(NO_ERROR, mVN->startMocking(mHalMock));
122 ASSERT_EQ(NO_ERROR, mVN->subscribe(listener,
123 TEST_PROPERTY_BOOLEAN,
124 0 /* rate */,
125 0 /* zones */,
126 SubscribeFlags::SET_CALL));
127 vehicle_prop_value_t v = {
128 .prop = TEST_PROPERTY_BOOLEAN,
129 .value_type = VEHICLE_VALUE_TYPE_BOOLEAN,
130 .timestamp = elapsedRealtimeNano(),
131 .value = {
132 .boolean_value = VEHICLE_TRUE
133 }
134 };
135
136 mVN->setProperty(v);
137
138 std::unique_ptr<ScopedVehiclePropValue> actualValue(new ScopedVehiclePropValue());
139 ASSERT_EQ(NO_ERROR, listener->waitForOnPropertySet(WAIT_TIMEOUT_NS, &actualValue));
140
141 ASSERT_EQ(v.prop, actualValue->value.prop);
142 ASSERT_EQ(v.value.boolean_value, actualValue->value.value.boolean_value);
143
144 mVN->unsubscribe(listener, TEST_PROPERTY_BOOLEAN);
145}
146
147TEST_F(IVehicleNetworkMockedTest, subscribeToSetPropertyZoned) {
148 const int PROP = TEST_PROPERTY_ZONED_INT32;
149 const int SUBSCRIBED_ZONE = VEHICLE_ZONE_ROW_1_RIGHT;
150 const int NON_SUBSCRIBED_ZONE = VEHICLE_ZONE_ROW_1_LEFT;
151
152 sp<IVehicleNetworkTestListener> listener(new IVehicleNetworkTestListener());
153 ASSERT_EQ(NO_ERROR, mVN->startMocking(mHalMock));
154 ASSERT_EQ(NO_ERROR, mVN->subscribe(listener,
155 PROP,
156 0 /* rate */,
157 SUBSCRIBED_ZONE,
158 SubscribeFlags::SET_CALL));
159 vehicle_prop_value_t v = {
160 .prop = PROP,
161 .value_type = VEHICLE_VALUE_TYPE_ZONED_INT32,
162 .timestamp = elapsedRealtimeNano(),
163 .zone = NON_SUBSCRIBED_ZONE, // We do not expect notifications for this zone.
164 .value = {
165 .int32_value = 42
166 }
167 };
168
169 mVN->setProperty(v);
170
171 std::unique_ptr<ScopedVehiclePropValue> actualValue(new ScopedVehiclePropValue());
172
173 ASSERT_EQ(-ETIMEDOUT, listener->waitForOnPropertySet(WAIT_TIMEOUT_NS, &actualValue));
174
175 v.zone = SUBSCRIBED_ZONE;
176 mVN->setProperty(v);
177 ASSERT_EQ(NO_ERROR, listener->waitForOnPropertySet(WAIT_TIMEOUT_NS, &actualValue));
178
179 ASSERT_EQ(v.prop, actualValue->value.prop);
180 ASSERT_EQ(v.value.int32_value, actualValue->value.value.int32_value);
181
182 mVN->unsubscribe(listener, PROP);
Keun-young Park28dd4702015-11-19 18:06:04 -0800183}
184
185}; // namespace android