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 Chalkopackage com.android.tv; 17816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko 186ebde20b03db4c0d57f67acaac11832b610b966bNick Chalkoimport static android.support.test.InstrumentationRegistry.getInstrumentation; 196ebde20b03db4c0d57f67acaac11832b610b966bNick Chalko 20816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalkoimport android.content.Context; 21816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalkoimport android.os.SystemClock; 226ebde20b03db4c0d57f67acaac11832b610b966bNick Chalkoimport android.support.test.rule.ActivityTestRule; 237d67089aa1e9aa2123c3cd2f386d7019a1544db1Nick Chalkoimport android.text.TextUtils; 24816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko 25816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalkoimport com.android.tv.data.Channel; 26816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalkoimport com.android.tv.data.ChannelDataManager; 27816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalkoimport com.android.tv.testing.ChannelInfo; 28816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalkoimport com.android.tv.testing.testinput.ChannelStateData; 29816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalkoimport com.android.tv.testing.testinput.TestInputControlConnection; 30816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalkoimport com.android.tv.testing.testinput.TestInputControlUtils; 3107b043dc3db83d6d20f0e8513b946830ab00e37bNick Chalkoimport com.android.tv.testing.testinput.TvTestInputConstants; 32816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko 336ebde20b03db4c0d57f67acaac11832b610b966bNick Chalkoimport org.junit.Before; 346ebde20b03db4c0d57f67acaac11832b610b966bNick Chalkoimport org.junit.Rule; 356ebde20b03db4c0d57f67acaac11832b610b966bNick Chalko 36816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalkoimport java.util.List; 37816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko 38816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko/** 39816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko * Base TestCase for tests that need a {@link MainActivity}. 40816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko */ 416ebde20b03db4c0d57f67acaac11832b610b966bNick Chalkopublic abstract class BaseMainActivityTestCase { 42816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko private static final String TAG = "BaseMainActivityTest"; 43816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko private static final int CHANNEL_LOADING_CHECK_INTERVAL_MS = 10; 44816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko 456ebde20b03db4c0d57f67acaac11832b610b966bNick Chalko @Rule 466ebde20b03db4c0d57f67acaac11832b610b966bNick Chalko public ActivityTestRule<MainActivity> mActivityTestRule = 476ebde20b03db4c0d57f67acaac11832b610b966bNick Chalko new ActivityTestRule<>(MainActivity.class); 486ebde20b03db4c0d57f67acaac11832b610b966bNick Chalko 49816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko protected final TestInputControlConnection mConnection = new TestInputControlConnection(); 50816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko 51816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko protected MainActivity mActivity; 52816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko 536ebde20b03db4c0d57f67acaac11832b610b966bNick Chalko @Before 546ebde20b03db4c0d57f67acaac11832b610b966bNick Chalko public void setUp() { 556ebde20b03db4c0d57f67acaac11832b610b966bNick Chalko mActivity = mActivityTestRule.getActivity(); 56816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko // TODO: ensure the SampleInputs are setup. 576ebde20b03db4c0d57f67acaac11832b610b966bNick Chalko getInstrumentation().getTargetContext() 58816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko .bindService(TestInputControlUtils.createIntent(), mConnection, 59816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko Context.BIND_AUTO_CREATE); 60816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko } 61816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko 626ebde20b03db4c0d57f67acaac11832b610b966bNick Chalko @Before 636ebde20b03db4c0d57f67acaac11832b610b966bNick Chalko public void tearDown() { 64816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko if (mConnection.isBound()) { 656ebde20b03db4c0d57f67acaac11832b610b966bNick Chalko getInstrumentation().getTargetContext().unbindService(mConnection); 66816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko } 67816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko } 68816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko 69816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko /** 70816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko * Tune to {@code channel}. 71816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko * 72816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko * @param channel the channel to tune to. 73816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko */ 74816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko protected void tuneToChannel(final Channel channel) { 75816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko // Run on UI thread so views can be modified 766ebde20b03db4c0d57f67acaac11832b610b966bNick Chalko getInstrumentation().runOnMainSync(new Runnable() { 776ebde20b03db4c0d57f67acaac11832b610b966bNick Chalko @Override 786ebde20b03db4c0d57f67acaac11832b610b966bNick Chalko public void run() { 796ebde20b03db4c0d57f67acaac11832b610b966bNick Chalko mActivity.tuneToChannel(channel); 806ebde20b03db4c0d57f67acaac11832b610b966bNick Chalko } 816ebde20b03db4c0d57f67acaac11832b610b966bNick Chalko }); 82816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko } 83816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko 84816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko /** 85816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko * Sleep until @{@link ChannelDataManager#isDbLoadFinished()} is true. 86816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko */ 87816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko protected void waitUntilChannelLoadingFinish() { 88816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko ChannelDataManager channelDataManager = mActivity.getChannelDataManager(); 89816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko while (!channelDataManager.isDbLoadFinished()) { 90816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko getInstrumentation().waitForIdleSync(); 91816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko SystemClock.sleep(CHANNEL_LOADING_CHECK_INTERVAL_MS); 92816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko } 93816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko } 94816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko 95816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko /** 96816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko * Tune to the channel with {@code name}. 97816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko * 98816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko * @param name the name of the channel to find. 99816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko */ 100816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko protected void tuneToChannel(String name) { 101816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko Channel c = findChannelWithName(name); 102816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko tuneToChannel(c); 103816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko } 104816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko 105816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko /** 106816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko * Tune to channel. 107816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko */ 108816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko protected void tuneToChannel(ChannelInfo channel) { 109816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko tuneToChannel(channel.name); 110816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko } 111816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko 112816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko /** 113816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko * Update the channel state to {@code data} then tune to that channel. 114816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko * 115816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko * @param data the state to update the channel with. 116816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko * @param channel the channel to tune to 117816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko */ 118816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko protected void updateThenTune(ChannelStateData data, ChannelInfo channel) { 11907b043dc3db83d6d20f0e8513b946830ab00e37bNick Chalko if (channel.equals(TvTestInputConstants.CH_1_DEFAULT_DONT_MODIFY)) { 12007b043dc3db83d6d20f0e8513b946830ab00e37bNick Chalko throw new IllegalArgumentException( 12107b043dc3db83d6d20f0e8513b946830ab00e37bNick Chalko "By convention " + TvTestInputConstants.CH_1_DEFAULT_DONT_MODIFY.name 12207b043dc3db83d6d20f0e8513b946830ab00e37bNick Chalko + " should not be modified."); 12307b043dc3db83d6d20f0e8513b946830ab00e37bNick Chalko } 124816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko mConnection.updateChannelState(channel, data); 125816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko tuneToChannel(channel); 126816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko } 127816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko 128816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko private Channel findChannelWithName(String displayName) { 129816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko waitUntilChannelLoadingFinish(); 1306ebde20b03db4c0d57f67acaac11832b610b966bNick Chalko Channel channel = null; 1316ebde20b03db4c0d57f67acaac11832b610b966bNick Chalko List <Channel> channelList = mActivity.getChannelDataManager().getChannelList(); 132816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko for (Channel c : channelList) { 1337d67089aa1e9aa2123c3cd2f386d7019a1544db1Nick Chalko if (TextUtils.equals(c.getDisplayName(), displayName)) { 1346ebde20b03db4c0d57f67acaac11832b610b966bNick Chalko channel = c; 1356ebde20b03db4c0d57f67acaac11832b610b966bNick Chalko break; 136816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko } 137816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko } 1386ebde20b03db4c0d57f67acaac11832b610b966bNick Chalko if (channel == null) { 1396ebde20b03db4c0d57f67acaac11832b610b966bNick Chalko throw new AssertionError("'" + displayName + "' channel not found"); 1406ebde20b03db4c0d57f67acaac11832b610b966bNick Chalko } 1416ebde20b03db4c0d57f67acaac11832b610b966bNick Chalko return channel; 142816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko } 143816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko} 144