11f52c94781fdc0d8aefbaa697bb8b52e18badcd5Sergey Vasilinets/*
21f52c94781fdc0d8aefbaa697bb8b52e18badcd5Sergey Vasilinets * Copyright (C) 2017 The Android Open Source Project
31f52c94781fdc0d8aefbaa697bb8b52e18badcd5Sergey Vasilinets *
41f52c94781fdc0d8aefbaa697bb8b52e18badcd5Sergey Vasilinets * Licensed under the Apache License, Version 2.0 (the "License");
51f52c94781fdc0d8aefbaa697bb8b52e18badcd5Sergey Vasilinets * you may not use this file except in compliance with the License.
61f52c94781fdc0d8aefbaa697bb8b52e18badcd5Sergey Vasilinets * You may obtain a copy of the License at
71f52c94781fdc0d8aefbaa697bb8b52e18badcd5Sergey Vasilinets *
81f52c94781fdc0d8aefbaa697bb8b52e18badcd5Sergey Vasilinets *      http://www.apache.org/licenses/LICENSE-2.0
91f52c94781fdc0d8aefbaa697bb8b52e18badcd5Sergey Vasilinets *
101f52c94781fdc0d8aefbaa697bb8b52e18badcd5Sergey Vasilinets * Unless required by applicable law or agreed to in writing, software
111f52c94781fdc0d8aefbaa697bb8b52e18badcd5Sergey Vasilinets * distributed under the License is distributed on an "AS IS" BASIS,
121f52c94781fdc0d8aefbaa697bb8b52e18badcd5Sergey Vasilinets * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
131f52c94781fdc0d8aefbaa697bb8b52e18badcd5Sergey Vasilinets * See the License for the specific language governing permissions and
141f52c94781fdc0d8aefbaa697bb8b52e18badcd5Sergey Vasilinets * limitations under the License.
151f52c94781fdc0d8aefbaa697bb8b52e18badcd5Sergey Vasilinets */
161f52c94781fdc0d8aefbaa697bb8b52e18badcd5Sergey Vasilinets
1764db0cc15b78b62a1d44a70fc8b4552e660d952cYigit Boyarpackage android.arch.lifecycle;
181f52c94781fdc0d8aefbaa697bb8b52e18badcd5Sergey Vasilinets
1927015a7478beac9e231135207e3e705784cee508Sergey Vasilinetsimport static android.arch.lifecycle.Lifecycle.State.CREATED;
2027015a7478beac9e231135207e3e705784cee508Sergey Vasilinets
211f52c94781fdc0d8aefbaa697bb8b52e18badcd5Sergey Vasilinetsimport static org.hamcrest.MatcherAssert.assertThat;
221f52c94781fdc0d8aefbaa697bb8b52e18badcd5Sergey Vasilinetsimport static org.hamcrest.Matchers.is;
23489ead3c3bb84fbfa12f72015b9e1a1ddd66f11cSergey Vasilinetsimport static org.hamcrest.Matchers.isIn;
241f52c94781fdc0d8aefbaa697bb8b52e18badcd5Sergey Vasilinetsimport static org.hamcrest.Matchers.notNullValue;
251f52c94781fdc0d8aefbaa697bb8b52e18badcd5Sergey Vasilinets
26b86bef286718da421268bc52cf4fab7cccb3104cSergey Vasilinetsimport android.arch.lifecycle.Lifecycle.Event;
2727015a7478beac9e231135207e3e705784cee508Sergey Vasilinetsimport android.arch.lifecycle.Lifecycle.State;
2864db0cc15b78b62a1d44a70fc8b4552e660d952cYigit Boyarimport android.arch.lifecycle.testapp.SimpleAppLifecycleTestActivity;
2964db0cc15b78b62a1d44a70fc8b4552e660d952cYigit Boyarimport android.arch.lifecycle.testapp.SimpleAppLifecycleTestActivity.TestEventType;
301f52c94781fdc0d8aefbaa697bb8b52e18badcd5Sergey Vasilinetsimport android.support.test.filters.LargeTest;
311f52c94781fdc0d8aefbaa697bb8b52e18badcd5Sergey Vasilinetsimport android.support.test.rule.ActivityTestRule;
321f52c94781fdc0d8aefbaa697bb8b52e18badcd5Sergey Vasilinetsimport android.support.test.runner.AndroidJUnit4;
331f52c94781fdc0d8aefbaa697bb8b52e18badcd5Sergey Vasilinetsimport android.util.Pair;
341f52c94781fdc0d8aefbaa697bb8b52e18badcd5Sergey Vasilinets
351f52c94781fdc0d8aefbaa697bb8b52e18badcd5Sergey Vasilinetsimport org.junit.After;
361f52c94781fdc0d8aefbaa697bb8b52e18badcd5Sergey Vasilinetsimport org.junit.Before;
371f52c94781fdc0d8aefbaa697bb8b52e18badcd5Sergey Vasilinetsimport org.junit.Rule;
381f52c94781fdc0d8aefbaa697bb8b52e18badcd5Sergey Vasilinetsimport org.junit.Test;
391f52c94781fdc0d8aefbaa697bb8b52e18badcd5Sergey Vasilinetsimport org.junit.runner.RunWith;
401f52c94781fdc0d8aefbaa697bb8b52e18badcd5Sergey Vasilinets
411f52c94781fdc0d8aefbaa697bb8b52e18badcd5Sergey Vasilinetsimport java.util.List;
421f52c94781fdc0d8aefbaa697bb8b52e18badcd5Sergey Vasilinets
431f52c94781fdc0d8aefbaa697bb8b52e18badcd5Sergey Vasilinets@LargeTest
441f52c94781fdc0d8aefbaa697bb8b52e18badcd5Sergey Vasilinets@RunWith(AndroidJUnit4.class)
451f52c94781fdc0d8aefbaa697bb8b52e18badcd5Sergey Vasilinetspublic class SimpleAppFullLifecycleTest {
461f52c94781fdc0d8aefbaa697bb8b52e18badcd5Sergey Vasilinets
471f52c94781fdc0d8aefbaa697bb8b52e18badcd5Sergey Vasilinets    @SuppressWarnings("unchecked")
48489ead3c3bb84fbfa12f72015b9e1a1ddd66f11cSergey Vasilinets    private static final Pair[] EXPECTED_EVENTS_CONSTRUCTION =
491f52c94781fdc0d8aefbaa697bb8b52e18badcd5Sergey Vasilinets            new Pair[] {
50b86bef286718da421268bc52cf4fab7cccb3104cSergey Vasilinets                new Pair(TestEventType.PROCESS_EVENT, Event.ON_CREATE),
51b86bef286718da421268bc52cf4fab7cccb3104cSergey Vasilinets                new Pair(TestEventType.ACTIVITY_EVENT, Event.ON_CREATE),
52b86bef286718da421268bc52cf4fab7cccb3104cSergey Vasilinets                new Pair(TestEventType.PROCESS_EVENT, Event.ON_START),
53b86bef286718da421268bc52cf4fab7cccb3104cSergey Vasilinets                new Pair(TestEventType.ACTIVITY_EVENT, Event.ON_START),
54b86bef286718da421268bc52cf4fab7cccb3104cSergey Vasilinets                new Pair(TestEventType.PROCESS_EVENT, Event.ON_RESUME),
55b86bef286718da421268bc52cf4fab7cccb3104cSergey Vasilinets                new Pair(TestEventType.ACTIVITY_EVENT, Event.ON_RESUME),
56489ead3c3bb84fbfa12f72015b9e1a1ddd66f11cSergey Vasilinets            };
571f52c94781fdc0d8aefbaa697bb8b52e18badcd5Sergey Vasilinets
58489ead3c3bb84fbfa12f72015b9e1a1ddd66f11cSergey Vasilinets    @SuppressWarnings("unchecked")
59489ead3c3bb84fbfa12f72015b9e1a1ddd66f11cSergey Vasilinets    private static final Pair[] EXPECTED_EVENTS_DESTRUCTION =
60489ead3c3bb84fbfa12f72015b9e1a1ddd66f11cSergey Vasilinets            new Pair[]{
611f52c94781fdc0d8aefbaa697bb8b52e18badcd5Sergey Vasilinets
62b86bef286718da421268bc52cf4fab7cccb3104cSergey Vasilinets                    new Pair(TestEventType.ACTIVITY_EVENT, Event.ON_PAUSE),
63b86bef286718da421268bc52cf4fab7cccb3104cSergey Vasilinets                    new Pair(TestEventType.ACTIVITY_EVENT, Event.ON_STOP),
64b86bef286718da421268bc52cf4fab7cccb3104cSergey Vasilinets                    new Pair(TestEventType.ACTIVITY_EVENT, Event.ON_DESTROY),
651f52c94781fdc0d8aefbaa697bb8b52e18badcd5Sergey Vasilinets
66b86bef286718da421268bc52cf4fab7cccb3104cSergey Vasilinets                    new Pair(TestEventType.PROCESS_EVENT, Event.ON_PAUSE),
67b86bef286718da421268bc52cf4fab7cccb3104cSergey Vasilinets                    new Pair(TestEventType.PROCESS_EVENT, Event.ON_STOP),
68489ead3c3bb84fbfa12f72015b9e1a1ddd66f11cSergey Vasilinets            };
691f52c94781fdc0d8aefbaa697bb8b52e18badcd5Sergey Vasilinets    @Rule
701f52c94781fdc0d8aefbaa697bb8b52e18badcd5Sergey Vasilinets    public ActivityTestRule<SimpleAppLifecycleTestActivity> activityTestRule =
711f52c94781fdc0d8aefbaa697bb8b52e18badcd5Sergey Vasilinets            new ActivityTestRule<>(SimpleAppLifecycleTestActivity.class, false, false);
721f52c94781fdc0d8aefbaa697bb8b52e18badcd5Sergey Vasilinets
731f52c94781fdc0d8aefbaa697bb8b52e18badcd5Sergey Vasilinets    @Before
741f52c94781fdc0d8aefbaa697bb8b52e18badcd5Sergey Vasilinets    public void setup() {
751f52c94781fdc0d8aefbaa697bb8b52e18badcd5Sergey Vasilinets        // cool down period, so application state will become DESTROYED
761f52c94781fdc0d8aefbaa697bb8b52e18badcd5Sergey Vasilinets        try {
77e13540a25fe5460240b6db0e18858c32d16f5399Sergey Vasilinets            Thread.sleep(ProcessLifecycleOwner.TIMEOUT_MS * 2);
781f52c94781fdc0d8aefbaa697bb8b52e18badcd5Sergey Vasilinets        } catch (InterruptedException e) {
791f52c94781fdc0d8aefbaa697bb8b52e18badcd5Sergey Vasilinets            e.printStackTrace();
801f52c94781fdc0d8aefbaa697bb8b52e18badcd5Sergey Vasilinets        }
811f52c94781fdc0d8aefbaa697bb8b52e18badcd5Sergey Vasilinets        SimpleAppLifecycleTestActivity.startProcessObserver();
821f52c94781fdc0d8aefbaa697bb8b52e18badcd5Sergey Vasilinets    }
831f52c94781fdc0d8aefbaa697bb8b52e18badcd5Sergey Vasilinets
841f52c94781fdc0d8aefbaa697bb8b52e18badcd5Sergey Vasilinets    @After
851f52c94781fdc0d8aefbaa697bb8b52e18badcd5Sergey Vasilinets    public void tearDown() {
861f52c94781fdc0d8aefbaa697bb8b52e18badcd5Sergey Vasilinets        SimpleAppLifecycleTestActivity.stopProcessObserver();
871f52c94781fdc0d8aefbaa697bb8b52e18badcd5Sergey Vasilinets    }
881f52c94781fdc0d8aefbaa697bb8b52e18badcd5Sergey Vasilinets
891f52c94781fdc0d8aefbaa697bb8b52e18badcd5Sergey Vasilinets    @Test
901f52c94781fdc0d8aefbaa697bb8b52e18badcd5Sergey Vasilinets    public void testFullLifecycle() throws InterruptedException {
9127015a7478beac9e231135207e3e705784cee508Sergey Vasilinets        State currentState = ProcessLifecycleOwner.get().getLifecycle().getCurrentState();
9227015a7478beac9e231135207e3e705784cee508Sergey Vasilinets        assertThat(currentState, is(CREATED));
931f52c94781fdc0d8aefbaa697bb8b52e18badcd5Sergey Vasilinets        activityTestRule.launchActivity(null);
94b86bef286718da421268bc52cf4fab7cccb3104cSergey Vasilinets        List<Pair<TestEventType, Event>> events = SimpleAppLifecycleTestActivity.awaitForEvents();
951f52c94781fdc0d8aefbaa697bb8b52e18badcd5Sergey Vasilinets        assertThat("Failed to await for events", events, notNullValue());
9662d0ec47ec5df1c9a8244265a61674dbcc1ba055Sergey Vasilinets        //noinspection ConstantConditions
97489ead3c3bb84fbfa12f72015b9e1a1ddd66f11cSergey Vasilinets        assertThat(events.subList(0, 6).toArray(), is(EXPECTED_EVENTS_CONSTRUCTION));
98489ead3c3bb84fbfa12f72015b9e1a1ddd66f11cSergey Vasilinets
99489ead3c3bb84fbfa12f72015b9e1a1ddd66f11cSergey Vasilinets        // TODO: bug 35122523
100b86bef286718da421268bc52cf4fab7cccb3104cSergey Vasilinets        for (Pair<TestEventType, Event> event: events.subList(6, 11)) {
101489ead3c3bb84fbfa12f72015b9e1a1ddd66f11cSergey Vasilinets            assertThat(event, isIn(EXPECTED_EVENTS_DESTRUCTION));
102489ead3c3bb84fbfa12f72015b9e1a1ddd66f11cSergey Vasilinets        }
1031f52c94781fdc0d8aefbaa697bb8b52e18badcd5Sergey Vasilinets    }
1041f52c94781fdc0d8aefbaa697bb8b52e18badcd5Sergey Vasilinets
1051f52c94781fdc0d8aefbaa697bb8b52e18badcd5Sergey Vasilinets}
106