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