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