LiveDataTest.java revision 0b5883440daa7d68a80c08625866952c86071028
1c1b53ee5d095a74b84c21257fb4cd00e33f748baYigit Boyar/* 264db0cc15b78b62a1d44a70fc8b4552e660d952cYigit Boyar * Copyright (C) 2017 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 android.arch.lifecycle; 18c1b53ee5d095a74b84c21257fb4cd00e33f748baYigit Boyar 19b86bef286718da421268bc52cf4fab7cccb3104cSergey Vasilinetsimport static android.arch.lifecycle.Lifecycle.Event.ON_CREATE; 20b86bef286718da421268bc52cf4fab7cccb3104cSergey Vasilinetsimport static android.arch.lifecycle.Lifecycle.Event.ON_DESTROY; 21b86bef286718da421268bc52cf4fab7cccb3104cSergey Vasilinetsimport static android.arch.lifecycle.Lifecycle.Event.ON_PAUSE; 22b86bef286718da421268bc52cf4fab7cccb3104cSergey Vasilinetsimport static android.arch.lifecycle.Lifecycle.Event.ON_RESUME; 23b86bef286718da421268bc52cf4fab7cccb3104cSergey Vasilinetsimport static android.arch.lifecycle.Lifecycle.Event.ON_START; 24b86bef286718da421268bc52cf4fab7cccb3104cSergey Vasilinetsimport static android.arch.lifecycle.Lifecycle.Event.ON_STOP; 25c1b53ee5d095a74b84c21257fb4cd00e33f748baYigit Boyar 26c1b53ee5d095a74b84c21257fb4cd00e33f748baYigit Boyarimport static org.hamcrest.CoreMatchers.instanceOf; 27c1b53ee5d095a74b84c21257fb4cd00e33f748baYigit Boyarimport static org.hamcrest.CoreMatchers.is; 28c1b53ee5d095a74b84c21257fb4cd00e33f748baYigit Boyarimport static org.hamcrest.MatcherAssert.assertThat; 29c1b53ee5d095a74b84c21257fb4cd00e33f748baYigit Boyarimport static org.mockito.Matchers.anyBoolean; 30c1b53ee5d095a74b84c21257fb4cd00e33f748baYigit Boyarimport static org.mockito.Matchers.anyString; 31c1b53ee5d095a74b84c21257fb4cd00e33f748baYigit Boyarimport static org.mockito.Mockito.mock; 32c1b53ee5d095a74b84c21257fb4cd00e33f748baYigit Boyarimport static org.mockito.Mockito.never; 33c1b53ee5d095a74b84c21257fb4cd00e33f748baYigit Boyarimport static org.mockito.Mockito.reset; 344d4bf0391459bec361ec7843447ae60d38c99028Yigit Boyarimport static org.mockito.Mockito.spy; 35c1b53ee5d095a74b84c21257fb4cd00e33f748baYigit Boyarimport static org.mockito.Mockito.verify; 36c1b53ee5d095a74b84c21257fb4cd00e33f748baYigit Boyarimport static org.mockito.Mockito.verifyNoMoreInteractions; 37c1b53ee5d095a74b84c21257fb4cd00e33f748baYigit Boyarimport static org.mockito.Mockito.when; 38c1b53ee5d095a74b84c21257fb4cd00e33f748baYigit Boyar 39ae36c8b11a64d3cdc9ba6e37d9f3d1d250fdc4a8Yigit Boyarimport android.arch.core.executor.ArchTaskExecutor; 4064db0cc15b78b62a1d44a70fc8b4552e660d952cYigit Boyarimport android.arch.lifecycle.util.InstantTaskExecutor; 41b86bef286718da421268bc52cf4fab7cccb3104cSergey Vasilinetsimport android.support.annotation.Nullable; 4234e5031083f735db3a395b0f6aa430880b072d71Yigit Boyar 4334e5031083f735db3a395b0f6aa430880b072d71Yigit Boyarimport org.junit.After; 44c1b53ee5d095a74b84c21257fb4cd00e33f748baYigit Boyarimport org.junit.Before; 45c1b53ee5d095a74b84c21257fb4cd00e33f748baYigit Boyarimport org.junit.Test; 46d069a4c914b2b43912fa6267b2f4c65408b6a4dcSergey Vasilinetsimport org.junit.runner.RunWith; 47d069a4c914b2b43912fa6267b2f4c65408b6a4dcSergey Vasilinetsimport org.junit.runners.JUnit4; 480b5883440daa7d68a80c08625866952c86071028shepshapardimport org.mockito.ArgumentCaptor; 49d069a4c914b2b43912fa6267b2f4c65408b6a4dcSergey Vasilinetsimport org.mockito.InOrder; 50c43ce90b803cdfa033dfc94fa4161371ed6f3ec6Sergey Vasilinetsimport org.mockito.Mockito; 51c1b53ee5d095a74b84c21257fb4cd00e33f748baYigit Boyar 52c1b53ee5d095a74b84c21257fb4cd00e33f748baYigit Boyar@SuppressWarnings({"unchecked"}) 53d069a4c914b2b43912fa6267b2f4c65408b6a4dcSergey Vasilinets@RunWith(JUnit4.class) 54c1b53ee5d095a74b84c21257fb4cd00e33f748baYigit Boyarpublic class LiveDataTest { 55c1b53ee5d095a74b84c21257fb4cd00e33f748baYigit Boyar private PublicLiveData<String> mLiveData; 560b5883440daa7d68a80c08625866952c86071028shepshapard private MethodExec mActiveObserversChanged; 570b5883440daa7d68a80c08625866952c86071028shepshapard 58e13540a25fe5460240b6db0e18858c32d16f5399Sergey Vasilinets private LifecycleOwner mOwner; 59c1b53ee5d095a74b84c21257fb4cd00e33f748baYigit Boyar private LifecycleRegistry mRegistry; 600b5883440daa7d68a80c08625866952c86071028shepshapard 610b5883440daa7d68a80c08625866952c86071028shepshapard private LifecycleOwner mOwner2; 625cfbb5dc6b92d9901a83628aec597acceb831916shepshapard private LifecycleRegistry mRegistry2; 630b5883440daa7d68a80c08625866952c86071028shepshapard 640b5883440daa7d68a80c08625866952c86071028shepshapard private LifecycleOwner mOwner3; 650b5883440daa7d68a80c08625866952c86071028shepshapard private Lifecycle mLifecycle3; 660b5883440daa7d68a80c08625866952c86071028shepshapard private Observer<String> mObserver3; 670b5883440daa7d68a80c08625866952c86071028shepshapard 680b5883440daa7d68a80c08625866952c86071028shepshapard private LifecycleOwner mOwner4; 690b5883440daa7d68a80c08625866952c86071028shepshapard private Lifecycle mLifecycle4; 700b5883440daa7d68a80c08625866952c86071028shepshapard private Observer<String> mObserver4; 710b5883440daa7d68a80c08625866952c86071028shepshapard 72c43ce90b803cdfa033dfc94fa4161371ed6f3ec6Sergey Vasilinets private boolean mInObserver; 73c1b53ee5d095a74b84c21257fb4cd00e33f748baYigit Boyar 74c1b53ee5d095a74b84c21257fb4cd00e33f748baYigit Boyar @Before 75c1b53ee5d095a74b84c21257fb4cd00e33f748baYigit Boyar public void init() { 76c1b53ee5d095a74b84c21257fb4cd00e33f748baYigit Boyar mLiveData = new PublicLiveData<>(); 775cfbb5dc6b92d9901a83628aec597acceb831916shepshapard 785cfbb5dc6b92d9901a83628aec597acceb831916shepshapard mActiveObserversChanged = mock(MethodExec.class); 795cfbb5dc6b92d9901a83628aec597acceb831916shepshapard mLiveData.activeObserversChanged = mActiveObserversChanged; 805cfbb5dc6b92d9901a83628aec597acceb831916shepshapard 81e13540a25fe5460240b6db0e18858c32d16f5399Sergey Vasilinets mOwner = mock(LifecycleOwner.class); 82e13540a25fe5460240b6db0e18858c32d16f5399Sergey Vasilinets mRegistry = new LifecycleRegistry(mOwner); 83e13540a25fe5460240b6db0e18858c32d16f5399Sergey Vasilinets when(mOwner.getLifecycle()).thenReturn(mRegistry); 845cfbb5dc6b92d9901a83628aec597acceb831916shepshapard 855cfbb5dc6b92d9901a83628aec597acceb831916shepshapard mOwner2 = mock(LifecycleOwner.class); 865cfbb5dc6b92d9901a83628aec597acceb831916shepshapard mRegistry2 = new LifecycleRegistry(mOwner2); 875cfbb5dc6b92d9901a83628aec597acceb831916shepshapard when(mOwner2.getLifecycle()).thenReturn(mRegistry2); 885cfbb5dc6b92d9901a83628aec597acceb831916shepshapard 89c43ce90b803cdfa033dfc94fa4161371ed6f3ec6Sergey Vasilinets mInObserver = false; 90c1b53ee5d095a74b84c21257fb4cd00e33f748baYigit Boyar } 91c1b53ee5d095a74b84c21257fb4cd00e33f748baYigit Boyar 9234e5031083f735db3a395b0f6aa430880b072d71Yigit Boyar @Before 930b5883440daa7d68a80c08625866952c86071028shepshapard public void initNonLifecycleRegistry() { 940b5883440daa7d68a80c08625866952c86071028shepshapard mOwner3 = mock(LifecycleOwner.class); 950b5883440daa7d68a80c08625866952c86071028shepshapard mLifecycle3 = mock(Lifecycle.class); 960b5883440daa7d68a80c08625866952c86071028shepshapard mObserver3 = (Observer<String>) mock(Observer.class); 970b5883440daa7d68a80c08625866952c86071028shepshapard when(mOwner3.getLifecycle()).thenReturn(mLifecycle3); 980b5883440daa7d68a80c08625866952c86071028shepshapard 990b5883440daa7d68a80c08625866952c86071028shepshapard mOwner4 = mock(LifecycleOwner.class); 1000b5883440daa7d68a80c08625866952c86071028shepshapard mLifecycle4 = mock(Lifecycle.class); 1010b5883440daa7d68a80c08625866952c86071028shepshapard mObserver4 = (Observer<String>) mock(Observer.class); 1020b5883440daa7d68a80c08625866952c86071028shepshapard when(mOwner4.getLifecycle()).thenReturn(mLifecycle4); 1030b5883440daa7d68a80c08625866952c86071028shepshapard } 1040b5883440daa7d68a80c08625866952c86071028shepshapard 1050b5883440daa7d68a80c08625866952c86071028shepshapard @Before 10634e5031083f735db3a395b0f6aa430880b072d71Yigit Boyar public void swapExecutorDelegate() { 107ae36c8b11a64d3cdc9ba6e37d9f3d1d250fdc4a8Yigit Boyar ArchTaskExecutor.getInstance().setDelegate(new InstantTaskExecutor()); 10834e5031083f735db3a395b0f6aa430880b072d71Yigit Boyar } 10934e5031083f735db3a395b0f6aa430880b072d71Yigit Boyar 11034e5031083f735db3a395b0f6aa430880b072d71Yigit Boyar @After 11134e5031083f735db3a395b0f6aa430880b072d71Yigit Boyar public void removeExecutorDelegate() { 112ae36c8b11a64d3cdc9ba6e37d9f3d1d250fdc4a8Yigit Boyar ArchTaskExecutor.getInstance().setDelegate(null); 11334e5031083f735db3a395b0f6aa430880b072d71Yigit Boyar } 11434e5031083f735db3a395b0f6aa430880b072d71Yigit Boyar 115c1b53ee5d095a74b84c21257fb4cd00e33f748baYigit Boyar @Test 116c1b53ee5d095a74b84c21257fb4cd00e33f748baYigit Boyar public void testObserverToggle() { 117c1b53ee5d095a74b84c21257fb4cd00e33f748baYigit Boyar Observer<String> observer = (Observer<String>) mock(Observer.class); 118e13540a25fe5460240b6db0e18858c32d16f5399Sergey Vasilinets mLiveData.observe(mOwner, observer); 119c1b53ee5d095a74b84c21257fb4cd00e33f748baYigit Boyar 120c1b53ee5d095a74b84c21257fb4cd00e33f748baYigit Boyar verify(mActiveObserversChanged, never()).onCall(anyBoolean()); 121abf6c87826e1a86fed71d945dc7e7f1aa643ea6cSergey Vasilinets assertThat(mLiveData.hasObservers(), is(true)); 122abf6c87826e1a86fed71d945dc7e7f1aa643ea6cSergey Vasilinets assertThat(mLiveData.hasActiveObservers(), is(false)); 123c1b53ee5d095a74b84c21257fb4cd00e33f748baYigit Boyar 124c1b53ee5d095a74b84c21257fb4cd00e33f748baYigit Boyar mLiveData.removeObserver(observer); 125c1b53ee5d095a74b84c21257fb4cd00e33f748baYigit Boyar verify(mActiveObserversChanged, never()).onCall(anyBoolean()); 126abf6c87826e1a86fed71d945dc7e7f1aa643ea6cSergey Vasilinets assertThat(mLiveData.hasObservers(), is(false)); 127abf6c87826e1a86fed71d945dc7e7f1aa643ea6cSergey Vasilinets assertThat(mLiveData.hasActiveObservers(), is(false)); 128c1b53ee5d095a74b84c21257fb4cd00e33f748baYigit Boyar } 129c1b53ee5d095a74b84c21257fb4cd00e33f748baYigit Boyar 130c1b53ee5d095a74b84c21257fb4cd00e33f748baYigit Boyar @Test 131c1b53ee5d095a74b84c21257fb4cd00e33f748baYigit Boyar public void testActiveObserverToggle() { 132c1b53ee5d095a74b84c21257fb4cd00e33f748baYigit Boyar Observer<String> observer = (Observer<String>) mock(Observer.class); 133e13540a25fe5460240b6db0e18858c32d16f5399Sergey Vasilinets mLiveData.observe(mOwner, observer); 134c1b53ee5d095a74b84c21257fb4cd00e33f748baYigit Boyar 135c1b53ee5d095a74b84c21257fb4cd00e33f748baYigit Boyar verify(mActiveObserversChanged, never()).onCall(anyBoolean()); 136abf6c87826e1a86fed71d945dc7e7f1aa643ea6cSergey Vasilinets assertThat(mLiveData.hasObservers(), is(true)); 137abf6c87826e1a86fed71d945dc7e7f1aa643ea6cSergey Vasilinets assertThat(mLiveData.hasActiveObservers(), is(false)); 138c1b53ee5d095a74b84c21257fb4cd00e33f748baYigit Boyar 139c1b53ee5d095a74b84c21257fb4cd00e33f748baYigit Boyar mRegistry.handleLifecycleEvent(ON_START); 140c1b53ee5d095a74b84c21257fb4cd00e33f748baYigit Boyar verify(mActiveObserversChanged).onCall(true); 141abf6c87826e1a86fed71d945dc7e7f1aa643ea6cSergey Vasilinets assertThat(mLiveData.hasActiveObservers(), is(true)); 1424d4bf0391459bec361ec7843447ae60d38c99028Yigit Boyar reset(mActiveObserversChanged); 143c1b53ee5d095a74b84c21257fb4cd00e33f748baYigit Boyar 144c1b53ee5d095a74b84c21257fb4cd00e33f748baYigit Boyar mRegistry.handleLifecycleEvent(ON_STOP); 145c1b53ee5d095a74b84c21257fb4cd00e33f748baYigit Boyar verify(mActiveObserversChanged).onCall(false); 146abf6c87826e1a86fed71d945dc7e7f1aa643ea6cSergey Vasilinets assertThat(mLiveData.hasActiveObservers(), is(false)); 147abf6c87826e1a86fed71d945dc7e7f1aa643ea6cSergey Vasilinets assertThat(mLiveData.hasObservers(), is(true)); 148c1b53ee5d095a74b84c21257fb4cd00e33f748baYigit Boyar 1494d4bf0391459bec361ec7843447ae60d38c99028Yigit Boyar reset(mActiveObserversChanged); 150c1b53ee5d095a74b84c21257fb4cd00e33f748baYigit Boyar mRegistry.handleLifecycleEvent(ON_START); 151c1b53ee5d095a74b84c21257fb4cd00e33f748baYigit Boyar verify(mActiveObserversChanged).onCall(true); 152abf6c87826e1a86fed71d945dc7e7f1aa643ea6cSergey Vasilinets assertThat(mLiveData.hasActiveObservers(), is(true)); 153abf6c87826e1a86fed71d945dc7e7f1aa643ea6cSergey Vasilinets assertThat(mLiveData.hasObservers(), is(true)); 154c1b53ee5d095a74b84c21257fb4cd00e33f748baYigit Boyar 1554d4bf0391459bec361ec7843447ae60d38c99028Yigit Boyar reset(mActiveObserversChanged); 156c1b53ee5d095a74b84c21257fb4cd00e33f748baYigit Boyar mLiveData.removeObserver(observer); 157c1b53ee5d095a74b84c21257fb4cd00e33f748baYigit Boyar verify(mActiveObserversChanged).onCall(false); 158abf6c87826e1a86fed71d945dc7e7f1aa643ea6cSergey Vasilinets assertThat(mLiveData.hasActiveObservers(), is(false)); 159abf6c87826e1a86fed71d945dc7e7f1aa643ea6cSergey Vasilinets assertThat(mLiveData.hasObservers(), is(false)); 160c1b53ee5d095a74b84c21257fb4cd00e33f748baYigit Boyar 1614d4bf0391459bec361ec7843447ae60d38c99028Yigit Boyar verifyNoMoreInteractions(mActiveObserversChanged); 162c1b53ee5d095a74b84c21257fb4cd00e33f748baYigit Boyar } 163c1b53ee5d095a74b84c21257fb4cd00e33f748baYigit Boyar 164c1b53ee5d095a74b84c21257fb4cd00e33f748baYigit Boyar @Test 165c1b53ee5d095a74b84c21257fb4cd00e33f748baYigit Boyar public void testReAddSameObserverTuple() { 166c1b53ee5d095a74b84c21257fb4cd00e33f748baYigit Boyar Observer<String> observer = (Observer<String>) mock(Observer.class); 167e13540a25fe5460240b6db0e18858c32d16f5399Sergey Vasilinets mLiveData.observe(mOwner, observer); 168e13540a25fe5460240b6db0e18858c32d16f5399Sergey Vasilinets mLiveData.observe(mOwner, observer); 169abf6c87826e1a86fed71d945dc7e7f1aa643ea6cSergey Vasilinets assertThat(mLiveData.hasObservers(), is(true)); 170c1b53ee5d095a74b84c21257fb4cd00e33f748baYigit Boyar } 171c1b53ee5d095a74b84c21257fb4cd00e33f748baYigit Boyar 172c1b53ee5d095a74b84c21257fb4cd00e33f748baYigit Boyar @Test 173e13540a25fe5460240b6db0e18858c32d16f5399Sergey Vasilinets public void testAdd2ObserversWithSameOwnerAndRemove() { 174c1b53ee5d095a74b84c21257fb4cd00e33f748baYigit Boyar Observer<String> o1 = (Observer<String>) mock(Observer.class); 175c1b53ee5d095a74b84c21257fb4cd00e33f748baYigit Boyar Observer<String> o2 = (Observer<String>) mock(Observer.class); 176e13540a25fe5460240b6db0e18858c32d16f5399Sergey Vasilinets mLiveData.observe(mOwner, o1); 177e13540a25fe5460240b6db0e18858c32d16f5399Sergey Vasilinets mLiveData.observe(mOwner, o2); 178abf6c87826e1a86fed71d945dc7e7f1aa643ea6cSergey Vasilinets assertThat(mLiveData.hasObservers(), is(true)); 179c1b53ee5d095a74b84c21257fb4cd00e33f748baYigit Boyar verify(mActiveObserversChanged, never()).onCall(anyBoolean()); 180c1b53ee5d095a74b84c21257fb4cd00e33f748baYigit Boyar 181c1b53ee5d095a74b84c21257fb4cd00e33f748baYigit Boyar mRegistry.handleLifecycleEvent(ON_START); 182c1b53ee5d095a74b84c21257fb4cd00e33f748baYigit Boyar verify(mActiveObserversChanged).onCall(true); 183c1b53ee5d095a74b84c21257fb4cd00e33f748baYigit Boyar mLiveData.setValue("a"); 184c1b53ee5d095a74b84c21257fb4cd00e33f748baYigit Boyar verify(o1).onChanged("a"); 185c1b53ee5d095a74b84c21257fb4cd00e33f748baYigit Boyar verify(o2).onChanged("a"); 186c1b53ee5d095a74b84c21257fb4cd00e33f748baYigit Boyar 187e13540a25fe5460240b6db0e18858c32d16f5399Sergey Vasilinets mLiveData.removeObservers(mOwner); 188c1b53ee5d095a74b84c21257fb4cd00e33f748baYigit Boyar 189abf6c87826e1a86fed71d945dc7e7f1aa643ea6cSergey Vasilinets assertThat(mLiveData.hasObservers(), is(false)); 19080f1ba3ad13ca7e35c524a20442fd895e034f625Sergey Vasilinets assertThat(mRegistry.getObserverCount(), is(0)); 191c1b53ee5d095a74b84c21257fb4cd00e33f748baYigit Boyar } 192c1b53ee5d095a74b84c21257fb4cd00e33f748baYigit Boyar 193c1b53ee5d095a74b84c21257fb4cd00e33f748baYigit Boyar @Test 194e13540a25fe5460240b6db0e18858c32d16f5399Sergey Vasilinets public void testAddSameObserverIn2LifecycleOwners() { 195c1b53ee5d095a74b84c21257fb4cd00e33f748baYigit Boyar Observer<String> observer = (Observer<String>) mock(Observer.class); 196c1b53ee5d095a74b84c21257fb4cd00e33f748baYigit Boyar 197e13540a25fe5460240b6db0e18858c32d16f5399Sergey Vasilinets mLiveData.observe(mOwner, observer); 198c1b53ee5d095a74b84c21257fb4cd00e33f748baYigit Boyar Throwable throwable = null; 199c1b53ee5d095a74b84c21257fb4cd00e33f748baYigit Boyar try { 2005cfbb5dc6b92d9901a83628aec597acceb831916shepshapard mLiveData.observe(mOwner2, observer); 201c1b53ee5d095a74b84c21257fb4cd00e33f748baYigit Boyar } catch (Throwable t) { 202c1b53ee5d095a74b84c21257fb4cd00e33f748baYigit Boyar throwable = t; 203c1b53ee5d095a74b84c21257fb4cd00e33f748baYigit Boyar } 204c1b53ee5d095a74b84c21257fb4cd00e33f748baYigit Boyar assertThat(throwable, instanceOf(IllegalArgumentException.class)); 205c43ce90b803cdfa033dfc94fa4161371ed6f3ec6Sergey Vasilinets //noinspection ConstantConditions 206c1b53ee5d095a74b84c21257fb4cd00e33f748baYigit Boyar assertThat(throwable.getMessage(), 207c43ce90b803cdfa033dfc94fa4161371ed6f3ec6Sergey Vasilinets is("Cannot add the same observer with different lifecycles")); 208c1b53ee5d095a74b84c21257fb4cd00e33f748baYigit Boyar } 209c1b53ee5d095a74b84c21257fb4cd00e33f748baYigit Boyar 210c1b53ee5d095a74b84c21257fb4cd00e33f748baYigit Boyar @Test 211c1b53ee5d095a74b84c21257fb4cd00e33f748baYigit Boyar public void testRemoveDestroyedObserver() { 212c1b53ee5d095a74b84c21257fb4cd00e33f748baYigit Boyar Observer<String> observer = (Observer<String>) mock(Observer.class); 213e13540a25fe5460240b6db0e18858c32d16f5399Sergey Vasilinets mLiveData.observe(mOwner, observer); 214c1b53ee5d095a74b84c21257fb4cd00e33f748baYigit Boyar mRegistry.handleLifecycleEvent(ON_START); 215c1b53ee5d095a74b84c21257fb4cd00e33f748baYigit Boyar verify(mActiveObserversChanged).onCall(true); 216abf6c87826e1a86fed71d945dc7e7f1aa643ea6cSergey Vasilinets assertThat(mLiveData.hasObservers(), is(true)); 217abf6c87826e1a86fed71d945dc7e7f1aa643ea6cSergey Vasilinets assertThat(mLiveData.hasActiveObservers(), is(true)); 2184d4bf0391459bec361ec7843447ae60d38c99028Yigit Boyar 2194d4bf0391459bec361ec7843447ae60d38c99028Yigit Boyar reset(mActiveObserversChanged); 220c1b53ee5d095a74b84c21257fb4cd00e33f748baYigit Boyar 221c1b53ee5d095a74b84c21257fb4cd00e33f748baYigit Boyar mRegistry.handleLifecycleEvent(ON_DESTROY); 222abf6c87826e1a86fed71d945dc7e7f1aa643ea6cSergey Vasilinets assertThat(mLiveData.hasObservers(), is(false)); 223abf6c87826e1a86fed71d945dc7e7f1aa643ea6cSergey Vasilinets assertThat(mLiveData.hasActiveObservers(), is(false)); 224c1b53ee5d095a74b84c21257fb4cd00e33f748baYigit Boyar verify(mActiveObserversChanged).onCall(false); 225c1b53ee5d095a74b84c21257fb4cd00e33f748baYigit Boyar } 226c1b53ee5d095a74b84c21257fb4cd00e33f748baYigit Boyar 227c1b53ee5d095a74b84c21257fb4cd00e33f748baYigit Boyar @Test 228c1b53ee5d095a74b84c21257fb4cd00e33f748baYigit Boyar public void testInactiveRegistry() { 229c1b53ee5d095a74b84c21257fb4cd00e33f748baYigit Boyar Observer<String> observer = (Observer<String>) mock(Observer.class); 230c1b53ee5d095a74b84c21257fb4cd00e33f748baYigit Boyar mRegistry.handleLifecycleEvent(ON_DESTROY); 231e13540a25fe5460240b6db0e18858c32d16f5399Sergey Vasilinets mLiveData.observe(mOwner, observer); 232abf6c87826e1a86fed71d945dc7e7f1aa643ea6cSergey Vasilinets assertThat(mLiveData.hasObservers(), is(false)); 233c1b53ee5d095a74b84c21257fb4cd00e33f748baYigit Boyar } 234c1b53ee5d095a74b84c21257fb4cd00e33f748baYigit Boyar 235c1b53ee5d095a74b84c21257fb4cd00e33f748baYigit Boyar @Test 236c1b53ee5d095a74b84c21257fb4cd00e33f748baYigit Boyar public void testNotifyActiveInactive() { 237c1b53ee5d095a74b84c21257fb4cd00e33f748baYigit Boyar Observer<String> observer = (Observer<String>) mock(Observer.class); 238c1b53ee5d095a74b84c21257fb4cd00e33f748baYigit Boyar mRegistry.handleLifecycleEvent(ON_CREATE); 239e13540a25fe5460240b6db0e18858c32d16f5399Sergey Vasilinets mLiveData.observe(mOwner, observer); 240c1b53ee5d095a74b84c21257fb4cd00e33f748baYigit Boyar mLiveData.setValue("a"); 241c1b53ee5d095a74b84c21257fb4cd00e33f748baYigit Boyar verify(observer, never()).onChanged(anyString()); 242c1b53ee5d095a74b84c21257fb4cd00e33f748baYigit Boyar mRegistry.handleLifecycleEvent(ON_START); 243c1b53ee5d095a74b84c21257fb4cd00e33f748baYigit Boyar verify(observer).onChanged("a"); 244c1b53ee5d095a74b84c21257fb4cd00e33f748baYigit Boyar 245c1b53ee5d095a74b84c21257fb4cd00e33f748baYigit Boyar mLiveData.setValue("b"); 246c1b53ee5d095a74b84c21257fb4cd00e33f748baYigit Boyar verify(observer).onChanged("b"); 247c1b53ee5d095a74b84c21257fb4cd00e33f748baYigit Boyar 248c1b53ee5d095a74b84c21257fb4cd00e33f748baYigit Boyar mRegistry.handleLifecycleEvent(ON_STOP); 249c1b53ee5d095a74b84c21257fb4cd00e33f748baYigit Boyar mLiveData.setValue("c"); 250c1b53ee5d095a74b84c21257fb4cd00e33f748baYigit Boyar verify(observer, never()).onChanged("c"); 251c1b53ee5d095a74b84c21257fb4cd00e33f748baYigit Boyar 252c1b53ee5d095a74b84c21257fb4cd00e33f748baYigit Boyar mRegistry.handleLifecycleEvent(ON_START); 253c1b53ee5d095a74b84c21257fb4cd00e33f748baYigit Boyar verify(observer).onChanged("c"); 254c1b53ee5d095a74b84c21257fb4cd00e33f748baYigit Boyar 255c1b53ee5d095a74b84c21257fb4cd00e33f748baYigit Boyar reset(observer); 256c1b53ee5d095a74b84c21257fb4cd00e33f748baYigit Boyar mRegistry.handleLifecycleEvent(ON_STOP); 257c1b53ee5d095a74b84c21257fb4cd00e33f748baYigit Boyar mRegistry.handleLifecycleEvent(ON_START); 258c1b53ee5d095a74b84c21257fb4cd00e33f748baYigit Boyar verify(observer, never()).onChanged(anyString()); 259c1b53ee5d095a74b84c21257fb4cd00e33f748baYigit Boyar } 260c1b53ee5d095a74b84c21257fb4cd00e33f748baYigit Boyar 261c1b53ee5d095a74b84c21257fb4cd00e33f748baYigit Boyar @Test 262e13540a25fe5460240b6db0e18858c32d16f5399Sergey Vasilinets public void testStopObservingOwner_onDestroy() { 263c1b53ee5d095a74b84c21257fb4cd00e33f748baYigit Boyar Observer<String> observer = (Observer<String>) mock(Observer.class); 264c1b53ee5d095a74b84c21257fb4cd00e33f748baYigit Boyar mRegistry.handleLifecycleEvent(ON_CREATE); 265e13540a25fe5460240b6db0e18858c32d16f5399Sergey Vasilinets mLiveData.observe(mOwner, observer); 26680f1ba3ad13ca7e35c524a20442fd895e034f625Sergey Vasilinets assertThat(mRegistry.getObserverCount(), is(1)); 267c1b53ee5d095a74b84c21257fb4cd00e33f748baYigit Boyar mRegistry.handleLifecycleEvent(ON_DESTROY); 26880f1ba3ad13ca7e35c524a20442fd895e034f625Sergey Vasilinets assertThat(mRegistry.getObserverCount(), is(0)); 269c1b53ee5d095a74b84c21257fb4cd00e33f748baYigit Boyar } 270c1b53ee5d095a74b84c21257fb4cd00e33f748baYigit Boyar 271c1b53ee5d095a74b84c21257fb4cd00e33f748baYigit Boyar @Test 272e13540a25fe5460240b6db0e18858c32d16f5399Sergey Vasilinets public void testStopObservingOwner_onStopObserving() { 273c1b53ee5d095a74b84c21257fb4cd00e33f748baYigit Boyar Observer<String> observer = (Observer<String>) mock(Observer.class); 274c1b53ee5d095a74b84c21257fb4cd00e33f748baYigit Boyar mRegistry.handleLifecycleEvent(ON_CREATE); 275e13540a25fe5460240b6db0e18858c32d16f5399Sergey Vasilinets mLiveData.observe(mOwner, observer); 27680f1ba3ad13ca7e35c524a20442fd895e034f625Sergey Vasilinets assertThat(mRegistry.getObserverCount(), is(1)); 277c1b53ee5d095a74b84c21257fb4cd00e33f748baYigit Boyar 278c1b53ee5d095a74b84c21257fb4cd00e33f748baYigit Boyar mLiveData.removeObserver(observer); 27980f1ba3ad13ca7e35c524a20442fd895e034f625Sergey Vasilinets assertThat(mRegistry.getObserverCount(), is(0)); 280c1b53ee5d095a74b84c21257fb4cd00e33f748baYigit Boyar } 281c1b53ee5d095a74b84c21257fb4cd00e33f748baYigit Boyar 2824d4bf0391459bec361ec7843447ae60d38c99028Yigit Boyar @Test 2834d4bf0391459bec361ec7843447ae60d38c99028Yigit Boyar public void testActiveChangeInCallback() { 2844d4bf0391459bec361ec7843447ae60d38c99028Yigit Boyar mRegistry.handleLifecycleEvent(ON_START); 285c43ce90b803cdfa033dfc94fa4161371ed6f3ec6Sergey Vasilinets Observer<String> observer1 = spy(new Observer<String>() { 2864d4bf0391459bec361ec7843447ae60d38c99028Yigit Boyar @Override 2874d4bf0391459bec361ec7843447ae60d38c99028Yigit Boyar public void onChanged(@Nullable String s) { 2884d4bf0391459bec361ec7843447ae60d38c99028Yigit Boyar mRegistry.handleLifecycleEvent(ON_STOP); 289abf6c87826e1a86fed71d945dc7e7f1aa643ea6cSergey Vasilinets assertThat(mLiveData.hasObservers(), is(true)); 290abf6c87826e1a86fed71d945dc7e7f1aa643ea6cSergey Vasilinets assertThat(mLiveData.hasActiveObservers(), is(false)); 2914d4bf0391459bec361ec7843447ae60d38c99028Yigit Boyar } 2924d4bf0391459bec361ec7843447ae60d38c99028Yigit Boyar }); 293c43ce90b803cdfa033dfc94fa4161371ed6f3ec6Sergey Vasilinets final Observer observer2 = mock(Observer.class); 294e13540a25fe5460240b6db0e18858c32d16f5399Sergey Vasilinets mLiveData.observe(mOwner, observer1); 295e13540a25fe5460240b6db0e18858c32d16f5399Sergey Vasilinets mLiveData.observe(mOwner, observer2); 2964d4bf0391459bec361ec7843447ae60d38c99028Yigit Boyar mLiveData.setValue("bla"); 297c43ce90b803cdfa033dfc94fa4161371ed6f3ec6Sergey Vasilinets verify(observer1).onChanged(anyString()); 298c43ce90b803cdfa033dfc94fa4161371ed6f3ec6Sergey Vasilinets verify(observer2, Mockito.never()).onChanged(anyString()); 299abf6c87826e1a86fed71d945dc7e7f1aa643ea6cSergey Vasilinets assertThat(mLiveData.hasObservers(), is(true)); 300abf6c87826e1a86fed71d945dc7e7f1aa643ea6cSergey Vasilinets assertThat(mLiveData.hasActiveObservers(), is(false)); 3014d4bf0391459bec361ec7843447ae60d38c99028Yigit Boyar } 3024d4bf0391459bec361ec7843447ae60d38c99028Yigit Boyar 3034d4bf0391459bec361ec7843447ae60d38c99028Yigit Boyar @Test 304c43ce90b803cdfa033dfc94fa4161371ed6f3ec6Sergey Vasilinets public void testActiveChangeInCallback2() { 305c43ce90b803cdfa033dfc94fa4161371ed6f3ec6Sergey Vasilinets Observer<String> observer1 = spy(new Observer<String>() { 306c43ce90b803cdfa033dfc94fa4161371ed6f3ec6Sergey Vasilinets @Override 307c43ce90b803cdfa033dfc94fa4161371ed6f3ec6Sergey Vasilinets public void onChanged(@Nullable String s) { 308c43ce90b803cdfa033dfc94fa4161371ed6f3ec6Sergey Vasilinets assertThat(mInObserver, is(false)); 309c43ce90b803cdfa033dfc94fa4161371ed6f3ec6Sergey Vasilinets mInObserver = true; 310c43ce90b803cdfa033dfc94fa4161371ed6f3ec6Sergey Vasilinets mRegistry.handleLifecycleEvent(ON_START); 311abf6c87826e1a86fed71d945dc7e7f1aa643ea6cSergey Vasilinets assertThat(mLiveData.hasActiveObservers(), is(true)); 312c43ce90b803cdfa033dfc94fa4161371ed6f3ec6Sergey Vasilinets mInObserver = false; 313c43ce90b803cdfa033dfc94fa4161371ed6f3ec6Sergey Vasilinets } 314c43ce90b803cdfa033dfc94fa4161371ed6f3ec6Sergey Vasilinets }); 315c43ce90b803cdfa033dfc94fa4161371ed6f3ec6Sergey Vasilinets final Observer observer2 = spy(new FailReentranceObserver()); 316d3449ae5a2f97b3654a9e5945a3365acb316891bSergey Vasilinets mLiveData.observeForever(observer1); 317e13540a25fe5460240b6db0e18858c32d16f5399Sergey Vasilinets mLiveData.observe(mOwner, observer2); 318c43ce90b803cdfa033dfc94fa4161371ed6f3ec6Sergey Vasilinets mLiveData.setValue("bla"); 319c43ce90b803cdfa033dfc94fa4161371ed6f3ec6Sergey Vasilinets verify(observer1).onChanged(anyString()); 320c43ce90b803cdfa033dfc94fa4161371ed6f3ec6Sergey Vasilinets verify(observer2).onChanged(anyString()); 321abf6c87826e1a86fed71d945dc7e7f1aa643ea6cSergey Vasilinets assertThat(mLiveData.hasObservers(), is(true)); 322abf6c87826e1a86fed71d945dc7e7f1aa643ea6cSergey Vasilinets assertThat(mLiveData.hasActiveObservers(), is(true)); 323c43ce90b803cdfa033dfc94fa4161371ed6f3ec6Sergey Vasilinets } 324c43ce90b803cdfa033dfc94fa4161371ed6f3ec6Sergey Vasilinets 325c43ce90b803cdfa033dfc94fa4161371ed6f3ec6Sergey Vasilinets @Test 3264d4bf0391459bec361ec7843447ae60d38c99028Yigit Boyar public void testObserverRemovalInCallback() { 3274d4bf0391459bec361ec7843447ae60d38c99028Yigit Boyar mRegistry.handleLifecycleEvent(ON_START); 3284d4bf0391459bec361ec7843447ae60d38c99028Yigit Boyar Observer<String> observer = spy(new Observer<String>() { 3294d4bf0391459bec361ec7843447ae60d38c99028Yigit Boyar @Override 3304d4bf0391459bec361ec7843447ae60d38c99028Yigit Boyar public void onChanged(@Nullable String s) { 331abf6c87826e1a86fed71d945dc7e7f1aa643ea6cSergey Vasilinets assertThat(mLiveData.hasObservers(), is(true)); 332c43ce90b803cdfa033dfc94fa4161371ed6f3ec6Sergey Vasilinets mLiveData.removeObserver(this); 333abf6c87826e1a86fed71d945dc7e7f1aa643ea6cSergey Vasilinets assertThat(mLiveData.hasObservers(), is(false)); 3344d4bf0391459bec361ec7843447ae60d38c99028Yigit Boyar } 3354d4bf0391459bec361ec7843447ae60d38c99028Yigit Boyar }); 336e13540a25fe5460240b6db0e18858c32d16f5399Sergey Vasilinets mLiveData.observe(mOwner, observer); 3374d4bf0391459bec361ec7843447ae60d38c99028Yigit Boyar mLiveData.setValue("bla"); 3384d4bf0391459bec361ec7843447ae60d38c99028Yigit Boyar verify(observer).onChanged(anyString()); 339abf6c87826e1a86fed71d945dc7e7f1aa643ea6cSergey Vasilinets assertThat(mLiveData.hasObservers(), is(false)); 3404d4bf0391459bec361ec7843447ae60d38c99028Yigit Boyar } 3414d4bf0391459bec361ec7843447ae60d38c99028Yigit Boyar 3424d4bf0391459bec361ec7843447ae60d38c99028Yigit Boyar @Test 3434d4bf0391459bec361ec7843447ae60d38c99028Yigit Boyar public void testObserverAdditionInCallback() { 3444d4bf0391459bec361ec7843447ae60d38c99028Yigit Boyar mRegistry.handleLifecycleEvent(ON_START); 345c43ce90b803cdfa033dfc94fa4161371ed6f3ec6Sergey Vasilinets final Observer observer2 = spy(new FailReentranceObserver()); 346c43ce90b803cdfa033dfc94fa4161371ed6f3ec6Sergey Vasilinets Observer<String> observer1 = spy(new Observer<String>() { 3474d4bf0391459bec361ec7843447ae60d38c99028Yigit Boyar @Override 3484d4bf0391459bec361ec7843447ae60d38c99028Yigit Boyar public void onChanged(@Nullable String s) { 349c43ce90b803cdfa033dfc94fa4161371ed6f3ec6Sergey Vasilinets assertThat(mInObserver, is(false)); 350c43ce90b803cdfa033dfc94fa4161371ed6f3ec6Sergey Vasilinets mInObserver = true; 351e13540a25fe5460240b6db0e18858c32d16f5399Sergey Vasilinets mLiveData.observe(mOwner, observer2); 352abf6c87826e1a86fed71d945dc7e7f1aa643ea6cSergey Vasilinets assertThat(mLiveData.hasObservers(), is(true)); 353abf6c87826e1a86fed71d945dc7e7f1aa643ea6cSergey Vasilinets assertThat(mLiveData.hasActiveObservers(), is(true)); 354c43ce90b803cdfa033dfc94fa4161371ed6f3ec6Sergey Vasilinets mInObserver = false; 3554d4bf0391459bec361ec7843447ae60d38c99028Yigit Boyar } 3564d4bf0391459bec361ec7843447ae60d38c99028Yigit Boyar }); 357e13540a25fe5460240b6db0e18858c32d16f5399Sergey Vasilinets mLiveData.observe(mOwner, observer1); 3584d4bf0391459bec361ec7843447ae60d38c99028Yigit Boyar mLiveData.setValue("bla"); 359c43ce90b803cdfa033dfc94fa4161371ed6f3ec6Sergey Vasilinets verify(observer1).onChanged(anyString()); 360c43ce90b803cdfa033dfc94fa4161371ed6f3ec6Sergey Vasilinets verify(observer2).onChanged(anyString()); 361abf6c87826e1a86fed71d945dc7e7f1aa643ea6cSergey Vasilinets assertThat(mLiveData.hasObservers(), is(true)); 362abf6c87826e1a86fed71d945dc7e7f1aa643ea6cSergey Vasilinets assertThat(mLiveData.hasActiveObservers(), is(true)); 3634d4bf0391459bec361ec7843447ae60d38c99028Yigit Boyar } 3644d4bf0391459bec361ec7843447ae60d38c99028Yigit Boyar 3657c41ee306fc78feaa0043c65bf82e65935bd9d35Sergey Vasilinets @Test 366e13540a25fe5460240b6db0e18858c32d16f5399Sergey Vasilinets public void testObserverWithoutLifecycleOwner() { 3677c41ee306fc78feaa0043c65bf82e65935bd9d35Sergey Vasilinets Observer<String> observer = (Observer<String>) mock(Observer.class); 3687c41ee306fc78feaa0043c65bf82e65935bd9d35Sergey Vasilinets mLiveData.setValue("boring"); 369d3449ae5a2f97b3654a9e5945a3365acb316891bSergey Vasilinets mLiveData.observeForever(observer); 3707c41ee306fc78feaa0043c65bf82e65935bd9d35Sergey Vasilinets verify(mActiveObserversChanged).onCall(true); 3717c41ee306fc78feaa0043c65bf82e65935bd9d35Sergey Vasilinets verify(observer).onChanged("boring"); 3727c41ee306fc78feaa0043c65bf82e65935bd9d35Sergey Vasilinets mLiveData.setValue("tihs"); 3737c41ee306fc78feaa0043c65bf82e65935bd9d35Sergey Vasilinets verify(observer).onChanged("tihs"); 3747c41ee306fc78feaa0043c65bf82e65935bd9d35Sergey Vasilinets mLiveData.removeObserver(observer); 3757c41ee306fc78feaa0043c65bf82e65935bd9d35Sergey Vasilinets verify(mActiveObserversChanged).onCall(false); 3767c41ee306fc78feaa0043c65bf82e65935bd9d35Sergey Vasilinets mLiveData.setValue("boring"); 3777c41ee306fc78feaa0043c65bf82e65935bd9d35Sergey Vasilinets reset(observer); 3787c41ee306fc78feaa0043c65bf82e65935bd9d35Sergey Vasilinets verify(observer, never()).onChanged(anyString()); 3797c41ee306fc78feaa0043c65bf82e65935bd9d35Sergey Vasilinets } 3807c41ee306fc78feaa0043c65bf82e65935bd9d35Sergey Vasilinets 381c43ce90b803cdfa033dfc94fa4161371ed6f3ec6Sergey Vasilinets @Test 382c43ce90b803cdfa033dfc94fa4161371ed6f3ec6Sergey Vasilinets public void testSetValueDuringSetValue() { 383c43ce90b803cdfa033dfc94fa4161371ed6f3ec6Sergey Vasilinets mRegistry.handleLifecycleEvent(ON_START); 384c43ce90b803cdfa033dfc94fa4161371ed6f3ec6Sergey Vasilinets final Observer observer1 = spy(new Observer<String>() { 385c43ce90b803cdfa033dfc94fa4161371ed6f3ec6Sergey Vasilinets @Override 386c43ce90b803cdfa033dfc94fa4161371ed6f3ec6Sergey Vasilinets public void onChanged(String o) { 387c43ce90b803cdfa033dfc94fa4161371ed6f3ec6Sergey Vasilinets assertThat(mInObserver, is(false)); 388c43ce90b803cdfa033dfc94fa4161371ed6f3ec6Sergey Vasilinets mInObserver = true; 389c43ce90b803cdfa033dfc94fa4161371ed6f3ec6Sergey Vasilinets if (o.equals(("bla"))) { 390c43ce90b803cdfa033dfc94fa4161371ed6f3ec6Sergey Vasilinets mLiveData.setValue("gt"); 391c43ce90b803cdfa033dfc94fa4161371ed6f3ec6Sergey Vasilinets } 392c43ce90b803cdfa033dfc94fa4161371ed6f3ec6Sergey Vasilinets mInObserver = false; 393c43ce90b803cdfa033dfc94fa4161371ed6f3ec6Sergey Vasilinets } 394c43ce90b803cdfa033dfc94fa4161371ed6f3ec6Sergey Vasilinets }); 395c43ce90b803cdfa033dfc94fa4161371ed6f3ec6Sergey Vasilinets final Observer observer2 = spy(new FailReentranceObserver()); 396e13540a25fe5460240b6db0e18858c32d16f5399Sergey Vasilinets mLiveData.observe(mOwner, observer1); 397e13540a25fe5460240b6db0e18858c32d16f5399Sergey Vasilinets mLiveData.observe(mOwner, observer2); 398c43ce90b803cdfa033dfc94fa4161371ed6f3ec6Sergey Vasilinets mLiveData.setValue("bla"); 399c43ce90b803cdfa033dfc94fa4161371ed6f3ec6Sergey Vasilinets verify(observer1, Mockito.atMost(2)).onChanged("gt"); 400c43ce90b803cdfa033dfc94fa4161371ed6f3ec6Sergey Vasilinets verify(observer2, Mockito.atMost(2)).onChanged("gt"); 401c43ce90b803cdfa033dfc94fa4161371ed6f3ec6Sergey Vasilinets } 402c43ce90b803cdfa033dfc94fa4161371ed6f3ec6Sergey Vasilinets 4035dcab68c2e390acfb016cb889604b85e1257b02fYigit Boyar @Test 4043facabd26326a3f4274b04dc7ab03442839c5601Sergey Vasilinets public void testRemoveDuringSetValue() { 4053facabd26326a3f4274b04dc7ab03442839c5601Sergey Vasilinets mRegistry.handleLifecycleEvent(ON_START); 4063facabd26326a3f4274b04dc7ab03442839c5601Sergey Vasilinets final Observer observer1 = spy(new Observer<String>() { 4073facabd26326a3f4274b04dc7ab03442839c5601Sergey Vasilinets @Override 4083facabd26326a3f4274b04dc7ab03442839c5601Sergey Vasilinets public void onChanged(String o) { 4093facabd26326a3f4274b04dc7ab03442839c5601Sergey Vasilinets mLiveData.removeObserver(this); 4103facabd26326a3f4274b04dc7ab03442839c5601Sergey Vasilinets } 4113facabd26326a3f4274b04dc7ab03442839c5601Sergey Vasilinets }); 4123facabd26326a3f4274b04dc7ab03442839c5601Sergey Vasilinets Observer<String> observer2 = (Observer<String>) mock(Observer.class); 4133facabd26326a3f4274b04dc7ab03442839c5601Sergey Vasilinets mLiveData.observeForever(observer1); 4143facabd26326a3f4274b04dc7ab03442839c5601Sergey Vasilinets mLiveData.observe(mOwner, observer2); 4153facabd26326a3f4274b04dc7ab03442839c5601Sergey Vasilinets mLiveData.setValue("gt"); 4163facabd26326a3f4274b04dc7ab03442839c5601Sergey Vasilinets verify(observer2).onChanged("gt"); 4173facabd26326a3f4274b04dc7ab03442839c5601Sergey Vasilinets } 4183facabd26326a3f4274b04dc7ab03442839c5601Sergey Vasilinets 4193facabd26326a3f4274b04dc7ab03442839c5601Sergey Vasilinets @Test 4205dcab68c2e390acfb016cb889604b85e1257b02fYigit Boyar public void testDataChangeDuringStateChange() { 4215dcab68c2e390acfb016cb889604b85e1257b02fYigit Boyar mRegistry.handleLifecycleEvent(ON_START); 4225dcab68c2e390acfb016cb889604b85e1257b02fYigit Boyar mRegistry.addObserver(new LifecycleObserver() { 4235dcab68c2e390acfb016cb889604b85e1257b02fYigit Boyar @OnLifecycleEvent(ON_STOP) 4245dcab68c2e390acfb016cb889604b85e1257b02fYigit Boyar public void onStop() { 4255dcab68c2e390acfb016cb889604b85e1257b02fYigit Boyar // change data in onStop, observer should not be called! 4265dcab68c2e390acfb016cb889604b85e1257b02fYigit Boyar mLiveData.setValue("b"); 4275dcab68c2e390acfb016cb889604b85e1257b02fYigit Boyar } 4285dcab68c2e390acfb016cb889604b85e1257b02fYigit Boyar }); 4295dcab68c2e390acfb016cb889604b85e1257b02fYigit Boyar Observer<String> observer = (Observer<String>) mock(Observer.class); 4305dcab68c2e390acfb016cb889604b85e1257b02fYigit Boyar mLiveData.setValue("a"); 431e13540a25fe5460240b6db0e18858c32d16f5399Sergey Vasilinets mLiveData.observe(mOwner, observer); 4325dcab68c2e390acfb016cb889604b85e1257b02fYigit Boyar verify(observer).onChanged("a"); 4335dcab68c2e390acfb016cb889604b85e1257b02fYigit Boyar mRegistry.handleLifecycleEvent(ON_PAUSE); 4345dcab68c2e390acfb016cb889604b85e1257b02fYigit Boyar mRegistry.handleLifecycleEvent(ON_STOP); 4355dcab68c2e390acfb016cb889604b85e1257b02fYigit Boyar verify(observer, never()).onChanged("b"); 4365dcab68c2e390acfb016cb889604b85e1257b02fYigit Boyar 4375dcab68c2e390acfb016cb889604b85e1257b02fYigit Boyar mRegistry.handleLifecycleEvent(ON_RESUME); 4385dcab68c2e390acfb016cb889604b85e1257b02fYigit Boyar verify(observer).onChanged("b"); 4395dcab68c2e390acfb016cb889604b85e1257b02fYigit Boyar } 4405dcab68c2e390acfb016cb889604b85e1257b02fYigit Boyar 4410da9764fa45b24977675265e04e8aff3fc889d04Sergey Vasilinets @Test 4420da9764fa45b24977675265e04e8aff3fc889d04Sergey Vasilinets public void testNotCallInactiveWithObserveForever() { 4430da9764fa45b24977675265e04e8aff3fc889d04Sergey Vasilinets mRegistry.handleLifecycleEvent(ON_START); 4440da9764fa45b24977675265e04e8aff3fc889d04Sergey Vasilinets Observer<String> observer = (Observer<String>) mock(Observer.class); 4450da9764fa45b24977675265e04e8aff3fc889d04Sergey Vasilinets Observer<String> observer2 = (Observer<String>) mock(Observer.class); 4460da9764fa45b24977675265e04e8aff3fc889d04Sergey Vasilinets mLiveData.observe(mOwner, observer); 4470da9764fa45b24977675265e04e8aff3fc889d04Sergey Vasilinets mLiveData.observeForever(observer2); 4480da9764fa45b24977675265e04e8aff3fc889d04Sergey Vasilinets verify(mActiveObserversChanged).onCall(true); 4490da9764fa45b24977675265e04e8aff3fc889d04Sergey Vasilinets reset(mActiveObserversChanged); 4500da9764fa45b24977675265e04e8aff3fc889d04Sergey Vasilinets mRegistry.handleLifecycleEvent(ON_STOP); 4510da9764fa45b24977675265e04e8aff3fc889d04Sergey Vasilinets verify(mActiveObserversChanged, never()).onCall(anyBoolean()); 4520da9764fa45b24977675265e04e8aff3fc889d04Sergey Vasilinets mRegistry.handleLifecycleEvent(ON_START); 4530da9764fa45b24977675265e04e8aff3fc889d04Sergey Vasilinets verify(mActiveObserversChanged, never()).onCall(anyBoolean()); 4540da9764fa45b24977675265e04e8aff3fc889d04Sergey Vasilinets } 4550da9764fa45b24977675265e04e8aff3fc889d04Sergey Vasilinets 456d069a4c914b2b43912fa6267b2f4c65408b6a4dcSergey Vasilinets @Test 457d069a4c914b2b43912fa6267b2f4c65408b6a4dcSergey Vasilinets public void testRemoveDuringAddition() { 458d069a4c914b2b43912fa6267b2f4c65408b6a4dcSergey Vasilinets mRegistry.handleLifecycleEvent(ON_START); 459d069a4c914b2b43912fa6267b2f4c65408b6a4dcSergey Vasilinets mLiveData.setValue("bla"); 460d069a4c914b2b43912fa6267b2f4c65408b6a4dcSergey Vasilinets mLiveData.observeForever(new Observer<String>() { 461d069a4c914b2b43912fa6267b2f4c65408b6a4dcSergey Vasilinets @Override 462d069a4c914b2b43912fa6267b2f4c65408b6a4dcSergey Vasilinets public void onChanged(@Nullable String s) { 463d069a4c914b2b43912fa6267b2f4c65408b6a4dcSergey Vasilinets mLiveData.removeObserver(this); 464d069a4c914b2b43912fa6267b2f4c65408b6a4dcSergey Vasilinets } 465d069a4c914b2b43912fa6267b2f4c65408b6a4dcSergey Vasilinets }); 466d069a4c914b2b43912fa6267b2f4c65408b6a4dcSergey Vasilinets assertThat(mLiveData.hasActiveObservers(), is(false)); 467d069a4c914b2b43912fa6267b2f4c65408b6a4dcSergey Vasilinets InOrder inOrder = Mockito.inOrder(mActiveObserversChanged); 468d069a4c914b2b43912fa6267b2f4c65408b6a4dcSergey Vasilinets inOrder.verify(mActiveObserversChanged).onCall(true); 469d069a4c914b2b43912fa6267b2f4c65408b6a4dcSergey Vasilinets inOrder.verify(mActiveObserversChanged).onCall(false); 470d069a4c914b2b43912fa6267b2f4c65408b6a4dcSergey Vasilinets inOrder.verifyNoMoreInteractions(); 471d069a4c914b2b43912fa6267b2f4c65408b6a4dcSergey Vasilinets } 472d069a4c914b2b43912fa6267b2f4c65408b6a4dcSergey Vasilinets 473d069a4c914b2b43912fa6267b2f4c65408b6a4dcSergey Vasilinets @Test 474d069a4c914b2b43912fa6267b2f4c65408b6a4dcSergey Vasilinets public void testRemoveDuringBringingUpToState() { 475d069a4c914b2b43912fa6267b2f4c65408b6a4dcSergey Vasilinets mLiveData.setValue("bla"); 476d069a4c914b2b43912fa6267b2f4c65408b6a4dcSergey Vasilinets mLiveData.observeForever(new Observer<String>() { 477d069a4c914b2b43912fa6267b2f4c65408b6a4dcSergey Vasilinets @Override 478d069a4c914b2b43912fa6267b2f4c65408b6a4dcSergey Vasilinets public void onChanged(@Nullable String s) { 479d069a4c914b2b43912fa6267b2f4c65408b6a4dcSergey Vasilinets mLiveData.removeObserver(this); 480d069a4c914b2b43912fa6267b2f4c65408b6a4dcSergey Vasilinets } 481d069a4c914b2b43912fa6267b2f4c65408b6a4dcSergey Vasilinets }); 482d069a4c914b2b43912fa6267b2f4c65408b6a4dcSergey Vasilinets mRegistry.handleLifecycleEvent(ON_RESUME); 483d069a4c914b2b43912fa6267b2f4c65408b6a4dcSergey Vasilinets assertThat(mLiveData.hasActiveObservers(), is(false)); 484d069a4c914b2b43912fa6267b2f4c65408b6a4dcSergey Vasilinets InOrder inOrder = Mockito.inOrder(mActiveObserversChanged); 485d069a4c914b2b43912fa6267b2f4c65408b6a4dcSergey Vasilinets inOrder.verify(mActiveObserversChanged).onCall(true); 486d069a4c914b2b43912fa6267b2f4c65408b6a4dcSergey Vasilinets inOrder.verify(mActiveObserversChanged).onCall(false); 487d069a4c914b2b43912fa6267b2f4c65408b6a4dcSergey Vasilinets inOrder.verifyNoMoreInteractions(); 488d069a4c914b2b43912fa6267b2f4c65408b6a4dcSergey Vasilinets } 489d069a4c914b2b43912fa6267b2f4c65408b6a4dcSergey Vasilinets 4905cfbb5dc6b92d9901a83628aec597acceb831916shepshapard @Test 4915cfbb5dc6b92d9901a83628aec597acceb831916shepshapard public void setValue_neverActive_observerOnChangedNotCalled() { 4925cfbb5dc6b92d9901a83628aec597acceb831916shepshapard Observer<String> observer = (Observer<String>) mock(Observer.class); 4935cfbb5dc6b92d9901a83628aec597acceb831916shepshapard mLiveData.observe(mOwner, observer); 4945cfbb5dc6b92d9901a83628aec597acceb831916shepshapard 4955cfbb5dc6b92d9901a83628aec597acceb831916shepshapard mLiveData.setValue("1"); 4965cfbb5dc6b92d9901a83628aec597acceb831916shepshapard 4975cfbb5dc6b92d9901a83628aec597acceb831916shepshapard verify(observer, never()).onChanged(anyString()); 4985cfbb5dc6b92d9901a83628aec597acceb831916shepshapard } 4995cfbb5dc6b92d9901a83628aec597acceb831916shepshapard 5005cfbb5dc6b92d9901a83628aec597acceb831916shepshapard @Test 5015cfbb5dc6b92d9901a83628aec597acceb831916shepshapard public void setValue_twoObserversTwoStartedOwners_onChangedCalledOnBoth() { 5025cfbb5dc6b92d9901a83628aec597acceb831916shepshapard Observer<String> observer1 = mock(Observer.class); 5035cfbb5dc6b92d9901a83628aec597acceb831916shepshapard Observer<String> observer2 = mock(Observer.class); 5045cfbb5dc6b92d9901a83628aec597acceb831916shepshapard 5055cfbb5dc6b92d9901a83628aec597acceb831916shepshapard mLiveData.observe(mOwner, observer1); 5065cfbb5dc6b92d9901a83628aec597acceb831916shepshapard mLiveData.observe(mOwner2, observer2); 5075cfbb5dc6b92d9901a83628aec597acceb831916shepshapard 5085cfbb5dc6b92d9901a83628aec597acceb831916shepshapard mRegistry.handleLifecycleEvent(Lifecycle.Event.ON_START); 5095cfbb5dc6b92d9901a83628aec597acceb831916shepshapard mRegistry2.handleLifecycleEvent(Lifecycle.Event.ON_START); 5105cfbb5dc6b92d9901a83628aec597acceb831916shepshapard 5115cfbb5dc6b92d9901a83628aec597acceb831916shepshapard mLiveData.setValue("1"); 5125cfbb5dc6b92d9901a83628aec597acceb831916shepshapard 5135cfbb5dc6b92d9901a83628aec597acceb831916shepshapard verify(observer1).onChanged("1"); 5145cfbb5dc6b92d9901a83628aec597acceb831916shepshapard verify(observer2).onChanged("1"); 5155cfbb5dc6b92d9901a83628aec597acceb831916shepshapard } 5165cfbb5dc6b92d9901a83628aec597acceb831916shepshapard 5175cfbb5dc6b92d9901a83628aec597acceb831916shepshapard @Test 5185cfbb5dc6b92d9901a83628aec597acceb831916shepshapard public void setValue_twoObserversOneStartedOwner_onChangedCalledOnOneCorrectObserver() { 5195cfbb5dc6b92d9901a83628aec597acceb831916shepshapard Observer<String> observer1 = mock(Observer.class); 5205cfbb5dc6b92d9901a83628aec597acceb831916shepshapard Observer<String> observer2 = mock(Observer.class); 5215cfbb5dc6b92d9901a83628aec597acceb831916shepshapard 5225cfbb5dc6b92d9901a83628aec597acceb831916shepshapard mLiveData.observe(mOwner, observer1); 5235cfbb5dc6b92d9901a83628aec597acceb831916shepshapard mLiveData.observe(mOwner2, observer2); 5245cfbb5dc6b92d9901a83628aec597acceb831916shepshapard 5255cfbb5dc6b92d9901a83628aec597acceb831916shepshapard mRegistry.handleLifecycleEvent(Lifecycle.Event.ON_START); 5265cfbb5dc6b92d9901a83628aec597acceb831916shepshapard 5275cfbb5dc6b92d9901a83628aec597acceb831916shepshapard mLiveData.setValue("1"); 5285cfbb5dc6b92d9901a83628aec597acceb831916shepshapard 5295cfbb5dc6b92d9901a83628aec597acceb831916shepshapard verify(observer1).onChanged("1"); 5305cfbb5dc6b92d9901a83628aec597acceb831916shepshapard verify(observer2, never()).onChanged(anyString()); 5315cfbb5dc6b92d9901a83628aec597acceb831916shepshapard } 5325cfbb5dc6b92d9901a83628aec597acceb831916shepshapard 5335cfbb5dc6b92d9901a83628aec597acceb831916shepshapard @Test 5345cfbb5dc6b92d9901a83628aec597acceb831916shepshapard public void setValue_twoObserversBothStartedAfterSetValue_onChangedCalledOnBoth() { 5355cfbb5dc6b92d9901a83628aec597acceb831916shepshapard Observer<String> observer1 = mock(Observer.class); 5365cfbb5dc6b92d9901a83628aec597acceb831916shepshapard Observer<String> observer2 = mock(Observer.class); 5375cfbb5dc6b92d9901a83628aec597acceb831916shepshapard 5385cfbb5dc6b92d9901a83628aec597acceb831916shepshapard mLiveData.observe(mOwner, observer1); 5395cfbb5dc6b92d9901a83628aec597acceb831916shepshapard mLiveData.observe(mOwner2, observer2); 5405cfbb5dc6b92d9901a83628aec597acceb831916shepshapard 5415cfbb5dc6b92d9901a83628aec597acceb831916shepshapard mLiveData.setValue("1"); 5425cfbb5dc6b92d9901a83628aec597acceb831916shepshapard 5435cfbb5dc6b92d9901a83628aec597acceb831916shepshapard mRegistry.handleLifecycleEvent(Lifecycle.Event.ON_START); 5445cfbb5dc6b92d9901a83628aec597acceb831916shepshapard mRegistry2.handleLifecycleEvent(Lifecycle.Event.ON_START); 5455cfbb5dc6b92d9901a83628aec597acceb831916shepshapard 5465cfbb5dc6b92d9901a83628aec597acceb831916shepshapard verify(observer1).onChanged("1"); 5475cfbb5dc6b92d9901a83628aec597acceb831916shepshapard verify(observer1).onChanged("1"); 5485cfbb5dc6b92d9901a83628aec597acceb831916shepshapard } 5495cfbb5dc6b92d9901a83628aec597acceb831916shepshapard 5505cfbb5dc6b92d9901a83628aec597acceb831916shepshapard @Test 5515cfbb5dc6b92d9901a83628aec597acceb831916shepshapard public void setValue_twoObserversOneStartedAfterSetValue_onChangedCalledOnCorrectObserver() { 5525cfbb5dc6b92d9901a83628aec597acceb831916shepshapard Observer<String> observer1 = mock(Observer.class); 5535cfbb5dc6b92d9901a83628aec597acceb831916shepshapard Observer<String> observer2 = mock(Observer.class); 5545cfbb5dc6b92d9901a83628aec597acceb831916shepshapard 5555cfbb5dc6b92d9901a83628aec597acceb831916shepshapard mLiveData.observe(mOwner, observer1); 5565cfbb5dc6b92d9901a83628aec597acceb831916shepshapard mLiveData.observe(mOwner2, observer2); 5575cfbb5dc6b92d9901a83628aec597acceb831916shepshapard 5585cfbb5dc6b92d9901a83628aec597acceb831916shepshapard mLiveData.setValue("1"); 5595cfbb5dc6b92d9901a83628aec597acceb831916shepshapard 5605cfbb5dc6b92d9901a83628aec597acceb831916shepshapard mRegistry.handleLifecycleEvent(Lifecycle.Event.ON_START); 5615cfbb5dc6b92d9901a83628aec597acceb831916shepshapard 5625cfbb5dc6b92d9901a83628aec597acceb831916shepshapard verify(observer1).onChanged("1"); 5635cfbb5dc6b92d9901a83628aec597acceb831916shepshapard verify(observer2, never()).onChanged(anyString()); 5645cfbb5dc6b92d9901a83628aec597acceb831916shepshapard } 5655cfbb5dc6b92d9901a83628aec597acceb831916shepshapard 5665cfbb5dc6b92d9901a83628aec597acceb831916shepshapard @Test 5675cfbb5dc6b92d9901a83628aec597acceb831916shepshapard public void setValue_twoObserversOneStarted_liveDataBecomesActive() { 5685cfbb5dc6b92d9901a83628aec597acceb831916shepshapard Observer<String> observer1 = mock(Observer.class); 5695cfbb5dc6b92d9901a83628aec597acceb831916shepshapard Observer<String> observer2 = mock(Observer.class); 5705cfbb5dc6b92d9901a83628aec597acceb831916shepshapard 5715cfbb5dc6b92d9901a83628aec597acceb831916shepshapard mLiveData.observe(mOwner, observer1); 5725cfbb5dc6b92d9901a83628aec597acceb831916shepshapard mLiveData.observe(mOwner2, observer2); 5735cfbb5dc6b92d9901a83628aec597acceb831916shepshapard 5745cfbb5dc6b92d9901a83628aec597acceb831916shepshapard mRegistry.handleLifecycleEvent(Lifecycle.Event.ON_START); 5755cfbb5dc6b92d9901a83628aec597acceb831916shepshapard 5765cfbb5dc6b92d9901a83628aec597acceb831916shepshapard verify(mActiveObserversChanged).onCall(true); 5775cfbb5dc6b92d9901a83628aec597acceb831916shepshapard } 5785cfbb5dc6b92d9901a83628aec597acceb831916shepshapard 5795cfbb5dc6b92d9901a83628aec597acceb831916shepshapard @Test 5805cfbb5dc6b92d9901a83628aec597acceb831916shepshapard public void setValue_twoObserversOneStopped_liveDataStaysActive() { 5815cfbb5dc6b92d9901a83628aec597acceb831916shepshapard Observer<String> observer1 = mock(Observer.class); 5825cfbb5dc6b92d9901a83628aec597acceb831916shepshapard Observer<String> observer2 = mock(Observer.class); 5835cfbb5dc6b92d9901a83628aec597acceb831916shepshapard 5845cfbb5dc6b92d9901a83628aec597acceb831916shepshapard mLiveData.observe(mOwner, observer1); 5855cfbb5dc6b92d9901a83628aec597acceb831916shepshapard mLiveData.observe(mOwner2, observer2); 5865cfbb5dc6b92d9901a83628aec597acceb831916shepshapard 5875cfbb5dc6b92d9901a83628aec597acceb831916shepshapard mRegistry.handleLifecycleEvent(Lifecycle.Event.ON_START); 5885cfbb5dc6b92d9901a83628aec597acceb831916shepshapard mRegistry2.handleLifecycleEvent(Lifecycle.Event.ON_START); 5895cfbb5dc6b92d9901a83628aec597acceb831916shepshapard 5905cfbb5dc6b92d9901a83628aec597acceb831916shepshapard verify(mActiveObserversChanged).onCall(true); 5915cfbb5dc6b92d9901a83628aec597acceb831916shepshapard 5925cfbb5dc6b92d9901a83628aec597acceb831916shepshapard reset(mActiveObserversChanged); 5935cfbb5dc6b92d9901a83628aec597acceb831916shepshapard mRegistry.handleLifecycleEvent(Lifecycle.Event.ON_STOP); 5945cfbb5dc6b92d9901a83628aec597acceb831916shepshapard 5955cfbb5dc6b92d9901a83628aec597acceb831916shepshapard verify(mActiveObserversChanged, never()).onCall(anyBoolean()); 5965cfbb5dc6b92d9901a83628aec597acceb831916shepshapard } 5975cfbb5dc6b92d9901a83628aec597acceb831916shepshapard 5985cfbb5dc6b92d9901a83628aec597acceb831916shepshapard @Test 5990b5883440daa7d68a80c08625866952c86071028shepshapard public void setValue_lifecycleIsCreatedNoEvent_liveDataBecomesInactiveAndObserverNotCalled() { 6005cfbb5dc6b92d9901a83628aec597acceb831916shepshapard 6010b5883440daa7d68a80c08625866952c86071028shepshapard // Arrange. 6020b5883440daa7d68a80c08625866952c86071028shepshapard 6030b5883440daa7d68a80c08625866952c86071028shepshapard mLiveData.observe(mOwner3, mObserver3); 6040b5883440daa7d68a80c08625866952c86071028shepshapard 6050b5883440daa7d68a80c08625866952c86071028shepshapard GenericLifecycleObserver lifecycleObserver = getGenericLifecycleObserver(mLifecycle3); 6060b5883440daa7d68a80c08625866952c86071028shepshapard 6070b5883440daa7d68a80c08625866952c86071028shepshapard when(mLifecycle3.getCurrentState()).thenReturn(Lifecycle.State.STARTED); 6080b5883440daa7d68a80c08625866952c86071028shepshapard lifecycleObserver.onStateChanged(mOwner3, Lifecycle.Event.ON_START); 6090b5883440daa7d68a80c08625866952c86071028shepshapard 6100b5883440daa7d68a80c08625866952c86071028shepshapard when(mLifecycle3.getCurrentState()).thenReturn(Lifecycle.State.CREATED); 6115cfbb5dc6b92d9901a83628aec597acceb831916shepshapard 612a3e03220c47cf14088ac23de6eb535cf45012109Yigit Boyar reset(mActiveObserversChanged); 6130b5883440daa7d68a80c08625866952c86071028shepshapard reset(mObserver3); 6140b5883440daa7d68a80c08625866952c86071028shepshapard 6150b5883440daa7d68a80c08625866952c86071028shepshapard // Act. 6165cfbb5dc6b92d9901a83628aec597acceb831916shepshapard 6175cfbb5dc6b92d9901a83628aec597acceb831916shepshapard mLiveData.setValue("1"); 618a3e03220c47cf14088ac23de6eb535cf45012109Yigit Boyar 6190b5883440daa7d68a80c08625866952c86071028shepshapard // Assert. 6200b5883440daa7d68a80c08625866952c86071028shepshapard 6210b5883440daa7d68a80c08625866952c86071028shepshapard verify(mActiveObserversChanged).onCall(false); 6220b5883440daa7d68a80c08625866952c86071028shepshapard verify(mObserver3, never()).onChanged(anyString()); 6230b5883440daa7d68a80c08625866952c86071028shepshapard } 6240b5883440daa7d68a80c08625866952c86071028shepshapard 6250b5883440daa7d68a80c08625866952c86071028shepshapard /* 6260b5883440daa7d68a80c08625866952c86071028shepshapard * Arrange: LiveData was made inactive via SetValue (because the Lifecycle it was 6270b5883440daa7d68a80c08625866952c86071028shepshapard * observing was in the CREATED state and no event was dispatched). 6280b5883440daa7d68a80c08625866952c86071028shepshapard * Act: Lifecycle enters Started state and dispatches event. 6290b5883440daa7d68a80c08625866952c86071028shepshapard * Assert: LiveData becomes active and dispatches new value to observer. 6300b5883440daa7d68a80c08625866952c86071028shepshapard */ 6310b5883440daa7d68a80c08625866952c86071028shepshapard @Test 6320b5883440daa7d68a80c08625866952c86071028shepshapard public void test_liveDataInactiveViaSetValueThenLifecycleResumes() { 6330b5883440daa7d68a80c08625866952c86071028shepshapard 6340b5883440daa7d68a80c08625866952c86071028shepshapard // Arrange. 6350b5883440daa7d68a80c08625866952c86071028shepshapard 6360b5883440daa7d68a80c08625866952c86071028shepshapard mLiveData.observe(mOwner3, mObserver3); 6370b5883440daa7d68a80c08625866952c86071028shepshapard 6380b5883440daa7d68a80c08625866952c86071028shepshapard GenericLifecycleObserver lifecycleObserver = getGenericLifecycleObserver(mLifecycle3); 6390b5883440daa7d68a80c08625866952c86071028shepshapard 6400b5883440daa7d68a80c08625866952c86071028shepshapard when(mLifecycle3.getCurrentState()).thenReturn(Lifecycle.State.STARTED); 6410b5883440daa7d68a80c08625866952c86071028shepshapard lifecycleObserver.onStateChanged(mOwner3, Lifecycle.Event.ON_START); 6420b5883440daa7d68a80c08625866952c86071028shepshapard 6430b5883440daa7d68a80c08625866952c86071028shepshapard when(mLifecycle3.getCurrentState()).thenReturn(Lifecycle.State.CREATED); 6440b5883440daa7d68a80c08625866952c86071028shepshapard mLiveData.setValue("1"); 6455cfbb5dc6b92d9901a83628aec597acceb831916shepshapard 6465cfbb5dc6b92d9901a83628aec597acceb831916shepshapard reset(mActiveObserversChanged); 6470b5883440daa7d68a80c08625866952c86071028shepshapard reset(mObserver3); 6480b5883440daa7d68a80c08625866952c86071028shepshapard 6490b5883440daa7d68a80c08625866952c86071028shepshapard // Act. 6500b5883440daa7d68a80c08625866952c86071028shepshapard 6510b5883440daa7d68a80c08625866952c86071028shepshapard when(mLifecycle3.getCurrentState()).thenReturn(Lifecycle.State.STARTED); 6520b5883440daa7d68a80c08625866952c86071028shepshapard lifecycleObserver.onStateChanged(mOwner3, Lifecycle.Event.ON_START); 6530b5883440daa7d68a80c08625866952c86071028shepshapard 6540b5883440daa7d68a80c08625866952c86071028shepshapard // Assert. 6550b5883440daa7d68a80c08625866952c86071028shepshapard 6565cfbb5dc6b92d9901a83628aec597acceb831916shepshapard verify(mActiveObserversChanged).onCall(true); 6570b5883440daa7d68a80c08625866952c86071028shepshapard verify(mObserver3).onChanged("1"); 6585cfbb5dc6b92d9901a83628aec597acceb831916shepshapard } 6595cfbb5dc6b92d9901a83628aec597acceb831916shepshapard 6600b5883440daa7d68a80c08625866952c86071028shepshapard /* 6610b5883440daa7d68a80c08625866952c86071028shepshapard * Arrange: One of two Lifecycles enter the CREATED state without sending an event. 6620b5883440daa7d68a80c08625866952c86071028shepshapard * Act: Lifecycle's setValue method is called with new value. 6630b5883440daa7d68a80c08625866952c86071028shepshapard * Assert: LiveData stays active and new value is dispatched to Lifecycle that is still at least 6640b5883440daa7d68a80c08625866952c86071028shepshapard * STARTED. 6655cfbb5dc6b92d9901a83628aec597acceb831916shepshapard */ 6665cfbb5dc6b92d9901a83628aec597acceb831916shepshapard @Test 6670b5883440daa7d68a80c08625866952c86071028shepshapard public void setValue_oneOfTwoLifecyclesAreCreatedNoEvent() { 6685cfbb5dc6b92d9901a83628aec597acceb831916shepshapard 6690b5883440daa7d68a80c08625866952c86071028shepshapard // Arrange. 6705cfbb5dc6b92d9901a83628aec597acceb831916shepshapard 6710b5883440daa7d68a80c08625866952c86071028shepshapard mLiveData.observe(mOwner3, mObserver3); 6720b5883440daa7d68a80c08625866952c86071028shepshapard mLiveData.observe(mOwner4, mObserver4); 6730b5883440daa7d68a80c08625866952c86071028shepshapard 6740b5883440daa7d68a80c08625866952c86071028shepshapard GenericLifecycleObserver lifecycleObserver3 = getGenericLifecycleObserver(mLifecycle3); 6750b5883440daa7d68a80c08625866952c86071028shepshapard GenericLifecycleObserver lifecycleObserver4 = getGenericLifecycleObserver(mLifecycle4); 6760b5883440daa7d68a80c08625866952c86071028shepshapard 6770b5883440daa7d68a80c08625866952c86071028shepshapard when(mLifecycle3.getCurrentState()).thenReturn(Lifecycle.State.STARTED); 6780b5883440daa7d68a80c08625866952c86071028shepshapard when(mLifecycle4.getCurrentState()).thenReturn(Lifecycle.State.STARTED); 6790b5883440daa7d68a80c08625866952c86071028shepshapard lifecycleObserver3.onStateChanged(mOwner3, Lifecycle.Event.ON_START); 6800b5883440daa7d68a80c08625866952c86071028shepshapard lifecycleObserver4.onStateChanged(mOwner4, Lifecycle.Event.ON_START); 6810b5883440daa7d68a80c08625866952c86071028shepshapard 6820b5883440daa7d68a80c08625866952c86071028shepshapard when(mLifecycle3.getCurrentState()).thenReturn(Lifecycle.State.CREATED); 6835cfbb5dc6b92d9901a83628aec597acceb831916shepshapard 6845cfbb5dc6b92d9901a83628aec597acceb831916shepshapard reset(mActiveObserversChanged); 6850b5883440daa7d68a80c08625866952c86071028shepshapard reset(mObserver3); 6860b5883440daa7d68a80c08625866952c86071028shepshapard reset(mObserver4); 6870b5883440daa7d68a80c08625866952c86071028shepshapard 6880b5883440daa7d68a80c08625866952c86071028shepshapard // Act. 6895cfbb5dc6b92d9901a83628aec597acceb831916shepshapard 6905cfbb5dc6b92d9901a83628aec597acceb831916shepshapard mLiveData.setValue("1"); 6910b5883440daa7d68a80c08625866952c86071028shepshapard 6920b5883440daa7d68a80c08625866952c86071028shepshapard // Assert. 6930b5883440daa7d68a80c08625866952c86071028shepshapard 6945cfbb5dc6b92d9901a83628aec597acceb831916shepshapard verify(mActiveObserversChanged, never()).onCall(anyBoolean()); 6950b5883440daa7d68a80c08625866952c86071028shepshapard verify(mObserver3, never()).onChanged(anyString()); 6960b5883440daa7d68a80c08625866952c86071028shepshapard verify(mObserver4).onChanged("1"); 6970b5883440daa7d68a80c08625866952c86071028shepshapard } 6985cfbb5dc6b92d9901a83628aec597acceb831916shepshapard 6990b5883440daa7d68a80c08625866952c86071028shepshapard /* 7000b5883440daa7d68a80c08625866952c86071028shepshapard * Arrange: Two observed Lifecycles enter the CREATED state without sending an event. 7010b5883440daa7d68a80c08625866952c86071028shepshapard * Act: Lifecycle's setValue method is called with new value. 7020b5883440daa7d68a80c08625866952c86071028shepshapard * Assert: LiveData becomes inactive and nothing is dispatched to either observer. 7030b5883440daa7d68a80c08625866952c86071028shepshapard */ 7040b5883440daa7d68a80c08625866952c86071028shepshapard @Test 7050b5883440daa7d68a80c08625866952c86071028shepshapard public void setValue_twoLifecyclesAreCreatedNoEvent() { 7060b5883440daa7d68a80c08625866952c86071028shepshapard 7070b5883440daa7d68a80c08625866952c86071028shepshapard // Arrange. 7080b5883440daa7d68a80c08625866952c86071028shepshapard 7090b5883440daa7d68a80c08625866952c86071028shepshapard mLiveData.observe(mOwner3, mObserver3); 7100b5883440daa7d68a80c08625866952c86071028shepshapard mLiveData.observe(mOwner4, mObserver4); 7110b5883440daa7d68a80c08625866952c86071028shepshapard 7120b5883440daa7d68a80c08625866952c86071028shepshapard GenericLifecycleObserver lifecycleObserver3 = getGenericLifecycleObserver(mLifecycle3); 7130b5883440daa7d68a80c08625866952c86071028shepshapard GenericLifecycleObserver lifecycleObserver4 = getGenericLifecycleObserver(mLifecycle4); 7140b5883440daa7d68a80c08625866952c86071028shepshapard 7150b5883440daa7d68a80c08625866952c86071028shepshapard when(mLifecycle3.getCurrentState()).thenReturn(Lifecycle.State.STARTED); 7160b5883440daa7d68a80c08625866952c86071028shepshapard when(mLifecycle4.getCurrentState()).thenReturn(Lifecycle.State.STARTED); 7170b5883440daa7d68a80c08625866952c86071028shepshapard lifecycleObserver3.onStateChanged(mOwner3, Lifecycle.Event.ON_START); 7180b5883440daa7d68a80c08625866952c86071028shepshapard lifecycleObserver4.onStateChanged(mOwner4, Lifecycle.Event.ON_START); 7190b5883440daa7d68a80c08625866952c86071028shepshapard 7200b5883440daa7d68a80c08625866952c86071028shepshapard when(mLifecycle3.getCurrentState()).thenReturn(Lifecycle.State.CREATED); 7210b5883440daa7d68a80c08625866952c86071028shepshapard when(mLifecycle4.getCurrentState()).thenReturn(Lifecycle.State.CREATED); 7225cfbb5dc6b92d9901a83628aec597acceb831916shepshapard 723a3e03220c47cf14088ac23de6eb535cf45012109Yigit Boyar reset(mActiveObserversChanged); 7240b5883440daa7d68a80c08625866952c86071028shepshapard reset(mObserver3); 7250b5883440daa7d68a80c08625866952c86071028shepshapard reset(mObserver4); 7260b5883440daa7d68a80c08625866952c86071028shepshapard 7270b5883440daa7d68a80c08625866952c86071028shepshapard // Act. 7280b5883440daa7d68a80c08625866952c86071028shepshapard 7290b5883440daa7d68a80c08625866952c86071028shepshapard mLiveData.setValue("1"); 7300b5883440daa7d68a80c08625866952c86071028shepshapard 7310b5883440daa7d68a80c08625866952c86071028shepshapard // Assert. 7320b5883440daa7d68a80c08625866952c86071028shepshapard 7330b5883440daa7d68a80c08625866952c86071028shepshapard verify(mActiveObserversChanged).onCall(false); 7340b5883440daa7d68a80c08625866952c86071028shepshapard verify(mObserver3, never()).onChanged(anyString()); 7350b5883440daa7d68a80c08625866952c86071028shepshapard verify(mObserver3, never()).onChanged(anyString()); 7360b5883440daa7d68a80c08625866952c86071028shepshapard } 7370b5883440daa7d68a80c08625866952c86071028shepshapard 7380b5883440daa7d68a80c08625866952c86071028shepshapard /* 7390b5883440daa7d68a80c08625866952c86071028shepshapard * Arrange: LiveData was made inactive via SetValue (because both Lifecycles it was 7400b5883440daa7d68a80c08625866952c86071028shepshapard * observing were in the CREATED state and no event was dispatched). 7410b5883440daa7d68a80c08625866952c86071028shepshapard * Act: One Lifecycle enters STARTED state and dispatches lifecycle event. 7420b5883440daa7d68a80c08625866952c86071028shepshapard * Assert: LiveData becomes active and dispatches new value to observer associated with started 7430b5883440daa7d68a80c08625866952c86071028shepshapard * Lifecycle. 7440b5883440daa7d68a80c08625866952c86071028shepshapard */ 7450b5883440daa7d68a80c08625866952c86071028shepshapard @Test 7460b5883440daa7d68a80c08625866952c86071028shepshapard public void test_liveDataInactiveViaSetValueThenOneLifecycleResumes() { 7470b5883440daa7d68a80c08625866952c86071028shepshapard 7480b5883440daa7d68a80c08625866952c86071028shepshapard // Arrange. 7490b5883440daa7d68a80c08625866952c86071028shepshapard 7500b5883440daa7d68a80c08625866952c86071028shepshapard mLiveData.observe(mOwner3, mObserver3); 7510b5883440daa7d68a80c08625866952c86071028shepshapard mLiveData.observe(mOwner4, mObserver4); 7520b5883440daa7d68a80c08625866952c86071028shepshapard 7530b5883440daa7d68a80c08625866952c86071028shepshapard GenericLifecycleObserver lifecycleObserver3 = getGenericLifecycleObserver(mLifecycle3); 7540b5883440daa7d68a80c08625866952c86071028shepshapard GenericLifecycleObserver lifecycleObserver4 = getGenericLifecycleObserver(mLifecycle4); 7550b5883440daa7d68a80c08625866952c86071028shepshapard 7560b5883440daa7d68a80c08625866952c86071028shepshapard when(mLifecycle3.getCurrentState()).thenReturn(Lifecycle.State.STARTED); 7570b5883440daa7d68a80c08625866952c86071028shepshapard when(mLifecycle4.getCurrentState()).thenReturn(Lifecycle.State.STARTED); 7580b5883440daa7d68a80c08625866952c86071028shepshapard lifecycleObserver3.onStateChanged(mOwner3, Lifecycle.Event.ON_START); 7590b5883440daa7d68a80c08625866952c86071028shepshapard lifecycleObserver4.onStateChanged(mOwner4, Lifecycle.Event.ON_START); 7600b5883440daa7d68a80c08625866952c86071028shepshapard 7610b5883440daa7d68a80c08625866952c86071028shepshapard when(mLifecycle3.getCurrentState()).thenReturn(Lifecycle.State.CREATED); 7620b5883440daa7d68a80c08625866952c86071028shepshapard when(mLifecycle4.getCurrentState()).thenReturn(Lifecycle.State.CREATED); 7630b5883440daa7d68a80c08625866952c86071028shepshapard 7640b5883440daa7d68a80c08625866952c86071028shepshapard mLiveData.setValue("1"); 7655cfbb5dc6b92d9901a83628aec597acceb831916shepshapard 766a3e03220c47cf14088ac23de6eb535cf45012109Yigit Boyar reset(mActiveObserversChanged); 7670b5883440daa7d68a80c08625866952c86071028shepshapard reset(mObserver3); 7680b5883440daa7d68a80c08625866952c86071028shepshapard reset(mObserver4); 7690b5883440daa7d68a80c08625866952c86071028shepshapard 7700b5883440daa7d68a80c08625866952c86071028shepshapard // Act. 7710b5883440daa7d68a80c08625866952c86071028shepshapard 7720b5883440daa7d68a80c08625866952c86071028shepshapard when(mLifecycle3.getCurrentState()).thenReturn(Lifecycle.State.STARTED); 7730b5883440daa7d68a80c08625866952c86071028shepshapard lifecycleObserver3.onStateChanged(mOwner3, Lifecycle.Event.ON_START); 7740b5883440daa7d68a80c08625866952c86071028shepshapard 7750b5883440daa7d68a80c08625866952c86071028shepshapard // Assert. 7760b5883440daa7d68a80c08625866952c86071028shepshapard 7775cfbb5dc6b92d9901a83628aec597acceb831916shepshapard verify(mActiveObserversChanged).onCall(true); 7780b5883440daa7d68a80c08625866952c86071028shepshapard verify(mObserver3).onChanged("1"); 7790b5883440daa7d68a80c08625866952c86071028shepshapard verify(mObserver4, never()).onChanged(anyString()); 7800b5883440daa7d68a80c08625866952c86071028shepshapard } 7810b5883440daa7d68a80c08625866952c86071028shepshapard 7820b5883440daa7d68a80c08625866952c86071028shepshapard private GenericLifecycleObserver getGenericLifecycleObserver(Lifecycle lifecycle) { 7830b5883440daa7d68a80c08625866952c86071028shepshapard ArgumentCaptor<GenericLifecycleObserver> captor = 7840b5883440daa7d68a80c08625866952c86071028shepshapard ArgumentCaptor.forClass(GenericLifecycleObserver.class); 7850b5883440daa7d68a80c08625866952c86071028shepshapard verify(lifecycle).addObserver(captor.capture()); 7860b5883440daa7d68a80c08625866952c86071028shepshapard return (captor.getValue()); 7875cfbb5dc6b92d9901a83628aec597acceb831916shepshapard } 7885cfbb5dc6b92d9901a83628aec597acceb831916shepshapard 789c1b53ee5d095a74b84c21257fb4cd00e33f748baYigit Boyar @SuppressWarnings("WeakerAccess") 790c1b53ee5d095a74b84c21257fb4cd00e33f748baYigit Boyar static class PublicLiveData<T> extends LiveData<T> { 791c1b53ee5d095a74b84c21257fb4cd00e33f748baYigit Boyar // cannot spy due to internal calls 792c1b53ee5d095a74b84c21257fb4cd00e33f748baYigit Boyar public MethodExec activeObserversChanged; 793c1b53ee5d095a74b84c21257fb4cd00e33f748baYigit Boyar 794c1b53ee5d095a74b84c21257fb4cd00e33f748baYigit Boyar @Override 7954d4bf0391459bec361ec7843447ae60d38c99028Yigit Boyar protected void onActive() { 796c1b53ee5d095a74b84c21257fb4cd00e33f748baYigit Boyar if (activeObserversChanged != null) { 7974d4bf0391459bec361ec7843447ae60d38c99028Yigit Boyar activeObserversChanged.onCall(true); 798c1b53ee5d095a74b84c21257fb4cd00e33f748baYigit Boyar } 799c1b53ee5d095a74b84c21257fb4cd00e33f748baYigit Boyar } 800c1b53ee5d095a74b84c21257fb4cd00e33f748baYigit Boyar 801c1b53ee5d095a74b84c21257fb4cd00e33f748baYigit Boyar @Override 8024d4bf0391459bec361ec7843447ae60d38c99028Yigit Boyar protected void onInactive() { 8034d4bf0391459bec361ec7843447ae60d38c99028Yigit Boyar if (activeObserversChanged != null) { 8044d4bf0391459bec361ec7843447ae60d38c99028Yigit Boyar activeObserversChanged.onCall(false); 805c1b53ee5d095a74b84c21257fb4cd00e33f748baYigit Boyar } 806c1b53ee5d095a74b84c21257fb4cd00e33f748baYigit Boyar } 807c1b53ee5d095a74b84c21257fb4cd00e33f748baYigit Boyar } 808c1b53ee5d095a74b84c21257fb4cd00e33f748baYigit Boyar 809c43ce90b803cdfa033dfc94fa4161371ed6f3ec6Sergey Vasilinets private class FailReentranceObserver<T> implements Observer<T> { 810c43ce90b803cdfa033dfc94fa4161371ed6f3ec6Sergey Vasilinets @Override 811c43ce90b803cdfa033dfc94fa4161371ed6f3ec6Sergey Vasilinets public void onChanged(@Nullable T t) { 812c43ce90b803cdfa033dfc94fa4161371ed6f3ec6Sergey Vasilinets assertThat(mInObserver, is(false)); 813c43ce90b803cdfa033dfc94fa4161371ed6f3ec6Sergey Vasilinets } 814c43ce90b803cdfa033dfc94fa4161371ed6f3ec6Sergey Vasilinets } 815c43ce90b803cdfa033dfc94fa4161371ed6f3ec6Sergey Vasilinets 816c1b53ee5d095a74b84c21257fb4cd00e33f748baYigit Boyar interface MethodExec { 817c1b53ee5d095a74b84c21257fb4cd00e33f748baYigit Boyar void onCall(boolean value); 818c1b53ee5d095a74b84c21257fb4cd00e33f748baYigit Boyar } 819c1b53ee5d095a74b84c21257fb4cd00e33f748baYigit Boyar} 820