1816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko/*
2816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko * Copyright (C) 2015 The Android Open Source Project
3816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko *
4816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko * Licensed under the Apache License, Version 2.0 (the "License");
5816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko * you may not use this file except in compliance with the License.
6816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko * You may obtain a copy of the License at
7816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko *
8816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko *      http://www.apache.org/licenses/LICENSE-2.0
9816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko *
10816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko * Unless required by applicable law or agreed to in writing, software
11816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko * distributed under the License is distributed on an "AS IS" BASIS,
12816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko * See the License for the specific language governing permissions and
14816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko * limitations under the License.
15816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko */
16816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko
17816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalkopackage com.android.tv.util;
18816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko
196ebde20b03db4c0d57f67acaac11832b610b966bNick Chalkoimport static android.support.test.InstrumentationRegistry.getContext;
206ebde20b03db4c0d57f67acaac11832b610b966bNick Chalko
21816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalkoimport android.content.pm.ResolveInfo;
22816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalkoimport android.media.tv.TvInputInfo;
2365fda1eaa94968bb55d5ded10dcb0b3f37fb05f2Nick Chalkoimport android.support.test.filters.SmallTest;
24816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko
25816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalkoimport com.android.tv.testing.ComparatorTester;
26816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko
276ebde20b03db4c0d57f67acaac11832b610b966bNick Chalkoimport org.junit.Test;
28816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalkoimport org.mockito.Mockito;
29816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalkoimport org.mockito.invocation.InvocationOnMock;
30816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalkoimport org.mockito.stubbing.Answer;
31816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko
326ebde20b03db4c0d57f67acaac11832b610b966bNick Chalkoimport java.util.ArrayList;
336ebde20b03db4c0d57f67acaac11832b610b966bNick Chalkoimport java.util.HashMap;
346ebde20b03db4c0d57f67acaac11832b610b966bNick Chalkoimport java.util.List;
3507b043dc3db83d6d20f0e8513b946830ab00e37bNick Chalko
36816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko/**
37816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko * Test for {@link TvInputManagerHelper}
38816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko */
39816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko@SmallTest
406ebde20b03db4c0d57f67acaac11832b610b966bNick Chalkopublic class TvInputManagerHelperTest {
416ebde20b03db4c0d57f67acaac11832b610b966bNick Chalko    final HashMap<String, TvInputInfoWrapper> TEST_INPUT_MAP = new HashMap<>();
426ebde20b03db4c0d57f67acaac11832b610b966bNick Chalko
436ebde20b03db4c0d57f67acaac11832b610b966bNick Chalko    @Test
446ebde20b03db4c0d57f67acaac11832b610b966bNick Chalko    public void testComparatorInternal() {
456ebde20b03db4c0d57f67acaac11832b610b966bNick Chalko        ResolveInfo resolveInfo = TestUtils.createResolveInfo("test", "test");
466ebde20b03db4c0d57f67acaac11832b610b966bNick Chalko
476ebde20b03db4c0d57f67acaac11832b610b966bNick Chalko        List<TvInputInfo> inputs = new ArrayList<>();
486ebde20b03db4c0d57f67acaac11832b610b966bNick Chalko        inputs.add(createTvInputInfo(resolveInfo, "2_partner_input", null, 0, false,
496ebde20b03db4c0d57f67acaac11832b610b966bNick Chalko                "2_partner_input", null, true));
506ebde20b03db4c0d57f67acaac11832b610b966bNick Chalko        inputs.add(createTvInputInfo(resolveInfo, "3_partner_input", null, 0, false,
516ebde20b03db4c0d57f67acaac11832b610b966bNick Chalko                "3_partner_input", null, true));
526ebde20b03db4c0d57f67acaac11832b610b966bNick Chalko        inputs.add(createTvInputInfo(resolveInfo, "1_3rd_party_input", null, 0, false,
536ebde20b03db4c0d57f67acaac11832b610b966bNick Chalko                "1_3rd_party_input", null, false));
546ebde20b03db4c0d57f67acaac11832b610b966bNick Chalko        inputs.add(createTvInputInfo(resolveInfo, "4_3rd_party_input", null, 0, false,
556ebde20b03db4c0d57f67acaac11832b610b966bNick Chalko                "4_3rd_party_input", null, false));
566ebde20b03db4c0d57f67acaac11832b610b966bNick Chalko
576ebde20b03db4c0d57f67acaac11832b610b966bNick Chalko        TvInputManagerHelper manager = createMockTvInputManager();
586ebde20b03db4c0d57f67acaac11832b610b966bNick Chalko
596ebde20b03db4c0d57f67acaac11832b610b966bNick Chalko        ComparatorTester<TvInputInfo> comparatorTester = ComparatorTester.withoutEqualsTest(
606ebde20b03db4c0d57f67acaac11832b610b966bNick Chalko                        new TvInputManagerHelper.InputComparatorInternal(manager));
616ebde20b03db4c0d57f67acaac11832b610b966bNick Chalko        for (TvInputInfo input : inputs) {
626ebde20b03db4c0d57f67acaac11832b610b966bNick Chalko            comparatorTester.addComparableGroup(input);
636ebde20b03db4c0d57f67acaac11832b610b966bNick Chalko        }
646ebde20b03db4c0d57f67acaac11832b610b966bNick Chalko        comparatorTester.test();
656ebde20b03db4c0d57f67acaac11832b610b966bNick Chalko    }
666ebde20b03db4c0d57f67acaac11832b610b966bNick Chalko
676ebde20b03db4c0d57f67acaac11832b610b966bNick Chalko    @Test
686ebde20b03db4c0d57f67acaac11832b610b966bNick Chalko    public void testHardwareInputComparatorHdmi() {
696ebde20b03db4c0d57f67acaac11832b610b966bNick Chalko        ResolveInfo resolveInfo = TestUtils.createResolveInfo("test", "test");
706ebde20b03db4c0d57f67acaac11832b610b966bNick Chalko
716ebde20b03db4c0d57f67acaac11832b610b966bNick Chalko        TvInputInfo hdmi1 = createTvInputInfo(resolveInfo, "HDMI1", null, TvInputInfo.TYPE_HDMI,
726ebde20b03db4c0d57f67acaac11832b610b966bNick Chalko                true, "HDMI1", null, false);
736ebde20b03db4c0d57f67acaac11832b610b966bNick Chalko        TvInputInfo hdmi2 = createTvInputInfo(resolveInfo, "HDMI2", null, TvInputInfo.TYPE_HDMI,
746ebde20b03db4c0d57f67acaac11832b610b966bNick Chalko                true, "HDMI2", "DVD", false);
756ebde20b03db4c0d57f67acaac11832b610b966bNick Chalko        TvInputInfo hdmi3 = createTvInputInfo(resolveInfo, "HDMI3", null, TvInputInfo.TYPE_HDMI,
766ebde20b03db4c0d57f67acaac11832b610b966bNick Chalko                true, "HDMI3", "Cable", false);
776ebde20b03db4c0d57f67acaac11832b610b966bNick Chalko        TvInputInfo hdmi4 = createTvInputInfo(resolveInfo, "HDMI4", null, TvInputInfo.TYPE_HDMI,
786ebde20b03db4c0d57f67acaac11832b610b966bNick Chalko                true, "HDMI4", null, false);
796ebde20b03db4c0d57f67acaac11832b610b966bNick Chalko
806ebde20b03db4c0d57f67acaac11832b610b966bNick Chalko        TvInputManagerHelper manager = createMockTvInputManager();
816ebde20b03db4c0d57f67acaac11832b610b966bNick Chalko
826ebde20b03db4c0d57f67acaac11832b610b966bNick Chalko        ComparatorTester<TvInputInfo> comparatorTester = ComparatorTester.withoutEqualsTest(
836ebde20b03db4c0d57f67acaac11832b610b966bNick Chalko                        new TvInputManagerHelper.HardwareInputComparator(getContext(), manager));
846ebde20b03db4c0d57f67acaac11832b610b966bNick Chalko        comparatorTester.addComparableGroup(hdmi3)
856ebde20b03db4c0d57f67acaac11832b610b966bNick Chalko                .addComparableGroup(hdmi2)
866ebde20b03db4c0d57f67acaac11832b610b966bNick Chalko                .addComparableGroup(hdmi1)
876ebde20b03db4c0d57f67acaac11832b610b966bNick Chalko                .addComparableGroup(hdmi4)
886ebde20b03db4c0d57f67acaac11832b610b966bNick Chalko                .test();
896ebde20b03db4c0d57f67acaac11832b610b966bNick Chalko    }
906ebde20b03db4c0d57f67acaac11832b610b966bNick Chalko
916ebde20b03db4c0d57f67acaac11832b610b966bNick Chalko    @Test
926ebde20b03db4c0d57f67acaac11832b610b966bNick Chalko    public void testHardwareInputComparatorCec() {
936ebde20b03db4c0d57f67acaac11832b610b966bNick Chalko        ResolveInfo resolveInfo = TestUtils.createResolveInfo("test", "test");
946ebde20b03db4c0d57f67acaac11832b610b966bNick Chalko
956ebde20b03db4c0d57f67acaac11832b610b966bNick Chalko        TvInputInfo hdmi1 = createTvInputInfo(resolveInfo, "HDMI1", null, TvInputInfo.TYPE_HDMI,
966ebde20b03db4c0d57f67acaac11832b610b966bNick Chalko                true, "HDMI1", null, false);
976ebde20b03db4c0d57f67acaac11832b610b966bNick Chalko        TvInputInfo hdmi2 = createTvInputInfo(resolveInfo, "HDMI2", null, TvInputInfo.TYPE_HDMI,
986ebde20b03db4c0d57f67acaac11832b610b966bNick Chalko                true, "HDMI2", null, false);
99816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko
1006ebde20b03db4c0d57f67acaac11832b610b966bNick Chalko        TvInputInfo cec1 = createTvInputInfo(resolveInfo, "2_cec", "HDMI1", TvInputInfo.TYPE_HDMI,
1016ebde20b03db4c0d57f67acaac11832b610b966bNick Chalko                true, "2_cec", null, false);
1026ebde20b03db4c0d57f67acaac11832b610b966bNick Chalko        TvInputInfo cec2 = createTvInputInfo(resolveInfo, "1_cec", "HDMI2", TvInputInfo.TYPE_HDMI,
1036ebde20b03db4c0d57f67acaac11832b610b966bNick Chalko                true, "1_cec", null, false);
1046ebde20b03db4c0d57f67acaac11832b610b966bNick Chalko
1056ebde20b03db4c0d57f67acaac11832b610b966bNick Chalko        TvInputManagerHelper manager = createMockTvInputManager();
1066ebde20b03db4c0d57f67acaac11832b610b966bNick Chalko
1076ebde20b03db4c0d57f67acaac11832b610b966bNick Chalko        ComparatorTester<TvInputInfo> comparatorTester = ComparatorTester.withoutEqualsTest(
1086ebde20b03db4c0d57f67acaac11832b610b966bNick Chalko                        new TvInputManagerHelper.HardwareInputComparator(getContext(), manager));
1096ebde20b03db4c0d57f67acaac11832b610b966bNick Chalko        comparatorTester.addComparableGroup(cec1)
1106ebde20b03db4c0d57f67acaac11832b610b966bNick Chalko                .addComparableGroup(cec2)
1116ebde20b03db4c0d57f67acaac11832b610b966bNick Chalko                .test();
1126ebde20b03db4c0d57f67acaac11832b610b966bNick Chalko    }
1136ebde20b03db4c0d57f67acaac11832b610b966bNick Chalko
1146ebde20b03db4c0d57f67acaac11832b610b966bNick Chalko    private TvInputManagerHelper createMockTvInputManager() {
115816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko        TvInputManagerHelper manager = Mockito.mock(TvInputManagerHelper.class);
116816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko        Mockito.doAnswer(new Answer<Boolean>() {
117816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko            @Override
118816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko            public Boolean answer(InvocationOnMock invocation) throws Throwable {
119816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko                TvInputInfo info = (TvInputInfo) invocation.getArguments()[0];
1206ebde20b03db4c0d57f67acaac11832b610b966bNick Chalko                return TEST_INPUT_MAP.get(info.getId()).mIsPartnerInput;
121816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko            }
122816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko        }).when(manager).isPartnerInput(Mockito.<TvInputInfo>any());
123816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko        Mockito.doAnswer(new Answer<String>() {
124816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko            @Override
125816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko            public String answer(InvocationOnMock invocation) throws Throwable {
126816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko                TvInputInfo info = (TvInputInfo) invocation.getArguments()[0];
1276ebde20b03db4c0d57f67acaac11832b610b966bNick Chalko                return TEST_INPUT_MAP.get(info.getId()).mLabel;
128816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko            }
129816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko        }).when(manager).loadLabel(Mockito.<TvInputInfo>any());
1306ebde20b03db4c0d57f67acaac11832b610b966bNick Chalko        Mockito.doAnswer(new Answer<String>() {
1316ebde20b03db4c0d57f67acaac11832b610b966bNick Chalko            @Override
1326ebde20b03db4c0d57f67acaac11832b610b966bNick Chalko            public String answer(InvocationOnMock invocation) throws Throwable {
1336ebde20b03db4c0d57f67acaac11832b610b966bNick Chalko                TvInputInfo info = (TvInputInfo) invocation.getArguments()[0];
1346ebde20b03db4c0d57f67acaac11832b610b966bNick Chalko                return TEST_INPUT_MAP.get(info.getId()).mCustomLabel;
1356ebde20b03db4c0d57f67acaac11832b610b966bNick Chalko            }
1366ebde20b03db4c0d57f67acaac11832b610b966bNick Chalko        }).when(manager).loadCustomLabel(Mockito.<TvInputInfo>any());
1376ebde20b03db4c0d57f67acaac11832b610b966bNick Chalko        Mockito.doAnswer(new Answer<TvInputInfo>() {
1386ebde20b03db4c0d57f67acaac11832b610b966bNick Chalko            @Override
1396ebde20b03db4c0d57f67acaac11832b610b966bNick Chalko            public TvInputInfo answer(InvocationOnMock invocation) throws Throwable {
1406ebde20b03db4c0d57f67acaac11832b610b966bNick Chalko                String inputId = (String) invocation.getArguments()[0];
1416ebde20b03db4c0d57f67acaac11832b610b966bNick Chalko                TvInputInfoWrapper inputWrapper = TEST_INPUT_MAP.get(inputId);
1426ebde20b03db4c0d57f67acaac11832b610b966bNick Chalko                return inputWrapper == null ? null : inputWrapper.mInput;
1436ebde20b03db4c0d57f67acaac11832b610b966bNick Chalko            }
1446ebde20b03db4c0d57f67acaac11832b610b966bNick Chalko        }).when(manager).getTvInputInfo(Mockito.<String>any());
1456ebde20b03db4c0d57f67acaac11832b610b966bNick Chalko        return manager;
1466ebde20b03db4c0d57f67acaac11832b610b966bNick Chalko    }
147816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko
1486ebde20b03db4c0d57f67acaac11832b610b966bNick Chalko    private TvInputInfo createTvInputInfo(ResolveInfo service, String id,
1496ebde20b03db4c0d57f67acaac11832b610b966bNick Chalko            String parentId, int type, boolean isHardwareInput, String label, String customLabel,
1506ebde20b03db4c0d57f67acaac11832b610b966bNick Chalko            boolean isPartnerInput) {
1516ebde20b03db4c0d57f67acaac11832b610b966bNick Chalko        TvInputInfoWrapper inputWrapper = new TvInputInfoWrapper();
1526ebde20b03db4c0d57f67acaac11832b610b966bNick Chalko        try {
1536ebde20b03db4c0d57f67acaac11832b610b966bNick Chalko            inputWrapper.mInput =
1546ebde20b03db4c0d57f67acaac11832b610b966bNick Chalko                    TestUtils.createTvInputInfo(service, id, parentId, type, isHardwareInput);
1556ebde20b03db4c0d57f67acaac11832b610b966bNick Chalko        } catch (Exception e) {
156816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko        }
1576ebde20b03db4c0d57f67acaac11832b610b966bNick Chalko        inputWrapper.mLabel = label;
1586ebde20b03db4c0d57f67acaac11832b610b966bNick Chalko        inputWrapper.mIsPartnerInput = isPartnerInput;
1596ebde20b03db4c0d57f67acaac11832b610b966bNick Chalko        inputWrapper.mCustomLabel = customLabel;
1606ebde20b03db4c0d57f67acaac11832b610b966bNick Chalko        TEST_INPUT_MAP.put(id, inputWrapper);
1616ebde20b03db4c0d57f67acaac11832b610b966bNick Chalko        return inputWrapper.mInput;
1626ebde20b03db4c0d57f67acaac11832b610b966bNick Chalko    }
1636ebde20b03db4c0d57f67acaac11832b610b966bNick Chalko
1646ebde20b03db4c0d57f67acaac11832b610b966bNick Chalko    private static class TvInputInfoWrapper {
1656ebde20b03db4c0d57f67acaac11832b610b966bNick Chalko        TvInputInfo mInput;
1666ebde20b03db4c0d57f67acaac11832b610b966bNick Chalko        String mLabel;
1676ebde20b03db4c0d57f67acaac11832b610b966bNick Chalko        String mCustomLabel;
1686ebde20b03db4c0d57f67acaac11832b610b966bNick Chalko        boolean mIsPartnerInput;
169816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko    }
170816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko}
171