FragmentTransactionTest.java revision 0765353c002bfdf681c982565810aa4be3499dd0
1af556dcfc63652cafa822a3d742ad96c78bff037Clara Bayarri/* 2af556dcfc63652cafa822a3d742ad96c78bff037Clara Bayarri * Copyright (C) 2016 The Android Open Source Project 3af556dcfc63652cafa822a3d742ad96c78bff037Clara Bayarri * 4af556dcfc63652cafa822a3d742ad96c78bff037Clara Bayarri * Licensed under the Apache License, Version 2.0 (the "License"); 5af556dcfc63652cafa822a3d742ad96c78bff037Clara Bayarri * you may not use this file except in compliance with the License. 6af556dcfc63652cafa822a3d742ad96c78bff037Clara Bayarri * You may obtain a copy of the License at 7af556dcfc63652cafa822a3d742ad96c78bff037Clara Bayarri * 8af556dcfc63652cafa822a3d742ad96c78bff037Clara Bayarri * http://www.apache.org/licenses/LICENSE-2.0 9af556dcfc63652cafa822a3d742ad96c78bff037Clara Bayarri * 10af556dcfc63652cafa822a3d742ad96c78bff037Clara Bayarri * Unless required by applicable law or agreed to in writing, software 11af556dcfc63652cafa822a3d742ad96c78bff037Clara Bayarri * distributed under the License is distributed on an "AS IS" BASIS, 12af556dcfc63652cafa822a3d742ad96c78bff037Clara Bayarri * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13af556dcfc63652cafa822a3d742ad96c78bff037Clara Bayarri * See the License for the specific language governing permissions and 14af556dcfc63652cafa822a3d742ad96c78bff037Clara Bayarri * limitations under the License. 15af556dcfc63652cafa822a3d742ad96c78bff037Clara Bayarri */ 16af556dcfc63652cafa822a3d742ad96c78bff037Clara Bayarripackage android.support.v4.app; 17af556dcfc63652cafa822a3d742ad96c78bff037Clara Bayarri 18af556dcfc63652cafa822a3d742ad96c78bff037Clara Bayarriimport static junit.framework.TestCase.assertFalse; 19af556dcfc63652cafa822a3d742ad96c78bff037Clara Bayarriimport static junit.framework.TestCase.assertTrue; 20af556dcfc63652cafa822a3d742ad96c78bff037Clara Bayarri 210765353c002bfdf681c982565810aa4be3499dd0George Mountimport static org.junit.Assert.assertEquals; 220765353c002bfdf681c982565810aa4be3499dd0George Mount 230765353c002bfdf681c982565810aa4be3499dd0George Mountimport android.app.Activity; 240765353c002bfdf681c982565810aa4be3499dd0George Mountimport android.app.Instrumentation; 250765353c002bfdf681c982565810aa4be3499dd0George Mountimport android.content.Intent; 2696221034e4a23a2abb83f772a0281bb197ac5ac0George Mountimport android.os.SystemClock; 27af556dcfc63652cafa822a3d742ad96c78bff037Clara Bayarriimport android.support.fragment.test.R; 28af556dcfc63652cafa822a3d742ad96c78bff037Clara Bayarriimport android.support.test.InstrumentationRegistry; 29754cb29c50f09a83251dd4bb633ba445b2411adbAurimas Liutikasimport android.support.test.filters.MediumTest; 30af556dcfc63652cafa822a3d742ad96c78bff037Clara Bayarriimport android.support.test.rule.ActivityTestRule; 31af556dcfc63652cafa822a3d742ad96c78bff037Clara Bayarriimport android.support.test.runner.AndroidJUnit4; 32af556dcfc63652cafa822a3d742ad96c78bff037Clara Bayarriimport android.support.v4.app.test.FragmentTestActivity; 330765353c002bfdf681c982565810aa4be3499dd0George Mountimport android.support.v4.app.test.NewIntentActivity; 34af556dcfc63652cafa822a3d742ad96c78bff037Clara Bayarri 35af556dcfc63652cafa822a3d742ad96c78bff037Clara Bayarriimport org.junit.Before; 36af556dcfc63652cafa822a3d742ad96c78bff037Clara Bayarriimport org.junit.Rule; 37af556dcfc63652cafa822a3d742ad96c78bff037Clara Bayarriimport org.junit.Test; 38af556dcfc63652cafa822a3d742ad96c78bff037Clara Bayarriimport org.junit.runner.RunWith; 39af556dcfc63652cafa822a3d742ad96c78bff037Clara Bayarri 400765353c002bfdf681c982565810aa4be3499dd0George Mountimport java.util.concurrent.TimeUnit; 410765353c002bfdf681c982565810aa4be3499dd0George Mount 42af556dcfc63652cafa822a3d742ad96c78bff037Clara Bayarri/** 43af556dcfc63652cafa822a3d742ad96c78bff037Clara Bayarri * Tests usage of the {@link FragmentTransaction} class. 44af556dcfc63652cafa822a3d742ad96c78bff037Clara Bayarri */ 45754cb29c50f09a83251dd4bb633ba445b2411adbAurimas Liutikas@MediumTest 46af556dcfc63652cafa822a3d742ad96c78bff037Clara Bayarri@RunWith(AndroidJUnit4.class) 47af556dcfc63652cafa822a3d742ad96c78bff037Clara Bayarripublic class FragmentTransactionTest { 48af556dcfc63652cafa822a3d742ad96c78bff037Clara Bayarri 49af556dcfc63652cafa822a3d742ad96c78bff037Clara Bayarri @Rule 50af556dcfc63652cafa822a3d742ad96c78bff037Clara Bayarri public ActivityTestRule<FragmentTestActivity> mActivityRule = 51af556dcfc63652cafa822a3d742ad96c78bff037Clara Bayarri new ActivityTestRule<>(FragmentTestActivity.class); 52af556dcfc63652cafa822a3d742ad96c78bff037Clara Bayarri 53af556dcfc63652cafa822a3d742ad96c78bff037Clara Bayarri private FragmentTestActivity mActivity; 54af556dcfc63652cafa822a3d742ad96c78bff037Clara Bayarri 55af556dcfc63652cafa822a3d742ad96c78bff037Clara Bayarri @Before 56af556dcfc63652cafa822a3d742ad96c78bff037Clara Bayarri public void setUp() { 57af556dcfc63652cafa822a3d742ad96c78bff037Clara Bayarri mActivity = mActivityRule.getActivity(); 58af556dcfc63652cafa822a3d742ad96c78bff037Clara Bayarri } 59af556dcfc63652cafa822a3d742ad96c78bff037Clara Bayarri 60af556dcfc63652cafa822a3d742ad96c78bff037Clara Bayarri @Test 61c90b24ff959edb955ff48e345c074a98368a90adAurimas Liutikas public void testAddTransactionWithValidFragment() throws Throwable { 62af556dcfc63652cafa822a3d742ad96c78bff037Clara Bayarri final Fragment fragment = new CorrectFragment(); 63c90b24ff959edb955ff48e345c074a98368a90adAurimas Liutikas mActivityRule.runOnUiThread(new Runnable() { 64af556dcfc63652cafa822a3d742ad96c78bff037Clara Bayarri @Override 65af556dcfc63652cafa822a3d742ad96c78bff037Clara Bayarri public void run() { 66af556dcfc63652cafa822a3d742ad96c78bff037Clara Bayarri mActivity.getSupportFragmentManager().beginTransaction() 67af556dcfc63652cafa822a3d742ad96c78bff037Clara Bayarri .add(R.id.content, fragment) 68af556dcfc63652cafa822a3d742ad96c78bff037Clara Bayarri .addToBackStack(null) 69af556dcfc63652cafa822a3d742ad96c78bff037Clara Bayarri .commit(); 70af556dcfc63652cafa822a3d742ad96c78bff037Clara Bayarri mActivity.getSupportFragmentManager().executePendingTransactions(); 71af556dcfc63652cafa822a3d742ad96c78bff037Clara Bayarri } 72af556dcfc63652cafa822a3d742ad96c78bff037Clara Bayarri }); 73af556dcfc63652cafa822a3d742ad96c78bff037Clara Bayarri InstrumentationRegistry.getInstrumentation().waitForIdleSync(); 74af556dcfc63652cafa822a3d742ad96c78bff037Clara Bayarri assertTrue(fragment.isAdded()); 75af556dcfc63652cafa822a3d742ad96c78bff037Clara Bayarri } 76af556dcfc63652cafa822a3d742ad96c78bff037Clara Bayarri 77af556dcfc63652cafa822a3d742ad96c78bff037Clara Bayarri @Test 78c90b24ff959edb955ff48e345c074a98368a90adAurimas Liutikas public void testAddTransactionWithPrivateFragment() throws Throwable { 79af556dcfc63652cafa822a3d742ad96c78bff037Clara Bayarri final Fragment fragment = new PrivateFragment(); 80c90b24ff959edb955ff48e345c074a98368a90adAurimas Liutikas mActivityRule.runOnUiThread(new Runnable() { 81af556dcfc63652cafa822a3d742ad96c78bff037Clara Bayarri @Override 82af556dcfc63652cafa822a3d742ad96c78bff037Clara Bayarri public void run() { 83af556dcfc63652cafa822a3d742ad96c78bff037Clara Bayarri boolean exceptionThrown = false; 84af556dcfc63652cafa822a3d742ad96c78bff037Clara Bayarri try { 85af556dcfc63652cafa822a3d742ad96c78bff037Clara Bayarri mActivity.getSupportFragmentManager().beginTransaction() 86af556dcfc63652cafa822a3d742ad96c78bff037Clara Bayarri .add(R.id.content, fragment) 87af556dcfc63652cafa822a3d742ad96c78bff037Clara Bayarri .addToBackStack(null) 88af556dcfc63652cafa822a3d742ad96c78bff037Clara Bayarri .commit(); 89af556dcfc63652cafa822a3d742ad96c78bff037Clara Bayarri mActivity.getSupportFragmentManager().executePendingTransactions(); 90af556dcfc63652cafa822a3d742ad96c78bff037Clara Bayarri } catch (IllegalStateException e) { 91af556dcfc63652cafa822a3d742ad96c78bff037Clara Bayarri exceptionThrown = true; 92af556dcfc63652cafa822a3d742ad96c78bff037Clara Bayarri } finally { 93af556dcfc63652cafa822a3d742ad96c78bff037Clara Bayarri assertTrue("Exception should be thrown", exceptionThrown); 94af556dcfc63652cafa822a3d742ad96c78bff037Clara Bayarri assertFalse("Fragment shouldn't be added", fragment.isAdded()); 95af556dcfc63652cafa822a3d742ad96c78bff037Clara Bayarri } 96af556dcfc63652cafa822a3d742ad96c78bff037Clara Bayarri } 97af556dcfc63652cafa822a3d742ad96c78bff037Clara Bayarri }); 98af556dcfc63652cafa822a3d742ad96c78bff037Clara Bayarri InstrumentationRegistry.getInstrumentation().waitForIdleSync(); 99af556dcfc63652cafa822a3d742ad96c78bff037Clara Bayarri } 100af556dcfc63652cafa822a3d742ad96c78bff037Clara Bayarri 101af556dcfc63652cafa822a3d742ad96c78bff037Clara Bayarri @Test 102c90b24ff959edb955ff48e345c074a98368a90adAurimas Liutikas public void testAddTransactionWithPackagePrivateFragment() throws Throwable { 103af556dcfc63652cafa822a3d742ad96c78bff037Clara Bayarri final Fragment fragment = new PackagePrivateFragment(); 104c90b24ff959edb955ff48e345c074a98368a90adAurimas Liutikas mActivityRule.runOnUiThread(new Runnable() { 105af556dcfc63652cafa822a3d742ad96c78bff037Clara Bayarri @Override 106af556dcfc63652cafa822a3d742ad96c78bff037Clara Bayarri public void run() { 107af556dcfc63652cafa822a3d742ad96c78bff037Clara Bayarri boolean exceptionThrown = false; 108af556dcfc63652cafa822a3d742ad96c78bff037Clara Bayarri try { 109af556dcfc63652cafa822a3d742ad96c78bff037Clara Bayarri mActivity.getSupportFragmentManager().beginTransaction() 110af556dcfc63652cafa822a3d742ad96c78bff037Clara Bayarri .add(R.id.content, fragment) 111af556dcfc63652cafa822a3d742ad96c78bff037Clara Bayarri .addToBackStack(null) 112af556dcfc63652cafa822a3d742ad96c78bff037Clara Bayarri .commit(); 113af556dcfc63652cafa822a3d742ad96c78bff037Clara Bayarri mActivity.getSupportFragmentManager().executePendingTransactions(); 114af556dcfc63652cafa822a3d742ad96c78bff037Clara Bayarri } catch (IllegalStateException e) { 115af556dcfc63652cafa822a3d742ad96c78bff037Clara Bayarri exceptionThrown = true; 116af556dcfc63652cafa822a3d742ad96c78bff037Clara Bayarri } finally { 117af556dcfc63652cafa822a3d742ad96c78bff037Clara Bayarri assertTrue("Exception should be thrown", exceptionThrown); 118af556dcfc63652cafa822a3d742ad96c78bff037Clara Bayarri assertFalse("Fragment shouldn't be added", fragment.isAdded()); 119af556dcfc63652cafa822a3d742ad96c78bff037Clara Bayarri } 120af556dcfc63652cafa822a3d742ad96c78bff037Clara Bayarri } 121af556dcfc63652cafa822a3d742ad96c78bff037Clara Bayarri }); 122af556dcfc63652cafa822a3d742ad96c78bff037Clara Bayarri InstrumentationRegistry.getInstrumentation().waitForIdleSync(); 123af556dcfc63652cafa822a3d742ad96c78bff037Clara Bayarri } 124af556dcfc63652cafa822a3d742ad96c78bff037Clara Bayarri 125af556dcfc63652cafa822a3d742ad96c78bff037Clara Bayarri @Test 126c90b24ff959edb955ff48e345c074a98368a90adAurimas Liutikas public void testAddTransactionWithAnonymousFragment() throws Throwable { 127af556dcfc63652cafa822a3d742ad96c78bff037Clara Bayarri final Fragment fragment = new Fragment() {}; 128c90b24ff959edb955ff48e345c074a98368a90adAurimas Liutikas mActivityRule.runOnUiThread(new Runnable() { 129af556dcfc63652cafa822a3d742ad96c78bff037Clara Bayarri @Override 130af556dcfc63652cafa822a3d742ad96c78bff037Clara Bayarri public void run() { 131af556dcfc63652cafa822a3d742ad96c78bff037Clara Bayarri boolean exceptionThrown = false; 132af556dcfc63652cafa822a3d742ad96c78bff037Clara Bayarri try { 133af556dcfc63652cafa822a3d742ad96c78bff037Clara Bayarri mActivity.getSupportFragmentManager().beginTransaction() 134af556dcfc63652cafa822a3d742ad96c78bff037Clara Bayarri .add(R.id.content, fragment) 135af556dcfc63652cafa822a3d742ad96c78bff037Clara Bayarri .addToBackStack(null) 136af556dcfc63652cafa822a3d742ad96c78bff037Clara Bayarri .commit(); 137af556dcfc63652cafa822a3d742ad96c78bff037Clara Bayarri mActivity.getSupportFragmentManager().executePendingTransactions(); 138af556dcfc63652cafa822a3d742ad96c78bff037Clara Bayarri } catch (IllegalStateException e) { 139af556dcfc63652cafa822a3d742ad96c78bff037Clara Bayarri exceptionThrown = true; 140af556dcfc63652cafa822a3d742ad96c78bff037Clara Bayarri } finally { 141af556dcfc63652cafa822a3d742ad96c78bff037Clara Bayarri assertTrue("Exception should be thrown", exceptionThrown); 142af556dcfc63652cafa822a3d742ad96c78bff037Clara Bayarri assertFalse("Fragment shouldn't be added", fragment.isAdded()); 143af556dcfc63652cafa822a3d742ad96c78bff037Clara Bayarri } 144af556dcfc63652cafa822a3d742ad96c78bff037Clara Bayarri } 145af556dcfc63652cafa822a3d742ad96c78bff037Clara Bayarri }); 146af556dcfc63652cafa822a3d742ad96c78bff037Clara Bayarri InstrumentationRegistry.getInstrumentation().waitForIdleSync(); 147af556dcfc63652cafa822a3d742ad96c78bff037Clara Bayarri } 148af556dcfc63652cafa822a3d742ad96c78bff037Clara Bayarri 149af556dcfc63652cafa822a3d742ad96c78bff037Clara Bayarri @Test 150c90b24ff959edb955ff48e345c074a98368a90adAurimas Liutikas public void testAddTransactionWithNonStaticFragment() throws Throwable { 151af556dcfc63652cafa822a3d742ad96c78bff037Clara Bayarri final Fragment fragment = new NonStaticFragment(); 152c90b24ff959edb955ff48e345c074a98368a90adAurimas Liutikas mActivityRule.runOnUiThread(new Runnable() { 153af556dcfc63652cafa822a3d742ad96c78bff037Clara Bayarri @Override 154af556dcfc63652cafa822a3d742ad96c78bff037Clara Bayarri public void run() { 155af556dcfc63652cafa822a3d742ad96c78bff037Clara Bayarri boolean exceptionThrown = false; 156af556dcfc63652cafa822a3d742ad96c78bff037Clara Bayarri try { 157af556dcfc63652cafa822a3d742ad96c78bff037Clara Bayarri mActivity.getSupportFragmentManager().beginTransaction() 158af556dcfc63652cafa822a3d742ad96c78bff037Clara Bayarri .add(R.id.content, fragment) 159af556dcfc63652cafa822a3d742ad96c78bff037Clara Bayarri .addToBackStack(null) 160af556dcfc63652cafa822a3d742ad96c78bff037Clara Bayarri .commit(); 161af556dcfc63652cafa822a3d742ad96c78bff037Clara Bayarri mActivity.getSupportFragmentManager().executePendingTransactions(); 162af556dcfc63652cafa822a3d742ad96c78bff037Clara Bayarri } catch (IllegalStateException e) { 163af556dcfc63652cafa822a3d742ad96c78bff037Clara Bayarri exceptionThrown = true; 164af556dcfc63652cafa822a3d742ad96c78bff037Clara Bayarri } finally { 165af556dcfc63652cafa822a3d742ad96c78bff037Clara Bayarri assertTrue("Exception should be thrown", exceptionThrown); 166af556dcfc63652cafa822a3d742ad96c78bff037Clara Bayarri assertFalse("Fragment shouldn't be added", fragment.isAdded()); 167af556dcfc63652cafa822a3d742ad96c78bff037Clara Bayarri } 168af556dcfc63652cafa822a3d742ad96c78bff037Clara Bayarri } 169af556dcfc63652cafa822a3d742ad96c78bff037Clara Bayarri }); 170af556dcfc63652cafa822a3d742ad96c78bff037Clara Bayarri InstrumentationRegistry.getInstrumentation().waitForIdleSync(); 171af556dcfc63652cafa822a3d742ad96c78bff037Clara Bayarri } 172af556dcfc63652cafa822a3d742ad96c78bff037Clara Bayarri 1730765353c002bfdf681c982565810aa4be3499dd0George Mount /** 1740765353c002bfdf681c982565810aa4be3499dd0George Mount * onNewIntent() should note that the state is not saved so that child fragment 1750765353c002bfdf681c982565810aa4be3499dd0George Mount * managers can execute transactions. 1760765353c002bfdf681c982565810aa4be3499dd0George Mount */ 1770765353c002bfdf681c982565810aa4be3499dd0George Mount @Test 1780765353c002bfdf681c982565810aa4be3499dd0George Mount public void newIntentUnlocks() throws Throwable { 1790765353c002bfdf681c982565810aa4be3499dd0George Mount Instrumentation instrumentation = InstrumentationRegistry.getInstrumentation(); 1800765353c002bfdf681c982565810aa4be3499dd0George Mount Intent intent1 = new Intent(mActivity, NewIntentActivity.class) 1810765353c002bfdf681c982565810aa4be3499dd0George Mount .setFlags(Intent.FLAG_ACTIVITY_NEW_TASK); 1820765353c002bfdf681c982565810aa4be3499dd0George Mount NewIntentActivity newIntentActivity = 1830765353c002bfdf681c982565810aa4be3499dd0George Mount (NewIntentActivity) instrumentation.startActivitySync(intent1); 1840765353c002bfdf681c982565810aa4be3499dd0George Mount FragmentTestUtil.waitForExecution(mActivityRule); 1850765353c002bfdf681c982565810aa4be3499dd0George Mount 1860765353c002bfdf681c982565810aa4be3499dd0George Mount Intent intent2 = new Intent(mActivity, FragmentTestActivity.class); 1870765353c002bfdf681c982565810aa4be3499dd0George Mount intent2.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK); 1880765353c002bfdf681c982565810aa4be3499dd0George Mount Activity coveringActivity = instrumentation.startActivitySync(intent2); 1890765353c002bfdf681c982565810aa4be3499dd0George Mount FragmentTestUtil.waitForExecution(mActivityRule); 1900765353c002bfdf681c982565810aa4be3499dd0George Mount 1910765353c002bfdf681c982565810aa4be3499dd0George Mount Intent intent3 = new Intent(mActivity, NewIntentActivity.class) 1920765353c002bfdf681c982565810aa4be3499dd0George Mount .setFlags(Intent.FLAG_ACTIVITY_NEW_TASK); 1930765353c002bfdf681c982565810aa4be3499dd0George Mount mActivity.startActivity(intent3); 1940765353c002bfdf681c982565810aa4be3499dd0George Mount assertTrue(newIntentActivity.newIntent.await(1, TimeUnit.SECONDS)); 1950765353c002bfdf681c982565810aa4be3499dd0George Mount FragmentTestUtil.waitForExecution(mActivityRule); 1960765353c002bfdf681c982565810aa4be3499dd0George Mount 1970765353c002bfdf681c982565810aa4be3499dd0George Mount for (Fragment fragment : newIntentActivity.getSupportFragmentManager().getFragments()) { 1980765353c002bfdf681c982565810aa4be3499dd0George Mount // There really should only be one fragment in newIntentActivity. 1990765353c002bfdf681c982565810aa4be3499dd0George Mount assertEquals(1, fragment.getChildFragmentManager().getFragments().size()); 2000765353c002bfdf681c982565810aa4be3499dd0George Mount } 2010765353c002bfdf681c982565810aa4be3499dd0George Mount } 2020765353c002bfdf681c982565810aa4be3499dd0George Mount 20396221034e4a23a2abb83f772a0281bb197ac5ac0George Mount private void getFragmentsUntilSize(int expectedSize) { 20496221034e4a23a2abb83f772a0281bb197ac5ac0George Mount final long endTime = SystemClock.uptimeMillis() + 3000; 20596221034e4a23a2abb83f772a0281bb197ac5ac0George Mount 20696221034e4a23a2abb83f772a0281bb197ac5ac0George Mount do { 20796221034e4a23a2abb83f772a0281bb197ac5ac0George Mount assertTrue(SystemClock.uptimeMillis() < endTime); 20896221034e4a23a2abb83f772a0281bb197ac5ac0George Mount } while (mActivity.getSupportFragmentManager().getFragments().size() != expectedSize); 20996221034e4a23a2abb83f772a0281bb197ac5ac0George Mount } 21096221034e4a23a2abb83f772a0281bb197ac5ac0George Mount 211af556dcfc63652cafa822a3d742ad96c78bff037Clara Bayarri public static class CorrectFragment extends Fragment {} 212af556dcfc63652cafa822a3d742ad96c78bff037Clara Bayarri 213af556dcfc63652cafa822a3d742ad96c78bff037Clara Bayarri private static class PrivateFragment extends Fragment {} 214af556dcfc63652cafa822a3d742ad96c78bff037Clara Bayarri 215af556dcfc63652cafa822a3d742ad96c78bff037Clara Bayarri static class PackagePrivateFragment extends Fragment {} 216af556dcfc63652cafa822a3d742ad96c78bff037Clara Bayarri 217af556dcfc63652cafa822a3d742ad96c78bff037Clara Bayarri private class NonStaticFragment extends Fragment {} 218af556dcfc63652cafa822a3d742ad96c78bff037Clara Bayarri} 219