1e18e25d2a79e94a4cea83a94daee5f4cafd419cfkeunyoung/*
2e18e25d2a79e94a4cea83a94daee5f4cafd419cfkeunyoung * Copyright (C) 2015 The Android Open Source Project
3e18e25d2a79e94a4cea83a94daee5f4cafd419cfkeunyoung *
4e18e25d2a79e94a4cea83a94daee5f4cafd419cfkeunyoung * Licensed under the Apache License, Version 2.0 (the "License");
5e18e25d2a79e94a4cea83a94daee5f4cafd419cfkeunyoung * you may not use this file except in compliance with the License.
6e18e25d2a79e94a4cea83a94daee5f4cafd419cfkeunyoung * You may obtain a copy of the License at
7e18e25d2a79e94a4cea83a94daee5f4cafd419cfkeunyoung *
8e18e25d2a79e94a4cea83a94daee5f4cafd419cfkeunyoung *      http://www.apache.org/licenses/LICENSE-2.0
9e18e25d2a79e94a4cea83a94daee5f4cafd419cfkeunyoung *
10e18e25d2a79e94a4cea83a94daee5f4cafd419cfkeunyoung * Unless required by applicable law or agreed to in writing, software
11e18e25d2a79e94a4cea83a94daee5f4cafd419cfkeunyoung * distributed under the License is distributed on an "AS IS" BASIS,
12e18e25d2a79e94a4cea83a94daee5f4cafd419cfkeunyoung * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13e18e25d2a79e94a4cea83a94daee5f4cafd419cfkeunyoung * See the License for the specific language governing permissions and
14e18e25d2a79e94a4cea83a94daee5f4cafd419cfkeunyoung * limitations under the License.
15e18e25d2a79e94a4cea83a94daee5f4cafd419cfkeunyoung */
16e18e25d2a79e94a4cea83a94daee5f4cafd419cfkeunyoung
17e18e25d2a79e94a4cea83a94daee5f4cafd419cfkeunyoung#include <unistd.h>
18e18e25d2a79e94a4cea83a94daee5f4cafd419cfkeunyoung
19e18e25d2a79e94a4cea83a94daee5f4cafd419cfkeunyoung#include <gtest/gtest.h>
20e18e25d2a79e94a4cea83a94daee5f4cafd419cfkeunyoung#include <binder/IServiceManager.h>
21e18e25d2a79e94a4cea83a94daee5f4cafd419cfkeunyoung#include <binder/ProcessState.h>
22e18e25d2a79e94a4cea83a94daee5f4cafd419cfkeunyoung#include <utils/threads.h>
23e18e25d2a79e94a4cea83a94daee5f4cafd419cfkeunyoung#include <utils/KeyedVector.h>
24e18e25d2a79e94a4cea83a94daee5f4cafd419cfkeunyoung#include <utils/String8.h>
25e18e25d2a79e94a4cea83a94daee5f4cafd419cfkeunyoung#include <utils/SystemClock.h>
26e18e25d2a79e94a4cea83a94daee5f4cafd419cfkeunyoung#include <VehicleNetwork.h>
27e18e25d2a79e94a4cea83a94daee5f4cafd419cfkeunyoung
28aaeffaff85979583b1826db759b5cdb6184559d5Keun-young Park#include "VehicleNetworkTestListener.h"
29aaeffaff85979583b1826db759b5cdb6184559d5Keun-young Park
30e18e25d2a79e94a4cea83a94daee5f4cafd419cfkeunyoungnamespace android {
31e18e25d2a79e94a4cea83a94daee5f4cafd419cfkeunyoung
32e18e25d2a79e94a4cea83a94daee5f4cafd419cfkeunyoung// Be careful with name conflict with other tests!. It can lead into wrong virtual function table
33e18e25d2a79e94a4cea83a94daee5f4cafd419cfkeunyoung// , leading into mysterious crash. Always add test name in front for any class name.
34e18e25d2a79e94a4cea83a94daee5f4cafd419cfkeunyoungclass VehicleNetworkTest : public testing::Test {
35e18e25d2a79e94a4cea83a94daee5f4cafd419cfkeunyoungpublic:
36e18e25d2a79e94a4cea83a94daee5f4cafd419cfkeunyoung    VehicleNetworkTest() :
37e18e25d2a79e94a4cea83a94daee5f4cafd419cfkeunyoung        mVN(NULL),
38e18e25d2a79e94a4cea83a94daee5f4cafd419cfkeunyoung        mListener(new VehicleNetworkTestListener()) {
39e18e25d2a79e94a4cea83a94daee5f4cafd419cfkeunyoung        String8 msg;
40e18e25d2a79e94a4cea83a94daee5f4cafd419cfkeunyoung        msg.appendFormat("Creating VehicleNetworkTest 0x%p %p %p\n", this, mVN.get(),
41e18e25d2a79e94a4cea83a94daee5f4cafd419cfkeunyoung                mListener.get());
42e18e25d2a79e94a4cea83a94daee5f4cafd419cfkeunyoung        std::cout<<msg.string();
43e18e25d2a79e94a4cea83a94daee5f4cafd419cfkeunyoung    }
44e18e25d2a79e94a4cea83a94daee5f4cafd419cfkeunyoung
45e18e25d2a79e94a4cea83a94daee5f4cafd419cfkeunyoung    virtual ~VehicleNetworkTest() { }
46e18e25d2a79e94a4cea83a94daee5f4cafd419cfkeunyoung
47e18e25d2a79e94a4cea83a94daee5f4cafd419cfkeunyoung    sp<VehicleNetwork> getDefaultVN() {
48e18e25d2a79e94a4cea83a94daee5f4cafd419cfkeunyoung        return mVN;
49e18e25d2a79e94a4cea83a94daee5f4cafd419cfkeunyoung    }
50e18e25d2a79e94a4cea83a94daee5f4cafd419cfkeunyoung
51e18e25d2a79e94a4cea83a94daee5f4cafd419cfkeunyoung    VehicleNetworkTestListener& getTestListener() {
52e18e25d2a79e94a4cea83a94daee5f4cafd419cfkeunyoung        return *mListener.get();
53e18e25d2a79e94a4cea83a94daee5f4cafd419cfkeunyoung    }
54e18e25d2a79e94a4cea83a94daee5f4cafd419cfkeunyoung
55e18e25d2a79e94a4cea83a94daee5f4cafd419cfkeunyoungprotected:
56e18e25d2a79e94a4cea83a94daee5f4cafd419cfkeunyoung    void SetUp() {
57e18e25d2a79e94a4cea83a94daee5f4cafd419cfkeunyoung        String8 msg;
58e18e25d2a79e94a4cea83a94daee5f4cafd419cfkeunyoung        msg.appendFormat("setUp starts %p %p %p\n", this, mVN.get(),
59e18e25d2a79e94a4cea83a94daee5f4cafd419cfkeunyoung                mListener.get());
60e18e25d2a79e94a4cea83a94daee5f4cafd419cfkeunyoung        std::cout<<msg.string();
61e18e25d2a79e94a4cea83a94daee5f4cafd419cfkeunyoung        ASSERT_TRUE(mListener.get() != NULL);
62e18e25d2a79e94a4cea83a94daee5f4cafd419cfkeunyoung        sp<VehicleNetworkListener> listener(mListener.get());
63e18e25d2a79e94a4cea83a94daee5f4cafd419cfkeunyoung        mVN = VehicleNetwork::createVehicleNetwork(listener);
64e18e25d2a79e94a4cea83a94daee5f4cafd419cfkeunyoung        ASSERT_TRUE(mVN.get() != NULL);
65e18e25d2a79e94a4cea83a94daee5f4cafd419cfkeunyoung        std::cout<<"setUp ends\n";
66e18e25d2a79e94a4cea83a94daee5f4cafd419cfkeunyoung    }
67e18e25d2a79e94a4cea83a94daee5f4cafd419cfkeunyoung
68e18e25d2a79e94a4cea83a94daee5f4cafd419cfkeunyoungprotected:
69e18e25d2a79e94a4cea83a94daee5f4cafd419cfkeunyoung    sp<VehicleNetwork> mVN;
70e18e25d2a79e94a4cea83a94daee5f4cafd419cfkeunyoung    sp<VehicleNetworkTestListener> mListener;
71e18e25d2a79e94a4cea83a94daee5f4cafd419cfkeunyoung};
72e18e25d2a79e94a4cea83a94daee5f4cafd419cfkeunyoung
73e18e25d2a79e94a4cea83a94daee5f4cafd419cfkeunyoung
74e18e25d2a79e94a4cea83a94daee5f4cafd419cfkeunyoungTEST_F(VehicleNetworkTest, listProperties) {
75e18e25d2a79e94a4cea83a94daee5f4cafd419cfkeunyoung    sp<VehicleNetwork> vn = getDefaultVN();
76e18e25d2a79e94a4cea83a94daee5f4cafd419cfkeunyoung    sp<VehiclePropertiesHolder> properties = vn->listProperties();
77e18e25d2a79e94a4cea83a94daee5f4cafd419cfkeunyoung    ASSERT_TRUE(properties.get() != NULL);
78d32f4e69d861d0adc2ae8f18345143f253d6fceckeunyoung    int32_t numConfigs = properties->getList().size();
79e18e25d2a79e94a4cea83a94daee5f4cafd419cfkeunyoung    ASSERT_TRUE(numConfigs > 0);
80d32f4e69d861d0adc2ae8f18345143f253d6fceckeunyoung    for (auto& config : properties->getList()) {
81e18e25d2a79e94a4cea83a94daee5f4cafd419cfkeunyoung        String8 msg = String8::format("prop 0x%x\n", config->prop);
82e18e25d2a79e94a4cea83a94daee5f4cafd419cfkeunyoung        std::cout<<msg.string();
83e18e25d2a79e94a4cea83a94daee5f4cafd419cfkeunyoung    }
84e18e25d2a79e94a4cea83a94daee5f4cafd419cfkeunyoung    sp<VehiclePropertiesHolder> propertiesIvalid  = vn->listProperties(-1); // no such property
85e18e25d2a79e94a4cea83a94daee5f4cafd419cfkeunyoung    ASSERT_TRUE(propertiesIvalid.get() == NULL);
86d32f4e69d861d0adc2ae8f18345143f253d6fceckeunyoung    for (auto& config : properties->getList()) {
87e18e25d2a79e94a4cea83a94daee5f4cafd419cfkeunyoung        String8 msg = String8::format("query single prop 0x%x\n", config->prop);
88e18e25d2a79e94a4cea83a94daee5f4cafd419cfkeunyoung        std::cout<<msg.string();
89e18e25d2a79e94a4cea83a94daee5f4cafd419cfkeunyoung        sp<VehiclePropertiesHolder> singleProperty = vn->listProperties(config->prop);
904aeb4bf0c56588be65264c324bbaaa545ad6714cKeun-young Park        ASSERT_EQ((size_t) 1, singleProperty->getList().size());
91d32f4e69d861d0adc2ae8f18345143f253d6fceckeunyoung        vehicle_prop_config_t const * newConfig = *singleProperty->getList().begin();
92e18e25d2a79e94a4cea83a94daee5f4cafd419cfkeunyoung        ASSERT_EQ(config->prop, newConfig->prop);
93e18e25d2a79e94a4cea83a94daee5f4cafd419cfkeunyoung        ASSERT_EQ(config->access, newConfig->access);
94e18e25d2a79e94a4cea83a94daee5f4cafd419cfkeunyoung        ASSERT_EQ(config->change_mode, newConfig->change_mode);
95e18e25d2a79e94a4cea83a94daee5f4cafd419cfkeunyoung        //TODO add more check
96e18e25d2a79e94a4cea83a94daee5f4cafd419cfkeunyoung    }
97e18e25d2a79e94a4cea83a94daee5f4cafd419cfkeunyoung}
98e18e25d2a79e94a4cea83a94daee5f4cafd419cfkeunyoung
99e18e25d2a79e94a4cea83a94daee5f4cafd419cfkeunyoungTEST_F(VehicleNetworkTest, getProperty) {
100e18e25d2a79e94a4cea83a94daee5f4cafd419cfkeunyoung    sp<VehicleNetwork> vn = getDefaultVN();
101e18e25d2a79e94a4cea83a94daee5f4cafd419cfkeunyoung    sp<VehiclePropertiesHolder> properties = vn->listProperties();
102e18e25d2a79e94a4cea83a94daee5f4cafd419cfkeunyoung    ASSERT_TRUE(properties.get() != NULL);
103d32f4e69d861d0adc2ae8f18345143f253d6fceckeunyoung    int32_t numConfigs = properties->getList().size();
104e18e25d2a79e94a4cea83a94daee5f4cafd419cfkeunyoung    ASSERT_TRUE(numConfigs > 0);
105d32f4e69d861d0adc2ae8f18345143f253d6fceckeunyoung    for (auto& config : properties->getList()) {
10628dd47033198a502b18b0363b98ad030ea1789ccKeun-young Park        if (config->prop == VEHICLE_PROPERTY_RADIO_PRESET) {
10728dd47033198a502b18b0363b98ad030ea1789ccKeun-young Park            continue;
10828dd47033198a502b18b0363b98ad030ea1789ccKeun-young Park        }
109e18e25d2a79e94a4cea83a94daee5f4cafd419cfkeunyoung        String8 msg = String8::format("getting prop 0x%x\n", config->prop);
110e18e25d2a79e94a4cea83a94daee5f4cafd419cfkeunyoung        std::cout<<msg.string();
111e18e25d2a79e94a4cea83a94daee5f4cafd419cfkeunyoung        ScopedVehiclePropValue value;
112e18e25d2a79e94a4cea83a94daee5f4cafd419cfkeunyoung        value.value.prop = config->prop;
1137d74e6d9195f29d0eb50f7bcbe235334b02dba8ekeunyoung        value.value.value_type = config->value_type;
114e18e25d2a79e94a4cea83a94daee5f4cafd419cfkeunyoung        status_t r = vn->getProperty(&value.value);
115e18e25d2a79e94a4cea83a94daee5f4cafd419cfkeunyoung        if ((config->access & VEHICLE_PROP_ACCESS_READ) == 0) { // cannot read
116e18e25d2a79e94a4cea83a94daee5f4cafd419cfkeunyoung            ASSERT_TRUE(r != NO_ERROR);
117e18e25d2a79e94a4cea83a94daee5f4cafd419cfkeunyoung        } else {
118e18e25d2a79e94a4cea83a94daee5f4cafd419cfkeunyoung            ASSERT_EQ(NO_ERROR, r);
119e18e25d2a79e94a4cea83a94daee5f4cafd419cfkeunyoung            ASSERT_EQ(config->value_type, value.value.value_type);
120e18e25d2a79e94a4cea83a94daee5f4cafd419cfkeunyoung        }
121e18e25d2a79e94a4cea83a94daee5f4cafd419cfkeunyoung    }
122e18e25d2a79e94a4cea83a94daee5f4cafd419cfkeunyoung}
123e18e25d2a79e94a4cea83a94daee5f4cafd419cfkeunyoung
124e18e25d2a79e94a4cea83a94daee5f4cafd419cfkeunyoung//TODO change this test to to safe write
125e18e25d2a79e94a4cea83a94daee5f4cafd419cfkeunyoungTEST_F(VehicleNetworkTest, setProperty) {
126e18e25d2a79e94a4cea83a94daee5f4cafd419cfkeunyoung    sp<VehicleNetwork> vn = getDefaultVN();
127e18e25d2a79e94a4cea83a94daee5f4cafd419cfkeunyoung    sp<VehiclePropertiesHolder> properties = vn->listProperties();
128e18e25d2a79e94a4cea83a94daee5f4cafd419cfkeunyoung    ASSERT_TRUE(properties.get() != NULL);
129d32f4e69d861d0adc2ae8f18345143f253d6fceckeunyoung    int32_t numConfigs = properties->getList().size();
130e18e25d2a79e94a4cea83a94daee5f4cafd419cfkeunyoung    ASSERT_TRUE(numConfigs > 0);
131d32f4e69d861d0adc2ae8f18345143f253d6fceckeunyoung    for (auto& config : properties->getList()) {
13228dd47033198a502b18b0363b98ad030ea1789ccKeun-young Park        if (config->prop == VEHICLE_PROPERTY_RADIO_PRESET) {
13328dd47033198a502b18b0363b98ad030ea1789ccKeun-young Park            continue;
13428dd47033198a502b18b0363b98ad030ea1789ccKeun-young Park        }
135e18e25d2a79e94a4cea83a94daee5f4cafd419cfkeunyoung        String8 msg = String8::format("setting prop 0x%x\n", config->prop);
136e18e25d2a79e94a4cea83a94daee5f4cafd419cfkeunyoung        std::cout<<msg.string();
137e18e25d2a79e94a4cea83a94daee5f4cafd419cfkeunyoung        ScopedVehiclePropValue value;
138e18e25d2a79e94a4cea83a94daee5f4cafd419cfkeunyoung        value.value.prop = config->prop;
139e18e25d2a79e94a4cea83a94daee5f4cafd419cfkeunyoung        value.value.value_type = config->value_type;
140e18e25d2a79e94a4cea83a94daee5f4cafd419cfkeunyoung        status_t r = vn->setProperty(value.value);
141e18e25d2a79e94a4cea83a94daee5f4cafd419cfkeunyoung        if ((config->access & VEHICLE_PROP_ACCESS_WRITE) == 0) { // cannot write
142e18e25d2a79e94a4cea83a94daee5f4cafd419cfkeunyoung            ASSERT_TRUE(r != NO_ERROR);
143e18e25d2a79e94a4cea83a94daee5f4cafd419cfkeunyoung        } else {
144e18e25d2a79e94a4cea83a94daee5f4cafd419cfkeunyoung            ASSERT_EQ(NO_ERROR, r);
145e18e25d2a79e94a4cea83a94daee5f4cafd419cfkeunyoung        }
146e18e25d2a79e94a4cea83a94daee5f4cafd419cfkeunyoung    }
147e18e25d2a79e94a4cea83a94daee5f4cafd419cfkeunyoung}
148e18e25d2a79e94a4cea83a94daee5f4cafd419cfkeunyoung
149e18e25d2a79e94a4cea83a94daee5f4cafd419cfkeunyoungTEST_F(VehicleNetworkTest, setSubscribe) {
150e18e25d2a79e94a4cea83a94daee5f4cafd419cfkeunyoung    sp<VehicleNetwork> vn = getDefaultVN();
151e18e25d2a79e94a4cea83a94daee5f4cafd419cfkeunyoung    sp<VehiclePropertiesHolder> properties = vn->listProperties();
152e18e25d2a79e94a4cea83a94daee5f4cafd419cfkeunyoung    ASSERT_TRUE(properties.get() != NULL);
153d32f4e69d861d0adc2ae8f18345143f253d6fceckeunyoung    int32_t numConfigs = properties->getList().size();
154e18e25d2a79e94a4cea83a94daee5f4cafd419cfkeunyoung    ASSERT_TRUE(numConfigs > 0);
155d32f4e69d861d0adc2ae8f18345143f253d6fceckeunyoung    for (auto& config : properties->getList()) {
156e18e25d2a79e94a4cea83a94daee5f4cafd419cfkeunyoung        String8 msg = String8::format("subscribing property 0x%x\n", config->prop);
157e18e25d2a79e94a4cea83a94daee5f4cafd419cfkeunyoung        std::cout<<msg.string();
158e18e25d2a79e94a4cea83a94daee5f4cafd419cfkeunyoung        status_t r = vn->subscribe(config->prop, config->max_sample_rate);
159e18e25d2a79e94a4cea83a94daee5f4cafd419cfkeunyoung        if (((config->access & VEHICLE_PROP_ACCESS_READ) == 0) ||
160e18e25d2a79e94a4cea83a94daee5f4cafd419cfkeunyoung                (config->change_mode == VEHICLE_PROP_CHANGE_MODE_STATIC)) { // cannot subsctibe
161e18e25d2a79e94a4cea83a94daee5f4cafd419cfkeunyoung            ASSERT_TRUE(r != NO_ERROR);
162e18e25d2a79e94a4cea83a94daee5f4cafd419cfkeunyoung        } else {
163d32f4e69d861d0adc2ae8f18345143f253d6fceckeunyoung            if ((config->prop >= (int32_t)VEHICLE_PROPERTY_INTERNAL_START) &&
164d32f4e69d861d0adc2ae8f18345143f253d6fceckeunyoung                    (config->prop <= (int32_t)VEHICLE_PROPERTY_INTERNAL_END)) {
165d32f4e69d861d0adc2ae8f18345143f253d6fceckeunyoung                // internal property requires write for event notification.
166d32f4e69d861d0adc2ae8f18345143f253d6fceckeunyoung                ScopedVehiclePropValue value;
167d32f4e69d861d0adc2ae8f18345143f253d6fceckeunyoung                value.value.prop = config->prop;
168d32f4e69d861d0adc2ae8f18345143f253d6fceckeunyoung                value.value.value_type = config->value_type;
169d32f4e69d861d0adc2ae8f18345143f253d6fceckeunyoung                status_t r = vn->setProperty(value.value);
170d32f4e69d861d0adc2ae8f18345143f253d6fceckeunyoung                ASSERT_EQ(NO_ERROR, r);
171d32f4e69d861d0adc2ae8f18345143f253d6fceckeunyoung            }
172e18e25d2a79e94a4cea83a94daee5f4cafd419cfkeunyoung            ASSERT_EQ(NO_ERROR, r);
173aaeffaff85979583b1826db759b5cdb6184559d5Keun-young Park            ASSERT_TRUE(getTestListener().waitForEvent(config->prop, 0, 2000000000));
174e18e25d2a79e94a4cea83a94daee5f4cafd419cfkeunyoung        }
175e18e25d2a79e94a4cea83a94daee5f4cafd419cfkeunyoung    }
176d32f4e69d861d0adc2ae8f18345143f253d6fceckeunyoung    for (auto& config : properties->getList()) {
177e18e25d2a79e94a4cea83a94daee5f4cafd419cfkeunyoung        vn->unsubscribe(config->prop);
178e18e25d2a79e94a4cea83a94daee5f4cafd419cfkeunyoung    }
179e18e25d2a79e94a4cea83a94daee5f4cafd419cfkeunyoung    usleep(1000000);
180e18e25d2a79e94a4cea83a94daee5f4cafd419cfkeunyoung    //TODO improve this as this will wait for too long
181d32f4e69d861d0adc2ae8f18345143f253d6fceckeunyoung    for (auto& config : properties->getList()) {
182aaeffaff85979583b1826db759b5cdb6184559d5Keun-young Park        int initialCount = getTestListener().getEventCount(config->prop);
183aaeffaff85979583b1826db759b5cdb6184559d5Keun-young Park        ASSERT_TRUE(!getTestListener().waitForEvent(config->prop, initialCount, 1000000000));
184e18e25d2a79e94a4cea83a94daee5f4cafd419cfkeunyoung    }
185e18e25d2a79e94a4cea83a94daee5f4cafd419cfkeunyoung}
186e18e25d2a79e94a4cea83a94daee5f4cafd419cfkeunyoung
187e18e25d2a79e94a4cea83a94daee5f4cafd419cfkeunyoung}; // namespace android
188