LiveDataTest.java revision 4d4bf0391459bec361ec7843447ae60d38c99028
1c1b53ee5d095a74b84c21257fb4cd00e33f748baYigit Boyar/* 264db0cc15b78b62a1d44a70fc8b4552e660d952cYigit Boyar * Copyright (C) 2016 The Android Open Source Project 3c1b53ee5d095a74b84c21257fb4cd00e33f748baYigit Boyar * 4c1b53ee5d095a74b84c21257fb4cd00e33f748baYigit Boyar * Licensed under the Apache License, Version 2.0 (the "License"); 5c1b53ee5d095a74b84c21257fb4cd00e33f748baYigit Boyar * you may not use this file except in compliance with the License. 6c1b53ee5d095a74b84c21257fb4cd00e33f748baYigit Boyar * You may obtain a copy of the License at 7c1b53ee5d095a74b84c21257fb4cd00e33f748baYigit Boyar * 8c1b53ee5d095a74b84c21257fb4cd00e33f748baYigit Boyar * http://www.apache.org/licenses/LICENSE-2.0 9c1b53ee5d095a74b84c21257fb4cd00e33f748baYigit Boyar * 10c1b53ee5d095a74b84c21257fb4cd00e33f748baYigit Boyar * Unless required by applicable law or agreed to in writing, software 11c1b53ee5d095a74b84c21257fb4cd00e33f748baYigit Boyar * distributed under the License is distributed on an "AS IS" BASIS, 12c1b53ee5d095a74b84c21257fb4cd00e33f748baYigit Boyar * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13c1b53ee5d095a74b84c21257fb4cd00e33f748baYigit Boyar * See the License for the specific language governing permissions and 14c1b53ee5d095a74b84c21257fb4cd00e33f748baYigit Boyar * limitations under the License. 15c1b53ee5d095a74b84c21257fb4cd00e33f748baYigit Boyar */ 16c1b53ee5d095a74b84c21257fb4cd00e33f748baYigit Boyar 1764db0cc15b78b62a1d44a70fc8b4552e660d952cYigit Boyarpackage com.android.support.lifecycle; 18c1b53ee5d095a74b84c21257fb4cd00e33f748baYigit Boyar 19b86bef286718da421268bc52cf4fab7cccb3104cSergey Vasilinetsimport static com.android.support.lifecycle.Lifecycle.ON_CREATE; 20b86bef286718da421268bc52cf4fab7cccb3104cSergey Vasilinetsimport static com.android.support.lifecycle.Lifecycle.ON_DESTROY; 21b86bef286718da421268bc52cf4fab7cccb3104cSergey Vasilinetsimport static com.android.support.lifecycle.Lifecycle.ON_START; 22b86bef286718da421268bc52cf4fab7cccb3104cSergey Vasilinetsimport static com.android.support.lifecycle.Lifecycle.ON_STOP; 23b86bef286718da421268bc52cf4fab7cccb3104cSergey Vasilinets 24b86bef286718da421268bc52cf4fab7cccb3104cSergey Vasilinetsimport static org.hamcrest.CoreMatchers.instanceOf; 25c1b53ee5d095a74b84c21257fb4cd00e33f748baYigit Boyarimport static org.hamcrest.CoreMatchers.is; 26c1b53ee5d095a74b84c21257fb4cd00e33f748baYigit Boyarimport static org.hamcrest.MatcherAssert.assertThat; 27c1b53ee5d095a74b84c21257fb4cd00e33f748baYigit Boyarimport static org.mockito.Matchers.anyBoolean; 28c1b53ee5d095a74b84c21257fb4cd00e33f748baYigit Boyarimport static org.mockito.Matchers.anyString; 29c1b53ee5d095a74b84c21257fb4cd00e33f748baYigit Boyarimport static org.mockito.Mockito.mock; 30c1b53ee5d095a74b84c21257fb4cd00e33f748baYigit Boyarimport static org.mockito.Mockito.never; 31c1b53ee5d095a74b84c21257fb4cd00e33f748baYigit Boyarimport static org.mockito.Mockito.reset; 32c1b53ee5d095a74b84c21257fb4cd00e33f748baYigit Boyarimport static org.mockito.Mockito.spy; 33c1b53ee5d095a74b84c21257fb4cd00e33f748baYigit Boyarimport static org.mockito.Mockito.verify; 344d4bf0391459bec361ec7843447ae60d38c99028Yigit Boyarimport static org.mockito.Mockito.verifyNoMoreInteractions; 35c1b53ee5d095a74b84c21257fb4cd00e33f748baYigit Boyarimport static org.mockito.Mockito.when; 36c1b53ee5d095a74b84c21257fb4cd00e33f748baYigit Boyar 37c1b53ee5d095a74b84c21257fb4cd00e33f748baYigit Boyarimport android.support.annotation.Nullable; 38c1b53ee5d095a74b84c21257fb4cd00e33f748baYigit Boyar 3964db0cc15b78b62a1d44a70fc8b4552e660d952cYigit Boyarimport org.junit.Before; 4064db0cc15b78b62a1d44a70fc8b4552e660d952cYigit Boyarimport org.junit.Test; 41b86bef286718da421268bc52cf4fab7cccb3104cSergey Vasilinets 4234e5031083f735db3a395b0f6aa430880b072d71Yigit Boyar@SuppressWarnings({"unchecked"}) 4334e5031083f735db3a395b0f6aa430880b072d71Yigit Boyarpublic class LiveDataTest { 44c1b53ee5d095a74b84c21257fb4cd00e33f748baYigit Boyar private PublicLiveData<String> mLiveData; 45c1b53ee5d095a74b84c21257fb4cd00e33f748baYigit Boyar private LifecycleProvider mProvider; 46d069a4c914b2b43912fa6267b2f4c65408b6a4dcSergey Vasilinets private LifecycleRegistry mRegistry; 47d069a4c914b2b43912fa6267b2f4c65408b6a4dcSergey Vasilinets private MethodExec mActiveObserversChanged; 48d069a4c914b2b43912fa6267b2f4c65408b6a4dcSergey Vasilinets 49c43ce90b803cdfa033dfc94fa4161371ed6f3ec6Sergey Vasilinets @Before 50c1b53ee5d095a74b84c21257fb4cd00e33f748baYigit Boyar public void init() { 51c1b53ee5d095a74b84c21257fb4cd00e33f748baYigit Boyar mLiveData = new PublicLiveData<>(); 52d069a4c914b2b43912fa6267b2f4c65408b6a4dcSergey Vasilinets mProvider = mock(LifecycleProvider.class); 53c1b53ee5d095a74b84c21257fb4cd00e33f748baYigit Boyar mRegistry = new LifecycleRegistry(mProvider); 54c1b53ee5d095a74b84c21257fb4cd00e33f748baYigit Boyar when(mProvider.getLifecycle()).thenReturn(mRegistry); 55e13540a25fe5460240b6db0e18858c32d16f5399Sergey Vasilinets mActiveObserversChanged = mock(MethodExec.class); 56c1b53ee5d095a74b84c21257fb4cd00e33f748baYigit Boyar mLiveData.activeObserversChanged = mActiveObserversChanged; 57c1b53ee5d095a74b84c21257fb4cd00e33f748baYigit Boyar } 58c43ce90b803cdfa033dfc94fa4161371ed6f3ec6Sergey Vasilinets 59c1b53ee5d095a74b84c21257fb4cd00e33f748baYigit Boyar @Test 60c1b53ee5d095a74b84c21257fb4cd00e33f748baYigit Boyar public void testObserverToggle() { 61c1b53ee5d095a74b84c21257fb4cd00e33f748baYigit Boyar Observer<String> observer = (Observer<String>) mock(Observer.class); 62c1b53ee5d095a74b84c21257fb4cd00e33f748baYigit Boyar mLiveData.observe(mProvider, observer); 63e13540a25fe5460240b6db0e18858c32d16f5399Sergey Vasilinets 64e13540a25fe5460240b6db0e18858c32d16f5399Sergey Vasilinets verify(mActiveObserversChanged, never()).onCall(anyBoolean()); 65e13540a25fe5460240b6db0e18858c32d16f5399Sergey Vasilinets assertThat(mLiveData.getObserverCount(), is(1)); 66c1b53ee5d095a74b84c21257fb4cd00e33f748baYigit Boyar assertThat(mLiveData.getActiveObserverCount(), is(0)); 67c1b53ee5d095a74b84c21257fb4cd00e33f748baYigit Boyar 68c43ce90b803cdfa033dfc94fa4161371ed6f3ec6Sergey Vasilinets mLiveData.removeObserver(observer); 69c1b53ee5d095a74b84c21257fb4cd00e33f748baYigit Boyar verify(mActiveObserversChanged, never()).onCall(anyBoolean()); 70c1b53ee5d095a74b84c21257fb4cd00e33f748baYigit Boyar assertThat(mLiveData.getObserverCount(), is(0)); 7134e5031083f735db3a395b0f6aa430880b072d71Yigit Boyar assertThat(mLiveData.getActiveObserverCount(), is(0)); 7234e5031083f735db3a395b0f6aa430880b072d71Yigit Boyar } 7336436741fe52fa90bbeeddf7baa05f97d734f5f1Yigit Boyar 7434e5031083f735db3a395b0f6aa430880b072d71Yigit Boyar @Test 7534e5031083f735db3a395b0f6aa430880b072d71Yigit Boyar public void testActiveObserverToggle() { 7634e5031083f735db3a395b0f6aa430880b072d71Yigit Boyar Observer<String> observer = (Observer<String>) mock(Observer.class); 7734e5031083f735db3a395b0f6aa430880b072d71Yigit Boyar mLiveData.observe(mProvider, observer); 7834e5031083f735db3a395b0f6aa430880b072d71Yigit Boyar 7934e5031083f735db3a395b0f6aa430880b072d71Yigit Boyar verify(mActiveObserversChanged, never()).onCall(anyBoolean()); 8034e5031083f735db3a395b0f6aa430880b072d71Yigit Boyar assertThat(mLiveData.getObserverCount(), is(1)); 81c1b53ee5d095a74b84c21257fb4cd00e33f748baYigit Boyar assertThat(mLiveData.getActiveObserverCount(), is(0)); 82c1b53ee5d095a74b84c21257fb4cd00e33f748baYigit Boyar 83c1b53ee5d095a74b84c21257fb4cd00e33f748baYigit Boyar mRegistry.handleLifecycleEvent(ON_START); 84e13540a25fe5460240b6db0e18858c32d16f5399Sergey Vasilinets verify(mActiveObserversChanged).onCall(true); 85c1b53ee5d095a74b84c21257fb4cd00e33f748baYigit Boyar assertThat(mLiveData.getActiveObserverCount(), is(1)); 86c1b53ee5d095a74b84c21257fb4cd00e33f748baYigit Boyar reset(mActiveObserversChanged); 87abf6c87826e1a86fed71d945dc7e7f1aa643ea6cSergey Vasilinets 88abf6c87826e1a86fed71d945dc7e7f1aa643ea6cSergey Vasilinets mRegistry.handleLifecycleEvent(ON_STOP); 89c1b53ee5d095a74b84c21257fb4cd00e33f748baYigit Boyar verify(mActiveObserversChanged).onCall(false); 90c1b53ee5d095a74b84c21257fb4cd00e33f748baYigit Boyar assertThat(mLiveData.getActiveObserverCount(), is(0)); 91c1b53ee5d095a74b84c21257fb4cd00e33f748baYigit Boyar assertThat(mLiveData.getObserverCount(), is(1)); 92abf6c87826e1a86fed71d945dc7e7f1aa643ea6cSergey Vasilinets 93abf6c87826e1a86fed71d945dc7e7f1aa643ea6cSergey Vasilinets reset(mActiveObserversChanged); 94c1b53ee5d095a74b84c21257fb4cd00e33f748baYigit Boyar mRegistry.handleLifecycleEvent(ON_START); 95c1b53ee5d095a74b84c21257fb4cd00e33f748baYigit Boyar verify(mActiveObserversChanged).onCall(true); 96c1b53ee5d095a74b84c21257fb4cd00e33f748baYigit Boyar assertThat(mLiveData.getActiveObserverCount(), is(1)); 97c1b53ee5d095a74b84c21257fb4cd00e33f748baYigit Boyar assertThat(mLiveData.getObserverCount(), is(1)); 98c1b53ee5d095a74b84c21257fb4cd00e33f748baYigit Boyar 99e13540a25fe5460240b6db0e18858c32d16f5399Sergey Vasilinets reset(mActiveObserversChanged); 100c1b53ee5d095a74b84c21257fb4cd00e33f748baYigit Boyar mLiveData.removeObserver(observer); 101c1b53ee5d095a74b84c21257fb4cd00e33f748baYigit Boyar verify(mActiveObserversChanged).onCall(false); 102abf6c87826e1a86fed71d945dc7e7f1aa643ea6cSergey Vasilinets assertThat(mLiveData.getActiveObserverCount(), is(0)); 103abf6c87826e1a86fed71d945dc7e7f1aa643ea6cSergey Vasilinets assertThat(mLiveData.getObserverCount(), is(0)); 104c1b53ee5d095a74b84c21257fb4cd00e33f748baYigit Boyar 105c1b53ee5d095a74b84c21257fb4cd00e33f748baYigit Boyar verifyNoMoreInteractions(mActiveObserversChanged); 106c1b53ee5d095a74b84c21257fb4cd00e33f748baYigit Boyar } 107abf6c87826e1a86fed71d945dc7e7f1aa643ea6cSergey Vasilinets 1084d4bf0391459bec361ec7843447ae60d38c99028Yigit Boyar @Test 109c1b53ee5d095a74b84c21257fb4cd00e33f748baYigit Boyar public void testReAddSameObserverTuple() { 110c1b53ee5d095a74b84c21257fb4cd00e33f748baYigit Boyar Observer<String> observer = (Observer<String>) mock(Observer.class); 111c1b53ee5d095a74b84c21257fb4cd00e33f748baYigit Boyar mLiveData.observe(mProvider, observer); 112abf6c87826e1a86fed71d945dc7e7f1aa643ea6cSergey Vasilinets mLiveData.observe(mProvider, observer); 113abf6c87826e1a86fed71d945dc7e7f1aa643ea6cSergey Vasilinets assertThat(mLiveData.getObserverCount(), is(1)); 114c1b53ee5d095a74b84c21257fb4cd00e33f748baYigit Boyar } 1154d4bf0391459bec361ec7843447ae60d38c99028Yigit Boyar 116c1b53ee5d095a74b84c21257fb4cd00e33f748baYigit Boyar @Test 117c1b53ee5d095a74b84c21257fb4cd00e33f748baYigit Boyar public void testAdd2ObserversWithSameProviderAndRemove() { 118abf6c87826e1a86fed71d945dc7e7f1aa643ea6cSergey Vasilinets Observer<String> o1 = (Observer<String>) mock(Observer.class); 119abf6c87826e1a86fed71d945dc7e7f1aa643ea6cSergey Vasilinets Observer<String> o2 = (Observer<String>) mock(Observer.class); 120c1b53ee5d095a74b84c21257fb4cd00e33f748baYigit Boyar mLiveData.observe(mProvider, o1); 1214d4bf0391459bec361ec7843447ae60d38c99028Yigit Boyar mLiveData.observe(mProvider, o2); 122c1b53ee5d095a74b84c21257fb4cd00e33f748baYigit Boyar assertThat(mLiveData.getObserverCount(), is(2)); 123c1b53ee5d095a74b84c21257fb4cd00e33f748baYigit Boyar verify(mActiveObserversChanged, never()).onCall(anyBoolean()); 124abf6c87826e1a86fed71d945dc7e7f1aa643ea6cSergey Vasilinets 125abf6c87826e1a86fed71d945dc7e7f1aa643ea6cSergey Vasilinets mRegistry.handleLifecycleEvent(ON_START); 126c1b53ee5d095a74b84c21257fb4cd00e33f748baYigit Boyar verify(mActiveObserversChanged).onCall(true); 1274d4bf0391459bec361ec7843447ae60d38c99028Yigit Boyar mLiveData.setValue("a"); 128c1b53ee5d095a74b84c21257fb4cd00e33f748baYigit Boyar verify(o1).onChanged("a"); 129c1b53ee5d095a74b84c21257fb4cd00e33f748baYigit Boyar verify(o2).onChanged("a"); 130c1b53ee5d095a74b84c21257fb4cd00e33f748baYigit Boyar 131c1b53ee5d095a74b84c21257fb4cd00e33f748baYigit Boyar mLiveData.removeObservers(mProvider); 132c1b53ee5d095a74b84c21257fb4cd00e33f748baYigit Boyar 133e13540a25fe5460240b6db0e18858c32d16f5399Sergey Vasilinets assertThat(mLiveData.getObserverCount(), is(0)); 134e13540a25fe5460240b6db0e18858c32d16f5399Sergey Vasilinets assertThat(mRegistry.size(), is(0)); 135abf6c87826e1a86fed71d945dc7e7f1aa643ea6cSergey Vasilinets } 136c1b53ee5d095a74b84c21257fb4cd00e33f748baYigit Boyar 137c1b53ee5d095a74b84c21257fb4cd00e33f748baYigit Boyar @Test 138c1b53ee5d095a74b84c21257fb4cd00e33f748baYigit Boyar public void testAddSameObserverIn2LifecycleProviders() { 139e13540a25fe5460240b6db0e18858c32d16f5399Sergey Vasilinets Observer<String> observer = (Observer<String>) mock(Observer.class); 140c1b53ee5d095a74b84c21257fb4cd00e33f748baYigit Boyar LifecycleProvider provider2 = mock(LifecycleProvider.class); 141c1b53ee5d095a74b84c21257fb4cd00e33f748baYigit Boyar LifecycleRegistry registry2 = new LifecycleRegistry(provider2); 142e13540a25fe5460240b6db0e18858c32d16f5399Sergey Vasilinets when(provider2.getLifecycle()).thenReturn(registry2); 143e13540a25fe5460240b6db0e18858c32d16f5399Sergey Vasilinets 144abf6c87826e1a86fed71d945dc7e7f1aa643ea6cSergey Vasilinets mLiveData.observe(mProvider, observer); 145c1b53ee5d095a74b84c21257fb4cd00e33f748baYigit Boyar Throwable throwable = null; 146c1b53ee5d095a74b84c21257fb4cd00e33f748baYigit Boyar try { 147c1b53ee5d095a74b84c21257fb4cd00e33f748baYigit Boyar mLiveData.observe(provider2, observer); 148c1b53ee5d095a74b84c21257fb4cd00e33f748baYigit Boyar } catch (Throwable t) { 149c1b53ee5d095a74b84c21257fb4cd00e33f748baYigit Boyar throwable = t; 150c1b53ee5d095a74b84c21257fb4cd00e33f748baYigit Boyar } 151c1b53ee5d095a74b84c21257fb4cd00e33f748baYigit Boyar assertThat(throwable, instanceOf(IllegalArgumentException.class)); 152c1b53ee5d095a74b84c21257fb4cd00e33f748baYigit Boyar assertThat(throwable.getMessage(), 153e13540a25fe5460240b6db0e18858c32d16f5399Sergey Vasilinets is("Cannot add the same observer twice to the LiveData")); 154c1b53ee5d095a74b84c21257fb4cd00e33f748baYigit Boyar } 155abf6c87826e1a86fed71d945dc7e7f1aa643ea6cSergey Vasilinets 15680f1ba3ad13ca7e35c524a20442fd895e034f625Sergey Vasilinets @Test 157c1b53ee5d095a74b84c21257fb4cd00e33f748baYigit Boyar public void testRemoveDestroyedObserver() { 158c1b53ee5d095a74b84c21257fb4cd00e33f748baYigit Boyar Observer<String> observer = (Observer<String>) mock(Observer.class); 159c1b53ee5d095a74b84c21257fb4cd00e33f748baYigit Boyar mLiveData.observe(mProvider, observer); 160e13540a25fe5460240b6db0e18858c32d16f5399Sergey Vasilinets mRegistry.handleLifecycleEvent(ON_START); 161c1b53ee5d095a74b84c21257fb4cd00e33f748baYigit Boyar verify(mActiveObserversChanged).onCall(true); 162e13540a25fe5460240b6db0e18858c32d16f5399Sergey Vasilinets assertThat(mLiveData.getObserverCount(), is(1)); 163e13540a25fe5460240b6db0e18858c32d16f5399Sergey Vasilinets assertThat(mLiveData.getActiveObserverCount(), is(1)); 164e13540a25fe5460240b6db0e18858c32d16f5399Sergey Vasilinets 165c1b53ee5d095a74b84c21257fb4cd00e33f748baYigit Boyar reset(mActiveObserversChanged); 166e13540a25fe5460240b6db0e18858c32d16f5399Sergey Vasilinets 167c1b53ee5d095a74b84c21257fb4cd00e33f748baYigit Boyar mRegistry.handleLifecycleEvent(ON_DESTROY); 168c1b53ee5d095a74b84c21257fb4cd00e33f748baYigit Boyar assertThat(mLiveData.getObserverCount(), is(0)); 169e13540a25fe5460240b6db0e18858c32d16f5399Sergey Vasilinets assertThat(mLiveData.getActiveObserverCount(), is(0)); 170c1b53ee5d095a74b84c21257fb4cd00e33f748baYigit Boyar verify(mActiveObserversChanged).onCall(false); 171c1b53ee5d095a74b84c21257fb4cd00e33f748baYigit Boyar } 172c1b53ee5d095a74b84c21257fb4cd00e33f748baYigit Boyar 173c1b53ee5d095a74b84c21257fb4cd00e33f748baYigit Boyar @Test 174c43ce90b803cdfa033dfc94fa4161371ed6f3ec6Sergey Vasilinets public void testInactiveRegistry() { 175c1b53ee5d095a74b84c21257fb4cd00e33f748baYigit Boyar Observer<String> observer = (Observer<String>) mock(Observer.class); 176c43ce90b803cdfa033dfc94fa4161371ed6f3ec6Sergey Vasilinets mRegistry.handleLifecycleEvent(ON_DESTROY); 177c1b53ee5d095a74b84c21257fb4cd00e33f748baYigit Boyar mLiveData.observe(mProvider, observer); 178c1b53ee5d095a74b84c21257fb4cd00e33f748baYigit Boyar assertThat(mLiveData.getObserverCount(), is(0)); 179c1b53ee5d095a74b84c21257fb4cd00e33f748baYigit Boyar } 180c1b53ee5d095a74b84c21257fb4cd00e33f748baYigit Boyar 181c1b53ee5d095a74b84c21257fb4cd00e33f748baYigit Boyar @Test 182e13540a25fe5460240b6db0e18858c32d16f5399Sergey Vasilinets public void testNotifyActiveInactive() { 183c1b53ee5d095a74b84c21257fb4cd00e33f748baYigit Boyar Observer<String> observer = (Observer<String>) mock(Observer.class); 184c1b53ee5d095a74b84c21257fb4cd00e33f748baYigit Boyar mRegistry.handleLifecycleEvent(ON_CREATE); 185abf6c87826e1a86fed71d945dc7e7f1aa643ea6cSergey Vasilinets mLiveData.observe(mProvider, observer); 186abf6c87826e1a86fed71d945dc7e7f1aa643ea6cSergey Vasilinets mLiveData.setValue("a"); 1874d4bf0391459bec361ec7843447ae60d38c99028Yigit Boyar verify(observer, never()).onChanged(anyString()); 1884d4bf0391459bec361ec7843447ae60d38c99028Yigit Boyar mRegistry.handleLifecycleEvent(ON_START); 189c1b53ee5d095a74b84c21257fb4cd00e33f748baYigit Boyar verify(observer).onChanged("a"); 190c1b53ee5d095a74b84c21257fb4cd00e33f748baYigit Boyar 191abf6c87826e1a86fed71d945dc7e7f1aa643ea6cSergey Vasilinets mLiveData.setValue("b"); 192abf6c87826e1a86fed71d945dc7e7f1aa643ea6cSergey Vasilinets verify(observer).onChanged("b"); 193c1b53ee5d095a74b84c21257fb4cd00e33f748baYigit Boyar 194c1b53ee5d095a74b84c21257fb4cd00e33f748baYigit Boyar mRegistry.handleLifecycleEvent(ON_STOP); 195c1b53ee5d095a74b84c21257fb4cd00e33f748baYigit Boyar mLiveData.setValue("c"); 196c1b53ee5d095a74b84c21257fb4cd00e33f748baYigit Boyar verify(observer, never()).onChanged("c"); 197c1b53ee5d095a74b84c21257fb4cd00e33f748baYigit Boyar 198c1b53ee5d095a74b84c21257fb4cd00e33f748baYigit Boyar mRegistry.handleLifecycleEvent(ON_START); 199c1b53ee5d095a74b84c21257fb4cd00e33f748baYigit Boyar verify(observer).onChanged("c"); 200e13540a25fe5460240b6db0e18858c32d16f5399Sergey Vasilinets 201abf6c87826e1a86fed71d945dc7e7f1aa643ea6cSergey Vasilinets reset(observer); 202c1b53ee5d095a74b84c21257fb4cd00e33f748baYigit Boyar mRegistry.handleLifecycleEvent(ON_STOP); 203c1b53ee5d095a74b84c21257fb4cd00e33f748baYigit Boyar mRegistry.handleLifecycleEvent(ON_START); 204c1b53ee5d095a74b84c21257fb4cd00e33f748baYigit Boyar verify(observer, never()).onChanged(anyString()); 205c1b53ee5d095a74b84c21257fb4cd00e33f748baYigit Boyar } 206c1b53ee5d095a74b84c21257fb4cd00e33f748baYigit Boyar 207c1b53ee5d095a74b84c21257fb4cd00e33f748baYigit Boyar @Test 208e13540a25fe5460240b6db0e18858c32d16f5399Sergey Vasilinets public void testStopObservingProvider_onDestroy() { 209c1b53ee5d095a74b84c21257fb4cd00e33f748baYigit Boyar Observer<String> observer = (Observer<String>) mock(Observer.class); 210c1b53ee5d095a74b84c21257fb4cd00e33f748baYigit Boyar mRegistry.handleLifecycleEvent(ON_CREATE); 211c1b53ee5d095a74b84c21257fb4cd00e33f748baYigit Boyar mLiveData.observe(mProvider, observer); 212c1b53ee5d095a74b84c21257fb4cd00e33f748baYigit Boyar assertThat(mRegistry.size(), is(1)); 213c1b53ee5d095a74b84c21257fb4cd00e33f748baYigit Boyar mRegistry.handleLifecycleEvent(ON_DESTROY); 214c1b53ee5d095a74b84c21257fb4cd00e33f748baYigit Boyar assertThat(mRegistry.size(), is(0)); 215c1b53ee5d095a74b84c21257fb4cd00e33f748baYigit Boyar } 216c1b53ee5d095a74b84c21257fb4cd00e33f748baYigit Boyar 217c1b53ee5d095a74b84c21257fb4cd00e33f748baYigit Boyar @Test 218c1b53ee5d095a74b84c21257fb4cd00e33f748baYigit Boyar public void testStopObservingProvider_onStopObserving() { 219c1b53ee5d095a74b84c21257fb4cd00e33f748baYigit Boyar Observer<String> observer = (Observer<String>) mock(Observer.class); 220c1b53ee5d095a74b84c21257fb4cd00e33f748baYigit Boyar mRegistry.handleLifecycleEvent(ON_CREATE); 221c1b53ee5d095a74b84c21257fb4cd00e33f748baYigit Boyar mLiveData.observe(mProvider, observer); 222c1b53ee5d095a74b84c21257fb4cd00e33f748baYigit Boyar assertThat(mRegistry.size(), is(1)); 223c1b53ee5d095a74b84c21257fb4cd00e33f748baYigit Boyar 224c1b53ee5d095a74b84c21257fb4cd00e33f748baYigit Boyar mLiveData.removeObserver(observer); 225c1b53ee5d095a74b84c21257fb4cd00e33f748baYigit Boyar assertThat(mRegistry.size(), is(0)); 226c1b53ee5d095a74b84c21257fb4cd00e33f748baYigit Boyar } 227c1b53ee5d095a74b84c21257fb4cd00e33f748baYigit Boyar 228c1b53ee5d095a74b84c21257fb4cd00e33f748baYigit Boyar @Test 229c1b53ee5d095a74b84c21257fb4cd00e33f748baYigit Boyar public void testActiveChangeInCallback() { 230c1b53ee5d095a74b84c21257fb4cd00e33f748baYigit Boyar mRegistry.handleLifecycleEvent(ON_START); 231e13540a25fe5460240b6db0e18858c32d16f5399Sergey Vasilinets Observer<String> observer = spy(new Observer<String>() { 232c1b53ee5d095a74b84c21257fb4cd00e33f748baYigit Boyar @Override 233c1b53ee5d095a74b84c21257fb4cd00e33f748baYigit Boyar public void onChanged(@Nullable String s) { 234e13540a25fe5460240b6db0e18858c32d16f5399Sergey Vasilinets mRegistry.handleLifecycleEvent(ON_STOP); 23580f1ba3ad13ca7e35c524a20442fd895e034f625Sergey Vasilinets assertThat(mLiveData.getObserverCount(), is(1)); 236c1b53ee5d095a74b84c21257fb4cd00e33f748baYigit Boyar assertThat(mLiveData.getActiveObserverCount(), is(1)); 23780f1ba3ad13ca7e35c524a20442fd895e034f625Sergey Vasilinets } 238c1b53ee5d095a74b84c21257fb4cd00e33f748baYigit Boyar }); 239c1b53ee5d095a74b84c21257fb4cd00e33f748baYigit Boyar mLiveData.observe(mProvider, observer); 240c1b53ee5d095a74b84c21257fb4cd00e33f748baYigit Boyar mLiveData.setValue("bla"); 241e13540a25fe5460240b6db0e18858c32d16f5399Sergey Vasilinets verify(observer).onChanged(anyString()); 242c1b53ee5d095a74b84c21257fb4cd00e33f748baYigit Boyar assertThat(mLiveData.getObserverCount(), is(1)); 243c1b53ee5d095a74b84c21257fb4cd00e33f748baYigit Boyar assertThat(mLiveData.getActiveObserverCount(), is(0)); 244e13540a25fe5460240b6db0e18858c32d16f5399Sergey Vasilinets } 24580f1ba3ad13ca7e35c524a20442fd895e034f625Sergey Vasilinets 246c1b53ee5d095a74b84c21257fb4cd00e33f748baYigit Boyar @Test 247c1b53ee5d095a74b84c21257fb4cd00e33f748baYigit Boyar public void testObserverRemovalInCallback() { 24880f1ba3ad13ca7e35c524a20442fd895e034f625Sergey Vasilinets mRegistry.handleLifecycleEvent(ON_START); 249c1b53ee5d095a74b84c21257fb4cd00e33f748baYigit Boyar Observer<String> observer = spy(new Observer<String>() { 250c1b53ee5d095a74b84c21257fb4cd00e33f748baYigit Boyar @Override 2514d4bf0391459bec361ec7843447ae60d38c99028Yigit Boyar public void onChanged(@Nullable String s) { 2524d4bf0391459bec361ec7843447ae60d38c99028Yigit Boyar mLiveData.removeObserver(this); 2534d4bf0391459bec361ec7843447ae60d38c99028Yigit Boyar assertThat(mLiveData.getObserverCount(), is(1)); 254c43ce90b803cdfa033dfc94fa4161371ed6f3ec6Sergey Vasilinets } 2554d4bf0391459bec361ec7843447ae60d38c99028Yigit Boyar }); 2564d4bf0391459bec361ec7843447ae60d38c99028Yigit Boyar mLiveData.observe(mProvider, observer); 2574d4bf0391459bec361ec7843447ae60d38c99028Yigit Boyar mLiveData.setValue("bla"); 258abf6c87826e1a86fed71d945dc7e7f1aa643ea6cSergey Vasilinets verify(observer).onChanged(anyString()); 259abf6c87826e1a86fed71d945dc7e7f1aa643ea6cSergey Vasilinets assertThat(mLiveData.getObserverCount(), is(0)); 2604d4bf0391459bec361ec7843447ae60d38c99028Yigit Boyar } 2614d4bf0391459bec361ec7843447ae60d38c99028Yigit Boyar 262c43ce90b803cdfa033dfc94fa4161371ed6f3ec6Sergey Vasilinets @Test 263e13540a25fe5460240b6db0e18858c32d16f5399Sergey Vasilinets public void testObserverAdditionInCallback() { 264e13540a25fe5460240b6db0e18858c32d16f5399Sergey Vasilinets mRegistry.handleLifecycleEvent(ON_START); 2654d4bf0391459bec361ec7843447ae60d38c99028Yigit Boyar Observer<String> observer = spy(new Observer<String>() { 266c43ce90b803cdfa033dfc94fa4161371ed6f3ec6Sergey Vasilinets @Override 267c43ce90b803cdfa033dfc94fa4161371ed6f3ec6Sergey Vasilinets public void onChanged(@Nullable String s) { 268abf6c87826e1a86fed71d945dc7e7f1aa643ea6cSergey Vasilinets mLiveData.observe(mProvider, mock(Observer.class)); 269abf6c87826e1a86fed71d945dc7e7f1aa643ea6cSergey Vasilinets assertThat(mLiveData.getObserverCount(), is(1)); 2704d4bf0391459bec361ec7843447ae60d38c99028Yigit Boyar assertThat(mLiveData.getActiveObserverCount(), is(1)); 2714d4bf0391459bec361ec7843447ae60d38c99028Yigit Boyar } 2724d4bf0391459bec361ec7843447ae60d38c99028Yigit Boyar }); 273c43ce90b803cdfa033dfc94fa4161371ed6f3ec6Sergey Vasilinets mLiveData.observe(mProvider, observer); 274c43ce90b803cdfa033dfc94fa4161371ed6f3ec6Sergey Vasilinets mLiveData.setValue("bla"); 275c43ce90b803cdfa033dfc94fa4161371ed6f3ec6Sergey Vasilinets verify(observer).onChanged(anyString()); 276c43ce90b803cdfa033dfc94fa4161371ed6f3ec6Sergey Vasilinets assertThat(mLiveData.getObserverCount(), is(2)); 277c43ce90b803cdfa033dfc94fa4161371ed6f3ec6Sergey Vasilinets assertThat(mLiveData.getActiveObserverCount(), is(2)); 278c43ce90b803cdfa033dfc94fa4161371ed6f3ec6Sergey Vasilinets } 279c43ce90b803cdfa033dfc94fa4161371ed6f3ec6Sergey Vasilinets 280abf6c87826e1a86fed71d945dc7e7f1aa643ea6cSergey Vasilinets @SuppressWarnings("WeakerAccess") 281c43ce90b803cdfa033dfc94fa4161371ed6f3ec6Sergey Vasilinets static class PublicLiveData<T> extends LiveData<T> { 282c43ce90b803cdfa033dfc94fa4161371ed6f3ec6Sergey Vasilinets // cannot spy due to internal calls 283c43ce90b803cdfa033dfc94fa4161371ed6f3ec6Sergey Vasilinets public MethodExec activeObserversChanged; 284c43ce90b803cdfa033dfc94fa4161371ed6f3ec6Sergey Vasilinets @Override 285d3449ae5a2f97b3654a9e5945a3365acb316891bSergey Vasilinets public void setValue(T value) { 286e13540a25fe5460240b6db0e18858c32d16f5399Sergey Vasilinets super.setValue(value); 287c43ce90b803cdfa033dfc94fa4161371ed6f3ec6Sergey Vasilinets } 288c43ce90b803cdfa033dfc94fa4161371ed6f3ec6Sergey Vasilinets 289c43ce90b803cdfa033dfc94fa4161371ed6f3ec6Sergey Vasilinets @Override 290abf6c87826e1a86fed71d945dc7e7f1aa643ea6cSergey Vasilinets protected void onActive() { 291abf6c87826e1a86fed71d945dc7e7f1aa643ea6cSergey Vasilinets if (activeObserversChanged != null) { 292c43ce90b803cdfa033dfc94fa4161371ed6f3ec6Sergey Vasilinets activeObserversChanged.onCall(true); 293c43ce90b803cdfa033dfc94fa4161371ed6f3ec6Sergey Vasilinets } 294c43ce90b803cdfa033dfc94fa4161371ed6f3ec6Sergey Vasilinets } 2954d4bf0391459bec361ec7843447ae60d38c99028Yigit Boyar 2964d4bf0391459bec361ec7843447ae60d38c99028Yigit Boyar @Override 2974d4bf0391459bec361ec7843447ae60d38c99028Yigit Boyar protected void onInactive() { 2984d4bf0391459bec361ec7843447ae60d38c99028Yigit Boyar if (activeObserversChanged != null) { 2994d4bf0391459bec361ec7843447ae60d38c99028Yigit Boyar activeObserversChanged.onCall(false); 300abf6c87826e1a86fed71d945dc7e7f1aa643ea6cSergey Vasilinets } 301c43ce90b803cdfa033dfc94fa4161371ed6f3ec6Sergey Vasilinets } 302abf6c87826e1a86fed71d945dc7e7f1aa643ea6cSergey Vasilinets } 3034d4bf0391459bec361ec7843447ae60d38c99028Yigit Boyar 3044d4bf0391459bec361ec7843447ae60d38c99028Yigit Boyar interface MethodExec { 305e13540a25fe5460240b6db0e18858c32d16f5399Sergey Vasilinets void onCall(boolean value); 3064d4bf0391459bec361ec7843447ae60d38c99028Yigit Boyar } 3074d4bf0391459bec361ec7843447ae60d38c99028Yigit Boyar} 308abf6c87826e1a86fed71d945dc7e7f1aa643ea6cSergey Vasilinets