BaseMainActivityTestCase.java revision 07b043dc3db83d6d20f0e8513b946830ab00e37b
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 18816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalkoimport android.content.Context; 19816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalkoimport android.os.SystemClock; 20816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalkoimport android.test.ActivityInstrumentationTestCase2; 21816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko 22816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalkoimport com.android.tv.data.Channel; 23816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalkoimport com.android.tv.data.ChannelDataManager; 24816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalkoimport com.android.tv.testing.ChannelInfo; 25816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalkoimport com.android.tv.testing.testinput.ChannelStateData; 26816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalkoimport com.android.tv.testing.testinput.TestInputControlConnection; 27816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalkoimport com.android.tv.testing.testinput.TestInputControlUtils; 2807b043dc3db83d6d20f0e8513b946830ab00e37bNick Chalkoimport com.android.tv.testing.testinput.TvTestInputConstants; 29816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko 30816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalkoimport java.util.List; 31816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko 32816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko/** 33816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko * Base TestCase for tests that need a {@link MainActivity}. 34816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko */ 35816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalkopublic abstract class BaseMainActivityTestCase 36816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko extends ActivityInstrumentationTestCase2<MainActivity> { 37816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko private static final String TAG = "BaseMainActivityTest"; 38816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko private static final int CHANNEL_LOADING_CHECK_INTERVAL_MS = 10; 39816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko 40816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko protected final TestInputControlConnection mConnection = new TestInputControlConnection(); 41816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko 42816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko protected MainActivity mActivity; 43816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko 44816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko public BaseMainActivityTestCase(Class<MainActivity> activityClass) { 45816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko super(activityClass); 46816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko } 47816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko 48816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko @Override 49816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko protected void setUp() throws Exception { 50816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko super.setUp(); 51816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko // TODO: ensure the SampleInputs are setup. 52816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko setActivityInitialTouchMode(false); 53816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko mActivity = getActivity(); 54816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko getInstrumentation().getContext() 55816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko .bindService(TestInputControlUtils.createIntent(), mConnection, 56816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko Context.BIND_AUTO_CREATE); 57816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko } 58816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko 59816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko @Override 60816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko protected void tearDown() throws Exception { 61816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko if (mConnection.isBound()) { 62816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko getInstrumentation().getContext().unbindService(mConnection); 63816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko } 64816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko super.tearDown(); 65816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko } 66816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko 67816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko /** 68816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko * Tune to {@code channel}. 69816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko * 70816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko * @param channel the channel to tune to. 71816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko */ 72816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko protected void tuneToChannel(final Channel channel) { 73816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko // Run on UI thread so views can be modified 74816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko try { 75816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko runTestOnUiThread(new Runnable() { 76816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko @Override 77816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko public void run() { 78816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko mActivity.tuneToChannel(channel); 79816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko } 80816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko }); 81816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko } catch (Throwable throwable) { 82816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko throw new RuntimeException(throwable); 83816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko } 84816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko } 85816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko 86816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko /** 87816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko * Sleep until @{@link ChannelDataManager#isDbLoadFinished()} is true. 88816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko */ 89816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko protected void waitUntilChannelLoadingFinish() { 90816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko ChannelDataManager channelDataManager = mActivity.getChannelDataManager(); 91816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko while (!channelDataManager.isDbLoadFinished()) { 92816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko getInstrumentation().waitForIdleSync(); 93816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko SystemClock.sleep(CHANNEL_LOADING_CHECK_INTERVAL_MS); 94816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko } 95816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko } 96816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko 97816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko /** 98816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko * Tune to the channel with {@code name}. 99816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko * 100816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko * @param name the name of the channel to find. 101816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko */ 102816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko protected void tuneToChannel(String name) { 103816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko Channel c = findChannelWithName(name); 104816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko tuneToChannel(c); 105816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko } 106816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko 107816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko /** 108816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko * Tune to channel. 109816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko */ 110816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko protected void tuneToChannel(ChannelInfo channel) { 111816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko tuneToChannel(channel.name); 112816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko } 113816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko 114816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko /** 115816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko * Update the channel state to {@code data} then tune to that channel. 116816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko * 117816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko * @param data the state to update the channel with. 118816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko * @param channel the channel to tune to 119816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko */ 120816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko protected void updateThenTune(ChannelStateData data, ChannelInfo channel) { 12107b043dc3db83d6d20f0e8513b946830ab00e37bNick Chalko if (channel.equals(TvTestInputConstants.CH_1_DEFAULT_DONT_MODIFY)) { 12207b043dc3db83d6d20f0e8513b946830ab00e37bNick Chalko throw new IllegalArgumentException( 12307b043dc3db83d6d20f0e8513b946830ab00e37bNick Chalko "By convention " + TvTestInputConstants.CH_1_DEFAULT_DONT_MODIFY.name 12407b043dc3db83d6d20f0e8513b946830ab00e37bNick Chalko + " should not be modified."); 12507b043dc3db83d6d20f0e8513b946830ab00e37bNick Chalko } 126816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko mConnection.updateChannelState(channel, data); 127816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko tuneToChannel(channel); 128816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko } 129816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko 130816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko private Channel findChannelWithName(String displayName) { 131816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko waitUntilChannelLoadingFinish(); 132816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko List<Channel> channelList = mActivity.getChannelDataManager().getChannelList(); 133816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko for (Channel c : channelList) { 134816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko if (c.getDisplayName().equals(displayName)) { 135816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko return c; 136816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko } 137816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko } 138816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko throw new AssertionError("'" + displayName + "' channel not found"); 139816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko } 140816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko 141816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko} 142