1aaeffaff85979583b1826db759b5cdb6184559d5Keun-young Park/*
2aaeffaff85979583b1826db759b5cdb6184559d5Keun-young Park * Copyright (C) 2015 The Android Open Source Project
3aaeffaff85979583b1826db759b5cdb6184559d5Keun-young Park *
4aaeffaff85979583b1826db759b5cdb6184559d5Keun-young Park * Licensed under the Apache License, Version 2.0 (the "License");
5aaeffaff85979583b1826db759b5cdb6184559d5Keun-young Park * you may not use this file except in compliance with the License.
6aaeffaff85979583b1826db759b5cdb6184559d5Keun-young Park * You may obtain a copy of the License at
7aaeffaff85979583b1826db759b5cdb6184559d5Keun-young Park *
8aaeffaff85979583b1826db759b5cdb6184559d5Keun-young Park *      http://www.apache.org/licenses/LICENSE-2.0
9aaeffaff85979583b1826db759b5cdb6184559d5Keun-young Park *
10aaeffaff85979583b1826db759b5cdb6184559d5Keun-young Park * Unless required by applicable law or agreed to in writing, software
11aaeffaff85979583b1826db759b5cdb6184559d5Keun-young Park * distributed under the License is distributed on an "AS IS" BASIS,
12aaeffaff85979583b1826db759b5cdb6184559d5Keun-young Park * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13aaeffaff85979583b1826db759b5cdb6184559d5Keun-young Park * See the License for the specific language governing permissions and
14aaeffaff85979583b1826db759b5cdb6184559d5Keun-young Park * limitations under the License.
15aaeffaff85979583b1826db759b5cdb6184559d5Keun-young Park */
16aaeffaff85979583b1826db759b5cdb6184559d5Keun-young Park
17aaeffaff85979583b1826db759b5cdb6184559d5Keun-young Park#ifndef ANDROID_VEHICLENETWORK_TEST_LISTER_H
18aaeffaff85979583b1826db759b5cdb6184559d5Keun-young Park#define ANDROID_VEHICLENETWORK_TEST_LISTER_H
19aaeffaff85979583b1826db759b5cdb6184559d5Keun-young Park
20aaeffaff85979583b1826db759b5cdb6184559d5Keun-young Park#include <IVehicleNetworkListener.h>
21aaeffaff85979583b1826db759b5cdb6184559d5Keun-young Park#include <VehicleNetworkDataTypes.h>
22aaeffaff85979583b1826db759b5cdb6184559d5Keun-young Park
23aaeffaff85979583b1826db759b5cdb6184559d5Keun-young Parknamespace android {
24aaeffaff85979583b1826db759b5cdb6184559d5Keun-young Park
25aaeffaff85979583b1826db759b5cdb6184559d5Keun-young Parkclass VehicleNetworkTestListener : public VehicleNetworkListener {
26aaeffaff85979583b1826db759b5cdb6184559d5Keun-young Parkpublic:
27aaeffaff85979583b1826db759b5cdb6184559d5Keun-young Park    VehicleNetworkTestListener()
28aaeffaff85979583b1826db759b5cdb6184559d5Keun-young Park    : mEvents(new VehiclePropValueListHolder(new List<vehicle_prop_value_t* >())) {
29aaeffaff85979583b1826db759b5cdb6184559d5Keun-young Park        String8 msg;
30aaeffaff85979583b1826db759b5cdb6184559d5Keun-young Park        msg.appendFormat("Creating VehicleNetworkTestListener 0x%p\n", this);
31aaeffaff85979583b1826db759b5cdb6184559d5Keun-young Park        std::cout<<msg.string();
32aaeffaff85979583b1826db759b5cdb6184559d5Keun-young Park    }
33aaeffaff85979583b1826db759b5cdb6184559d5Keun-young Park
34aaeffaff85979583b1826db759b5cdb6184559d5Keun-young Park    virtual ~VehicleNetworkTestListener() {
35aaeffaff85979583b1826db759b5cdb6184559d5Keun-young Park        std::cout<<"destroying VehicleNetworkTestListener\n";
36aaeffaff85979583b1826db759b5cdb6184559d5Keun-young Park        for (auto& e : mEvents->getList()) {
37aaeffaff85979583b1826db759b5cdb6184559d5Keun-young Park            VehiclePropValueUtil::deleteMembers(e);
38aaeffaff85979583b1826db759b5cdb6184559d5Keun-young Park            delete e;
39aaeffaff85979583b1826db759b5cdb6184559d5Keun-young Park        }
40aaeffaff85979583b1826db759b5cdb6184559d5Keun-young Park    }
41aaeffaff85979583b1826db759b5cdb6184559d5Keun-young Park
42aaeffaff85979583b1826db759b5cdb6184559d5Keun-young Park    virtual void onEvents(sp<VehiclePropValueListHolder>& events) {
43aaeffaff85979583b1826db759b5cdb6184559d5Keun-young Park        String8 msg("events ");
44aaeffaff85979583b1826db759b5cdb6184559d5Keun-young Park        Mutex::Autolock autolock(mLock);
45aaeffaff85979583b1826db759b5cdb6184559d5Keun-young Park        for (auto& e : events->getList()) {
46aaeffaff85979583b1826db759b5cdb6184559d5Keun-young Park            ssize_t index = mEventCounts.indexOfKey(e->prop);
47aaeffaff85979583b1826db759b5cdb6184559d5Keun-young Park            if (index < 0) {
48aaeffaff85979583b1826db759b5cdb6184559d5Keun-young Park                mEventCounts.add(e->prop, 1); // 1st event
49aaeffaff85979583b1826db759b5cdb6184559d5Keun-young Park                msg.appendFormat("0x%x:%d ", e->prop, 1);
50aaeffaff85979583b1826db759b5cdb6184559d5Keun-young Park            } else {
51aaeffaff85979583b1826db759b5cdb6184559d5Keun-young Park                int count = mEventCounts.valueAt(index);
52aaeffaff85979583b1826db759b5cdb6184559d5Keun-young Park                count++;
53aaeffaff85979583b1826db759b5cdb6184559d5Keun-young Park                mEventCounts.replaceValueAt(index, count);
54aaeffaff85979583b1826db759b5cdb6184559d5Keun-young Park                msg.appendFormat("0x%x:%d ", e->prop, count);
55aaeffaff85979583b1826db759b5cdb6184559d5Keun-young Park            }
56aaeffaff85979583b1826db759b5cdb6184559d5Keun-young Park            vehicle_prop_value_t* copy = VehiclePropValueUtil::allocVehicleProp(*e);
57aaeffaff85979583b1826db759b5cdb6184559d5Keun-young Park            mEvents->getList().push_back(copy);
58aaeffaff85979583b1826db759b5cdb6184559d5Keun-young Park        }
59aaeffaff85979583b1826db759b5cdb6184559d5Keun-young Park        msg.append("\n");
60aaeffaff85979583b1826db759b5cdb6184559d5Keun-young Park        std::cout<<msg.string();
61aaeffaff85979583b1826db759b5cdb6184559d5Keun-young Park        mCondition.signal();
62aaeffaff85979583b1826db759b5cdb6184559d5Keun-young Park    }
63aaeffaff85979583b1826db759b5cdb6184559d5Keun-young Park
64558e9b1c1ed5a21445b4a937f67843e2bf89f0a5Keun-young Park    virtual void onHalError(int32_t /*errorCode*/, int32_t /*property*/, int32_t /*operation*/) {
65aaeffaff85979583b1826db759b5cdb6184559d5Keun-young Park        //TODO
66aaeffaff85979583b1826db759b5cdb6184559d5Keun-young Park    }
67aaeffaff85979583b1826db759b5cdb6184559d5Keun-young Park
68558e9b1c1ed5a21445b4a937f67843e2bf89f0a5Keun-young Park    virtual void onHalRestart(bool /*inMocking*/) {
69aaeffaff85979583b1826db759b5cdb6184559d5Keun-young Park        //TODO cannot test this in native world without plumbing mocking
70aaeffaff85979583b1826db759b5cdb6184559d5Keun-young Park    }
71aaeffaff85979583b1826db759b5cdb6184559d5Keun-young Park
72aaeffaff85979583b1826db759b5cdb6184559d5Keun-young Park    void waitForEvents(nsecs_t reltime) {
73aaeffaff85979583b1826db759b5cdb6184559d5Keun-young Park        Mutex::Autolock autolock(mLock);
74aaeffaff85979583b1826db759b5cdb6184559d5Keun-young Park        mCondition.waitRelative(mLock, reltime);
75aaeffaff85979583b1826db759b5cdb6184559d5Keun-young Park    }
76aaeffaff85979583b1826db759b5cdb6184559d5Keun-young Park
77aaeffaff85979583b1826db759b5cdb6184559d5Keun-young Park    bool waitForEvent(int32_t property, int initialEventCount, nsecs_t reltime) {
78aaeffaff85979583b1826db759b5cdb6184559d5Keun-young Park        Mutex::Autolock autolock(mLock);
79aaeffaff85979583b1826db759b5cdb6184559d5Keun-young Park        int currentCount = initialEventCount;
80aaeffaff85979583b1826db759b5cdb6184559d5Keun-young Park        int64_t now = android::elapsedRealtimeNano();
81aaeffaff85979583b1826db759b5cdb6184559d5Keun-young Park        int64_t endTime = now + reltime;
82aaeffaff85979583b1826db759b5cdb6184559d5Keun-young Park        while ((initialEventCount == currentCount) && (now < endTime)) {
83aaeffaff85979583b1826db759b5cdb6184559d5Keun-young Park            mCondition.waitRelative(mLock, endTime - now);
84aaeffaff85979583b1826db759b5cdb6184559d5Keun-young Park            currentCount = getEventCountLocked(property);
85aaeffaff85979583b1826db759b5cdb6184559d5Keun-young Park            now = android::elapsedRealtimeNano();
86aaeffaff85979583b1826db759b5cdb6184559d5Keun-young Park        }
87aaeffaff85979583b1826db759b5cdb6184559d5Keun-young Park        return (initialEventCount != currentCount);
88aaeffaff85979583b1826db759b5cdb6184559d5Keun-young Park    }
89aaeffaff85979583b1826db759b5cdb6184559d5Keun-young Park
90aaeffaff85979583b1826db759b5cdb6184559d5Keun-young Park    int getEventCount(int32_t property) {
91aaeffaff85979583b1826db759b5cdb6184559d5Keun-young Park        Mutex::Autolock autolock(mLock);
92aaeffaff85979583b1826db759b5cdb6184559d5Keun-young Park        return getEventCountLocked(property);
93aaeffaff85979583b1826db759b5cdb6184559d5Keun-young Park    }
94aaeffaff85979583b1826db759b5cdb6184559d5Keun-young Park
95aaeffaff85979583b1826db759b5cdb6184559d5Keun-young Park    sp<VehiclePropValueListHolder>& getEvents() {
96aaeffaff85979583b1826db759b5cdb6184559d5Keun-young Park        // this is nothing more than memory barrier. Just for testing.
97aaeffaff85979583b1826db759b5cdb6184559d5Keun-young Park        Mutex::Autolock autolock(mLock);
98aaeffaff85979583b1826db759b5cdb6184559d5Keun-young Park        return mEvents;
99aaeffaff85979583b1826db759b5cdb6184559d5Keun-young Park    }
100aaeffaff85979583b1826db759b5cdb6184559d5Keun-young Park
101aaeffaff85979583b1826db759b5cdb6184559d5Keun-young Park    const vehicle_prop_value& getLastValue() {
102aaeffaff85979583b1826db759b5cdb6184559d5Keun-young Park        auto itr = getEvents()->getList().end();
103aaeffaff85979583b1826db759b5cdb6184559d5Keun-young Park        itr--;
104aaeffaff85979583b1826db759b5cdb6184559d5Keun-young Park        return **itr;
105aaeffaff85979583b1826db759b5cdb6184559d5Keun-young Park    }
106aaeffaff85979583b1826db759b5cdb6184559d5Keun-young Park
107aaeffaff85979583b1826db759b5cdb6184559d5Keun-young Parkprivate:
108aaeffaff85979583b1826db759b5cdb6184559d5Keun-young Park    int getEventCountLocked(int32_t property) {
109aaeffaff85979583b1826db759b5cdb6184559d5Keun-young Park        ssize_t index = mEventCounts.indexOfKey(property);
110aaeffaff85979583b1826db759b5cdb6184559d5Keun-young Park        if (index < 0) {
111aaeffaff85979583b1826db759b5cdb6184559d5Keun-young Park            return 0;
112aaeffaff85979583b1826db759b5cdb6184559d5Keun-young Park        } else {
113aaeffaff85979583b1826db759b5cdb6184559d5Keun-young Park            return mEventCounts.valueAt(index);
114aaeffaff85979583b1826db759b5cdb6184559d5Keun-young Park        }
115aaeffaff85979583b1826db759b5cdb6184559d5Keun-young Park    }
116aaeffaff85979583b1826db759b5cdb6184559d5Keun-young Parkprivate:
117aaeffaff85979583b1826db759b5cdb6184559d5Keun-young Park    Mutex mLock;
118aaeffaff85979583b1826db759b5cdb6184559d5Keun-young Park    Condition mCondition;
119aaeffaff85979583b1826db759b5cdb6184559d5Keun-young Park    KeyedVector<int32_t, int> mEventCounts;
120aaeffaff85979583b1826db759b5cdb6184559d5Keun-young Park    sp<VehiclePropValueListHolder> mEvents;
121aaeffaff85979583b1826db759b5cdb6184559d5Keun-young Park};
122aaeffaff85979583b1826db759b5cdb6184559d5Keun-young Park
123aaeffaff85979583b1826db759b5cdb6184559d5Keun-young Park}; // namespace android
124aaeffaff85979583b1826db759b5cdb6184559d5Keun-young Park#endif // ANDROID_VEHICLENETWORK_TEST_LISTER_H
125