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