FragmentTransactionTest.java revision 43db3168ca4a4d309f059363054ba60bc22a9ef3
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
2196221034e4a23a2abb83f772a0281bb197ac5ac0George Mountimport static org.junit.Assert.assertEquals;
2296221034e4a23a2abb83f772a0281bb197ac5ac0George Mount
2396221034e4a23a2abb83f772a0281bb197ac5ac0George Mountimport android.os.SystemClock;
24af556dcfc63652cafa822a3d742ad96c78bff037Clara Bayarriimport android.support.fragment.test.R;
25af556dcfc63652cafa822a3d742ad96c78bff037Clara Bayarriimport android.support.test.InstrumentationRegistry;
26754cb29c50f09a83251dd4bb633ba445b2411adbAurimas Liutikasimport android.support.test.filters.MediumTest;
27af556dcfc63652cafa822a3d742ad96c78bff037Clara Bayarriimport android.support.test.rule.ActivityTestRule;
28af556dcfc63652cafa822a3d742ad96c78bff037Clara Bayarriimport android.support.test.runner.AndroidJUnit4;
29af556dcfc63652cafa822a3d742ad96c78bff037Clara Bayarriimport android.support.v4.app.test.FragmentTestActivity;
30af556dcfc63652cafa822a3d742ad96c78bff037Clara Bayarri
31af556dcfc63652cafa822a3d742ad96c78bff037Clara Bayarriimport org.junit.Before;
32af556dcfc63652cafa822a3d742ad96c78bff037Clara Bayarriimport org.junit.Rule;
33af556dcfc63652cafa822a3d742ad96c78bff037Clara Bayarriimport org.junit.Test;
34af556dcfc63652cafa822a3d742ad96c78bff037Clara Bayarriimport org.junit.runner.RunWith;
35af556dcfc63652cafa822a3d742ad96c78bff037Clara Bayarri
3643db3168ca4a4d309f059363054ba60bc22a9ef3George Mountimport java.util.Collection;
3796221034e4a23a2abb83f772a0281bb197ac5ac0George Mount
38af556dcfc63652cafa822a3d742ad96c78bff037Clara Bayarri/**
39af556dcfc63652cafa822a3d742ad96c78bff037Clara Bayarri * Tests usage of the {@link FragmentTransaction} class.
40af556dcfc63652cafa822a3d742ad96c78bff037Clara Bayarri */
41754cb29c50f09a83251dd4bb633ba445b2411adbAurimas Liutikas@MediumTest
42af556dcfc63652cafa822a3d742ad96c78bff037Clara Bayarri@RunWith(AndroidJUnit4.class)
43af556dcfc63652cafa822a3d742ad96c78bff037Clara Bayarripublic class FragmentTransactionTest {
44af556dcfc63652cafa822a3d742ad96c78bff037Clara Bayarri
45af556dcfc63652cafa822a3d742ad96c78bff037Clara Bayarri    @Rule
46af556dcfc63652cafa822a3d742ad96c78bff037Clara Bayarri    public ActivityTestRule<FragmentTestActivity> mActivityRule =
47af556dcfc63652cafa822a3d742ad96c78bff037Clara Bayarri            new ActivityTestRule<>(FragmentTestActivity.class);
48af556dcfc63652cafa822a3d742ad96c78bff037Clara Bayarri
49af556dcfc63652cafa822a3d742ad96c78bff037Clara Bayarri    private FragmentTestActivity mActivity;
50af556dcfc63652cafa822a3d742ad96c78bff037Clara Bayarri
51af556dcfc63652cafa822a3d742ad96c78bff037Clara Bayarri    @Before
52af556dcfc63652cafa822a3d742ad96c78bff037Clara Bayarri    public void setUp() {
53af556dcfc63652cafa822a3d742ad96c78bff037Clara Bayarri        mActivity = mActivityRule.getActivity();
54af556dcfc63652cafa822a3d742ad96c78bff037Clara Bayarri    }
55af556dcfc63652cafa822a3d742ad96c78bff037Clara Bayarri
56af556dcfc63652cafa822a3d742ad96c78bff037Clara Bayarri    @Test
57c90b24ff959edb955ff48e345c074a98368a90adAurimas Liutikas    public void testAddTransactionWithValidFragment() throws Throwable {
58af556dcfc63652cafa822a3d742ad96c78bff037Clara Bayarri        final Fragment fragment = new CorrectFragment();
59c90b24ff959edb955ff48e345c074a98368a90adAurimas Liutikas        mActivityRule.runOnUiThread(new Runnable() {
60af556dcfc63652cafa822a3d742ad96c78bff037Clara Bayarri            @Override
61af556dcfc63652cafa822a3d742ad96c78bff037Clara Bayarri            public void run() {
62af556dcfc63652cafa822a3d742ad96c78bff037Clara Bayarri                mActivity.getSupportFragmentManager().beginTransaction()
63af556dcfc63652cafa822a3d742ad96c78bff037Clara Bayarri                        .add(R.id.content, fragment)
64af556dcfc63652cafa822a3d742ad96c78bff037Clara Bayarri                        .addToBackStack(null)
65af556dcfc63652cafa822a3d742ad96c78bff037Clara Bayarri                        .commit();
66af556dcfc63652cafa822a3d742ad96c78bff037Clara Bayarri                mActivity.getSupportFragmentManager().executePendingTransactions();
67af556dcfc63652cafa822a3d742ad96c78bff037Clara Bayarri            }
68af556dcfc63652cafa822a3d742ad96c78bff037Clara Bayarri        });
69af556dcfc63652cafa822a3d742ad96c78bff037Clara Bayarri        InstrumentationRegistry.getInstrumentation().waitForIdleSync();
70af556dcfc63652cafa822a3d742ad96c78bff037Clara Bayarri        assertTrue(fragment.isAdded());
71af556dcfc63652cafa822a3d742ad96c78bff037Clara Bayarri    }
72af556dcfc63652cafa822a3d742ad96c78bff037Clara Bayarri
73af556dcfc63652cafa822a3d742ad96c78bff037Clara Bayarri    @Test
74c90b24ff959edb955ff48e345c074a98368a90adAurimas Liutikas    public void testAddTransactionWithPrivateFragment() throws Throwable {
75af556dcfc63652cafa822a3d742ad96c78bff037Clara Bayarri        final Fragment fragment = new PrivateFragment();
76c90b24ff959edb955ff48e345c074a98368a90adAurimas Liutikas        mActivityRule.runOnUiThread(new Runnable() {
77af556dcfc63652cafa822a3d742ad96c78bff037Clara Bayarri            @Override
78af556dcfc63652cafa822a3d742ad96c78bff037Clara Bayarri            public void run() {
79af556dcfc63652cafa822a3d742ad96c78bff037Clara Bayarri                boolean exceptionThrown = false;
80af556dcfc63652cafa822a3d742ad96c78bff037Clara Bayarri                try {
81af556dcfc63652cafa822a3d742ad96c78bff037Clara Bayarri                    mActivity.getSupportFragmentManager().beginTransaction()
82af556dcfc63652cafa822a3d742ad96c78bff037Clara Bayarri                            .add(R.id.content, fragment)
83af556dcfc63652cafa822a3d742ad96c78bff037Clara Bayarri                            .addToBackStack(null)
84af556dcfc63652cafa822a3d742ad96c78bff037Clara Bayarri                            .commit();
85af556dcfc63652cafa822a3d742ad96c78bff037Clara Bayarri                    mActivity.getSupportFragmentManager().executePendingTransactions();
86af556dcfc63652cafa822a3d742ad96c78bff037Clara Bayarri                } catch (IllegalStateException e) {
87af556dcfc63652cafa822a3d742ad96c78bff037Clara Bayarri                    exceptionThrown = true;
88af556dcfc63652cafa822a3d742ad96c78bff037Clara Bayarri                } finally {
89af556dcfc63652cafa822a3d742ad96c78bff037Clara Bayarri                    assertTrue("Exception should be thrown", exceptionThrown);
90af556dcfc63652cafa822a3d742ad96c78bff037Clara Bayarri                    assertFalse("Fragment shouldn't be added", fragment.isAdded());
91af556dcfc63652cafa822a3d742ad96c78bff037Clara Bayarri                }
92af556dcfc63652cafa822a3d742ad96c78bff037Clara Bayarri            }
93af556dcfc63652cafa822a3d742ad96c78bff037Clara Bayarri        });
94af556dcfc63652cafa822a3d742ad96c78bff037Clara Bayarri        InstrumentationRegistry.getInstrumentation().waitForIdleSync();
95af556dcfc63652cafa822a3d742ad96c78bff037Clara Bayarri    }
96af556dcfc63652cafa822a3d742ad96c78bff037Clara Bayarri
97af556dcfc63652cafa822a3d742ad96c78bff037Clara Bayarri    @Test
98c90b24ff959edb955ff48e345c074a98368a90adAurimas Liutikas    public void testAddTransactionWithPackagePrivateFragment() throws Throwable {
99af556dcfc63652cafa822a3d742ad96c78bff037Clara Bayarri        final Fragment fragment = new PackagePrivateFragment();
100c90b24ff959edb955ff48e345c074a98368a90adAurimas Liutikas        mActivityRule.runOnUiThread(new Runnable() {
101af556dcfc63652cafa822a3d742ad96c78bff037Clara Bayarri            @Override
102af556dcfc63652cafa822a3d742ad96c78bff037Clara Bayarri            public void run() {
103af556dcfc63652cafa822a3d742ad96c78bff037Clara Bayarri                boolean exceptionThrown = false;
104af556dcfc63652cafa822a3d742ad96c78bff037Clara Bayarri                try {
105af556dcfc63652cafa822a3d742ad96c78bff037Clara Bayarri                    mActivity.getSupportFragmentManager().beginTransaction()
106af556dcfc63652cafa822a3d742ad96c78bff037Clara Bayarri                            .add(R.id.content, fragment)
107af556dcfc63652cafa822a3d742ad96c78bff037Clara Bayarri                            .addToBackStack(null)
108af556dcfc63652cafa822a3d742ad96c78bff037Clara Bayarri                            .commit();
109af556dcfc63652cafa822a3d742ad96c78bff037Clara Bayarri                    mActivity.getSupportFragmentManager().executePendingTransactions();
110af556dcfc63652cafa822a3d742ad96c78bff037Clara Bayarri                } catch (IllegalStateException e) {
111af556dcfc63652cafa822a3d742ad96c78bff037Clara Bayarri                    exceptionThrown = true;
112af556dcfc63652cafa822a3d742ad96c78bff037Clara Bayarri                } finally {
113af556dcfc63652cafa822a3d742ad96c78bff037Clara Bayarri                    assertTrue("Exception should be thrown", exceptionThrown);
114af556dcfc63652cafa822a3d742ad96c78bff037Clara Bayarri                    assertFalse("Fragment shouldn't be added", fragment.isAdded());
115af556dcfc63652cafa822a3d742ad96c78bff037Clara Bayarri                }
116af556dcfc63652cafa822a3d742ad96c78bff037Clara Bayarri            }
117af556dcfc63652cafa822a3d742ad96c78bff037Clara Bayarri        });
118af556dcfc63652cafa822a3d742ad96c78bff037Clara Bayarri        InstrumentationRegistry.getInstrumentation().waitForIdleSync();
119af556dcfc63652cafa822a3d742ad96c78bff037Clara Bayarri    }
120af556dcfc63652cafa822a3d742ad96c78bff037Clara Bayarri
121af556dcfc63652cafa822a3d742ad96c78bff037Clara Bayarri    @Test
122c90b24ff959edb955ff48e345c074a98368a90adAurimas Liutikas    public void testAddTransactionWithAnonymousFragment() throws Throwable {
123af556dcfc63652cafa822a3d742ad96c78bff037Clara Bayarri        final Fragment fragment = new Fragment() {};
124c90b24ff959edb955ff48e345c074a98368a90adAurimas Liutikas        mActivityRule.runOnUiThread(new Runnable() {
125af556dcfc63652cafa822a3d742ad96c78bff037Clara Bayarri            @Override
126af556dcfc63652cafa822a3d742ad96c78bff037Clara Bayarri            public void run() {
127af556dcfc63652cafa822a3d742ad96c78bff037Clara Bayarri                boolean exceptionThrown = false;
128af556dcfc63652cafa822a3d742ad96c78bff037Clara Bayarri                try {
129af556dcfc63652cafa822a3d742ad96c78bff037Clara Bayarri                    mActivity.getSupportFragmentManager().beginTransaction()
130af556dcfc63652cafa822a3d742ad96c78bff037Clara Bayarri                            .add(R.id.content, fragment)
131af556dcfc63652cafa822a3d742ad96c78bff037Clara Bayarri                            .addToBackStack(null)
132af556dcfc63652cafa822a3d742ad96c78bff037Clara Bayarri                            .commit();
133af556dcfc63652cafa822a3d742ad96c78bff037Clara Bayarri                    mActivity.getSupportFragmentManager().executePendingTransactions();
134af556dcfc63652cafa822a3d742ad96c78bff037Clara Bayarri                } catch (IllegalStateException e) {
135af556dcfc63652cafa822a3d742ad96c78bff037Clara Bayarri                    exceptionThrown = true;
136af556dcfc63652cafa822a3d742ad96c78bff037Clara Bayarri                } finally {
137af556dcfc63652cafa822a3d742ad96c78bff037Clara Bayarri                    assertTrue("Exception should be thrown", exceptionThrown);
138af556dcfc63652cafa822a3d742ad96c78bff037Clara Bayarri                    assertFalse("Fragment shouldn't be added", fragment.isAdded());
139af556dcfc63652cafa822a3d742ad96c78bff037Clara Bayarri                }
140af556dcfc63652cafa822a3d742ad96c78bff037Clara Bayarri            }
141af556dcfc63652cafa822a3d742ad96c78bff037Clara Bayarri        });
142af556dcfc63652cafa822a3d742ad96c78bff037Clara Bayarri        InstrumentationRegistry.getInstrumentation().waitForIdleSync();
143af556dcfc63652cafa822a3d742ad96c78bff037Clara Bayarri    }
144af556dcfc63652cafa822a3d742ad96c78bff037Clara Bayarri
145af556dcfc63652cafa822a3d742ad96c78bff037Clara Bayarri    @Test
146c90b24ff959edb955ff48e345c074a98368a90adAurimas Liutikas    public void testAddTransactionWithNonStaticFragment() throws Throwable {
147af556dcfc63652cafa822a3d742ad96c78bff037Clara Bayarri        final Fragment fragment = new NonStaticFragment();
148c90b24ff959edb955ff48e345c074a98368a90adAurimas Liutikas        mActivityRule.runOnUiThread(new Runnable() {
149af556dcfc63652cafa822a3d742ad96c78bff037Clara Bayarri            @Override
150af556dcfc63652cafa822a3d742ad96c78bff037Clara Bayarri            public void run() {
151af556dcfc63652cafa822a3d742ad96c78bff037Clara Bayarri                boolean exceptionThrown = false;
152af556dcfc63652cafa822a3d742ad96c78bff037Clara Bayarri                try {
153af556dcfc63652cafa822a3d742ad96c78bff037Clara Bayarri                    mActivity.getSupportFragmentManager().beginTransaction()
154af556dcfc63652cafa822a3d742ad96c78bff037Clara Bayarri                            .add(R.id.content, fragment)
155af556dcfc63652cafa822a3d742ad96c78bff037Clara Bayarri                            .addToBackStack(null)
156af556dcfc63652cafa822a3d742ad96c78bff037Clara Bayarri                            .commit();
157af556dcfc63652cafa822a3d742ad96c78bff037Clara Bayarri                    mActivity.getSupportFragmentManager().executePendingTransactions();
158af556dcfc63652cafa822a3d742ad96c78bff037Clara Bayarri                } catch (IllegalStateException e) {
159af556dcfc63652cafa822a3d742ad96c78bff037Clara Bayarri                    exceptionThrown = true;
160af556dcfc63652cafa822a3d742ad96c78bff037Clara Bayarri                } finally {
161af556dcfc63652cafa822a3d742ad96c78bff037Clara Bayarri                    assertTrue("Exception should be thrown", exceptionThrown);
162af556dcfc63652cafa822a3d742ad96c78bff037Clara Bayarri                    assertFalse("Fragment shouldn't be added", fragment.isAdded());
163af556dcfc63652cafa822a3d742ad96c78bff037Clara Bayarri                }
164af556dcfc63652cafa822a3d742ad96c78bff037Clara Bayarri            }
165af556dcfc63652cafa822a3d742ad96c78bff037Clara Bayarri        });
166af556dcfc63652cafa822a3d742ad96c78bff037Clara Bayarri        InstrumentationRegistry.getInstrumentation().waitForIdleSync();
167af556dcfc63652cafa822a3d742ad96c78bff037Clara Bayarri    }
168af556dcfc63652cafa822a3d742ad96c78bff037Clara Bayarri
16996221034e4a23a2abb83f772a0281bb197ac5ac0George Mount    // Ensure that getFragments() works during transactions, even if it is run off thread
17096221034e4a23a2abb83f772a0281bb197ac5ac0George Mount    @Test
17196221034e4a23a2abb83f772a0281bb197ac5ac0George Mount    public void getFragmentsOffThread() throws Throwable {
17296221034e4a23a2abb83f772a0281bb197ac5ac0George Mount        final FragmentManager fm = mActivity.getSupportFragmentManager();
17396221034e4a23a2abb83f772a0281bb197ac5ac0George Mount
17496221034e4a23a2abb83f772a0281bb197ac5ac0George Mount        // Make sure that adding a fragment works
17596221034e4a23a2abb83f772a0281bb197ac5ac0George Mount        Fragment fragment = new CorrectFragment();
17696221034e4a23a2abb83f772a0281bb197ac5ac0George Mount        fm.beginTransaction()
17796221034e4a23a2abb83f772a0281bb197ac5ac0George Mount                .add(R.id.content, fragment)
17896221034e4a23a2abb83f772a0281bb197ac5ac0George Mount                .addToBackStack(null)
17996221034e4a23a2abb83f772a0281bb197ac5ac0George Mount                .commit();
18096221034e4a23a2abb83f772a0281bb197ac5ac0George Mount
18196221034e4a23a2abb83f772a0281bb197ac5ac0George Mount        FragmentTestUtil.executePendingTransactions(mActivityRule);
18243db3168ca4a4d309f059363054ba60bc22a9ef3George Mount        Collection<Fragment> fragments = fm.getFragments();
18396221034e4a23a2abb83f772a0281bb197ac5ac0George Mount        assertEquals(1, fragments.size());
18443db3168ca4a4d309f059363054ba60bc22a9ef3George Mount        assertTrue(fragments.contains(fragment));
18596221034e4a23a2abb83f772a0281bb197ac5ac0George Mount
18696221034e4a23a2abb83f772a0281bb197ac5ac0George Mount        // Removed fragments shouldn't show
18796221034e4a23a2abb83f772a0281bb197ac5ac0George Mount        fm.beginTransaction()
18896221034e4a23a2abb83f772a0281bb197ac5ac0George Mount                .remove(fragment)
18996221034e4a23a2abb83f772a0281bb197ac5ac0George Mount                .addToBackStack(null)
19096221034e4a23a2abb83f772a0281bb197ac5ac0George Mount                .commit();
19196221034e4a23a2abb83f772a0281bb197ac5ac0George Mount        FragmentTestUtil.executePendingTransactions(mActivityRule);
19296221034e4a23a2abb83f772a0281bb197ac5ac0George Mount        assertTrue(fm.getFragments().isEmpty());
19396221034e4a23a2abb83f772a0281bb197ac5ac0George Mount
19496221034e4a23a2abb83f772a0281bb197ac5ac0George Mount        // Now try detached fragments
19596221034e4a23a2abb83f772a0281bb197ac5ac0George Mount        FragmentTestUtil.popBackStackImmediate(mActivityRule);
19696221034e4a23a2abb83f772a0281bb197ac5ac0George Mount        fm.beginTransaction()
19796221034e4a23a2abb83f772a0281bb197ac5ac0George Mount                .detach(fragment)
19896221034e4a23a2abb83f772a0281bb197ac5ac0George Mount                .addToBackStack(null)
19996221034e4a23a2abb83f772a0281bb197ac5ac0George Mount                .commit();
20096221034e4a23a2abb83f772a0281bb197ac5ac0George Mount        FragmentTestUtil.executePendingTransactions(mActivityRule);
20196221034e4a23a2abb83f772a0281bb197ac5ac0George Mount        assertTrue(fm.getFragments().isEmpty());
20296221034e4a23a2abb83f772a0281bb197ac5ac0George Mount
20396221034e4a23a2abb83f772a0281bb197ac5ac0George Mount        // Now try hidden fragments
20496221034e4a23a2abb83f772a0281bb197ac5ac0George Mount        FragmentTestUtil.popBackStackImmediate(mActivityRule);
20596221034e4a23a2abb83f772a0281bb197ac5ac0George Mount        fm.beginTransaction()
20696221034e4a23a2abb83f772a0281bb197ac5ac0George Mount                .hide(fragment)
20796221034e4a23a2abb83f772a0281bb197ac5ac0George Mount                .addToBackStack(null)
20896221034e4a23a2abb83f772a0281bb197ac5ac0George Mount                .commit();
20996221034e4a23a2abb83f772a0281bb197ac5ac0George Mount        FragmentTestUtil.executePendingTransactions(mActivityRule);
21096221034e4a23a2abb83f772a0281bb197ac5ac0George Mount        fragments = fm.getFragments();
21196221034e4a23a2abb83f772a0281bb197ac5ac0George Mount        assertEquals(1, fragments.size());
21243db3168ca4a4d309f059363054ba60bc22a9ef3George Mount        assertTrue(fragments.contains(fragment));
21396221034e4a23a2abb83f772a0281bb197ac5ac0George Mount
21496221034e4a23a2abb83f772a0281bb197ac5ac0George Mount        // And showing it again shouldn't change anything:
21596221034e4a23a2abb83f772a0281bb197ac5ac0George Mount        FragmentTestUtil.popBackStackImmediate(mActivityRule);
21696221034e4a23a2abb83f772a0281bb197ac5ac0George Mount        fragments = fm.getFragments();
21796221034e4a23a2abb83f772a0281bb197ac5ac0George Mount        assertEquals(1, fragments.size());
21843db3168ca4a4d309f059363054ba60bc22a9ef3George Mount        assertTrue(fragments.contains(fragment));
21996221034e4a23a2abb83f772a0281bb197ac5ac0George Mount
22096221034e4a23a2abb83f772a0281bb197ac5ac0George Mount        // Now pop back to the start state
22196221034e4a23a2abb83f772a0281bb197ac5ac0George Mount        FragmentTestUtil.popBackStackImmediate(mActivityRule);
22296221034e4a23a2abb83f772a0281bb197ac5ac0George Mount
22396221034e4a23a2abb83f772a0281bb197ac5ac0George Mount        // We can't force concurrency, but we can do it lots of times and hope that
22496221034e4a23a2abb83f772a0281bb197ac5ac0George Mount        // we hit it.
22596221034e4a23a2abb83f772a0281bb197ac5ac0George Mount        for (int i = 0; i < 100; i++) {
22643db3168ca4a4d309f059363054ba60bc22a9ef3George Mount            Fragment fragment2 = new CorrectFragment();
22796221034e4a23a2abb83f772a0281bb197ac5ac0George Mount            fm.beginTransaction()
22843db3168ca4a4d309f059363054ba60bc22a9ef3George Mount                    .add(R.id.content, fragment2)
22996221034e4a23a2abb83f772a0281bb197ac5ac0George Mount                    .addToBackStack(null)
23096221034e4a23a2abb83f772a0281bb197ac5ac0George Mount                    .commit();
23196221034e4a23a2abb83f772a0281bb197ac5ac0George Mount            getFragmentsUntilSize(1);
23296221034e4a23a2abb83f772a0281bb197ac5ac0George Mount
23396221034e4a23a2abb83f772a0281bb197ac5ac0George Mount            fm.popBackStack();
23496221034e4a23a2abb83f772a0281bb197ac5ac0George Mount            getFragmentsUntilSize(0);
23596221034e4a23a2abb83f772a0281bb197ac5ac0George Mount        }
23696221034e4a23a2abb83f772a0281bb197ac5ac0George Mount    }
23796221034e4a23a2abb83f772a0281bb197ac5ac0George Mount
23896221034e4a23a2abb83f772a0281bb197ac5ac0George Mount    private void getFragmentsUntilSize(int expectedSize) {
23996221034e4a23a2abb83f772a0281bb197ac5ac0George Mount        final long endTime = SystemClock.uptimeMillis() + 3000;
24096221034e4a23a2abb83f772a0281bb197ac5ac0George Mount
24196221034e4a23a2abb83f772a0281bb197ac5ac0George Mount        do {
24296221034e4a23a2abb83f772a0281bb197ac5ac0George Mount            assertTrue(SystemClock.uptimeMillis() < endTime);
24396221034e4a23a2abb83f772a0281bb197ac5ac0George Mount        } while (mActivity.getSupportFragmentManager().getFragments().size() != expectedSize);
24496221034e4a23a2abb83f772a0281bb197ac5ac0George Mount    }
24596221034e4a23a2abb83f772a0281bb197ac5ac0George Mount
246af556dcfc63652cafa822a3d742ad96c78bff037Clara Bayarri    public static class CorrectFragment extends Fragment {}
247af556dcfc63652cafa822a3d742ad96c78bff037Clara Bayarri
248af556dcfc63652cafa822a3d742ad96c78bff037Clara Bayarri    private static class PrivateFragment extends Fragment {}
249af556dcfc63652cafa822a3d742ad96c78bff037Clara Bayarri
250af556dcfc63652cafa822a3d742ad96c78bff037Clara Bayarri    static class PackagePrivateFragment extends Fragment {}
251af556dcfc63652cafa822a3d742ad96c78bff037Clara Bayarri
252af556dcfc63652cafa822a3d742ad96c78bff037Clara Bayarri    private class NonStaticFragment extends Fragment {}
253af556dcfc63652cafa822a3d742ad96c78bff037Clara Bayarri}
254