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