/* * Copyright (C) 2015 The Android Open Source Project * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ package com.android.tv; import static android.support.test.InstrumentationRegistry.getInstrumentation; import android.content.Context; import android.os.SystemClock; import android.support.test.rule.ActivityTestRule; import android.text.TextUtils; import com.android.tv.data.Channel; import com.android.tv.data.ChannelDataManager; import com.android.tv.testing.ChannelInfo; import com.android.tv.testing.testinput.ChannelStateData; import com.android.tv.testing.testinput.TestInputControlConnection; import com.android.tv.testing.testinput.TestInputControlUtils; import com.android.tv.testing.testinput.TvTestInputConstants; import org.junit.Before; import org.junit.Rule; import java.util.List; /** * Base TestCase for tests that need a {@link MainActivity}. */ public abstract class BaseMainActivityTestCase { private static final String TAG = "BaseMainActivityTest"; private static final int CHANNEL_LOADING_CHECK_INTERVAL_MS = 10; @Rule public ActivityTestRule mActivityTestRule = new ActivityTestRule<>(MainActivity.class); protected final TestInputControlConnection mConnection = new TestInputControlConnection(); protected MainActivity mActivity; @Before public void setUp() { mActivity = mActivityTestRule.getActivity(); // TODO: ensure the SampleInputs are setup. getInstrumentation().getTargetContext() .bindService(TestInputControlUtils.createIntent(), mConnection, Context.BIND_AUTO_CREATE); } @Before public void tearDown() { if (mConnection.isBound()) { getInstrumentation().getTargetContext().unbindService(mConnection); } } /** * Tune to {@code channel}. * * @param channel the channel to tune to. */ protected void tuneToChannel(final Channel channel) { // Run on UI thread so views can be modified getInstrumentation().runOnMainSync(new Runnable() { @Override public void run() { mActivity.tuneToChannel(channel); } }); } /** * Sleep until @{@link ChannelDataManager#isDbLoadFinished()} is true. */ protected void waitUntilChannelLoadingFinish() { ChannelDataManager channelDataManager = mActivity.getChannelDataManager(); while (!channelDataManager.isDbLoadFinished()) { getInstrumentation().waitForIdleSync(); SystemClock.sleep(CHANNEL_LOADING_CHECK_INTERVAL_MS); } } /** * Tune to the channel with {@code name}. * * @param name the name of the channel to find. */ protected void tuneToChannel(String name) { Channel c = findChannelWithName(name); tuneToChannel(c); } /** * Tune to channel. */ protected void tuneToChannel(ChannelInfo channel) { tuneToChannel(channel.name); } /** * Update the channel state to {@code data} then tune to that channel. * * @param data the state to update the channel with. * @param channel the channel to tune to */ protected void updateThenTune(ChannelStateData data, ChannelInfo channel) { if (channel.equals(TvTestInputConstants.CH_1_DEFAULT_DONT_MODIFY)) { throw new IllegalArgumentException( "By convention " + TvTestInputConstants.CH_1_DEFAULT_DONT_MODIFY.name + " should not be modified."); } mConnection.updateChannelState(channel, data); tuneToChannel(channel); } private Channel findChannelWithName(String displayName) { waitUntilChannelLoadingFinish(); Channel channel = null; List channelList = mActivity.getChannelDataManager().getChannelList(); for (Channel c : channelList) { if (TextUtils.equals(c.getDisplayName(), displayName)) { channel = c; break; } } if (channel == null) { throw new AssertionError("'" + displayName + "' channel not found"); } return channel; } }