CarTestService.java revision e54ac276796c6535558f8444d882adecd19ce2bd
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;
261ab8e18e01d8063821bee0bf641a365224c7e1eekeunyoungimport com.android.car.vehiclenetwork.VehiclePropValueParcelable;
271ab8e18e01d8063821bee0bf641a365224c7e1eekeunyoung
281ab8e18e01d8063821bee0bf641a365224c7e1eekeunyoungimport java.io.PrintWriter;
291ab8e18e01d8063821bee0bf641a365224c7e1eekeunyoung
301ab8e18e01d8063821bee0bf641a365224c7e1eekeunyoung/**
311ab8e18e01d8063821bee0bf641a365224c7e1eekeunyoung * Service to allow testing / mocking vehicle HAL.
321ab8e18e01d8063821bee0bf641a365224c7e1eekeunyoung * This service uses Vehicle HAL APIs directly (one exception) as vehicle HAL mocking anyway
331ab8e18e01d8063821bee0bf641a365224c7e1eekeunyoung * requires accessing that level directly.
341ab8e18e01d8063821bee0bf641a365224c7e1eekeunyoung */
351ab8e18e01d8063821bee0bf641a365224c7e1eekeunyoungpublic class CarTestService extends ICarTest.Stub implements CarServiceBase {
361ab8e18e01d8063821bee0bf641a365224c7e1eekeunyoung
371ab8e18e01d8063821bee0bf641a365224c7e1eekeunyoung    private final Context mContext;
381ab8e18e01d8063821bee0bf641a365224c7e1eekeunyoung    private final VehicleNetwork mVehicleNetwork;
391ab8e18e01d8063821bee0bf641a365224c7e1eekeunyoung    private final ICarImpl mICarImpl;
404b0212c1b3576f4174c292bbcdd72815584ff075keunyoung    private boolean mInMocking = false;
414b0212c1b3576f4174c292bbcdd72815584ff075keunyoung    private int mMockingFlags = 0;
421ab8e18e01d8063821bee0bf641a365224c7e1eekeunyoung
431ab8e18e01d8063821bee0bf641a365224c7e1eekeunyoung    public CarTestService(Context context, ICarImpl carImpl) {
441ab8e18e01d8063821bee0bf641a365224c7e1eekeunyoung        mContext = context;
451ab8e18e01d8063821bee0bf641a365224c7e1eekeunyoung        mICarImpl = carImpl;
461ab8e18e01d8063821bee0bf641a365224c7e1eekeunyoung        mVehicleNetwork = VehicleHal.getInstance().getVehicleNetwork();
471ab8e18e01d8063821bee0bf641a365224c7e1eekeunyoung    }
481ab8e18e01d8063821bee0bf641a365224c7e1eekeunyoung
491ab8e18e01d8063821bee0bf641a365224c7e1eekeunyoung    @Override
501ab8e18e01d8063821bee0bf641a365224c7e1eekeunyoung    public void init() {
514b0212c1b3576f4174c292bbcdd72815584ff075keunyoung        // nothing to do.
524b0212c1b3576f4174c292bbcdd72815584ff075keunyoung        // This service should not reset anything for init / release to maintain mocking.
531ab8e18e01d8063821bee0bf641a365224c7e1eekeunyoung    }
541ab8e18e01d8063821bee0bf641a365224c7e1eekeunyoung
551ab8e18e01d8063821bee0bf641a365224c7e1eekeunyoung    @Override
561ab8e18e01d8063821bee0bf641a365224c7e1eekeunyoung    public void release() {
574b0212c1b3576f4174c292bbcdd72815584ff075keunyoung        // nothing to do
584b0212c1b3576f4174c292bbcdd72815584ff075keunyoung        // This service should not reset anything for init / release to maintain mocking.
591ab8e18e01d8063821bee0bf641a365224c7e1eekeunyoung    }
601ab8e18e01d8063821bee0bf641a365224c7e1eekeunyoung
611ab8e18e01d8063821bee0bf641a365224c7e1eekeunyoung    @Override
621ab8e18e01d8063821bee0bf641a365224c7e1eekeunyoung    public void dump(PrintWriter writer) {
634b0212c1b3576f4174c292bbcdd72815584ff075keunyoung        writer.println("*CarTestService*");
644b0212c1b3576f4174c292bbcdd72815584ff075keunyoung        writer.println(" mInMocking" + mInMocking);
651ab8e18e01d8063821bee0bf641a365224c7e1eekeunyoung    }
661ab8e18e01d8063821bee0bf641a365224c7e1eekeunyoung
671ab8e18e01d8063821bee0bf641a365224c7e1eekeunyoung    @Override
681ab8e18e01d8063821bee0bf641a365224c7e1eekeunyoung    public void injectEvent(VehiclePropValueParcelable value) {
691ab8e18e01d8063821bee0bf641a365224c7e1eekeunyoung        ICarImpl.assertVehicleHalMockPermission(mContext);
701ab8e18e01d8063821bee0bf641a365224c7e1eekeunyoung        mVehicleNetwork.injectEvent(value.value);
711ab8e18e01d8063821bee0bf641a365224c7e1eekeunyoung    }
721ab8e18e01d8063821bee0bf641a365224c7e1eekeunyoung
731ab8e18e01d8063821bee0bf641a365224c7e1eekeunyoung    @Override
744b0212c1b3576f4174c292bbcdd72815584ff075keunyoung    public void startMocking(IVehicleNetworkHalMock mock, int flags) {
751ab8e18e01d8063821bee0bf641a365224c7e1eekeunyoung        ICarImpl.assertVehicleHalMockPermission(mContext);
765c7cb266f8900450c2ab41802b079b02f14d707fkeunyoung        try {
775c7cb266f8900450c2ab41802b079b02f14d707fkeunyoung            mVehicleNetwork.startMocking(mock);
785c7cb266f8900450c2ab41802b079b02f14d707fkeunyoung            VehicleHal.getInstance().startMocking();
795c7cb266f8900450c2ab41802b079b02f14d707fkeunyoung            mICarImpl.startMocking();
804b0212c1b3576f4174c292bbcdd72815584ff075keunyoung            synchronized (this) {
814b0212c1b3576f4174c292bbcdd72815584ff075keunyoung                mInMocking = true;
824b0212c1b3576f4174c292bbcdd72815584ff075keunyoung                mMockingFlags = flags;
834b0212c1b3576f4174c292bbcdd72815584ff075keunyoung            }
845c7cb266f8900450c2ab41802b079b02f14d707fkeunyoung        } catch (Exception e) {
855c7cb266f8900450c2ab41802b079b02f14d707fkeunyoung            Log.w(CarLog.TAG_TEST, "startMocking failed", e);
865c7cb266f8900450c2ab41802b079b02f14d707fkeunyoung            throw e;
875c7cb266f8900450c2ab41802b079b02f14d707fkeunyoung        }
884b0212c1b3576f4174c292bbcdd72815584ff075keunyoung        Log.i(CarLog.TAG_TEST, "start vehicle HAL mocking, flags:0x" + Integer.toHexString(flags));
891ab8e18e01d8063821bee0bf641a365224c7e1eekeunyoung    }
901ab8e18e01d8063821bee0bf641a365224c7e1eekeunyoung
911ab8e18e01d8063821bee0bf641a365224c7e1eekeunyoung    @Override
921ab8e18e01d8063821bee0bf641a365224c7e1eekeunyoung    public void stopMocking(IVehicleNetworkHalMock mock) {
931ab8e18e01d8063821bee0bf641a365224c7e1eekeunyoung        ICarImpl.assertVehicleHalMockPermission(mContext);
941ab8e18e01d8063821bee0bf641a365224c7e1eekeunyoung        mVehicleNetwork.stopMocking(mock);
951ab8e18e01d8063821bee0bf641a365224c7e1eekeunyoung        VehicleHal.getInstance().stopMocking();
961ab8e18e01d8063821bee0bf641a365224c7e1eekeunyoung        mICarImpl.stopMocking();
974b0212c1b3576f4174c292bbcdd72815584ff075keunyoung        synchronized (this) {
984b0212c1b3576f4174c292bbcdd72815584ff075keunyoung            mInMocking = false;
994b0212c1b3576f4174c292bbcdd72815584ff075keunyoung            mMockingFlags = 0;
1004b0212c1b3576f4174c292bbcdd72815584ff075keunyoung        }
1015c7cb266f8900450c2ab41802b079b02f14d707fkeunyoung        Log.i(CarLog.TAG_TEST, "stop vehicle HAL mocking");
1021ab8e18e01d8063821bee0bf641a365224c7e1eekeunyoung    }
1034b0212c1b3576f4174c292bbcdd72815584ff075keunyoung
1044b0212c1b3576f4174c292bbcdd72815584ff075keunyoung    public synchronized boolean isInMocking() {
1054b0212c1b3576f4174c292bbcdd72815584ff075keunyoung        return mInMocking;
1064b0212c1b3576f4174c292bbcdd72815584ff075keunyoung    }
1074b0212c1b3576f4174c292bbcdd72815584ff075keunyoung
1084b0212c1b3576f4174c292bbcdd72815584ff075keunyoung    public synchronized boolean shouldDoRealShutdownInMocking() {
1094b0212c1b3576f4174c292bbcdd72815584ff075keunyoung        return (mMockingFlags & CarTestManager.FLAG_MOCKING_REAL_SHUTDOWN) != 0;
1104b0212c1b3576f4174c292bbcdd72815584ff075keunyoung    }
1111ab8e18e01d8063821bee0bf641a365224c7e1eekeunyoung}
112