TestUtils.java revision 1f52c94781fdc0d8aefbaa697bb8b52e18badcd5
1b085e34beddf631062d0e2503911ef4a33152c06Sergey Vasilinets/* 2b085e34beddf631062d0e2503911ef4a33152c06Sergey Vasilinets * Copyright (C) 2016 The Android Open Source Project 3b085e34beddf631062d0e2503911ef4a33152c06Sergey Vasilinets * 4b085e34beddf631062d0e2503911ef4a33152c06Sergey Vasilinets * Licensed under the Apache License, Version 2.0 (the "License"); 5b085e34beddf631062d0e2503911ef4a33152c06Sergey Vasilinets * you may not use this file except in compliance with the License. 6b085e34beddf631062d0e2503911ef4a33152c06Sergey Vasilinets * You may obtain a copy of the License at 7b085e34beddf631062d0e2503911ef4a33152c06Sergey Vasilinets * 8b085e34beddf631062d0e2503911ef4a33152c06Sergey Vasilinets * http://www.apache.org/licenses/LICENSE-2.0 9b085e34beddf631062d0e2503911ef4a33152c06Sergey Vasilinets * 10b085e34beddf631062d0e2503911ef4a33152c06Sergey Vasilinets * Unless required by applicable law or agreed to in writing, software 11b085e34beddf631062d0e2503911ef4a33152c06Sergey Vasilinets * distributed under the License is distributed on an "AS IS" BASIS, 12b085e34beddf631062d0e2503911ef4a33152c06Sergey Vasilinets * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13b085e34beddf631062d0e2503911ef4a33152c06Sergey Vasilinets * See the License for the specific language governing permissions and 14b085e34beddf631062d0e2503911ef4a33152c06Sergey Vasilinets * limitations under the License. 15b085e34beddf631062d0e2503911ef4a33152c06Sergey Vasilinets */ 16b085e34beddf631062d0e2503911ef4a33152c06Sergey Vasilinets 171f52c94781fdc0d8aefbaa697bb8b52e18badcd5Sergey Vasilinetspackage com.android.support.lifecycle; 18b085e34beddf631062d0e2503911ef4a33152c06Sergey Vasilinets 191f52c94781fdc0d8aefbaa697bb8b52e18badcd5Sergey Vasilinetsimport android.app.Activity; 20b085e34beddf631062d0e2503911ef4a33152c06Sergey Vasilinetsimport android.app.Instrumentation; 21b085e34beddf631062d0e2503911ef4a33152c06Sergey Vasilinetsimport android.app.Instrumentation.ActivityMonitor; 22b085e34beddf631062d0e2503911ef4a33152c06Sergey Vasilinetsimport android.support.test.InstrumentationRegistry; 23b085e34beddf631062d0e2503911ef4a33152c06Sergey Vasilinetsimport android.support.test.rule.UiThreadTestRule; 24b085e34beddf631062d0e2503911ef4a33152c06Sergey Vasilinets 25b085e34beddf631062d0e2503911ef4a33152c06Sergey Vasilinetspublic class TestUtils { 26b085e34beddf631062d0e2503911ef4a33152c06Sergey Vasilinets 27b085e34beddf631062d0e2503911ef4a33152c06Sergey Vasilinets private static final long TIMEOUT_MS = 2000; 28b085e34beddf631062d0e2503911ef4a33152c06Sergey Vasilinets 291f52c94781fdc0d8aefbaa697bb8b52e18badcd5Sergey Vasilinets @SuppressWarnings("unchecked") 301f52c94781fdc0d8aefbaa697bb8b52e18badcd5Sergey Vasilinets public static <T extends Activity> T recreateActivity(final T activity, UiThreadTestRule rule) 31b085e34beddf631062d0e2503911ef4a33152c06Sergey Vasilinets throws Throwable { 32b085e34beddf631062d0e2503911ef4a33152c06Sergey Vasilinets ActivityMonitor monitor = new ActivityMonitor( 331f52c94781fdc0d8aefbaa697bb8b52e18badcd5Sergey Vasilinets activity.getClass().getCanonicalName(), null, false); 34b085e34beddf631062d0e2503911ef4a33152c06Sergey Vasilinets Instrumentation instrumentation = InstrumentationRegistry.getInstrumentation(); 35b085e34beddf631062d0e2503911ef4a33152c06Sergey Vasilinets instrumentation.addMonitor(monitor); 361f52c94781fdc0d8aefbaa697bb8b52e18badcd5Sergey Vasilinets rule.runOnUiThread(activity::recreate); 371f52c94781fdc0d8aefbaa697bb8b52e18badcd5Sergey Vasilinets T result; 38ede4592947eadcab982f71b186dd9debd52e84ccSergey Vasilinets 39ede4592947eadcab982f71b186dd9debd52e84ccSergey Vasilinets // this guarantee that we will reinstall monitor between notifications about onDestroy 40ede4592947eadcab982f71b186dd9debd52e84ccSergey Vasilinets // and onCreate 411f52c94781fdc0d8aefbaa697bb8b52e18badcd5Sergey Vasilinets //noinspection SynchronizationOnLocalVariableOrMethodParameter 42ede4592947eadcab982f71b186dd9debd52e84ccSergey Vasilinets synchronized (monitor) { 43ede4592947eadcab982f71b186dd9debd52e84ccSergey Vasilinets do { 44ede4592947eadcab982f71b186dd9debd52e84ccSergey Vasilinets // the documetation says "Block until an Activity is created 45ede4592947eadcab982f71b186dd9debd52e84ccSergey Vasilinets // that matches this monitor." This statement is true, but there are some other 46ede4592947eadcab982f71b186dd9debd52e84ccSergey Vasilinets // true statements like: "Block until an Activity is destoyed" or 47ede4592947eadcab982f71b186dd9debd52e84ccSergey Vasilinets // "Block until an Activity is resumed"... 48ede4592947eadcab982f71b186dd9debd52e84ccSergey Vasilinets 49ede4592947eadcab982f71b186dd9debd52e84ccSergey Vasilinets // this call will release synchronization monitor's monitor 501f52c94781fdc0d8aefbaa697bb8b52e18badcd5Sergey Vasilinets result = (T) monitor.waitForActivityWithTimeout(TIMEOUT_MS); 51ede4592947eadcab982f71b186dd9debd52e84ccSergey Vasilinets if (result == null) { 52ede4592947eadcab982f71b186dd9debd52e84ccSergey Vasilinets throw new RuntimeException("Timeout. Failed to recreate an activity"); 53ede4592947eadcab982f71b186dd9debd52e84ccSergey Vasilinets } 54ede4592947eadcab982f71b186dd9debd52e84ccSergey Vasilinets } while (result == activity); 55b085e34beddf631062d0e2503911ef4a33152c06Sergey Vasilinets } 56b085e34beddf631062d0e2503911ef4a33152c06Sergey Vasilinets return result; 57b085e34beddf631062d0e2503911ef4a33152c06Sergey Vasilinets } 58b085e34beddf631062d0e2503911ef4a33152c06Sergey Vasilinets} 59