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