11ab8e18e01d8063821bee0bf641a365224c7e1eekeunyoung/* 21ab8e18e01d8063821bee0bf641a365224c7e1eekeunyoung * Copyright (C) 2015 The Android Open Source Project 31ab8e18e01d8063821bee0bf641a365224c7e1eekeunyoung * 41ab8e18e01d8063821bee0bf641a365224c7e1eekeunyoung * Licensed under the Apache License, Version 2.0 (the "License"); 51ab8e18e01d8063821bee0bf641a365224c7e1eekeunyoung * you may not use this file except in compliance with the License. 61ab8e18e01d8063821bee0bf641a365224c7e1eekeunyoung * You may obtain a copy of the License at 71ab8e18e01d8063821bee0bf641a365224c7e1eekeunyoung * 81ab8e18e01d8063821bee0bf641a365224c7e1eekeunyoung * http://www.apache.org/licenses/LICENSE-2.0 91ab8e18e01d8063821bee0bf641a365224c7e1eekeunyoung * 101ab8e18e01d8063821bee0bf641a365224c7e1eekeunyoung * Unless required by applicable law or agreed to in writing, software 111ab8e18e01d8063821bee0bf641a365224c7e1eekeunyoung * distributed under the License is distributed on an "AS IS" BASIS, 121ab8e18e01d8063821bee0bf641a365224c7e1eekeunyoung * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 131ab8e18e01d8063821bee0bf641a365224c7e1eekeunyoung * See the License for the specific language governing permissions and 141ab8e18e01d8063821bee0bf641a365224c7e1eekeunyoung * limitations under the License. 151ab8e18e01d8063821bee0bf641a365224c7e1eekeunyoung */ 161ab8e18e01d8063821bee0bf641a365224c7e1eekeunyoungpackage com.android.car; 171ab8e18e01d8063821bee0bf641a365224c7e1eekeunyoung 18e54ac276796c6535558f8444d882adecd19ce2bdKeun-young Parkimport android.car.test.CarTestManager; 19e54ac276796c6535558f8444d882adecd19ce2bdKeun-young Parkimport android.car.test.ICarTest; 201ab8e18e01d8063821bee0bf641a365224c7e1eekeunyoungimport android.content.Context; 211ab8e18e01d8063821bee0bf641a365224c7e1eekeunyoungimport android.util.Log; 221ab8e18e01d8063821bee0bf641a365224c7e1eekeunyoung 231ab8e18e01d8063821bee0bf641a365224c7e1eekeunyoungimport com.android.car.hal.VehicleHal; 241ab8e18e01d8063821bee0bf641a365224c7e1eekeunyoungimport com.android.car.vehiclenetwork.IVehicleNetworkHalMock; 251ab8e18e01d8063821bee0bf641a365224c7e1eekeunyoungimport com.android.car.vehiclenetwork.VehicleNetwork; 26a28d7b201584823286f26e21a9f30d07c416eb3eKeun-young Parkimport com.android.car.vehiclenetwork.VehicleNetworkProto.VehiclePropConfigs; 271ab8e18e01d8063821bee0bf641a365224c7e1eekeunyoungimport com.android.car.vehiclenetwork.VehiclePropValueParcelable; 281ab8e18e01d8063821bee0bf641a365224c7e1eekeunyoung 291ab8e18e01d8063821bee0bf641a365224c7e1eekeunyoungimport java.io.PrintWriter; 301ab8e18e01d8063821bee0bf641a365224c7e1eekeunyoung 311ab8e18e01d8063821bee0bf641a365224c7e1eekeunyoung/** 321ab8e18e01d8063821bee0bf641a365224c7e1eekeunyoung * Service to allow testing / mocking vehicle HAL. 331ab8e18e01d8063821bee0bf641a365224c7e1eekeunyoung * This service uses Vehicle HAL APIs directly (one exception) as vehicle HAL mocking anyway 341ab8e18e01d8063821bee0bf641a365224c7e1eekeunyoung * requires accessing that level directly. 351ab8e18e01d8063821bee0bf641a365224c7e1eekeunyoung */ 361ab8e18e01d8063821bee0bf641a365224c7e1eekeunyoungpublic class CarTestService extends ICarTest.Stub implements CarServiceBase { 371ab8e18e01d8063821bee0bf641a365224c7e1eekeunyoung 381ab8e18e01d8063821bee0bf641a365224c7e1eekeunyoung private final Context mContext; 391ab8e18e01d8063821bee0bf641a365224c7e1eekeunyoung private final VehicleNetwork mVehicleNetwork; 401ab8e18e01d8063821bee0bf641a365224c7e1eekeunyoung private final ICarImpl mICarImpl; 414b0212c1b3576f4174c292bbcdd72815584ff075keunyoung private boolean mInMocking = false; 424b0212c1b3576f4174c292bbcdd72815584ff075keunyoung private int mMockingFlags = 0; 4343cfff21932b23f0e382aa78ffc1bb053928b1c5Keun-young Park private Exception mException = null; 441ab8e18e01d8063821bee0bf641a365224c7e1eekeunyoung 451ab8e18e01d8063821bee0bf641a365224c7e1eekeunyoung public CarTestService(Context context, ICarImpl carImpl) { 461ab8e18e01d8063821bee0bf641a365224c7e1eekeunyoung mContext = context; 471ab8e18e01d8063821bee0bf641a365224c7e1eekeunyoung mICarImpl = carImpl; 481ab8e18e01d8063821bee0bf641a365224c7e1eekeunyoung mVehicleNetwork = VehicleHal.getInstance().getVehicleNetwork(); 491ab8e18e01d8063821bee0bf641a365224c7e1eekeunyoung } 501ab8e18e01d8063821bee0bf641a365224c7e1eekeunyoung 511ab8e18e01d8063821bee0bf641a365224c7e1eekeunyoung @Override 521ab8e18e01d8063821bee0bf641a365224c7e1eekeunyoung public void init() { 534b0212c1b3576f4174c292bbcdd72815584ff075keunyoung // nothing to do. 544b0212c1b3576f4174c292bbcdd72815584ff075keunyoung // This service should not reset anything for init / release to maintain mocking. 551ab8e18e01d8063821bee0bf641a365224c7e1eekeunyoung } 561ab8e18e01d8063821bee0bf641a365224c7e1eekeunyoung 571ab8e18e01d8063821bee0bf641a365224c7e1eekeunyoung @Override 581ab8e18e01d8063821bee0bf641a365224c7e1eekeunyoung public void release() { 594b0212c1b3576f4174c292bbcdd72815584ff075keunyoung // nothing to do 604b0212c1b3576f4174c292bbcdd72815584ff075keunyoung // This service should not reset anything for init / release to maintain mocking. 611ab8e18e01d8063821bee0bf641a365224c7e1eekeunyoung } 621ab8e18e01d8063821bee0bf641a365224c7e1eekeunyoung 631ab8e18e01d8063821bee0bf641a365224c7e1eekeunyoung @Override 641ab8e18e01d8063821bee0bf641a365224c7e1eekeunyoung public void dump(PrintWriter writer) { 654b0212c1b3576f4174c292bbcdd72815584ff075keunyoung writer.println("*CarTestService*"); 664b0212c1b3576f4174c292bbcdd72815584ff075keunyoung writer.println(" mInMocking" + mInMocking); 671ab8e18e01d8063821bee0bf641a365224c7e1eekeunyoung } 681ab8e18e01d8063821bee0bf641a365224c7e1eekeunyoung 691ab8e18e01d8063821bee0bf641a365224c7e1eekeunyoung @Override 701ab8e18e01d8063821bee0bf641a365224c7e1eekeunyoung public void injectEvent(VehiclePropValueParcelable value) { 711ab8e18e01d8063821bee0bf641a365224c7e1eekeunyoung ICarImpl.assertVehicleHalMockPermission(mContext); 721ab8e18e01d8063821bee0bf641a365224c7e1eekeunyoung mVehicleNetwork.injectEvent(value.value); 731ab8e18e01d8063821bee0bf641a365224c7e1eekeunyoung } 741ab8e18e01d8063821bee0bf641a365224c7e1eekeunyoung 751ab8e18e01d8063821bee0bf641a365224c7e1eekeunyoung @Override 7643cfff21932b23f0e382aa78ffc1bb053928b1c5Keun-young Park public void startMocking(final IVehicleNetworkHalMock mock, final int flags) { 771ab8e18e01d8063821bee0bf641a365224c7e1eekeunyoung ICarImpl.assertVehicleHalMockPermission(mContext); 7843cfff21932b23f0e382aa78ffc1bb053928b1c5Keun-young Park CarServiceUtils.runOnMainSync(new Runnable() { 7943cfff21932b23f0e382aa78ffc1bb053928b1c5Keun-young Park @Override 8043cfff21932b23f0e382aa78ffc1bb053928b1c5Keun-young Park public void run() { 8143cfff21932b23f0e382aa78ffc1bb053928b1c5Keun-young Park try { 8243cfff21932b23f0e382aa78ffc1bb053928b1c5Keun-young Park mVehicleNetwork.startMocking(mock); 8343cfff21932b23f0e382aa78ffc1bb053928b1c5Keun-young Park VehicleHal.getInstance().startMocking(); 8443cfff21932b23f0e382aa78ffc1bb053928b1c5Keun-young Park mICarImpl.startMocking(); 8543cfff21932b23f0e382aa78ffc1bb053928b1c5Keun-young Park synchronized (this) { 8643cfff21932b23f0e382aa78ffc1bb053928b1c5Keun-young Park mInMocking = true; 8743cfff21932b23f0e382aa78ffc1bb053928b1c5Keun-young Park mMockingFlags = flags; 8843cfff21932b23f0e382aa78ffc1bb053928b1c5Keun-young Park mException = null; 8943cfff21932b23f0e382aa78ffc1bb053928b1c5Keun-young Park } 9043cfff21932b23f0e382aa78ffc1bb053928b1c5Keun-young Park } catch (Exception e) { 9143cfff21932b23f0e382aa78ffc1bb053928b1c5Keun-young Park Log.w(CarLog.TAG_TEST, "startMocking failed", e); 9243cfff21932b23f0e382aa78ffc1bb053928b1c5Keun-young Park synchronized (this) { 9343cfff21932b23f0e382aa78ffc1bb053928b1c5Keun-young Park mException = e; 9443cfff21932b23f0e382aa78ffc1bb053928b1c5Keun-young Park } 9543cfff21932b23f0e382aa78ffc1bb053928b1c5Keun-young Park } 9643cfff21932b23f0e382aa78ffc1bb053928b1c5Keun-young Park Log.i(CarLog.TAG_TEST, "start vehicle HAL mocking, flags:0x" + 9743cfff21932b23f0e382aa78ffc1bb053928b1c5Keun-young Park Integer.toHexString(flags)); 9843cfff21932b23f0e382aa78ffc1bb053928b1c5Keun-young Park } 9943cfff21932b23f0e382aa78ffc1bb053928b1c5Keun-young Park }); 10043cfff21932b23f0e382aa78ffc1bb053928b1c5Keun-young Park synchronized (this) { 10143cfff21932b23f0e382aa78ffc1bb053928b1c5Keun-young Park if (mException != null) { 10243cfff21932b23f0e382aa78ffc1bb053928b1c5Keun-young Park throw new IllegalStateException(mException); 1034b0212c1b3576f4174c292bbcdd72815584ff075keunyoung } 1045c7cb266f8900450c2ab41802b079b02f14d707fkeunyoung } 1051ab8e18e01d8063821bee0bf641a365224c7e1eekeunyoung } 1061ab8e18e01d8063821bee0bf641a365224c7e1eekeunyoung 1071ab8e18e01d8063821bee0bf641a365224c7e1eekeunyoung @Override 10843cfff21932b23f0e382aa78ffc1bb053928b1c5Keun-young Park public void stopMocking(final IVehicleNetworkHalMock mock) { 1091ab8e18e01d8063821bee0bf641a365224c7e1eekeunyoung ICarImpl.assertVehicleHalMockPermission(mContext); 11043cfff21932b23f0e382aa78ffc1bb053928b1c5Keun-young Park CarServiceUtils.runOnMainSync(new Runnable() { 11143cfff21932b23f0e382aa78ffc1bb053928b1c5Keun-young Park @Override 11243cfff21932b23f0e382aa78ffc1bb053928b1c5Keun-young Park public void run() { 11343cfff21932b23f0e382aa78ffc1bb053928b1c5Keun-young Park try { 11443cfff21932b23f0e382aa78ffc1bb053928b1c5Keun-young Park mVehicleNetwork.stopMocking(mock); 11543cfff21932b23f0e382aa78ffc1bb053928b1c5Keun-young Park VehicleHal.getInstance().stopMocking(); 11643cfff21932b23f0e382aa78ffc1bb053928b1c5Keun-young Park mICarImpl.stopMocking(); 11743cfff21932b23f0e382aa78ffc1bb053928b1c5Keun-young Park synchronized (this) { 11843cfff21932b23f0e382aa78ffc1bb053928b1c5Keun-young Park mInMocking = false; 11943cfff21932b23f0e382aa78ffc1bb053928b1c5Keun-young Park mMockingFlags = 0; 12043cfff21932b23f0e382aa78ffc1bb053928b1c5Keun-young Park mException = null; 12143cfff21932b23f0e382aa78ffc1bb053928b1c5Keun-young Park } 12243cfff21932b23f0e382aa78ffc1bb053928b1c5Keun-young Park Log.i(CarLog.TAG_TEST, "stop vehicle HAL mocking"); 12343cfff21932b23f0e382aa78ffc1bb053928b1c5Keun-young Park } catch (Exception e) { 12443cfff21932b23f0e382aa78ffc1bb053928b1c5Keun-young Park Log.w(CarLog.TAG_TEST, "stopMocking failed", e); 12543cfff21932b23f0e382aa78ffc1bb053928b1c5Keun-young Park } 12643cfff21932b23f0e382aa78ffc1bb053928b1c5Keun-young Park } 12743cfff21932b23f0e382aa78ffc1bb053928b1c5Keun-young Park }); 1281ab8e18e01d8063821bee0bf641a365224c7e1eekeunyoung } 1294b0212c1b3576f4174c292bbcdd72815584ff075keunyoung 130a28d7b201584823286f26e21a9f30d07c416eb3eKeun-young Park @Override 131a28d7b201584823286f26e21a9f30d07c416eb3eKeun-young Park public boolean isPropertySupported(int property) { 132a28d7b201584823286f26e21a9f30d07c416eb3eKeun-young Park VehiclePropConfigs configs = VehicleHal.getInstance().getVehicleNetwork().listProperties( 133a28d7b201584823286f26e21a9f30d07c416eb3eKeun-young Park property); 134a28d7b201584823286f26e21a9f30d07c416eb3eKeun-young Park return configs != null; 135a28d7b201584823286f26e21a9f30d07c416eb3eKeun-young Park } 136a28d7b201584823286f26e21a9f30d07c416eb3eKeun-young Park 1374b0212c1b3576f4174c292bbcdd72815584ff075keunyoung public synchronized boolean isInMocking() { 1384b0212c1b3576f4174c292bbcdd72815584ff075keunyoung return mInMocking; 1394b0212c1b3576f4174c292bbcdd72815584ff075keunyoung } 1404b0212c1b3576f4174c292bbcdd72815584ff075keunyoung 1414b0212c1b3576f4174c292bbcdd72815584ff075keunyoung public synchronized boolean shouldDoRealShutdownInMocking() { 1424b0212c1b3576f4174c292bbcdd72815584ff075keunyoung return (mMockingFlags & CarTestManager.FLAG_MOCKING_REAL_SHUTDOWN) != 0; 1434b0212c1b3576f4174c292bbcdd72815584ff075keunyoung } 1441ab8e18e01d8063821bee0bf641a365224c7e1eekeunyoung} 145