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