138f4f4174d9cd53c553f14c19746500cb861b089Ian Lake/* 291f3de362ba7218d74f121e6f78ea31519e829fcIan Lake * Copyright 2018 The Android Open Source Project 338f4f4174d9cd53c553f14c19746500cb861b089Ian Lake * 438f4f4174d9cd53c553f14c19746500cb861b089Ian Lake * Licensed under the Apache License, Version 2.0 (the "License"); 538f4f4174d9cd53c553f14c19746500cb861b089Ian Lake * you may not use this file except in compliance with the License. 638f4f4174d9cd53c553f14c19746500cb861b089Ian Lake * You may obtain a copy of the License at 738f4f4174d9cd53c553f14c19746500cb861b089Ian Lake * 838f4f4174d9cd53c553f14c19746500cb861b089Ian Lake * http://www.apache.org/licenses/LICENSE-2.0 938f4f4174d9cd53c553f14c19746500cb861b089Ian Lake * 1038f4f4174d9cd53c553f14c19746500cb861b089Ian Lake * Unless required by applicable law or agreed to in writing, software 1138f4f4174d9cd53c553f14c19746500cb861b089Ian Lake * distributed under the License is distributed on an "AS IS" BASIS, 1238f4f4174d9cd53c553f14c19746500cb861b089Ian Lake * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 1338f4f4174d9cd53c553f14c19746500cb861b089Ian Lake * See the License for the specific language governing permissions and 1438f4f4174d9cd53c553f14c19746500cb861b089Ian Lake * limitations under the License. 1538f4f4174d9cd53c553f14c19746500cb861b089Ian Lake */ 1638f4f4174d9cd53c553f14c19746500cb861b089Ian Lake 17ac5fe7c617c66850fff75a9fce9979c6e5674b0fAurimas Liutikaspackage androidx.loader.app; 1838f4f4174d9cd53c553f14c19746500cb861b089Ian Lake 1991f3de362ba7218d74f121e6f78ea31519e829fcIan Lakeimport static org.junit.Assert.assertFalse; 200f4d973e9bb5a00727068f6a76338908c21902fdIan Lakeimport static org.junit.Assert.assertNull; 2138f4f4174d9cd53c553f14c19746500cb861b089Ian Lakeimport static org.junit.Assert.assertTrue; 224c7ed1494f506952eb85c935bc543ea741e7bdb4Ian Lakeimport static org.mockito.Mockito.mock; 2338f4f4174d9cd53c553f14c19746500cb861b089Ian Lake 2438f4f4174d9cd53c553f14c19746500cb861b089Ian Lakeimport android.content.Context; 2538f4f4174d9cd53c553f14c19746500cb861b089Ian Lakeimport android.support.test.filters.SmallTest; 2638f4f4174d9cd53c553f14c19746500cb861b089Ian Lake 276160d5a551afe96c4180acf0454b5b4dbae89b9eAurimas Liutikasimport androidx.loader.app.test.DummyLoader; 286160d5a551afe96c4180acf0454b5b4dbae89b9eAurimas Liutikasimport androidx.loader.content.Loader; 296160d5a551afe96c4180acf0454b5b4dbae89b9eAurimas Liutikas 3038f4f4174d9cd53c553f14c19746500cb861b089Ian Lakeimport org.junit.Test; 3138f4f4174d9cd53c553f14c19746500cb861b089Ian Lakeimport org.junit.runner.RunWith; 324c7ed1494f506952eb85c935bc543ea741e7bdb4Ian Lakeimport org.junit.runners.JUnit4; 3338f4f4174d9cd53c553f14c19746500cb861b089Ian Lake 344c7ed1494f506952eb85c935bc543ea741e7bdb4Ian Lake@RunWith(JUnit4.class) 3538f4f4174d9cd53c553f14c19746500cb861b089Ian Lake@SmallTest 3638f4f4174d9cd53c553f14c19746500cb861b089Ian Lakepublic class LoaderViewModelTest { 3738f4f4174d9cd53c553f14c19746500cb861b089Ian Lake 3838f4f4174d9cd53c553f14c19746500cb861b089Ian Lake @Test 3938f4f4174d9cd53c553f14c19746500cb861b089Ian Lake public void testHasRunningLoaders() { 4038f4f4174d9cd53c553f14c19746500cb861b089Ian Lake LoaderManagerImpl.LoaderViewModel loaderViewModel = new LoaderManagerImpl.LoaderViewModel(); 4138f4f4174d9cd53c553f14c19746500cb861b089Ian Lake assertFalse("LoaderViewModel should not be running with before putLoader", 4238f4f4174d9cd53c553f14c19746500cb861b089Ian Lake loaderViewModel.hasRunningLoaders()); 4338f4f4174d9cd53c553f14c19746500cb861b089Ian Lake 444c7ed1494f506952eb85c935bc543ea741e7bdb4Ian Lake AlwaysRunningLoaderInfo info = new AlwaysRunningLoaderInfo(mock(Context.class)); 4538f4f4174d9cd53c553f14c19746500cb861b089Ian Lake loaderViewModel.putLoader(0, info); 4638f4f4174d9cd53c553f14c19746500cb861b089Ian Lake assertTrue("LoaderViewModel should be running after a running LoaderInfo is added", 4738f4f4174d9cd53c553f14c19746500cb861b089Ian Lake loaderViewModel.hasRunningLoaders()); 4838f4f4174d9cd53c553f14c19746500cb861b089Ian Lake 4938f4f4174d9cd53c553f14c19746500cb861b089Ian Lake loaderViewModel.removeLoader(0); 5038f4f4174d9cd53c553f14c19746500cb861b089Ian Lake assertFalse("LoaderViewModel should not be running after all LoaderInfos are removed", 5138f4f4174d9cd53c553f14c19746500cb861b089Ian Lake loaderViewModel.hasRunningLoaders()); 5238f4f4174d9cd53c553f14c19746500cb861b089Ian Lake } 5338f4f4174d9cd53c553f14c19746500cb861b089Ian Lake 5438f4f4174d9cd53c553f14c19746500cb861b089Ian Lake @Test 5538f4f4174d9cd53c553f14c19746500cb861b089Ian Lake public void testOnCleared() { 5638f4f4174d9cd53c553f14c19746500cb861b089Ian Lake LoaderManagerImpl.LoaderViewModel loaderViewModel = new LoaderManagerImpl.LoaderViewModel(); 574c7ed1494f506952eb85c935bc543ea741e7bdb4Ian Lake AlwaysRunningLoaderInfo info = new AlwaysRunningLoaderInfo(mock(Context.class)); 5838f4f4174d9cd53c553f14c19746500cb861b089Ian Lake loaderViewModel.putLoader(0, info); 5938f4f4174d9cd53c553f14c19746500cb861b089Ian Lake 6038f4f4174d9cd53c553f14c19746500cb861b089Ian Lake assertFalse("LoaderInfo shouldn't be destroyed before onCleared", info.mDestroyed); 6138f4f4174d9cd53c553f14c19746500cb861b089Ian Lake loaderViewModel.onCleared(); 6238f4f4174d9cd53c553f14c19746500cb861b089Ian Lake assertTrue("LoaderInfo should be destroyed after onCleared", info.mDestroyed); 630f4d973e9bb5a00727068f6a76338908c21902fdIan Lake assertNull("LoaderInfo should be removed from LoaderViewModel after onCleared", 640f4d973e9bb5a00727068f6a76338908c21902fdIan Lake loaderViewModel.getLoader(0)); 6538f4f4174d9cd53c553f14c19746500cb861b089Ian Lake } 6638f4f4174d9cd53c553f14c19746500cb861b089Ian Lake 6738f4f4174d9cd53c553f14c19746500cb861b089Ian Lake private class AlwaysRunningLoaderInfo extends LoaderManagerImpl.LoaderInfo<Boolean> { 6838f4f4174d9cd53c553f14c19746500cb861b089Ian Lake boolean mDestroyed = false; 6938f4f4174d9cd53c553f14c19746500cb861b089Ian Lake 7038f4f4174d9cd53c553f14c19746500cb861b089Ian Lake AlwaysRunningLoaderInfo(Context context) { 7101b544c7352c805d3c18f023b2eaeecb924ee1b3Ian Lake super(0, null, new DummyLoader(context), null); 7238f4f4174d9cd53c553f14c19746500cb861b089Ian Lake } 7338f4f4174d9cd53c553f14c19746500cb861b089Ian Lake 7438f4f4174d9cd53c553f14c19746500cb861b089Ian Lake @Override 7538f4f4174d9cd53c553f14c19746500cb861b089Ian Lake boolean isCallbackWaitingForData() { 7638f4f4174d9cd53c553f14c19746500cb861b089Ian Lake return true; 7738f4f4174d9cd53c553f14c19746500cb861b089Ian Lake } 7838f4f4174d9cd53c553f14c19746500cb861b089Ian Lake 7938f4f4174d9cd53c553f14c19746500cb861b089Ian Lake @Override 805404d815b5a1cc57d7b1dc6c1f89627f627e76eeIan Lake Loader<Boolean> destroy(boolean reset) { 8138f4f4174d9cd53c553f14c19746500cb861b089Ian Lake mDestroyed = true; 825404d815b5a1cc57d7b1dc6c1f89627f627e76eeIan Lake return super.destroy(reset); 8338f4f4174d9cd53c553f14c19746500cb861b089Ian Lake } 8438f4f4174d9cd53c553f14c19746500cb861b089Ian Lake } 8538f4f4174d9cd53c553f14c19746500cb861b089Ian Lake} 86