LiveDataTest.java revision 3facabd26326a3f4274b04dc7ab03442839c5601
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 3964db0cc15b78b62a1d44a70fc8b4552e660d952cYigit Boyarimport android.arch.core.executor.AppToolkitTaskExecutor; 4064db0cc15b78b62a1d44a70fc8b4552e660d952cYigit Boyarimport android.arch.lifecycle.util.InstantTaskExecutor; 41b86bef286718da421268bc52cf4fab7cccb3104cSergey Vasilinetsimport android.support.annotation.Nullable; 42b86bef286718da421268bc52cf4fab7cccb3104cSergey Vasilinetsimport android.support.test.filters.SmallTest; 4334e5031083f735db3a395b0f6aa430880b072d71Yigit Boyar 4434e5031083f735db3a395b0f6aa430880b072d71Yigit Boyarimport org.junit.After; 45c1b53ee5d095a74b84c21257fb4cd00e33f748baYigit Boyarimport org.junit.Before; 46c1b53ee5d095a74b84c21257fb4cd00e33f748baYigit Boyarimport org.junit.Test; 47c43ce90b803cdfa033dfc94fa4161371ed6f3ec6Sergey Vasilinetsimport org.mockito.Mockito; 48c1b53ee5d095a74b84c21257fb4cd00e33f748baYigit Boyar 49c1b53ee5d095a74b84c21257fb4cd00e33f748baYigit Boyar@SuppressWarnings({"unchecked"}) 50c43ce90b803cdfa033dfc94fa4161371ed6f3ec6Sergey Vasilinets@SmallTest 51c1b53ee5d095a74b84c21257fb4cd00e33f748baYigit Boyarpublic class LiveDataTest { 52c1b53ee5d095a74b84c21257fb4cd00e33f748baYigit Boyar private PublicLiveData<String> mLiveData; 53e13540a25fe5460240b6db0e18858c32d16f5399Sergey Vasilinets private LifecycleOwner mOwner; 54c1b53ee5d095a74b84c21257fb4cd00e33f748baYigit Boyar private LifecycleRegistry mRegistry; 55c1b53ee5d095a74b84c21257fb4cd00e33f748baYigit Boyar private MethodExec mActiveObserversChanged; 56c43ce90b803cdfa033dfc94fa4161371ed6f3ec6Sergey Vasilinets private boolean mInObserver; 57c1b53ee5d095a74b84c21257fb4cd00e33f748baYigit Boyar 58c1b53ee5d095a74b84c21257fb4cd00e33f748baYigit Boyar @Before 59c1b53ee5d095a74b84c21257fb4cd00e33f748baYigit Boyar public void init() { 60c1b53ee5d095a74b84c21257fb4cd00e33f748baYigit Boyar mLiveData = new PublicLiveData<>(); 61e13540a25fe5460240b6db0e18858c32d16f5399Sergey Vasilinets mOwner = mock(LifecycleOwner.class); 62e13540a25fe5460240b6db0e18858c32d16f5399Sergey Vasilinets mRegistry = new LifecycleRegistry(mOwner); 63e13540a25fe5460240b6db0e18858c32d16f5399Sergey Vasilinets when(mOwner.getLifecycle()).thenReturn(mRegistry); 64c1b53ee5d095a74b84c21257fb4cd00e33f748baYigit Boyar mActiveObserversChanged = mock(MethodExec.class); 65c1b53ee5d095a74b84c21257fb4cd00e33f748baYigit Boyar mLiveData.activeObserversChanged = mActiveObserversChanged; 66c43ce90b803cdfa033dfc94fa4161371ed6f3ec6Sergey Vasilinets mInObserver = false; 67c1b53ee5d095a74b84c21257fb4cd00e33f748baYigit Boyar } 68c1b53ee5d095a74b84c21257fb4cd00e33f748baYigit Boyar 6934e5031083f735db3a395b0f6aa430880b072d71Yigit Boyar @Before 7034e5031083f735db3a395b0f6aa430880b072d71Yigit Boyar public void swapExecutorDelegate() { 7136436741fe52fa90bbeeddf7baa05f97d734f5f1Yigit Boyar AppToolkitTaskExecutor.getInstance().setDelegate(new InstantTaskExecutor()); 7234e5031083f735db3a395b0f6aa430880b072d71Yigit Boyar } 7334e5031083f735db3a395b0f6aa430880b072d71Yigit Boyar 7434e5031083f735db3a395b0f6aa430880b072d71Yigit Boyar @After 7534e5031083f735db3a395b0f6aa430880b072d71Yigit Boyar public void removeExecutorDelegate() { 7634e5031083f735db3a395b0f6aa430880b072d71Yigit Boyar AppToolkitTaskExecutor.getInstance().setDelegate(null); 7734e5031083f735db3a395b0f6aa430880b072d71Yigit Boyar } 7834e5031083f735db3a395b0f6aa430880b072d71Yigit Boyar 79c1b53ee5d095a74b84c21257fb4cd00e33f748baYigit Boyar @Test 80c1b53ee5d095a74b84c21257fb4cd00e33f748baYigit Boyar public void testObserverToggle() { 81c1b53ee5d095a74b84c21257fb4cd00e33f748baYigit Boyar Observer<String> observer = (Observer<String>) mock(Observer.class); 82e13540a25fe5460240b6db0e18858c32d16f5399Sergey Vasilinets mLiveData.observe(mOwner, observer); 83c1b53ee5d095a74b84c21257fb4cd00e33f748baYigit Boyar 84c1b53ee5d095a74b84c21257fb4cd00e33f748baYigit Boyar verify(mActiveObserversChanged, never()).onCall(anyBoolean()); 85abf6c87826e1a86fed71d945dc7e7f1aa643ea6cSergey Vasilinets assertThat(mLiveData.hasObservers(), is(true)); 86abf6c87826e1a86fed71d945dc7e7f1aa643ea6cSergey Vasilinets assertThat(mLiveData.hasActiveObservers(), is(false)); 87c1b53ee5d095a74b84c21257fb4cd00e33f748baYigit Boyar 88c1b53ee5d095a74b84c21257fb4cd00e33f748baYigit Boyar mLiveData.removeObserver(observer); 89c1b53ee5d095a74b84c21257fb4cd00e33f748baYigit Boyar verify(mActiveObserversChanged, never()).onCall(anyBoolean()); 90abf6c87826e1a86fed71d945dc7e7f1aa643ea6cSergey Vasilinets assertThat(mLiveData.hasObservers(), is(false)); 91abf6c87826e1a86fed71d945dc7e7f1aa643ea6cSergey Vasilinets assertThat(mLiveData.hasActiveObservers(), is(false)); 92c1b53ee5d095a74b84c21257fb4cd00e33f748baYigit Boyar } 93c1b53ee5d095a74b84c21257fb4cd00e33f748baYigit Boyar 94c1b53ee5d095a74b84c21257fb4cd00e33f748baYigit Boyar @Test 95c1b53ee5d095a74b84c21257fb4cd00e33f748baYigit Boyar public void testActiveObserverToggle() { 96c1b53ee5d095a74b84c21257fb4cd00e33f748baYigit Boyar Observer<String> observer = (Observer<String>) mock(Observer.class); 97e13540a25fe5460240b6db0e18858c32d16f5399Sergey Vasilinets mLiveData.observe(mOwner, observer); 98c1b53ee5d095a74b84c21257fb4cd00e33f748baYigit Boyar 99c1b53ee5d095a74b84c21257fb4cd00e33f748baYigit Boyar verify(mActiveObserversChanged, never()).onCall(anyBoolean()); 100abf6c87826e1a86fed71d945dc7e7f1aa643ea6cSergey Vasilinets assertThat(mLiveData.hasObservers(), is(true)); 101abf6c87826e1a86fed71d945dc7e7f1aa643ea6cSergey Vasilinets assertThat(mLiveData.hasActiveObservers(), is(false)); 102c1b53ee5d095a74b84c21257fb4cd00e33f748baYigit Boyar 103c1b53ee5d095a74b84c21257fb4cd00e33f748baYigit Boyar mRegistry.handleLifecycleEvent(ON_START); 104c1b53ee5d095a74b84c21257fb4cd00e33f748baYigit Boyar verify(mActiveObserversChanged).onCall(true); 105abf6c87826e1a86fed71d945dc7e7f1aa643ea6cSergey Vasilinets assertThat(mLiveData.hasActiveObservers(), is(true)); 1064d4bf0391459bec361ec7843447ae60d38c99028Yigit Boyar reset(mActiveObserversChanged); 107c1b53ee5d095a74b84c21257fb4cd00e33f748baYigit Boyar 108c1b53ee5d095a74b84c21257fb4cd00e33f748baYigit Boyar mRegistry.handleLifecycleEvent(ON_STOP); 109c1b53ee5d095a74b84c21257fb4cd00e33f748baYigit Boyar verify(mActiveObserversChanged).onCall(false); 110abf6c87826e1a86fed71d945dc7e7f1aa643ea6cSergey Vasilinets assertThat(mLiveData.hasActiveObservers(), is(false)); 111abf6c87826e1a86fed71d945dc7e7f1aa643ea6cSergey Vasilinets assertThat(mLiveData.hasObservers(), is(true)); 112c1b53ee5d095a74b84c21257fb4cd00e33f748baYigit Boyar 1134d4bf0391459bec361ec7843447ae60d38c99028Yigit Boyar reset(mActiveObserversChanged); 114c1b53ee5d095a74b84c21257fb4cd00e33f748baYigit Boyar mRegistry.handleLifecycleEvent(ON_START); 115c1b53ee5d095a74b84c21257fb4cd00e33f748baYigit Boyar verify(mActiveObserversChanged).onCall(true); 116abf6c87826e1a86fed71d945dc7e7f1aa643ea6cSergey Vasilinets assertThat(mLiveData.hasActiveObservers(), is(true)); 117abf6c87826e1a86fed71d945dc7e7f1aa643ea6cSergey Vasilinets assertThat(mLiveData.hasObservers(), is(true)); 118c1b53ee5d095a74b84c21257fb4cd00e33f748baYigit Boyar 1194d4bf0391459bec361ec7843447ae60d38c99028Yigit Boyar reset(mActiveObserversChanged); 120c1b53ee5d095a74b84c21257fb4cd00e33f748baYigit Boyar mLiveData.removeObserver(observer); 121c1b53ee5d095a74b84c21257fb4cd00e33f748baYigit Boyar verify(mActiveObserversChanged).onCall(false); 122abf6c87826e1a86fed71d945dc7e7f1aa643ea6cSergey Vasilinets assertThat(mLiveData.hasActiveObservers(), is(false)); 123abf6c87826e1a86fed71d945dc7e7f1aa643ea6cSergey Vasilinets assertThat(mLiveData.hasObservers(), is(false)); 124c1b53ee5d095a74b84c21257fb4cd00e33f748baYigit Boyar 1254d4bf0391459bec361ec7843447ae60d38c99028Yigit Boyar verifyNoMoreInteractions(mActiveObserversChanged); 126c1b53ee5d095a74b84c21257fb4cd00e33f748baYigit Boyar } 127c1b53ee5d095a74b84c21257fb4cd00e33f748baYigit Boyar 128c1b53ee5d095a74b84c21257fb4cd00e33f748baYigit Boyar @Test 129c1b53ee5d095a74b84c21257fb4cd00e33f748baYigit Boyar public void testReAddSameObserverTuple() { 130c1b53ee5d095a74b84c21257fb4cd00e33f748baYigit Boyar Observer<String> observer = (Observer<String>) mock(Observer.class); 131e13540a25fe5460240b6db0e18858c32d16f5399Sergey Vasilinets mLiveData.observe(mOwner, observer); 132e13540a25fe5460240b6db0e18858c32d16f5399Sergey Vasilinets mLiveData.observe(mOwner, observer); 133abf6c87826e1a86fed71d945dc7e7f1aa643ea6cSergey Vasilinets assertThat(mLiveData.hasObservers(), is(true)); 134c1b53ee5d095a74b84c21257fb4cd00e33f748baYigit Boyar } 135c1b53ee5d095a74b84c21257fb4cd00e33f748baYigit Boyar 136c1b53ee5d095a74b84c21257fb4cd00e33f748baYigit Boyar @Test 137e13540a25fe5460240b6db0e18858c32d16f5399Sergey Vasilinets public void testAdd2ObserversWithSameOwnerAndRemove() { 138c1b53ee5d095a74b84c21257fb4cd00e33f748baYigit Boyar Observer<String> o1 = (Observer<String>) mock(Observer.class); 139c1b53ee5d095a74b84c21257fb4cd00e33f748baYigit Boyar Observer<String> o2 = (Observer<String>) mock(Observer.class); 140e13540a25fe5460240b6db0e18858c32d16f5399Sergey Vasilinets mLiveData.observe(mOwner, o1); 141e13540a25fe5460240b6db0e18858c32d16f5399Sergey Vasilinets mLiveData.observe(mOwner, o2); 142abf6c87826e1a86fed71d945dc7e7f1aa643ea6cSergey Vasilinets assertThat(mLiveData.hasObservers(), is(true)); 143c1b53ee5d095a74b84c21257fb4cd00e33f748baYigit Boyar verify(mActiveObserversChanged, never()).onCall(anyBoolean()); 144c1b53ee5d095a74b84c21257fb4cd00e33f748baYigit Boyar 145c1b53ee5d095a74b84c21257fb4cd00e33f748baYigit Boyar mRegistry.handleLifecycleEvent(ON_START); 146c1b53ee5d095a74b84c21257fb4cd00e33f748baYigit Boyar verify(mActiveObserversChanged).onCall(true); 147c1b53ee5d095a74b84c21257fb4cd00e33f748baYigit Boyar mLiveData.setValue("a"); 148c1b53ee5d095a74b84c21257fb4cd00e33f748baYigit Boyar verify(o1).onChanged("a"); 149c1b53ee5d095a74b84c21257fb4cd00e33f748baYigit Boyar verify(o2).onChanged("a"); 150c1b53ee5d095a74b84c21257fb4cd00e33f748baYigit Boyar 151e13540a25fe5460240b6db0e18858c32d16f5399Sergey Vasilinets mLiveData.removeObservers(mOwner); 152c1b53ee5d095a74b84c21257fb4cd00e33f748baYigit Boyar 153abf6c87826e1a86fed71d945dc7e7f1aa643ea6cSergey Vasilinets assertThat(mLiveData.hasObservers(), is(false)); 15480f1ba3ad13ca7e35c524a20442fd895e034f625Sergey Vasilinets assertThat(mRegistry.getObserverCount(), is(0)); 155c1b53ee5d095a74b84c21257fb4cd00e33f748baYigit Boyar } 156c1b53ee5d095a74b84c21257fb4cd00e33f748baYigit Boyar 157c1b53ee5d095a74b84c21257fb4cd00e33f748baYigit Boyar @Test 158e13540a25fe5460240b6db0e18858c32d16f5399Sergey Vasilinets public void testAddSameObserverIn2LifecycleOwners() { 159c1b53ee5d095a74b84c21257fb4cd00e33f748baYigit Boyar Observer<String> observer = (Observer<String>) mock(Observer.class); 160e13540a25fe5460240b6db0e18858c32d16f5399Sergey Vasilinets LifecycleOwner owner2 = mock(LifecycleOwner.class); 161e13540a25fe5460240b6db0e18858c32d16f5399Sergey Vasilinets LifecycleRegistry registry2 = new LifecycleRegistry(owner2); 162e13540a25fe5460240b6db0e18858c32d16f5399Sergey Vasilinets when(owner2.getLifecycle()).thenReturn(registry2); 163c1b53ee5d095a74b84c21257fb4cd00e33f748baYigit Boyar 164e13540a25fe5460240b6db0e18858c32d16f5399Sergey Vasilinets mLiveData.observe(mOwner, observer); 165c1b53ee5d095a74b84c21257fb4cd00e33f748baYigit Boyar Throwable throwable = null; 166c1b53ee5d095a74b84c21257fb4cd00e33f748baYigit Boyar try { 167e13540a25fe5460240b6db0e18858c32d16f5399Sergey Vasilinets mLiveData.observe(owner2, observer); 168c1b53ee5d095a74b84c21257fb4cd00e33f748baYigit Boyar } catch (Throwable t) { 169c1b53ee5d095a74b84c21257fb4cd00e33f748baYigit Boyar throwable = t; 170c1b53ee5d095a74b84c21257fb4cd00e33f748baYigit Boyar } 171c1b53ee5d095a74b84c21257fb4cd00e33f748baYigit Boyar assertThat(throwable, instanceOf(IllegalArgumentException.class)); 172c43ce90b803cdfa033dfc94fa4161371ed6f3ec6Sergey Vasilinets //noinspection ConstantConditions 173c1b53ee5d095a74b84c21257fb4cd00e33f748baYigit Boyar assertThat(throwable.getMessage(), 174c43ce90b803cdfa033dfc94fa4161371ed6f3ec6Sergey Vasilinets is("Cannot add the same observer with different lifecycles")); 175c1b53ee5d095a74b84c21257fb4cd00e33f748baYigit Boyar } 176c1b53ee5d095a74b84c21257fb4cd00e33f748baYigit Boyar 177c1b53ee5d095a74b84c21257fb4cd00e33f748baYigit Boyar @Test 178c1b53ee5d095a74b84c21257fb4cd00e33f748baYigit Boyar public void testRemoveDestroyedObserver() { 179c1b53ee5d095a74b84c21257fb4cd00e33f748baYigit Boyar Observer<String> observer = (Observer<String>) mock(Observer.class); 180e13540a25fe5460240b6db0e18858c32d16f5399Sergey Vasilinets mLiveData.observe(mOwner, observer); 181c1b53ee5d095a74b84c21257fb4cd00e33f748baYigit Boyar mRegistry.handleLifecycleEvent(ON_START); 182c1b53ee5d095a74b84c21257fb4cd00e33f748baYigit Boyar verify(mActiveObserversChanged).onCall(true); 183abf6c87826e1a86fed71d945dc7e7f1aa643ea6cSergey Vasilinets assertThat(mLiveData.hasObservers(), is(true)); 184abf6c87826e1a86fed71d945dc7e7f1aa643ea6cSergey Vasilinets assertThat(mLiveData.hasActiveObservers(), is(true)); 1854d4bf0391459bec361ec7843447ae60d38c99028Yigit Boyar 1864d4bf0391459bec361ec7843447ae60d38c99028Yigit Boyar reset(mActiveObserversChanged); 187c1b53ee5d095a74b84c21257fb4cd00e33f748baYigit Boyar 188c1b53ee5d095a74b84c21257fb4cd00e33f748baYigit Boyar mRegistry.handleLifecycleEvent(ON_DESTROY); 189abf6c87826e1a86fed71d945dc7e7f1aa643ea6cSergey Vasilinets assertThat(mLiveData.hasObservers(), is(false)); 190abf6c87826e1a86fed71d945dc7e7f1aa643ea6cSergey Vasilinets assertThat(mLiveData.hasActiveObservers(), is(false)); 191c1b53ee5d095a74b84c21257fb4cd00e33f748baYigit Boyar verify(mActiveObserversChanged).onCall(false); 192c1b53ee5d095a74b84c21257fb4cd00e33f748baYigit Boyar } 193c1b53ee5d095a74b84c21257fb4cd00e33f748baYigit Boyar 194c1b53ee5d095a74b84c21257fb4cd00e33f748baYigit Boyar @Test 195c1b53ee5d095a74b84c21257fb4cd00e33f748baYigit Boyar public void testInactiveRegistry() { 196c1b53ee5d095a74b84c21257fb4cd00e33f748baYigit Boyar Observer<String> observer = (Observer<String>) mock(Observer.class); 197c1b53ee5d095a74b84c21257fb4cd00e33f748baYigit Boyar mRegistry.handleLifecycleEvent(ON_DESTROY); 198e13540a25fe5460240b6db0e18858c32d16f5399Sergey Vasilinets mLiveData.observe(mOwner, observer); 199abf6c87826e1a86fed71d945dc7e7f1aa643ea6cSergey Vasilinets assertThat(mLiveData.hasObservers(), is(false)); 200c1b53ee5d095a74b84c21257fb4cd00e33f748baYigit Boyar } 201c1b53ee5d095a74b84c21257fb4cd00e33f748baYigit Boyar 202c1b53ee5d095a74b84c21257fb4cd00e33f748baYigit Boyar @Test 203c1b53ee5d095a74b84c21257fb4cd00e33f748baYigit Boyar public void testNotifyActiveInactive() { 204c1b53ee5d095a74b84c21257fb4cd00e33f748baYigit Boyar Observer<String> observer = (Observer<String>) mock(Observer.class); 205c1b53ee5d095a74b84c21257fb4cd00e33f748baYigit Boyar mRegistry.handleLifecycleEvent(ON_CREATE); 206e13540a25fe5460240b6db0e18858c32d16f5399Sergey Vasilinets mLiveData.observe(mOwner, observer); 207c1b53ee5d095a74b84c21257fb4cd00e33f748baYigit Boyar mLiveData.setValue("a"); 208c1b53ee5d095a74b84c21257fb4cd00e33f748baYigit Boyar verify(observer, never()).onChanged(anyString()); 209c1b53ee5d095a74b84c21257fb4cd00e33f748baYigit Boyar mRegistry.handleLifecycleEvent(ON_START); 210c1b53ee5d095a74b84c21257fb4cd00e33f748baYigit Boyar verify(observer).onChanged("a"); 211c1b53ee5d095a74b84c21257fb4cd00e33f748baYigit Boyar 212c1b53ee5d095a74b84c21257fb4cd00e33f748baYigit Boyar mLiveData.setValue("b"); 213c1b53ee5d095a74b84c21257fb4cd00e33f748baYigit Boyar verify(observer).onChanged("b"); 214c1b53ee5d095a74b84c21257fb4cd00e33f748baYigit Boyar 215c1b53ee5d095a74b84c21257fb4cd00e33f748baYigit Boyar mRegistry.handleLifecycleEvent(ON_STOP); 216c1b53ee5d095a74b84c21257fb4cd00e33f748baYigit Boyar mLiveData.setValue("c"); 217c1b53ee5d095a74b84c21257fb4cd00e33f748baYigit Boyar verify(observer, never()).onChanged("c"); 218c1b53ee5d095a74b84c21257fb4cd00e33f748baYigit Boyar 219c1b53ee5d095a74b84c21257fb4cd00e33f748baYigit Boyar mRegistry.handleLifecycleEvent(ON_START); 220c1b53ee5d095a74b84c21257fb4cd00e33f748baYigit Boyar verify(observer).onChanged("c"); 221c1b53ee5d095a74b84c21257fb4cd00e33f748baYigit Boyar 222c1b53ee5d095a74b84c21257fb4cd00e33f748baYigit Boyar reset(observer); 223c1b53ee5d095a74b84c21257fb4cd00e33f748baYigit Boyar mRegistry.handleLifecycleEvent(ON_STOP); 224c1b53ee5d095a74b84c21257fb4cd00e33f748baYigit Boyar mRegistry.handleLifecycleEvent(ON_START); 225c1b53ee5d095a74b84c21257fb4cd00e33f748baYigit Boyar verify(observer, never()).onChanged(anyString()); 226c1b53ee5d095a74b84c21257fb4cd00e33f748baYigit Boyar } 227c1b53ee5d095a74b84c21257fb4cd00e33f748baYigit Boyar 228c1b53ee5d095a74b84c21257fb4cd00e33f748baYigit Boyar @Test 229e13540a25fe5460240b6db0e18858c32d16f5399Sergey Vasilinets public void testStopObservingOwner_onDestroy() { 230c1b53ee5d095a74b84c21257fb4cd00e33f748baYigit Boyar Observer<String> observer = (Observer<String>) mock(Observer.class); 231c1b53ee5d095a74b84c21257fb4cd00e33f748baYigit Boyar mRegistry.handleLifecycleEvent(ON_CREATE); 232e13540a25fe5460240b6db0e18858c32d16f5399Sergey Vasilinets mLiveData.observe(mOwner, observer); 23380f1ba3ad13ca7e35c524a20442fd895e034f625Sergey Vasilinets assertThat(mRegistry.getObserverCount(), is(1)); 234c1b53ee5d095a74b84c21257fb4cd00e33f748baYigit Boyar mRegistry.handleLifecycleEvent(ON_DESTROY); 23580f1ba3ad13ca7e35c524a20442fd895e034f625Sergey Vasilinets assertThat(mRegistry.getObserverCount(), is(0)); 236c1b53ee5d095a74b84c21257fb4cd00e33f748baYigit Boyar } 237c1b53ee5d095a74b84c21257fb4cd00e33f748baYigit Boyar 238c1b53ee5d095a74b84c21257fb4cd00e33f748baYigit Boyar @Test 239e13540a25fe5460240b6db0e18858c32d16f5399Sergey Vasilinets public void testStopObservingOwner_onStopObserving() { 240c1b53ee5d095a74b84c21257fb4cd00e33f748baYigit Boyar Observer<String> observer = (Observer<String>) mock(Observer.class); 241c1b53ee5d095a74b84c21257fb4cd00e33f748baYigit Boyar mRegistry.handleLifecycleEvent(ON_CREATE); 242e13540a25fe5460240b6db0e18858c32d16f5399Sergey Vasilinets mLiveData.observe(mOwner, observer); 24380f1ba3ad13ca7e35c524a20442fd895e034f625Sergey Vasilinets assertThat(mRegistry.getObserverCount(), is(1)); 244c1b53ee5d095a74b84c21257fb4cd00e33f748baYigit Boyar 245c1b53ee5d095a74b84c21257fb4cd00e33f748baYigit Boyar mLiveData.removeObserver(observer); 24680f1ba3ad13ca7e35c524a20442fd895e034f625Sergey Vasilinets assertThat(mRegistry.getObserverCount(), is(0)); 247c1b53ee5d095a74b84c21257fb4cd00e33f748baYigit Boyar } 248c1b53ee5d095a74b84c21257fb4cd00e33f748baYigit Boyar 2494d4bf0391459bec361ec7843447ae60d38c99028Yigit Boyar @Test 2504d4bf0391459bec361ec7843447ae60d38c99028Yigit Boyar public void testActiveChangeInCallback() { 2514d4bf0391459bec361ec7843447ae60d38c99028Yigit Boyar mRegistry.handleLifecycleEvent(ON_START); 252c43ce90b803cdfa033dfc94fa4161371ed6f3ec6Sergey Vasilinets Observer<String> observer1 = spy(new Observer<String>() { 2534d4bf0391459bec361ec7843447ae60d38c99028Yigit Boyar @Override 2544d4bf0391459bec361ec7843447ae60d38c99028Yigit Boyar public void onChanged(@Nullable String s) { 2554d4bf0391459bec361ec7843447ae60d38c99028Yigit Boyar mRegistry.handleLifecycleEvent(ON_STOP); 256abf6c87826e1a86fed71d945dc7e7f1aa643ea6cSergey Vasilinets assertThat(mLiveData.hasObservers(), is(true)); 257abf6c87826e1a86fed71d945dc7e7f1aa643ea6cSergey Vasilinets assertThat(mLiveData.hasActiveObservers(), is(false)); 2584d4bf0391459bec361ec7843447ae60d38c99028Yigit Boyar } 2594d4bf0391459bec361ec7843447ae60d38c99028Yigit Boyar }); 260c43ce90b803cdfa033dfc94fa4161371ed6f3ec6Sergey Vasilinets final Observer observer2 = mock(Observer.class); 261e13540a25fe5460240b6db0e18858c32d16f5399Sergey Vasilinets mLiveData.observe(mOwner, observer1); 262e13540a25fe5460240b6db0e18858c32d16f5399Sergey Vasilinets mLiveData.observe(mOwner, observer2); 2634d4bf0391459bec361ec7843447ae60d38c99028Yigit Boyar mLiveData.setValue("bla"); 264c43ce90b803cdfa033dfc94fa4161371ed6f3ec6Sergey Vasilinets verify(observer1).onChanged(anyString()); 265c43ce90b803cdfa033dfc94fa4161371ed6f3ec6Sergey Vasilinets verify(observer2, Mockito.never()).onChanged(anyString()); 266abf6c87826e1a86fed71d945dc7e7f1aa643ea6cSergey Vasilinets assertThat(mLiveData.hasObservers(), is(true)); 267abf6c87826e1a86fed71d945dc7e7f1aa643ea6cSergey Vasilinets assertThat(mLiveData.hasActiveObservers(), is(false)); 2684d4bf0391459bec361ec7843447ae60d38c99028Yigit Boyar } 2694d4bf0391459bec361ec7843447ae60d38c99028Yigit Boyar 2704d4bf0391459bec361ec7843447ae60d38c99028Yigit Boyar @Test 271c43ce90b803cdfa033dfc94fa4161371ed6f3ec6Sergey Vasilinets public void testActiveChangeInCallback2() { 272c43ce90b803cdfa033dfc94fa4161371ed6f3ec6Sergey Vasilinets Observer<String> observer1 = spy(new Observer<String>() { 273c43ce90b803cdfa033dfc94fa4161371ed6f3ec6Sergey Vasilinets @Override 274c43ce90b803cdfa033dfc94fa4161371ed6f3ec6Sergey Vasilinets public void onChanged(@Nullable String s) { 275c43ce90b803cdfa033dfc94fa4161371ed6f3ec6Sergey Vasilinets assertThat(mInObserver, is(false)); 276c43ce90b803cdfa033dfc94fa4161371ed6f3ec6Sergey Vasilinets mInObserver = true; 277c43ce90b803cdfa033dfc94fa4161371ed6f3ec6Sergey Vasilinets mRegistry.handleLifecycleEvent(ON_START); 278abf6c87826e1a86fed71d945dc7e7f1aa643ea6cSergey Vasilinets assertThat(mLiveData.hasActiveObservers(), is(true)); 279c43ce90b803cdfa033dfc94fa4161371ed6f3ec6Sergey Vasilinets mInObserver = false; 280c43ce90b803cdfa033dfc94fa4161371ed6f3ec6Sergey Vasilinets } 281c43ce90b803cdfa033dfc94fa4161371ed6f3ec6Sergey Vasilinets }); 282c43ce90b803cdfa033dfc94fa4161371ed6f3ec6Sergey Vasilinets final Observer observer2 = spy(new FailReentranceObserver()); 283d3449ae5a2f97b3654a9e5945a3365acb316891bSergey Vasilinets mLiveData.observeForever(observer1); 284e13540a25fe5460240b6db0e18858c32d16f5399Sergey Vasilinets mLiveData.observe(mOwner, observer2); 285c43ce90b803cdfa033dfc94fa4161371ed6f3ec6Sergey Vasilinets mLiveData.setValue("bla"); 286c43ce90b803cdfa033dfc94fa4161371ed6f3ec6Sergey Vasilinets verify(observer1).onChanged(anyString()); 287c43ce90b803cdfa033dfc94fa4161371ed6f3ec6Sergey Vasilinets verify(observer2).onChanged(anyString()); 288abf6c87826e1a86fed71d945dc7e7f1aa643ea6cSergey Vasilinets assertThat(mLiveData.hasObservers(), is(true)); 289abf6c87826e1a86fed71d945dc7e7f1aa643ea6cSergey Vasilinets assertThat(mLiveData.hasActiveObservers(), is(true)); 290c43ce90b803cdfa033dfc94fa4161371ed6f3ec6Sergey Vasilinets } 291c43ce90b803cdfa033dfc94fa4161371ed6f3ec6Sergey Vasilinets 292c43ce90b803cdfa033dfc94fa4161371ed6f3ec6Sergey Vasilinets @Test 2934d4bf0391459bec361ec7843447ae60d38c99028Yigit Boyar public void testObserverRemovalInCallback() { 2944d4bf0391459bec361ec7843447ae60d38c99028Yigit Boyar mRegistry.handleLifecycleEvent(ON_START); 2954d4bf0391459bec361ec7843447ae60d38c99028Yigit Boyar Observer<String> observer = spy(new Observer<String>() { 2964d4bf0391459bec361ec7843447ae60d38c99028Yigit Boyar @Override 2974d4bf0391459bec361ec7843447ae60d38c99028Yigit Boyar public void onChanged(@Nullable String s) { 298abf6c87826e1a86fed71d945dc7e7f1aa643ea6cSergey Vasilinets assertThat(mLiveData.hasObservers(), is(true)); 299c43ce90b803cdfa033dfc94fa4161371ed6f3ec6Sergey Vasilinets mLiveData.removeObserver(this); 300abf6c87826e1a86fed71d945dc7e7f1aa643ea6cSergey Vasilinets assertThat(mLiveData.hasObservers(), is(false)); 3014d4bf0391459bec361ec7843447ae60d38c99028Yigit Boyar } 3024d4bf0391459bec361ec7843447ae60d38c99028Yigit Boyar }); 303e13540a25fe5460240b6db0e18858c32d16f5399Sergey Vasilinets mLiveData.observe(mOwner, observer); 3044d4bf0391459bec361ec7843447ae60d38c99028Yigit Boyar mLiveData.setValue("bla"); 3054d4bf0391459bec361ec7843447ae60d38c99028Yigit Boyar verify(observer).onChanged(anyString()); 306abf6c87826e1a86fed71d945dc7e7f1aa643ea6cSergey Vasilinets assertThat(mLiveData.hasObservers(), is(false)); 3074d4bf0391459bec361ec7843447ae60d38c99028Yigit Boyar } 3084d4bf0391459bec361ec7843447ae60d38c99028Yigit Boyar 3094d4bf0391459bec361ec7843447ae60d38c99028Yigit Boyar @Test 3104d4bf0391459bec361ec7843447ae60d38c99028Yigit Boyar public void testObserverAdditionInCallback() { 3114d4bf0391459bec361ec7843447ae60d38c99028Yigit Boyar mRegistry.handleLifecycleEvent(ON_START); 312c43ce90b803cdfa033dfc94fa4161371ed6f3ec6Sergey Vasilinets final Observer observer2 = spy(new FailReentranceObserver()); 313c43ce90b803cdfa033dfc94fa4161371ed6f3ec6Sergey Vasilinets Observer<String> observer1 = spy(new Observer<String>() { 3144d4bf0391459bec361ec7843447ae60d38c99028Yigit Boyar @Override 3154d4bf0391459bec361ec7843447ae60d38c99028Yigit Boyar public void onChanged(@Nullable String s) { 316c43ce90b803cdfa033dfc94fa4161371ed6f3ec6Sergey Vasilinets assertThat(mInObserver, is(false)); 317c43ce90b803cdfa033dfc94fa4161371ed6f3ec6Sergey Vasilinets mInObserver = true; 318e13540a25fe5460240b6db0e18858c32d16f5399Sergey Vasilinets mLiveData.observe(mOwner, observer2); 319abf6c87826e1a86fed71d945dc7e7f1aa643ea6cSergey Vasilinets assertThat(mLiveData.hasObservers(), is(true)); 320abf6c87826e1a86fed71d945dc7e7f1aa643ea6cSergey Vasilinets assertThat(mLiveData.hasActiveObservers(), is(true)); 321c43ce90b803cdfa033dfc94fa4161371ed6f3ec6Sergey Vasilinets mInObserver = false; 3224d4bf0391459bec361ec7843447ae60d38c99028Yigit Boyar } 3234d4bf0391459bec361ec7843447ae60d38c99028Yigit Boyar }); 324e13540a25fe5460240b6db0e18858c32d16f5399Sergey Vasilinets mLiveData.observe(mOwner, observer1); 3254d4bf0391459bec361ec7843447ae60d38c99028Yigit Boyar mLiveData.setValue("bla"); 326c43ce90b803cdfa033dfc94fa4161371ed6f3ec6Sergey Vasilinets verify(observer1).onChanged(anyString()); 327c43ce90b803cdfa033dfc94fa4161371ed6f3ec6Sergey Vasilinets verify(observer2).onChanged(anyString()); 328abf6c87826e1a86fed71d945dc7e7f1aa643ea6cSergey Vasilinets assertThat(mLiveData.hasObservers(), is(true)); 329abf6c87826e1a86fed71d945dc7e7f1aa643ea6cSergey Vasilinets assertThat(mLiveData.hasActiveObservers(), is(true)); 3304d4bf0391459bec361ec7843447ae60d38c99028Yigit Boyar } 3314d4bf0391459bec361ec7843447ae60d38c99028Yigit Boyar 3327c41ee306fc78feaa0043c65bf82e65935bd9d35Sergey Vasilinets @Test 333e13540a25fe5460240b6db0e18858c32d16f5399Sergey Vasilinets public void testObserverWithoutLifecycleOwner() { 3347c41ee306fc78feaa0043c65bf82e65935bd9d35Sergey Vasilinets Observer<String> observer = (Observer<String>) mock(Observer.class); 3357c41ee306fc78feaa0043c65bf82e65935bd9d35Sergey Vasilinets mLiveData.setValue("boring"); 336d3449ae5a2f97b3654a9e5945a3365acb316891bSergey Vasilinets mLiveData.observeForever(observer); 3377c41ee306fc78feaa0043c65bf82e65935bd9d35Sergey Vasilinets verify(mActiveObserversChanged).onCall(true); 3387c41ee306fc78feaa0043c65bf82e65935bd9d35Sergey Vasilinets verify(observer).onChanged("boring"); 3397c41ee306fc78feaa0043c65bf82e65935bd9d35Sergey Vasilinets mLiveData.setValue("tihs"); 3407c41ee306fc78feaa0043c65bf82e65935bd9d35Sergey Vasilinets verify(observer).onChanged("tihs"); 3417c41ee306fc78feaa0043c65bf82e65935bd9d35Sergey Vasilinets mLiveData.removeObserver(observer); 3427c41ee306fc78feaa0043c65bf82e65935bd9d35Sergey Vasilinets verify(mActiveObserversChanged).onCall(false); 3437c41ee306fc78feaa0043c65bf82e65935bd9d35Sergey Vasilinets mLiveData.setValue("boring"); 3447c41ee306fc78feaa0043c65bf82e65935bd9d35Sergey Vasilinets reset(observer); 3457c41ee306fc78feaa0043c65bf82e65935bd9d35Sergey Vasilinets verify(observer, never()).onChanged(anyString()); 3467c41ee306fc78feaa0043c65bf82e65935bd9d35Sergey Vasilinets } 3477c41ee306fc78feaa0043c65bf82e65935bd9d35Sergey Vasilinets 348c43ce90b803cdfa033dfc94fa4161371ed6f3ec6Sergey Vasilinets @Test 349c43ce90b803cdfa033dfc94fa4161371ed6f3ec6Sergey Vasilinets public void testSetValueDuringSetValue() { 350c43ce90b803cdfa033dfc94fa4161371ed6f3ec6Sergey Vasilinets mRegistry.handleLifecycleEvent(ON_START); 351c43ce90b803cdfa033dfc94fa4161371ed6f3ec6Sergey Vasilinets final Observer observer1 = spy(new Observer<String>() { 352c43ce90b803cdfa033dfc94fa4161371ed6f3ec6Sergey Vasilinets @Override 353c43ce90b803cdfa033dfc94fa4161371ed6f3ec6Sergey Vasilinets public void onChanged(String o) { 354c43ce90b803cdfa033dfc94fa4161371ed6f3ec6Sergey Vasilinets assertThat(mInObserver, is(false)); 355c43ce90b803cdfa033dfc94fa4161371ed6f3ec6Sergey Vasilinets mInObserver = true; 356c43ce90b803cdfa033dfc94fa4161371ed6f3ec6Sergey Vasilinets if (o.equals(("bla"))) { 357c43ce90b803cdfa033dfc94fa4161371ed6f3ec6Sergey Vasilinets mLiveData.setValue("gt"); 358c43ce90b803cdfa033dfc94fa4161371ed6f3ec6Sergey Vasilinets } 359c43ce90b803cdfa033dfc94fa4161371ed6f3ec6Sergey Vasilinets mInObserver = false; 360c43ce90b803cdfa033dfc94fa4161371ed6f3ec6Sergey Vasilinets } 361c43ce90b803cdfa033dfc94fa4161371ed6f3ec6Sergey Vasilinets }); 362c43ce90b803cdfa033dfc94fa4161371ed6f3ec6Sergey Vasilinets final Observer observer2 = spy(new FailReentranceObserver()); 363e13540a25fe5460240b6db0e18858c32d16f5399Sergey Vasilinets mLiveData.observe(mOwner, observer1); 364e13540a25fe5460240b6db0e18858c32d16f5399Sergey Vasilinets mLiveData.observe(mOwner, observer2); 365c43ce90b803cdfa033dfc94fa4161371ed6f3ec6Sergey Vasilinets mLiveData.setValue("bla"); 366c43ce90b803cdfa033dfc94fa4161371ed6f3ec6Sergey Vasilinets verify(observer1, Mockito.atMost(2)).onChanged("gt"); 367c43ce90b803cdfa033dfc94fa4161371ed6f3ec6Sergey Vasilinets verify(observer2, Mockito.atMost(2)).onChanged("gt"); 368c43ce90b803cdfa033dfc94fa4161371ed6f3ec6Sergey Vasilinets } 369c43ce90b803cdfa033dfc94fa4161371ed6f3ec6Sergey Vasilinets 3705dcab68c2e390acfb016cb889604b85e1257b02fYigit Boyar @Test 3713facabd26326a3f4274b04dc7ab03442839c5601Sergey Vasilinets public void testRemoveDuringSetValue() { 3723facabd26326a3f4274b04dc7ab03442839c5601Sergey Vasilinets mRegistry.handleLifecycleEvent(ON_START); 3733facabd26326a3f4274b04dc7ab03442839c5601Sergey Vasilinets final Observer observer1 = spy(new Observer<String>() { 3743facabd26326a3f4274b04dc7ab03442839c5601Sergey Vasilinets @Override 3753facabd26326a3f4274b04dc7ab03442839c5601Sergey Vasilinets public void onChanged(String o) { 3763facabd26326a3f4274b04dc7ab03442839c5601Sergey Vasilinets mLiveData.removeObserver(this); 3773facabd26326a3f4274b04dc7ab03442839c5601Sergey Vasilinets } 3783facabd26326a3f4274b04dc7ab03442839c5601Sergey Vasilinets }); 3793facabd26326a3f4274b04dc7ab03442839c5601Sergey Vasilinets Observer<String> observer2 = (Observer<String>) mock(Observer.class); 3803facabd26326a3f4274b04dc7ab03442839c5601Sergey Vasilinets mLiveData.observeForever(observer1); 3813facabd26326a3f4274b04dc7ab03442839c5601Sergey Vasilinets mLiveData.observe(mOwner, observer2); 3823facabd26326a3f4274b04dc7ab03442839c5601Sergey Vasilinets mLiveData.setValue("gt"); 3833facabd26326a3f4274b04dc7ab03442839c5601Sergey Vasilinets verify(observer2).onChanged("gt"); 3843facabd26326a3f4274b04dc7ab03442839c5601Sergey Vasilinets } 3853facabd26326a3f4274b04dc7ab03442839c5601Sergey Vasilinets 3863facabd26326a3f4274b04dc7ab03442839c5601Sergey Vasilinets @Test 3875dcab68c2e390acfb016cb889604b85e1257b02fYigit Boyar public void testDataChangeDuringStateChange() { 3885dcab68c2e390acfb016cb889604b85e1257b02fYigit Boyar mRegistry.handleLifecycleEvent(ON_START); 3895dcab68c2e390acfb016cb889604b85e1257b02fYigit Boyar mRegistry.addObserver(new LifecycleObserver() { 3905dcab68c2e390acfb016cb889604b85e1257b02fYigit Boyar @OnLifecycleEvent(ON_STOP) 3915dcab68c2e390acfb016cb889604b85e1257b02fYigit Boyar public void onStop() { 3925dcab68c2e390acfb016cb889604b85e1257b02fYigit Boyar // change data in onStop, observer should not be called! 3935dcab68c2e390acfb016cb889604b85e1257b02fYigit Boyar mLiveData.setValue("b"); 3945dcab68c2e390acfb016cb889604b85e1257b02fYigit Boyar } 3955dcab68c2e390acfb016cb889604b85e1257b02fYigit Boyar }); 3965dcab68c2e390acfb016cb889604b85e1257b02fYigit Boyar Observer<String> observer = (Observer<String>) mock(Observer.class); 3975dcab68c2e390acfb016cb889604b85e1257b02fYigit Boyar mLiveData.setValue("a"); 398e13540a25fe5460240b6db0e18858c32d16f5399Sergey Vasilinets mLiveData.observe(mOwner, observer); 3995dcab68c2e390acfb016cb889604b85e1257b02fYigit Boyar verify(observer).onChanged("a"); 4005dcab68c2e390acfb016cb889604b85e1257b02fYigit Boyar mRegistry.handleLifecycleEvent(ON_PAUSE); 4015dcab68c2e390acfb016cb889604b85e1257b02fYigit Boyar mRegistry.handleLifecycleEvent(ON_STOP); 4025dcab68c2e390acfb016cb889604b85e1257b02fYigit Boyar verify(observer, never()).onChanged("b"); 4035dcab68c2e390acfb016cb889604b85e1257b02fYigit Boyar 4045dcab68c2e390acfb016cb889604b85e1257b02fYigit Boyar mRegistry.handleLifecycleEvent(ON_RESUME); 4055dcab68c2e390acfb016cb889604b85e1257b02fYigit Boyar verify(observer).onChanged("b"); 4065dcab68c2e390acfb016cb889604b85e1257b02fYigit Boyar } 4075dcab68c2e390acfb016cb889604b85e1257b02fYigit Boyar 4080da9764fa45b24977675265e04e8aff3fc889d04Sergey Vasilinets @Test 4090da9764fa45b24977675265e04e8aff3fc889d04Sergey Vasilinets public void testNotCallInactiveWithObserveForever() { 4100da9764fa45b24977675265e04e8aff3fc889d04Sergey Vasilinets mRegistry.handleLifecycleEvent(ON_START); 4110da9764fa45b24977675265e04e8aff3fc889d04Sergey Vasilinets Observer<String> observer = (Observer<String>) mock(Observer.class); 4120da9764fa45b24977675265e04e8aff3fc889d04Sergey Vasilinets Observer<String> observer2 = (Observer<String>) mock(Observer.class); 4130da9764fa45b24977675265e04e8aff3fc889d04Sergey Vasilinets mLiveData.observe(mOwner, observer); 4140da9764fa45b24977675265e04e8aff3fc889d04Sergey Vasilinets mLiveData.observeForever(observer2); 4150da9764fa45b24977675265e04e8aff3fc889d04Sergey Vasilinets verify(mActiveObserversChanged).onCall(true); 4160da9764fa45b24977675265e04e8aff3fc889d04Sergey Vasilinets reset(mActiveObserversChanged); 4170da9764fa45b24977675265e04e8aff3fc889d04Sergey Vasilinets mRegistry.handleLifecycleEvent(ON_STOP); 4180da9764fa45b24977675265e04e8aff3fc889d04Sergey Vasilinets verify(mActiveObserversChanged, never()).onCall(anyBoolean()); 4190da9764fa45b24977675265e04e8aff3fc889d04Sergey Vasilinets mRegistry.handleLifecycleEvent(ON_START); 4200da9764fa45b24977675265e04e8aff3fc889d04Sergey Vasilinets verify(mActiveObserversChanged, never()).onCall(anyBoolean()); 4210da9764fa45b24977675265e04e8aff3fc889d04Sergey Vasilinets } 4220da9764fa45b24977675265e04e8aff3fc889d04Sergey Vasilinets 423c1b53ee5d095a74b84c21257fb4cd00e33f748baYigit Boyar @SuppressWarnings("WeakerAccess") 424c1b53ee5d095a74b84c21257fb4cd00e33f748baYigit Boyar static class PublicLiveData<T> extends LiveData<T> { 425c1b53ee5d095a74b84c21257fb4cd00e33f748baYigit Boyar // cannot spy due to internal calls 426c1b53ee5d095a74b84c21257fb4cd00e33f748baYigit Boyar public MethodExec activeObserversChanged; 427c1b53ee5d095a74b84c21257fb4cd00e33f748baYigit Boyar 428c1b53ee5d095a74b84c21257fb4cd00e33f748baYigit Boyar @Override 4294d4bf0391459bec361ec7843447ae60d38c99028Yigit Boyar protected void onActive() { 430c1b53ee5d095a74b84c21257fb4cd00e33f748baYigit Boyar if (activeObserversChanged != null) { 4314d4bf0391459bec361ec7843447ae60d38c99028Yigit Boyar activeObserversChanged.onCall(true); 432c1b53ee5d095a74b84c21257fb4cd00e33f748baYigit Boyar } 433c1b53ee5d095a74b84c21257fb4cd00e33f748baYigit Boyar } 434c1b53ee5d095a74b84c21257fb4cd00e33f748baYigit Boyar 435c1b53ee5d095a74b84c21257fb4cd00e33f748baYigit Boyar @Override 4364d4bf0391459bec361ec7843447ae60d38c99028Yigit Boyar protected void onInactive() { 4374d4bf0391459bec361ec7843447ae60d38c99028Yigit Boyar if (activeObserversChanged != null) { 4384d4bf0391459bec361ec7843447ae60d38c99028Yigit Boyar activeObserversChanged.onCall(false); 439c1b53ee5d095a74b84c21257fb4cd00e33f748baYigit Boyar } 440c1b53ee5d095a74b84c21257fb4cd00e33f748baYigit Boyar } 441c1b53ee5d095a74b84c21257fb4cd00e33f748baYigit Boyar } 442c1b53ee5d095a74b84c21257fb4cd00e33f748baYigit Boyar 443c43ce90b803cdfa033dfc94fa4161371ed6f3ec6Sergey Vasilinets private class FailReentranceObserver<T> implements Observer<T> { 444c43ce90b803cdfa033dfc94fa4161371ed6f3ec6Sergey Vasilinets @Override 445c43ce90b803cdfa033dfc94fa4161371ed6f3ec6Sergey Vasilinets public void onChanged(@Nullable T t) { 446c43ce90b803cdfa033dfc94fa4161371ed6f3ec6Sergey Vasilinets assertThat(mInObserver, is(false)); 447c43ce90b803cdfa033dfc94fa4161371ed6f3ec6Sergey Vasilinets } 448c43ce90b803cdfa033dfc94fa4161371ed6f3ec6Sergey Vasilinets } 449c43ce90b803cdfa033dfc94fa4161371ed6f3ec6Sergey Vasilinets 450c1b53ee5d095a74b84c21257fb4cd00e33f748baYigit Boyar interface MethodExec { 451c1b53ee5d095a74b84c21257fb4cd00e33f748baYigit Boyar void onCall(boolean value); 452c1b53ee5d095a74b84c21257fb4cd00e33f748baYigit Boyar } 453c1b53ee5d095a74b84c21257fb4cd00e33f748baYigit Boyar} 454