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