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