• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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 <VehicleNetwork.h>
27 
28 #include "VehicleNetworkTestListener.h"
29 
30 namespace android {
31 
32 // Be careful with name conflict with other tests!. It can lead into wrong virtual function table
33 // , leading into mysterious crash. Always add test name in front for any class name.
34 class VehicleNetworkTest : public testing::Test {
35 public:
VehicleNetworkTest()36     VehicleNetworkTest() :
37         mVN(NULL),
38         mListener(new VehicleNetworkTestListener()) {
39         String8 msg;
40         msg.appendFormat("Creating VehicleNetworkTest 0x%p %p %p\n", this, mVN.get(),
41                 mListener.get());
42         std::cout<<msg.string();
43     }
44 
~VehicleNetworkTest()45     virtual ~VehicleNetworkTest() { }
46 
getDefaultVN()47     sp<VehicleNetwork> getDefaultVN() {
48         return mVN;
49     }
50 
getTestListener()51     VehicleNetworkTestListener& getTestListener() {
52         return *mListener.get();
53     }
54 
55 protected:
SetUp()56     void SetUp() {
57         String8 msg;
58         msg.appendFormat("setUp starts %p %p %p\n", this, mVN.get(),
59                 mListener.get());
60         std::cout<<msg.string();
61         ASSERT_TRUE(mListener.get() != NULL);
62         sp<VehicleNetworkListener> listener(mListener.get());
63         mVN = VehicleNetwork::createVehicleNetwork(listener);
64         ASSERT_TRUE(mVN.get() != NULL);
65         std::cout<<"setUp ends\n";
66     }
67 
68 protected:
69     sp<VehicleNetwork> mVN;
70     sp<VehicleNetworkTestListener> mListener;
71 };
72 
73 
TEST_F(VehicleNetworkTest,listProperties)74 TEST_F(VehicleNetworkTest, listProperties) {
75     sp<VehicleNetwork> vn = getDefaultVN();
76     sp<VehiclePropertiesHolder> properties = vn->listProperties();
77     ASSERT_TRUE(properties.get() != NULL);
78     int32_t numConfigs = properties->getList().size();
79     ASSERT_TRUE(numConfigs > 0);
80     for (auto& config : properties->getList()) {
81         String8 msg = String8::format("prop 0x%x\n", config->prop);
82         std::cout<<msg.string();
83     }
84     sp<VehiclePropertiesHolder> propertiesIvalid  = vn->listProperties(-1); // no such property
85     ASSERT_TRUE(propertiesIvalid.get() == NULL);
86     for (auto& config : properties->getList()) {
87         String8 msg = String8::format("query single prop 0x%x\n", config->prop);
88         std::cout<<msg.string();
89         sp<VehiclePropertiesHolder> singleProperty = vn->listProperties(config->prop);
90         ASSERT_EQ((size_t) 1, singleProperty->getList().size());
91         vehicle_prop_config_t const * newConfig = *singleProperty->getList().begin();
92         ASSERT_EQ(config->prop, newConfig->prop);
93         ASSERT_EQ(config->access, newConfig->access);
94         ASSERT_EQ(config->change_mode, newConfig->change_mode);
95         //TODO add more check
96     }
97 }
98 
TEST_F(VehicleNetworkTest,getProperty)99 TEST_F(VehicleNetworkTest, getProperty) {
100     sp<VehicleNetwork> vn = getDefaultVN();
101     sp<VehiclePropertiesHolder> properties = vn->listProperties();
102     ASSERT_TRUE(properties.get() != NULL);
103     int32_t numConfigs = properties->getList().size();
104     ASSERT_TRUE(numConfigs > 0);
105     for (auto& config : properties->getList()) {
106         if (config->prop == VEHICLE_PROPERTY_RADIO_PRESET) {
107             continue;
108         }
109         String8 msg = String8::format("getting prop 0x%x\n", config->prop);
110         std::cout<<msg.string();
111         ScopedVehiclePropValue value;
112         value.value.prop = config->prop;
113         value.value.value_type = config->value_type;
114         status_t r = vn->getProperty(&value.value);
115         if ((config->access & VEHICLE_PROP_ACCESS_READ) == 0) { // cannot read
116             ASSERT_TRUE(r != NO_ERROR);
117         } else {
118             ASSERT_EQ(NO_ERROR, r);
119             ASSERT_EQ(config->value_type, value.value.value_type);
120         }
121     }
122 }
123 
124 //TODO change this test to to safe write
TEST_F(VehicleNetworkTest,setProperty)125 TEST_F(VehicleNetworkTest, setProperty) {
126     sp<VehicleNetwork> vn = getDefaultVN();
127     sp<VehiclePropertiesHolder> properties = vn->listProperties();
128     ASSERT_TRUE(properties.get() != NULL);
129     int32_t numConfigs = properties->getList().size();
130     ASSERT_TRUE(numConfigs > 0);
131     for (auto& config : properties->getList()) {
132         if (config->prop == VEHICLE_PROPERTY_RADIO_PRESET) {
133             continue;
134         }
135         String8 msg = String8::format("setting prop 0x%x\n", config->prop);
136         std::cout<<msg.string();
137         ScopedVehiclePropValue value;
138         value.value.prop = config->prop;
139         value.value.value_type = config->value_type;
140         status_t r = vn->setProperty(value.value);
141         if ((config->access & VEHICLE_PROP_ACCESS_WRITE) == 0) { // cannot write
142             ASSERT_TRUE(r != NO_ERROR);
143         } else {
144             ASSERT_EQ(NO_ERROR, r);
145         }
146     }
147 }
148 
TEST_F(VehicleNetworkTest,setSubscribe)149 TEST_F(VehicleNetworkTest, setSubscribe) {
150     sp<VehicleNetwork> vn = getDefaultVN();
151     sp<VehiclePropertiesHolder> properties = vn->listProperties();
152     ASSERT_TRUE(properties.get() != NULL);
153     int32_t numConfigs = properties->getList().size();
154     ASSERT_TRUE(numConfigs > 0);
155     for (auto& config : properties->getList()) {
156         String8 msg = String8::format("subscribing property 0x%x\n", config->prop);
157         std::cout<<msg.string();
158         status_t r = vn->subscribe(config->prop, config->max_sample_rate);
159         if (((config->access & VEHICLE_PROP_ACCESS_READ) == 0) ||
160                 (config->change_mode == VEHICLE_PROP_CHANGE_MODE_STATIC)) { // cannot subsctibe
161             ASSERT_TRUE(r != NO_ERROR);
162         } else {
163             if ((config->prop >= (int32_t)VEHICLE_PROPERTY_INTERNAL_START) &&
164                     (config->prop <= (int32_t)VEHICLE_PROPERTY_INTERNAL_END)) {
165                 // internal property requires write for event notification.
166                 ScopedVehiclePropValue value;
167                 value.value.prop = config->prop;
168                 value.value.value_type = config->value_type;
169                 status_t r = vn->setProperty(value.value);
170                 ASSERT_EQ(NO_ERROR, r);
171             }
172             ASSERT_EQ(NO_ERROR, r);
173             ASSERT_TRUE(getTestListener().waitForEvent(config->prop, 0, 2000000000));
174         }
175     }
176     for (auto& config : properties->getList()) {
177         vn->unsubscribe(config->prop);
178     }
179     usleep(1000000);
180     //TODO improve this as this will wait for too long
181     for (auto& config : properties->getList()) {
182         int initialCount = getTestListener().getEventCount(config->prop);
183         ASSERT_TRUE(!getTestListener().waitForEvent(config->prop, initialCount, 1000000000));
184     }
185 }
186 
187 }; // namespace android
188