Home | History | Annotate | Download | only in util
      1 /*
      2  * Copyright (C) 2015 The Android Open Source Project
      3  *
      4  * Licensed under the Apache License, Version 2.0 (the "License");
      5  * you may not use this file except in compliance with the License.
      6  * You may obtain a copy of the License at
      7  *
      8  *      http://www.apache.org/licenses/LICENSE-2.0
      9  *
     10  * Unless required by applicable law or agreed to in writing, software
     11  * distributed under the License is distributed on an "AS IS" BASIS,
     12  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
     13  * See the License for the specific language governing permissions and
     14  * limitations under the License.
     15  */
     16 
     17 package com.android.tv.util;
     18 
     19 import static android.support.test.InstrumentationRegistry.getContext;
     20 
     21 import android.content.pm.ResolveInfo;
     22 import android.media.tv.TvInputInfo;
     23 import android.support.test.filters.SmallTest;
     24 
     25 import com.android.tv.testing.ComparatorTester;
     26 
     27 import org.junit.Test;
     28 import org.mockito.Mockito;
     29 import org.mockito.invocation.InvocationOnMock;
     30 import org.mockito.stubbing.Answer;
     31 
     32 import java.util.ArrayList;
     33 import java.util.HashMap;
     34 import java.util.List;
     35 
     36 /**
     37  * Test for {@link TvInputManagerHelper}
     38  */
     39 @SmallTest
     40 public class TvInputManagerHelperTest {
     41     final HashMap<String, TvInputInfoWrapper> TEST_INPUT_MAP = new HashMap<>();
     42 
     43     @Test
     44     public void testComparatorInternal() {
     45         ResolveInfo resolveInfo = TestUtils.createResolveInfo("test", "test");
     46 
     47         List<TvInputInfo> inputs = new ArrayList<>();
     48         inputs.add(createTvInputInfo(resolveInfo, "2_partner_input", null, 0, false,
     49                 "2_partner_input", null, true));
     50         inputs.add(createTvInputInfo(resolveInfo, "3_partner_input", null, 0, false,
     51                 "3_partner_input", null, true));
     52         inputs.add(createTvInputInfo(resolveInfo, "1_3rd_party_input", null, 0, false,
     53                 "1_3rd_party_input", null, false));
     54         inputs.add(createTvInputInfo(resolveInfo, "4_3rd_party_input", null, 0, false,
     55                 "4_3rd_party_input", null, false));
     56 
     57         TvInputManagerHelper manager = createMockTvInputManager();
     58 
     59         ComparatorTester<TvInputInfo> comparatorTester = ComparatorTester.withoutEqualsTest(
     60                         new TvInputManagerHelper.InputComparatorInternal(manager));
     61         for (TvInputInfo input : inputs) {
     62             comparatorTester.addComparableGroup(input);
     63         }
     64         comparatorTester.test();
     65     }
     66 
     67     @Test
     68     public void testHardwareInputComparatorHdmi() {
     69         ResolveInfo resolveInfo = TestUtils.createResolveInfo("test", "test");
     70 
     71         TvInputInfo hdmi1 = createTvInputInfo(resolveInfo, "HDMI1", null, TvInputInfo.TYPE_HDMI,
     72                 true, "HDMI1", null, false);
     73         TvInputInfo hdmi2 = createTvInputInfo(resolveInfo, "HDMI2", null, TvInputInfo.TYPE_HDMI,
     74                 true, "HDMI2", "DVD", false);
     75         TvInputInfo hdmi3 = createTvInputInfo(resolveInfo, "HDMI3", null, TvInputInfo.TYPE_HDMI,
     76                 true, "HDMI3", "Cable", false);
     77         TvInputInfo hdmi4 = createTvInputInfo(resolveInfo, "HDMI4", null, TvInputInfo.TYPE_HDMI,
     78                 true, "HDMI4", null, false);
     79 
     80         TvInputManagerHelper manager = createMockTvInputManager();
     81 
     82         ComparatorTester<TvInputInfo> comparatorTester = ComparatorTester.withoutEqualsTest(
     83                         new TvInputManagerHelper.HardwareInputComparator(getContext(), manager));
     84         comparatorTester.addComparableGroup(hdmi3)
     85                 .addComparableGroup(hdmi2)
     86                 .addComparableGroup(hdmi1)
     87                 .addComparableGroup(hdmi4)
     88                 .test();
     89     }
     90 
     91     @Test
     92     public void testHardwareInputComparatorCec() {
     93         ResolveInfo resolveInfo = TestUtils.createResolveInfo("test", "test");
     94 
     95         TvInputInfo hdmi1 = createTvInputInfo(resolveInfo, "HDMI1", null, TvInputInfo.TYPE_HDMI,
     96                 true, "HDMI1", null, false);
     97         TvInputInfo hdmi2 = createTvInputInfo(resolveInfo, "HDMI2", null, TvInputInfo.TYPE_HDMI,
     98                 true, "HDMI2", null, false);
     99 
    100         TvInputInfo cec1 = createTvInputInfo(resolveInfo, "2_cec", "HDMI1", TvInputInfo.TYPE_HDMI,
    101                 true, "2_cec", null, false);
    102         TvInputInfo cec2 = createTvInputInfo(resolveInfo, "1_cec", "HDMI2", TvInputInfo.TYPE_HDMI,
    103                 true, "1_cec", null, false);
    104 
    105         TvInputManagerHelper manager = createMockTvInputManager();
    106 
    107         ComparatorTester<TvInputInfo> comparatorTester = ComparatorTester.withoutEqualsTest(
    108                         new TvInputManagerHelper.HardwareInputComparator(getContext(), manager));
    109         comparatorTester.addComparableGroup(cec1)
    110                 .addComparableGroup(cec2)
    111                 .test();
    112     }
    113 
    114     private TvInputManagerHelper createMockTvInputManager() {
    115         TvInputManagerHelper manager = Mockito.mock(TvInputManagerHelper.class);
    116         Mockito.doAnswer(new Answer<Boolean>() {
    117             @Override
    118             public Boolean answer(InvocationOnMock invocation) throws Throwable {
    119                 TvInputInfo info = (TvInputInfo) invocation.getArguments()[0];
    120                 return TEST_INPUT_MAP.get(info.getId()).mIsPartnerInput;
    121             }
    122         }).when(manager).isPartnerInput(Mockito.<TvInputInfo>any());
    123         Mockito.doAnswer(new Answer<String>() {
    124             @Override
    125             public String answer(InvocationOnMock invocation) throws Throwable {
    126                 TvInputInfo info = (TvInputInfo) invocation.getArguments()[0];
    127                 return TEST_INPUT_MAP.get(info.getId()).mLabel;
    128             }
    129         }).when(manager).loadLabel(Mockito.<TvInputInfo>any());
    130         Mockito.doAnswer(new Answer<String>() {
    131             @Override
    132             public String answer(InvocationOnMock invocation) throws Throwable {
    133                 TvInputInfo info = (TvInputInfo) invocation.getArguments()[0];
    134                 return TEST_INPUT_MAP.get(info.getId()).mCustomLabel;
    135             }
    136         }).when(manager).loadCustomLabel(Mockito.<TvInputInfo>any());
    137         Mockito.doAnswer(new Answer<TvInputInfo>() {
    138             @Override
    139             public TvInputInfo answer(InvocationOnMock invocation) throws Throwable {
    140                 String inputId = (String) invocation.getArguments()[0];
    141                 TvInputInfoWrapper inputWrapper = TEST_INPUT_MAP.get(inputId);
    142                 return inputWrapper == null ? null : inputWrapper.mInput;
    143             }
    144         }).when(manager).getTvInputInfo(Mockito.<String>any());
    145         return manager;
    146     }
    147 
    148     private TvInputInfo createTvInputInfo(ResolveInfo service, String id,
    149             String parentId, int type, boolean isHardwareInput, String label, String customLabel,
    150             boolean isPartnerInput) {
    151         TvInputInfoWrapper inputWrapper = new TvInputInfoWrapper();
    152         try {
    153             inputWrapper.mInput =
    154                     TestUtils.createTvInputInfo(service, id, parentId, type, isHardwareInput);
    155         } catch (Exception e) {
    156         }
    157         inputWrapper.mLabel = label;
    158         inputWrapper.mIsPartnerInput = isPartnerInput;
    159         inputWrapper.mCustomLabel = customLabel;
    160         TEST_INPUT_MAP.put(id, inputWrapper);
    161         return inputWrapper.mInput;
    162     }
    163 
    164     private static class TvInputInfoWrapper {
    165         TvInputInfo mInput;
    166         String mLabel;
    167         String mCustomLabel;
    168         boolean mIsPartnerInput;
    169     }
    170 }
    171