• 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 #ifndef ANDROID_IVEHICLENETWORK_TEST_LISTER_H
18 #define ANDROID_IVEHICLENETWORK_TEST_LISTER_H
19 
20 #include <IVehicleNetworkListener.h>
21 
22 namespace android {
23 
24 class IVehicleNetworkTestListener : public BnVehicleNetworkListener {
25 public:
IVehicleNetworkTestListener()26     IVehicleNetworkTestListener() :
27         mHalRestartCount(0) {};
28 
onEvents(sp<VehiclePropValueListHolder> & events)29     virtual void onEvents(sp<VehiclePropValueListHolder>& events) {
30         String8 msg("events ");
31         Mutex::Autolock autolock(mLock);
32         for (auto& e : events->getList()) {
33             ssize_t index = mEventCounts.indexOfKey(e->prop);
34             if (index < 0) {
35                 mEventCounts.add(e->prop, 1); // 1st event
36                 msg.appendFormat("0x%x:%d ", e->prop, 1);
37             } else {
38                 int count = mEventCounts.valueAt(index);
39                 count++;
40                 mEventCounts.replaceValueAt(index, count);
41                 msg.appendFormat("0x%x:%d ", e->prop, count);
42             }
43         }
44         msg.append("\n");
45         std::cout<<msg.string();
46         mCondition.signal();
47     }
48 
onHalError(int32_t errorCode,int32_t property,int32_t operation)49     virtual void onHalError(int32_t errorCode, int32_t property, int32_t operation) {
50         Mutex::Autolock autolock(mHalErrorLock);
51         mErrorCode = errorCode;
52         mProperty = property;
53         mOperation = operation;
54         mHalErrorCondition.signal();
55     }
56 
onHalRestart(bool)57     virtual void onHalRestart(bool /*inMocking*/) {
58         Mutex::Autolock autolock(mHalRestartLock);
59         mHalRestartCount++;
60         mHalRestartCondition.signal();
61     }
62 
waitForEvents(nsecs_t reltime)63     void waitForEvents(nsecs_t reltime) {
64         Mutex::Autolock autolock(mLock);
65         mCondition.waitRelative(mLock, reltime);
66     }
67 
waitForEvent(int32_t property,nsecs_t reltime)68     bool waitForEvent(int32_t property, nsecs_t reltime) {
69         Mutex::Autolock autolock(mLock);
70         int startCount = getEventCountLocked(property);
71         int currentCount = startCount;
72         int64_t now = android::elapsedRealtimeNano();
73         int64_t endTime = now + reltime;
74         while ((startCount == currentCount) && (now < endTime)) {
75             mCondition.waitRelative(mLock, endTime - now);
76             currentCount = getEventCountLocked(property);
77             now = android::elapsedRealtimeNano();
78         }
79         return (startCount != currentCount);
80     }
81 
getEventCount(int32_t property)82     int getEventCount(int32_t property) {
83         Mutex::Autolock autolock(mLock);
84         return getEventCountLocked(property);
85     }
86 
getHalRestartCount()87     int getHalRestartCount() {
88         Mutex::Autolock autolock(mHalRestartLock);
89         return mHalRestartCount;
90     }
91 
waitForHalRestart(nsecs_t reltime)92     void waitForHalRestart(nsecs_t reltime) {
93         Mutex::Autolock autolock(mHalRestartLock);
94         mHalRestartCondition.waitRelative(mHalRestartLock, reltime);
95     }
96 
waitForHalError(nsecs_t reltime)97     void waitForHalError(nsecs_t reltime) {
98         Mutex::Autolock autolock(mHalErrorLock);
99         mHalErrorCondition.waitRelative(mHalErrorLock, reltime);
100     }
101 
isErrorMatching(int32_t errorCode,int32_t property,int32_t operation)102     bool isErrorMatching(int32_t errorCode, int32_t property, int32_t operation) {
103         Mutex::Autolock autolock(mHalErrorLock);
104         return mErrorCode == errorCode && mProperty == property && mOperation == operation;
105     }
106 
107 private:
getEventCountLocked(int32_t property)108     int getEventCountLocked(int32_t property) {
109         ssize_t index = mEventCounts.indexOfKey(property);
110         if (index < 0) {
111             return 0;
112         } else {
113             return mEventCounts.valueAt(index);
114         }
115     }
116 
117 
118 private:
119     Mutex mLock;
120     Condition mCondition;
121     KeyedVector<int32_t, int> mEventCounts;
122 
123     Mutex mHalRestartLock;
124     Condition mHalRestartCondition;
125     int mHalRestartCount;
126 
127     Mutex mHalErrorLock;
128     Condition mHalErrorCondition;
129     int32_t mErrorCode;
130     int32_t mProperty;
131     int32_t mOperation;
132 };
133 
134 }; // namespace android
135 #endif // ANDROID_IVEHICLENETWORK_TEST_LISTER_H
136