1/*
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));
108    ASSERT_EQ(NO_ERROR, mVN->subscribe(listener, TEST_PROPERTY_INT32, 0, 0));
109    const int ERROR_CODE = -123;
110    const int OPERATION_CODE = 4567;
111    ASSERT_EQ(NO_ERROR, mVN->injectHalError(ERROR_CODE, TEST_PROPERTY_INT32, OPERATION_CODE));
112    listener->waitForHalError(WAIT_TIMEOUT_NS);
113    ASSERT_TRUE(listener->isErrorMatching(ERROR_CODE, TEST_PROPERTY_INT32, OPERATION_CODE));
114    mVN->unsubscribe(listener, TEST_PROPERTY_INT32);
115}
116
117}; // namespace android
118