VehicleNetworkTest.cpp revision 7d74e6d9195f29d0eb50f7bcbe235334b02dba8e
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 28e18e25d2a79e94a4cea83a94daee5f4cafd419cfkeunyoungnamespace android { 29e18e25d2a79e94a4cea83a94daee5f4cafd419cfkeunyoung 30e18e25d2a79e94a4cea83a94daee5f4cafd419cfkeunyoung// Be careful with name conflict with other tests!. It can lead into wrong virtual function table 31e18e25d2a79e94a4cea83a94daee5f4cafd419cfkeunyoung// , leading into mysterious crash. Always add test name in front for any class name. 32e18e25d2a79e94a4cea83a94daee5f4cafd419cfkeunyoungclass VehicleNetworkTestListener : public VehicleNetworkListener { 33e18e25d2a79e94a4cea83a94daee5f4cafd419cfkeunyoungpublic: 34e18e25d2a79e94a4cea83a94daee5f4cafd419cfkeunyoung VehicleNetworkTestListener() { 35e18e25d2a79e94a4cea83a94daee5f4cafd419cfkeunyoung String8 msg; 36e18e25d2a79e94a4cea83a94daee5f4cafd419cfkeunyoung msg.appendFormat("Creating VehicleNetworkTestListener 0x%p\n", this); 37e18e25d2a79e94a4cea83a94daee5f4cafd419cfkeunyoung std::cout<<msg.string(); 38e18e25d2a79e94a4cea83a94daee5f4cafd419cfkeunyoung } 39e18e25d2a79e94a4cea83a94daee5f4cafd419cfkeunyoung 40e18e25d2a79e94a4cea83a94daee5f4cafd419cfkeunyoung virtual ~VehicleNetworkTestListener() { 41e18e25d2a79e94a4cea83a94daee5f4cafd419cfkeunyoung std::cout<<"destroying VehicleNetworkTestListener\n"; 42e18e25d2a79e94a4cea83a94daee5f4cafd419cfkeunyoung } 43e18e25d2a79e94a4cea83a94daee5f4cafd419cfkeunyoung 44e18e25d2a79e94a4cea83a94daee5f4cafd419cfkeunyoung virtual void onEvents(sp<VehiclePropValueListHolder>& events) { 45e18e25d2a79e94a4cea83a94daee5f4cafd419cfkeunyoung String8 msg("events "); 46e18e25d2a79e94a4cea83a94daee5f4cafd419cfkeunyoung Mutex::Autolock autolock(mLock); 47e18e25d2a79e94a4cea83a94daee5f4cafd419cfkeunyoung for (auto& e : events->getList()) { 48e18e25d2a79e94a4cea83a94daee5f4cafd419cfkeunyoung ssize_t index = mEventCounts.indexOfKey(e->prop); 49e18e25d2a79e94a4cea83a94daee5f4cafd419cfkeunyoung if (index < 0) { 50e18e25d2a79e94a4cea83a94daee5f4cafd419cfkeunyoung mEventCounts.add(e->prop, 1); // 1st event 51e18e25d2a79e94a4cea83a94daee5f4cafd419cfkeunyoung msg.appendFormat("0x%x:%d ", e->prop, 1); 52e18e25d2a79e94a4cea83a94daee5f4cafd419cfkeunyoung } else { 53e18e25d2a79e94a4cea83a94daee5f4cafd419cfkeunyoung int count = mEventCounts.valueAt(index); 54e18e25d2a79e94a4cea83a94daee5f4cafd419cfkeunyoung count++; 55e18e25d2a79e94a4cea83a94daee5f4cafd419cfkeunyoung mEventCounts.replaceValueAt(index, count); 56e18e25d2a79e94a4cea83a94daee5f4cafd419cfkeunyoung msg.appendFormat("0x%x:%d ", e->prop, count); 57e18e25d2a79e94a4cea83a94daee5f4cafd419cfkeunyoung } 58e18e25d2a79e94a4cea83a94daee5f4cafd419cfkeunyoung } 59e18e25d2a79e94a4cea83a94daee5f4cafd419cfkeunyoung msg.append("\n"); 60e18e25d2a79e94a4cea83a94daee5f4cafd419cfkeunyoung std::cout<<msg.string(); 61e18e25d2a79e94a4cea83a94daee5f4cafd419cfkeunyoung mCondition.signal(); 62e18e25d2a79e94a4cea83a94daee5f4cafd419cfkeunyoung } 63e18e25d2a79e94a4cea83a94daee5f4cafd419cfkeunyoung 64e18e25d2a79e94a4cea83a94daee5f4cafd419cfkeunyoung void waitForEvents(nsecs_t reltime) { 65e18e25d2a79e94a4cea83a94daee5f4cafd419cfkeunyoung Mutex::Autolock autolock(mLock); 66e18e25d2a79e94a4cea83a94daee5f4cafd419cfkeunyoung mCondition.waitRelative(mLock, reltime); 67e18e25d2a79e94a4cea83a94daee5f4cafd419cfkeunyoung } 68e18e25d2a79e94a4cea83a94daee5f4cafd419cfkeunyoung 69e18e25d2a79e94a4cea83a94daee5f4cafd419cfkeunyoung bool waitForEvent(int32_t property, nsecs_t reltime) { 70e18e25d2a79e94a4cea83a94daee5f4cafd419cfkeunyoung Mutex::Autolock autolock(mLock); 71e18e25d2a79e94a4cea83a94daee5f4cafd419cfkeunyoung int startCount = getEventCountLocked(property); 72e18e25d2a79e94a4cea83a94daee5f4cafd419cfkeunyoung int currentCount = startCount; 73e18e25d2a79e94a4cea83a94daee5f4cafd419cfkeunyoung int64_t now = android::elapsedRealtimeNano(); 74e18e25d2a79e94a4cea83a94daee5f4cafd419cfkeunyoung int64_t endTime = now + reltime; 75e18e25d2a79e94a4cea83a94daee5f4cafd419cfkeunyoung while ((startCount == currentCount) && (now < endTime)) { 76e18e25d2a79e94a4cea83a94daee5f4cafd419cfkeunyoung mCondition.waitRelative(mLock, endTime - now); 77e18e25d2a79e94a4cea83a94daee5f4cafd419cfkeunyoung currentCount = getEventCountLocked(property); 78e18e25d2a79e94a4cea83a94daee5f4cafd419cfkeunyoung now = android::elapsedRealtimeNano(); 79e18e25d2a79e94a4cea83a94daee5f4cafd419cfkeunyoung } 80e18e25d2a79e94a4cea83a94daee5f4cafd419cfkeunyoung return (startCount != currentCount); 81e18e25d2a79e94a4cea83a94daee5f4cafd419cfkeunyoung } 82e18e25d2a79e94a4cea83a94daee5f4cafd419cfkeunyoung 83e18e25d2a79e94a4cea83a94daee5f4cafd419cfkeunyoung int getEventCount(int32_t property) { 84e18e25d2a79e94a4cea83a94daee5f4cafd419cfkeunyoung Mutex::Autolock autolock(mLock); 85e18e25d2a79e94a4cea83a94daee5f4cafd419cfkeunyoung return getEventCountLocked(property); 86e18e25d2a79e94a4cea83a94daee5f4cafd419cfkeunyoung } 87e18e25d2a79e94a4cea83a94daee5f4cafd419cfkeunyoung 88e18e25d2a79e94a4cea83a94daee5f4cafd419cfkeunyoungprivate: 89e18e25d2a79e94a4cea83a94daee5f4cafd419cfkeunyoung int getEventCountLocked(int32_t property) { 90e18e25d2a79e94a4cea83a94daee5f4cafd419cfkeunyoung ssize_t index = mEventCounts.indexOfKey(property); 91e18e25d2a79e94a4cea83a94daee5f4cafd419cfkeunyoung if (index < 0) { 92e18e25d2a79e94a4cea83a94daee5f4cafd419cfkeunyoung return 0; 93e18e25d2a79e94a4cea83a94daee5f4cafd419cfkeunyoung } else { 94e18e25d2a79e94a4cea83a94daee5f4cafd419cfkeunyoung return mEventCounts.valueAt(index); 95e18e25d2a79e94a4cea83a94daee5f4cafd419cfkeunyoung } 96e18e25d2a79e94a4cea83a94daee5f4cafd419cfkeunyoung } 97e18e25d2a79e94a4cea83a94daee5f4cafd419cfkeunyoungprivate: 98e18e25d2a79e94a4cea83a94daee5f4cafd419cfkeunyoung Mutex mLock; 99e18e25d2a79e94a4cea83a94daee5f4cafd419cfkeunyoung Condition mCondition; 100e18e25d2a79e94a4cea83a94daee5f4cafd419cfkeunyoung KeyedVector<int32_t, int> mEventCounts; 101e18e25d2a79e94a4cea83a94daee5f4cafd419cfkeunyoung}; 102e18e25d2a79e94a4cea83a94daee5f4cafd419cfkeunyoung 103e18e25d2a79e94a4cea83a94daee5f4cafd419cfkeunyoungclass VehicleNetworkTest : public testing::Test { 104e18e25d2a79e94a4cea83a94daee5f4cafd419cfkeunyoungpublic: 105e18e25d2a79e94a4cea83a94daee5f4cafd419cfkeunyoung VehicleNetworkTest() : 106e18e25d2a79e94a4cea83a94daee5f4cafd419cfkeunyoung mVN(NULL), 107e18e25d2a79e94a4cea83a94daee5f4cafd419cfkeunyoung mListener(new VehicleNetworkTestListener()) { 108e18e25d2a79e94a4cea83a94daee5f4cafd419cfkeunyoung String8 msg; 109e18e25d2a79e94a4cea83a94daee5f4cafd419cfkeunyoung msg.appendFormat("Creating VehicleNetworkTest 0x%p %p %p\n", this, mVN.get(), 110e18e25d2a79e94a4cea83a94daee5f4cafd419cfkeunyoung mListener.get()); 111e18e25d2a79e94a4cea83a94daee5f4cafd419cfkeunyoung std::cout<<msg.string(); 112e18e25d2a79e94a4cea83a94daee5f4cafd419cfkeunyoung } 113e18e25d2a79e94a4cea83a94daee5f4cafd419cfkeunyoung 114e18e25d2a79e94a4cea83a94daee5f4cafd419cfkeunyoung virtual ~VehicleNetworkTest() { } 115e18e25d2a79e94a4cea83a94daee5f4cafd419cfkeunyoung 116e18e25d2a79e94a4cea83a94daee5f4cafd419cfkeunyoung sp<VehicleNetwork> getDefaultVN() { 117e18e25d2a79e94a4cea83a94daee5f4cafd419cfkeunyoung return mVN; 118e18e25d2a79e94a4cea83a94daee5f4cafd419cfkeunyoung } 119e18e25d2a79e94a4cea83a94daee5f4cafd419cfkeunyoung 120e18e25d2a79e94a4cea83a94daee5f4cafd419cfkeunyoung VehicleNetworkTestListener& getTestListener() { 121e18e25d2a79e94a4cea83a94daee5f4cafd419cfkeunyoung return *mListener.get(); 122e18e25d2a79e94a4cea83a94daee5f4cafd419cfkeunyoung } 123e18e25d2a79e94a4cea83a94daee5f4cafd419cfkeunyoung 124e18e25d2a79e94a4cea83a94daee5f4cafd419cfkeunyoungprotected: 125e18e25d2a79e94a4cea83a94daee5f4cafd419cfkeunyoung void SetUp() { 126e18e25d2a79e94a4cea83a94daee5f4cafd419cfkeunyoung String8 msg; 127e18e25d2a79e94a4cea83a94daee5f4cafd419cfkeunyoung msg.appendFormat("setUp starts %p %p %p\n", this, mVN.get(), 128e18e25d2a79e94a4cea83a94daee5f4cafd419cfkeunyoung mListener.get()); 129e18e25d2a79e94a4cea83a94daee5f4cafd419cfkeunyoung std::cout<<msg.string(); 130e18e25d2a79e94a4cea83a94daee5f4cafd419cfkeunyoung ASSERT_TRUE(mListener.get() != NULL); 131e18e25d2a79e94a4cea83a94daee5f4cafd419cfkeunyoung sp<VehicleNetworkListener> listener(mListener.get()); 132e18e25d2a79e94a4cea83a94daee5f4cafd419cfkeunyoung mVN = VehicleNetwork::createVehicleNetwork(listener); 133e18e25d2a79e94a4cea83a94daee5f4cafd419cfkeunyoung ASSERT_TRUE(mVN.get() != NULL); 134e18e25d2a79e94a4cea83a94daee5f4cafd419cfkeunyoung std::cout<<"setUp ends\n"; 135e18e25d2a79e94a4cea83a94daee5f4cafd419cfkeunyoung } 136e18e25d2a79e94a4cea83a94daee5f4cafd419cfkeunyoung 137e18e25d2a79e94a4cea83a94daee5f4cafd419cfkeunyoungprotected: 138e18e25d2a79e94a4cea83a94daee5f4cafd419cfkeunyoung sp<VehicleNetwork> mVN; 139e18e25d2a79e94a4cea83a94daee5f4cafd419cfkeunyoung sp<VehicleNetworkTestListener> mListener; 140e18e25d2a79e94a4cea83a94daee5f4cafd419cfkeunyoung}; 141e18e25d2a79e94a4cea83a94daee5f4cafd419cfkeunyoung 142e18e25d2a79e94a4cea83a94daee5f4cafd419cfkeunyoung 143e18e25d2a79e94a4cea83a94daee5f4cafd419cfkeunyoungTEST_F(VehicleNetworkTest, listProperties) { 144e18e25d2a79e94a4cea83a94daee5f4cafd419cfkeunyoung sp<VehicleNetwork> vn = getDefaultVN(); 145e18e25d2a79e94a4cea83a94daee5f4cafd419cfkeunyoung sp<VehiclePropertiesHolder> properties = vn->listProperties(); 146e18e25d2a79e94a4cea83a94daee5f4cafd419cfkeunyoung ASSERT_TRUE(properties.get() != NULL); 147d32f4e69d861d0adc2ae8f18345143f253d6fceckeunyoung int32_t numConfigs = properties->getList().size(); 148e18e25d2a79e94a4cea83a94daee5f4cafd419cfkeunyoung ASSERT_TRUE(numConfigs > 0); 149d32f4e69d861d0adc2ae8f18345143f253d6fceckeunyoung for (auto& config : properties->getList()) { 150e18e25d2a79e94a4cea83a94daee5f4cafd419cfkeunyoung String8 msg = String8::format("prop 0x%x\n", config->prop); 151e18e25d2a79e94a4cea83a94daee5f4cafd419cfkeunyoung std::cout<<msg.string(); 152e18e25d2a79e94a4cea83a94daee5f4cafd419cfkeunyoung } 153e18e25d2a79e94a4cea83a94daee5f4cafd419cfkeunyoung sp<VehiclePropertiesHolder> propertiesIvalid = vn->listProperties(-1); // no such property 154e18e25d2a79e94a4cea83a94daee5f4cafd419cfkeunyoung ASSERT_TRUE(propertiesIvalid.get() == NULL); 155d32f4e69d861d0adc2ae8f18345143f253d6fceckeunyoung for (auto& config : properties->getList()) { 156e18e25d2a79e94a4cea83a94daee5f4cafd419cfkeunyoung String8 msg = String8::format("query single prop 0x%x\n", config->prop); 157e18e25d2a79e94a4cea83a94daee5f4cafd419cfkeunyoung std::cout<<msg.string(); 158e18e25d2a79e94a4cea83a94daee5f4cafd419cfkeunyoung sp<VehiclePropertiesHolder> singleProperty = vn->listProperties(config->prop); 159d32f4e69d861d0adc2ae8f18345143f253d6fceckeunyoung ASSERT_EQ(1, singleProperty->getList().size()); 160d32f4e69d861d0adc2ae8f18345143f253d6fceckeunyoung vehicle_prop_config_t const * newConfig = *singleProperty->getList().begin(); 161e18e25d2a79e94a4cea83a94daee5f4cafd419cfkeunyoung ASSERT_EQ(config->prop, newConfig->prop); 162e18e25d2a79e94a4cea83a94daee5f4cafd419cfkeunyoung ASSERT_EQ(config->access, newConfig->access); 163e18e25d2a79e94a4cea83a94daee5f4cafd419cfkeunyoung ASSERT_EQ(config->change_mode, newConfig->change_mode); 164e18e25d2a79e94a4cea83a94daee5f4cafd419cfkeunyoung //TODO add more check 165e18e25d2a79e94a4cea83a94daee5f4cafd419cfkeunyoung } 166e18e25d2a79e94a4cea83a94daee5f4cafd419cfkeunyoung} 167e18e25d2a79e94a4cea83a94daee5f4cafd419cfkeunyoung 168e18e25d2a79e94a4cea83a94daee5f4cafd419cfkeunyoungTEST_F(VehicleNetworkTest, getProperty) { 169e18e25d2a79e94a4cea83a94daee5f4cafd419cfkeunyoung sp<VehicleNetwork> vn = getDefaultVN(); 170e18e25d2a79e94a4cea83a94daee5f4cafd419cfkeunyoung sp<VehiclePropertiesHolder> properties = vn->listProperties(); 171e18e25d2a79e94a4cea83a94daee5f4cafd419cfkeunyoung ASSERT_TRUE(properties.get() != NULL); 172d32f4e69d861d0adc2ae8f18345143f253d6fceckeunyoung int32_t numConfigs = properties->getList().size(); 173e18e25d2a79e94a4cea83a94daee5f4cafd419cfkeunyoung ASSERT_TRUE(numConfigs > 0); 174d32f4e69d861d0adc2ae8f18345143f253d6fceckeunyoung for (auto& config : properties->getList()) { 175e18e25d2a79e94a4cea83a94daee5f4cafd419cfkeunyoung String8 msg = String8::format("getting prop 0x%x\n", config->prop); 176e18e25d2a79e94a4cea83a94daee5f4cafd419cfkeunyoung std::cout<<msg.string(); 177e18e25d2a79e94a4cea83a94daee5f4cafd419cfkeunyoung ScopedVehiclePropValue value; 178e18e25d2a79e94a4cea83a94daee5f4cafd419cfkeunyoung value.value.prop = config->prop; 1797d74e6d9195f29d0eb50f7bcbe235334b02dba8ekeunyoung value.value.value_type = config->value_type; 180e18e25d2a79e94a4cea83a94daee5f4cafd419cfkeunyoung status_t r = vn->getProperty(&value.value); 181e18e25d2a79e94a4cea83a94daee5f4cafd419cfkeunyoung if ((config->access & VEHICLE_PROP_ACCESS_READ) == 0) { // cannot read 182e18e25d2a79e94a4cea83a94daee5f4cafd419cfkeunyoung ASSERT_TRUE(r != NO_ERROR); 183e18e25d2a79e94a4cea83a94daee5f4cafd419cfkeunyoung } else { 184e18e25d2a79e94a4cea83a94daee5f4cafd419cfkeunyoung ASSERT_EQ(NO_ERROR, r); 185e18e25d2a79e94a4cea83a94daee5f4cafd419cfkeunyoung ASSERT_EQ(config->value_type, value.value.value_type); 186e18e25d2a79e94a4cea83a94daee5f4cafd419cfkeunyoung } 187e18e25d2a79e94a4cea83a94daee5f4cafd419cfkeunyoung } 188e18e25d2a79e94a4cea83a94daee5f4cafd419cfkeunyoung} 189e18e25d2a79e94a4cea83a94daee5f4cafd419cfkeunyoung 190e18e25d2a79e94a4cea83a94daee5f4cafd419cfkeunyoung//TODO change this test to to safe write 191e18e25d2a79e94a4cea83a94daee5f4cafd419cfkeunyoungTEST_F(VehicleNetworkTest, setProperty) { 192e18e25d2a79e94a4cea83a94daee5f4cafd419cfkeunyoung sp<VehicleNetwork> vn = getDefaultVN(); 193e18e25d2a79e94a4cea83a94daee5f4cafd419cfkeunyoung sp<VehiclePropertiesHolder> properties = vn->listProperties(); 194e18e25d2a79e94a4cea83a94daee5f4cafd419cfkeunyoung ASSERT_TRUE(properties.get() != NULL); 195d32f4e69d861d0adc2ae8f18345143f253d6fceckeunyoung int32_t numConfigs = properties->getList().size(); 196e18e25d2a79e94a4cea83a94daee5f4cafd419cfkeunyoung ASSERT_TRUE(numConfigs > 0); 197d32f4e69d861d0adc2ae8f18345143f253d6fceckeunyoung for (auto& config : properties->getList()) { 198e18e25d2a79e94a4cea83a94daee5f4cafd419cfkeunyoung String8 msg = String8::format("setting prop 0x%x\n", config->prop); 199e18e25d2a79e94a4cea83a94daee5f4cafd419cfkeunyoung std::cout<<msg.string(); 200e18e25d2a79e94a4cea83a94daee5f4cafd419cfkeunyoung ScopedVehiclePropValue value; 201e18e25d2a79e94a4cea83a94daee5f4cafd419cfkeunyoung value.value.prop = config->prop; 202e18e25d2a79e94a4cea83a94daee5f4cafd419cfkeunyoung value.value.value_type = config->value_type; 203e18e25d2a79e94a4cea83a94daee5f4cafd419cfkeunyoung status_t r = vn->setProperty(value.value); 204e18e25d2a79e94a4cea83a94daee5f4cafd419cfkeunyoung if ((config->access & VEHICLE_PROP_ACCESS_WRITE) == 0) { // cannot write 205e18e25d2a79e94a4cea83a94daee5f4cafd419cfkeunyoung ASSERT_TRUE(r != NO_ERROR); 206e18e25d2a79e94a4cea83a94daee5f4cafd419cfkeunyoung } else { 207e18e25d2a79e94a4cea83a94daee5f4cafd419cfkeunyoung ASSERT_EQ(NO_ERROR, r); 208e18e25d2a79e94a4cea83a94daee5f4cafd419cfkeunyoung } 209e18e25d2a79e94a4cea83a94daee5f4cafd419cfkeunyoung } 210e18e25d2a79e94a4cea83a94daee5f4cafd419cfkeunyoung} 211e18e25d2a79e94a4cea83a94daee5f4cafd419cfkeunyoung 212e18e25d2a79e94a4cea83a94daee5f4cafd419cfkeunyoungTEST_F(VehicleNetworkTest, setSubscribe) { 213e18e25d2a79e94a4cea83a94daee5f4cafd419cfkeunyoung sp<VehicleNetwork> vn = getDefaultVN(); 214e18e25d2a79e94a4cea83a94daee5f4cafd419cfkeunyoung sp<VehiclePropertiesHolder> properties = vn->listProperties(); 215e18e25d2a79e94a4cea83a94daee5f4cafd419cfkeunyoung ASSERT_TRUE(properties.get() != NULL); 216d32f4e69d861d0adc2ae8f18345143f253d6fceckeunyoung int32_t numConfigs = properties->getList().size(); 217e18e25d2a79e94a4cea83a94daee5f4cafd419cfkeunyoung ASSERT_TRUE(numConfigs > 0); 218d32f4e69d861d0adc2ae8f18345143f253d6fceckeunyoung for (auto& config : properties->getList()) { 219e18e25d2a79e94a4cea83a94daee5f4cafd419cfkeunyoung String8 msg = String8::format("subscribing property 0x%x\n", config->prop); 220e18e25d2a79e94a4cea83a94daee5f4cafd419cfkeunyoung std::cout<<msg.string(); 221e18e25d2a79e94a4cea83a94daee5f4cafd419cfkeunyoung status_t r = vn->subscribe(config->prop, config->max_sample_rate); 222e18e25d2a79e94a4cea83a94daee5f4cafd419cfkeunyoung if (((config->access & VEHICLE_PROP_ACCESS_READ) == 0) || 223e18e25d2a79e94a4cea83a94daee5f4cafd419cfkeunyoung (config->change_mode == VEHICLE_PROP_CHANGE_MODE_STATIC)) { // cannot subsctibe 224e18e25d2a79e94a4cea83a94daee5f4cafd419cfkeunyoung ASSERT_TRUE(r != NO_ERROR); 225e18e25d2a79e94a4cea83a94daee5f4cafd419cfkeunyoung } else { 226d32f4e69d861d0adc2ae8f18345143f253d6fceckeunyoung if ((config->prop >= (int32_t)VEHICLE_PROPERTY_INTERNAL_START) && 227d32f4e69d861d0adc2ae8f18345143f253d6fceckeunyoung (config->prop <= (int32_t)VEHICLE_PROPERTY_INTERNAL_END)) { 228d32f4e69d861d0adc2ae8f18345143f253d6fceckeunyoung // internal property requires write for event notification. 229d32f4e69d861d0adc2ae8f18345143f253d6fceckeunyoung ScopedVehiclePropValue value; 230d32f4e69d861d0adc2ae8f18345143f253d6fceckeunyoung value.value.prop = config->prop; 231d32f4e69d861d0adc2ae8f18345143f253d6fceckeunyoung value.value.value_type = config->value_type; 232d32f4e69d861d0adc2ae8f18345143f253d6fceckeunyoung status_t r = vn->setProperty(value.value); 233d32f4e69d861d0adc2ae8f18345143f253d6fceckeunyoung ASSERT_EQ(NO_ERROR, r); 234d32f4e69d861d0adc2ae8f18345143f253d6fceckeunyoung } 235e18e25d2a79e94a4cea83a94daee5f4cafd419cfkeunyoung ASSERT_EQ(NO_ERROR, r); 236e18e25d2a79e94a4cea83a94daee5f4cafd419cfkeunyoung ASSERT_TRUE(getTestListener().waitForEvent(config->prop, 2000000000)); 237e18e25d2a79e94a4cea83a94daee5f4cafd419cfkeunyoung } 238e18e25d2a79e94a4cea83a94daee5f4cafd419cfkeunyoung } 239d32f4e69d861d0adc2ae8f18345143f253d6fceckeunyoung for (auto& config : properties->getList()) { 240e18e25d2a79e94a4cea83a94daee5f4cafd419cfkeunyoung vn->unsubscribe(config->prop); 241e18e25d2a79e94a4cea83a94daee5f4cafd419cfkeunyoung } 242e18e25d2a79e94a4cea83a94daee5f4cafd419cfkeunyoung usleep(1000000); 243e18e25d2a79e94a4cea83a94daee5f4cafd419cfkeunyoung //TODO improve this as this will wait for too long 244d32f4e69d861d0adc2ae8f18345143f253d6fceckeunyoung for (auto& config : properties->getList()) { 245e18e25d2a79e94a4cea83a94daee5f4cafd419cfkeunyoung ASSERT_TRUE(!getTestListener().waitForEvent(config->prop, 1000000000)); 246e18e25d2a79e94a4cea83a94daee5f4cafd419cfkeunyoung } 247e18e25d2a79e94a4cea83a94daee5f4cafd419cfkeunyoung} 248e18e25d2a79e94a4cea83a94daee5f4cafd419cfkeunyoung 249e18e25d2a79e94a4cea83a94daee5f4cafd419cfkeunyoung}; // namespace android 250