AudioRoutingPolicyTest.java revision e54ac276796c6535558f8444d882adecd19ce2bd
15c7cb266f8900450c2ab41802b079b02f14d707fkeunyoung/*
25c7cb266f8900450c2ab41802b079b02f14d707fkeunyoung * Copyright (C) 2015 The Android Open Source Project
35c7cb266f8900450c2ab41802b079b02f14d707fkeunyoung *
45c7cb266f8900450c2ab41802b079b02f14d707fkeunyoung * Licensed under the Apache License, Version 2.0 (the "License");
55c7cb266f8900450c2ab41802b079b02f14d707fkeunyoung * you may not use this file except in compliance with the License.
65c7cb266f8900450c2ab41802b079b02f14d707fkeunyoung * You may obtain a copy of the License at
75c7cb266f8900450c2ab41802b079b02f14d707fkeunyoung *
85c7cb266f8900450c2ab41802b079b02f14d707fkeunyoung *      http://www.apache.org/licenses/LICENSE-2.0
95c7cb266f8900450c2ab41802b079b02f14d707fkeunyoung *
105c7cb266f8900450c2ab41802b079b02f14d707fkeunyoung * Unless required by applicable law or agreed to in writing, software
115c7cb266f8900450c2ab41802b079b02f14d707fkeunyoung * distributed under the License is distributed on an "AS IS" BASIS,
125c7cb266f8900450c2ab41802b079b02f14d707fkeunyoung * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
135c7cb266f8900450c2ab41802b079b02f14d707fkeunyoung * See the License for the specific language governing permissions and
145c7cb266f8900450c2ab41802b079b02f14d707fkeunyoung * limitations under the License.
155c7cb266f8900450c2ab41802b079b02f14d707fkeunyoung */
16e54ac276796c6535558f8444d882adecd19ce2bdKeun-young Parkpackage com.android.car.test;
175c7cb266f8900450c2ab41802b079b02f14d707fkeunyoung
18e54ac276796c6535558f8444d882adecd19ce2bdKeun-young Parkimport android.car.test.VehicleHalEmulator.VehicleHalPropertyHandler;
1975623ce0736848d0b27f08c65d843a031b325027Pavel Maltsev
205c7cb266f8900450c2ab41802b079b02f14d707fkeunyoungimport com.android.car.vehiclenetwork.VehicleNetworkConsts;
210727f9536803bf13e49ff73bd1ed04489b592c56Keun-young Parkimport com.android.car.vehiclenetwork.VehicleNetworkConsts.VehicleAudioContextFlag;
225c7cb266f8900450c2ab41802b079b02f14d707fkeunyoungimport com.android.car.vehiclenetwork.VehicleNetworkConsts.VehicleAudioRoutingPolicyIndex;
235c7cb266f8900450c2ab41802b079b02f14d707fkeunyoungimport com.android.car.vehiclenetwork.VehicleNetworkConsts.VehiclePermissionModel;
245c7cb266f8900450c2ab41802b079b02f14d707fkeunyoungimport com.android.car.vehiclenetwork.VehicleNetworkConsts.VehiclePropAccess;
255c7cb266f8900450c2ab41802b079b02f14d707fkeunyoungimport com.android.car.vehiclenetwork.VehicleNetworkConsts.VehiclePropChangeMode;
265c7cb266f8900450c2ab41802b079b02f14d707fkeunyoungimport com.android.car.vehiclenetwork.VehicleNetworkConsts.VehicleValueType;
275c7cb266f8900450c2ab41802b079b02f14d707fkeunyoungimport com.android.car.vehiclenetwork.VehicleNetworkProto.VehiclePropValue;
285c7cb266f8900450c2ab41802b079b02f14d707fkeunyoungimport com.android.car.vehiclenetwork.VehiclePropConfigUtil;
295c7cb266f8900450c2ab41802b079b02f14d707fkeunyoungimport com.android.car.vehiclenetwork.VehiclePropValueUtil;
30e54ac276796c6535558f8444d882adecd19ce2bdKeun-young Parkimport com.android.support.car.test.MockedCarTestBase;
315c7cb266f8900450c2ab41802b079b02f14d707fkeunyoung
325c7cb266f8900450c2ab41802b079b02f14d707fkeunyoungimport java.util.LinkedList;
335c7cb266f8900450c2ab41802b079b02f14d707fkeunyoungimport java.util.concurrent.Semaphore;
345c7cb266f8900450c2ab41802b079b02f14d707fkeunyoungimport java.util.concurrent.TimeUnit;
355c7cb266f8900450c2ab41802b079b02f14d707fkeunyoung
365c7cb266f8900450c2ab41802b079b02f14d707fkeunyoungpublic class AudioRoutingPolicyTest extends MockedCarTestBase {
375c7cb266f8900450c2ab41802b079b02f14d707fkeunyoung
385c7cb266f8900450c2ab41802b079b02f14d707fkeunyoung    private static final long TIMEOUT_MS = 3000;
395c7cb266f8900450c2ab41802b079b02f14d707fkeunyoung
40a74b9caa2fb6435f1c01c5e8766b89235c4e3d5akeunyoung    private final VehicleHalPropertyHandler mAudioRoutingPolicyHandler =
41a74b9caa2fb6435f1c01c5e8766b89235c4e3d5akeunyoung            new VehicleHalPropertyHandler() {
425c7cb266f8900450c2ab41802b079b02f14d707fkeunyoung
435c7cb266f8900450c2ab41802b079b02f14d707fkeunyoung        @Override
445c7cb266f8900450c2ab41802b079b02f14d707fkeunyoung        public void onPropertySet(VehiclePropValue value) {
455c7cb266f8900450c2ab41802b079b02f14d707fkeunyoung            handlePropertySetEvent(value);
465c7cb266f8900450c2ab41802b079b02f14d707fkeunyoung        }
475c7cb266f8900450c2ab41802b079b02f14d707fkeunyoung
485c7cb266f8900450c2ab41802b079b02f14d707fkeunyoung        @Override
495c7cb266f8900450c2ab41802b079b02f14d707fkeunyoung        public VehiclePropValue onPropertyGet(VehiclePropValue value) {
505c7cb266f8900450c2ab41802b079b02f14d707fkeunyoung            fail("cannot get");
515c7cb266f8900450c2ab41802b079b02f14d707fkeunyoung            return null;
525c7cb266f8900450c2ab41802b079b02f14d707fkeunyoung        }
535c7cb266f8900450c2ab41802b079b02f14d707fkeunyoung
545c7cb266f8900450c2ab41802b079b02f14d707fkeunyoung        @Override
550727f9536803bf13e49ff73bd1ed04489b592c56Keun-young Park        public void onPropertySubscribe(int property, float sampleRate, int zones) {
565c7cb266f8900450c2ab41802b079b02f14d707fkeunyoung            fail("cannot subscribe");
575c7cb266f8900450c2ab41802b079b02f14d707fkeunyoung        }
585c7cb266f8900450c2ab41802b079b02f14d707fkeunyoung
595c7cb266f8900450c2ab41802b079b02f14d707fkeunyoung        @Override
605c7cb266f8900450c2ab41802b079b02f14d707fkeunyoung        public void onPropertyUnsubscribe(int property) {
615c7cb266f8900450c2ab41802b079b02f14d707fkeunyoung            fail("cannot unsubscribe");
625c7cb266f8900450c2ab41802b079b02f14d707fkeunyoung        }
635c7cb266f8900450c2ab41802b079b02f14d707fkeunyoung    };
645c7cb266f8900450c2ab41802b079b02f14d707fkeunyoung
655c7cb266f8900450c2ab41802b079b02f14d707fkeunyoung    private final Semaphore mWaitSemaphore = new Semaphore(0);
665c7cb266f8900450c2ab41802b079b02f14d707fkeunyoung    private final LinkedList<VehiclePropValue> mEvents = new LinkedList<VehiclePropValue>();
675c7cb266f8900450c2ab41802b079b02f14d707fkeunyoung
685c7cb266f8900450c2ab41802b079b02f14d707fkeunyoung    @Override
695c7cb266f8900450c2ab41802b079b02f14d707fkeunyoung    protected void setUp() throws Exception {
705c7cb266f8900450c2ab41802b079b02f14d707fkeunyoung        super.setUp();
715c7cb266f8900450c2ab41802b079b02f14d707fkeunyoung
725c7cb266f8900450c2ab41802b079b02f14d707fkeunyoung        getVehicleHalEmulator().addProperty(
735c7cb266f8900450c2ab41802b079b02f14d707fkeunyoung                VehiclePropConfigUtil.getBuilder(
745c7cb266f8900450c2ab41802b079b02f14d707fkeunyoung                        VehicleNetworkConsts.VEHICLE_PROPERTY_AUDIO_ROUTING_POLICY,
755c7cb266f8900450c2ab41802b079b02f14d707fkeunyoung                        VehiclePropAccess.VEHICLE_PROP_ACCESS_WRITE,
765c7cb266f8900450c2ab41802b079b02f14d707fkeunyoung                        VehiclePropChangeMode.VEHICLE_PROP_CHANGE_MODE_ON_CHANGE,
775c7cb266f8900450c2ab41802b079b02f14d707fkeunyoung                        VehicleValueType.VEHICLE_VALUE_TYPE_INT32_VEC2,
785c7cb266f8900450c2ab41802b079b02f14d707fkeunyoung                        VehiclePermissionModel.VEHICLE_PERMISSION_SYSTEM_APP_ONLY,
795c7cb266f8900450c2ab41802b079b02f14d707fkeunyoung                        0 /*configFlags*/, 0 /*sampleRateMax*/, 0 /*sampleRateMin*/).build(),
805c7cb266f8900450c2ab41802b079b02f14d707fkeunyoung                mAudioRoutingPolicyHandler);
815c7cb266f8900450c2ab41802b079b02f14d707fkeunyoung    }
825c7cb266f8900450c2ab41802b079b02f14d707fkeunyoung
835c7cb266f8900450c2ab41802b079b02f14d707fkeunyoung    public void testNoHwVaraint() throws Exception {
845c7cb266f8900450c2ab41802b079b02f14d707fkeunyoung        getVehicleHalEmulator().removeProperty(
855c7cb266f8900450c2ab41802b079b02f14d707fkeunyoung                VehicleNetworkConsts.VEHICLE_PROPERTY_AUDIO_HW_VARIANT);
865c7cb266f8900450c2ab41802b079b02f14d707fkeunyoung        getVehicleHalEmulator().start();
875c7cb266f8900450c2ab41802b079b02f14d707fkeunyoung        checkPolicy0();
885c7cb266f8900450c2ab41802b079b02f14d707fkeunyoung    }
895c7cb266f8900450c2ab41802b079b02f14d707fkeunyoung
905c7cb266f8900450c2ab41802b079b02f14d707fkeunyoung    public void testHwVariant0() throws Exception {
915c7cb266f8900450c2ab41802b079b02f14d707fkeunyoung        getVehicleHalEmulator().addStaticProperty(
925c7cb266f8900450c2ab41802b079b02f14d707fkeunyoung                VehiclePropConfigUtil.createStaticStringProperty(
935c7cb266f8900450c2ab41802b079b02f14d707fkeunyoung                        VehicleNetworkConsts.VEHICLE_PROPERTY_AUDIO_HW_VARIANT),
945c7cb266f8900450c2ab41802b079b02f14d707fkeunyoung                VehiclePropValueUtil.createIntValue(
955c7cb266f8900450c2ab41802b079b02f14d707fkeunyoung                        VehicleNetworkConsts.VEHICLE_PROPERTY_AUDIO_HW_VARIANT, 0, 0));
965c7cb266f8900450c2ab41802b079b02f14d707fkeunyoung        getVehicleHalEmulator().start();
975c7cb266f8900450c2ab41802b079b02f14d707fkeunyoung        checkPolicy0();
985c7cb266f8900450c2ab41802b079b02f14d707fkeunyoung    }
995c7cb266f8900450c2ab41802b079b02f14d707fkeunyoung
1005c7cb266f8900450c2ab41802b079b02f14d707fkeunyoung    public void testHwVariant1() throws Exception {
1015c7cb266f8900450c2ab41802b079b02f14d707fkeunyoung        getVehicleHalEmulator().addStaticProperty(
1025c7cb266f8900450c2ab41802b079b02f14d707fkeunyoung                VehiclePropConfigUtil.createStaticStringProperty(
1035c7cb266f8900450c2ab41802b079b02f14d707fkeunyoung                        VehicleNetworkConsts.VEHICLE_PROPERTY_AUDIO_HW_VARIANT),
1045c7cb266f8900450c2ab41802b079b02f14d707fkeunyoung                VehiclePropValueUtil.createIntValue(
1055c7cb266f8900450c2ab41802b079b02f14d707fkeunyoung                        VehicleNetworkConsts.VEHICLE_PROPERTY_AUDIO_HW_VARIANT, 1, 0));
1065c7cb266f8900450c2ab41802b079b02f14d707fkeunyoung        getVehicleHalEmulator().start();
1075c7cb266f8900450c2ab41802b079b02f14d707fkeunyoung        checkPolicy1();
1085c7cb266f8900450c2ab41802b079b02f14d707fkeunyoung    }
1095c7cb266f8900450c2ab41802b079b02f14d707fkeunyoung
1105c7cb266f8900450c2ab41802b079b02f14d707fkeunyoung    private void checkPolicy0() throws Exception {
1115c7cb266f8900450c2ab41802b079b02f14d707fkeunyoung        assertTrue(mWaitSemaphore.tryAcquire(TIMEOUT_MS, TimeUnit.MILLISECONDS));
1125c7cb266f8900450c2ab41802b079b02f14d707fkeunyoung        VehiclePropValue v = mEvents.get(0);
1135c7cb266f8900450c2ab41802b079b02f14d707fkeunyoung        assertEquals(0, v.getInt32Values(
1145c7cb266f8900450c2ab41802b079b02f14d707fkeunyoung                VehicleAudioRoutingPolicyIndex.VEHICLE_AUDIO_ROUTING_POLICY_INDEX_STREAM));
1155c7cb266f8900450c2ab41802b079b02f14d707fkeunyoung        assertEquals(
1160727f9536803bf13e49ff73bd1ed04489b592c56Keun-young Park                VehicleAudioContextFlag.VEHICLE_AUDIO_CONTEXT_ALARM_FLAG |
1170727f9536803bf13e49ff73bd1ed04489b592c56Keun-young Park                VehicleAudioContextFlag.VEHICLE_AUDIO_CONTEXT_CALL_FLAG |
1180727f9536803bf13e49ff73bd1ed04489b592c56Keun-young Park                VehicleAudioContextFlag.VEHICLE_AUDIO_CONTEXT_MUSIC_FLAG |
1190727f9536803bf13e49ff73bd1ed04489b592c56Keun-young Park                VehicleAudioContextFlag.VEHICLE_AUDIO_CONTEXT_NAVIGATION_FLAG |
1200727f9536803bf13e49ff73bd1ed04489b592c56Keun-young Park                VehicleAudioContextFlag.VEHICLE_AUDIO_CONTEXT_NOTIFICATION_FLAG |
1210727f9536803bf13e49ff73bd1ed04489b592c56Keun-young Park                VehicleAudioContextFlag.VEHICLE_AUDIO_CONTEXT_UNKNOWN_FLAG |
1225672e85bdf82f6a2350afb942dfe17b7c699af87Keun-young Park                VehicleAudioContextFlag.VEHICLE_AUDIO_CONTEXT_VOICE_COMMAND_FLAG |
1235672e85bdf82f6a2350afb942dfe17b7c699af87Keun-young Park                VehicleAudioContextFlag.VEHICLE_AUDIO_CONTEXT_SYSTEM_SOUND |
1245672e85bdf82f6a2350afb942dfe17b7c699af87Keun-young Park                VehicleAudioContextFlag.VEHICLE_AUDIO_CONTEXT_SAFETY_ALERT_FLAG,
1255c7cb266f8900450c2ab41802b079b02f14d707fkeunyoung                v.getInt32Values(
1265c7cb266f8900450c2ab41802b079b02f14d707fkeunyoung                        VehicleAudioRoutingPolicyIndex.VEHICLE_AUDIO_ROUTING_POLICY_INDEX_CONTEXTS)
1275c7cb266f8900450c2ab41802b079b02f14d707fkeunyoung                        );
1285c7cb266f8900450c2ab41802b079b02f14d707fkeunyoung    }
1295c7cb266f8900450c2ab41802b079b02f14d707fkeunyoung
1305c7cb266f8900450c2ab41802b079b02f14d707fkeunyoung    private void checkPolicy1() throws Exception {
131a74b9caa2fb6435f1c01c5e8766b89235c4e3d5akeunyoung        // write happens twice.
1325c7cb266f8900450c2ab41802b079b02f14d707fkeunyoung        assertTrue(mWaitSemaphore.tryAcquire(TIMEOUT_MS, TimeUnit.MILLISECONDS));
1335c7cb266f8900450c2ab41802b079b02f14d707fkeunyoung        assertTrue(mWaitSemaphore.tryAcquire(TIMEOUT_MS, TimeUnit.MILLISECONDS));
1345c7cb266f8900450c2ab41802b079b02f14d707fkeunyoung        VehiclePropValue v = mEvents.get(0);
1355c7cb266f8900450c2ab41802b079b02f14d707fkeunyoung        assertEquals(0, v.getInt32Values(
1365c7cb266f8900450c2ab41802b079b02f14d707fkeunyoung                VehicleAudioRoutingPolicyIndex.VEHICLE_AUDIO_ROUTING_POLICY_INDEX_STREAM));
1375c7cb266f8900450c2ab41802b079b02f14d707fkeunyoung        assertEquals(
1380727f9536803bf13e49ff73bd1ed04489b592c56Keun-young Park                VehicleAudioContextFlag.VEHICLE_AUDIO_CONTEXT_CALL_FLAG |
1390727f9536803bf13e49ff73bd1ed04489b592c56Keun-young Park                VehicleAudioContextFlag.VEHICLE_AUDIO_CONTEXT_MUSIC_FLAG |
1400727f9536803bf13e49ff73bd1ed04489b592c56Keun-young Park                VehicleAudioContextFlag.VEHICLE_AUDIO_CONTEXT_UNKNOWN_FLAG,
1415c7cb266f8900450c2ab41802b079b02f14d707fkeunyoung                v.getInt32Values(
1425c7cb266f8900450c2ab41802b079b02f14d707fkeunyoung                        VehicleAudioRoutingPolicyIndex.VEHICLE_AUDIO_ROUTING_POLICY_INDEX_CONTEXTS)
1435c7cb266f8900450c2ab41802b079b02f14d707fkeunyoung                        );
1445c7cb266f8900450c2ab41802b079b02f14d707fkeunyoung        v = mEvents.get(1);
1455c7cb266f8900450c2ab41802b079b02f14d707fkeunyoung        assertEquals(1, v.getInt32Values(
1465c7cb266f8900450c2ab41802b079b02f14d707fkeunyoung                VehicleAudioRoutingPolicyIndex.VEHICLE_AUDIO_ROUTING_POLICY_INDEX_STREAM));
1475c7cb266f8900450c2ab41802b079b02f14d707fkeunyoung        assertEquals(
1480727f9536803bf13e49ff73bd1ed04489b592c56Keun-young Park                VehicleAudioContextFlag.VEHICLE_AUDIO_CONTEXT_ALARM_FLAG |
1490727f9536803bf13e49ff73bd1ed04489b592c56Keun-young Park                VehicleAudioContextFlag.VEHICLE_AUDIO_CONTEXT_NAVIGATION_FLAG |
1500727f9536803bf13e49ff73bd1ed04489b592c56Keun-young Park                VehicleAudioContextFlag.VEHICLE_AUDIO_CONTEXT_NOTIFICATION_FLAG |
1515672e85bdf82f6a2350afb942dfe17b7c699af87Keun-young Park                VehicleAudioContextFlag.VEHICLE_AUDIO_CONTEXT_VOICE_COMMAND_FLAG |
1525672e85bdf82f6a2350afb942dfe17b7c699af87Keun-young Park                VehicleAudioContextFlag.VEHICLE_AUDIO_CONTEXT_SYSTEM_SOUND |
1535672e85bdf82f6a2350afb942dfe17b7c699af87Keun-young Park                VehicleAudioContextFlag.VEHICLE_AUDIO_CONTEXT_SAFETY_ALERT_FLAG,
1545c7cb266f8900450c2ab41802b079b02f14d707fkeunyoung                v.getInt32Values(
1555c7cb266f8900450c2ab41802b079b02f14d707fkeunyoung                        VehicleAudioRoutingPolicyIndex.VEHICLE_AUDIO_ROUTING_POLICY_INDEX_CONTEXTS)
1565c7cb266f8900450c2ab41802b079b02f14d707fkeunyoung                        );
1575c7cb266f8900450c2ab41802b079b02f14d707fkeunyoung    }
1585c7cb266f8900450c2ab41802b079b02f14d707fkeunyoung
1595c7cb266f8900450c2ab41802b079b02f14d707fkeunyoung    private void handlePropertySetEvent(VehiclePropValue value) {
1605c7cb266f8900450c2ab41802b079b02f14d707fkeunyoung        mEvents.add(value);
1615c7cb266f8900450c2ab41802b079b02f14d707fkeunyoung        mWaitSemaphore.release();
1625c7cb266f8900450c2ab41802b079b02f14d707fkeunyoung    }
1635c7cb266f8900450c2ab41802b079b02f14d707fkeunyoung}
164