MediatorLiveDataTest.java revision ae36c8b11a64d3cdc9ba6e37d9f3d1d250fdc4a8
16ca8525782f16bcb4403dc692a1fefd77934aa31Sergey Vasilinets/* 26ca8525782f16bcb4403dc692a1fefd77934aa31Sergey Vasilinets * Copyright (C) 2017 The Android Open Source Project 36ca8525782f16bcb4403dc692a1fefd77934aa31Sergey Vasilinets * 46ca8525782f16bcb4403dc692a1fefd77934aa31Sergey Vasilinets * Licensed under the Apache License, Version 2.0 (the "License"); 56ca8525782f16bcb4403dc692a1fefd77934aa31Sergey Vasilinets * you may not use this file except in compliance with the License. 66ca8525782f16bcb4403dc692a1fefd77934aa31Sergey Vasilinets * You may obtain a copy of the License at 76ca8525782f16bcb4403dc692a1fefd77934aa31Sergey Vasilinets * 86ca8525782f16bcb4403dc692a1fefd77934aa31Sergey Vasilinets * http://www.apache.org/licenses/LICENSE-2.0 96ca8525782f16bcb4403dc692a1fefd77934aa31Sergey Vasilinets * 106ca8525782f16bcb4403dc692a1fefd77934aa31Sergey Vasilinets * Unless required by applicable law or agreed to in writing, software 116ca8525782f16bcb4403dc692a1fefd77934aa31Sergey Vasilinets * distributed under the License is distributed on an "AS IS" BASIS, 126ca8525782f16bcb4403dc692a1fefd77934aa31Sergey Vasilinets * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 136ca8525782f16bcb4403dc692a1fefd77934aa31Sergey Vasilinets * See the License for the specific language governing permissions and 146ca8525782f16bcb4403dc692a1fefd77934aa31Sergey Vasilinets * limitations under the License. 156ca8525782f16bcb4403dc692a1fefd77934aa31Sergey Vasilinets */ 166ca8525782f16bcb4403dc692a1fefd77934aa31Sergey Vasilinets 1764db0cc15b78b62a1d44a70fc8b4552e660d952cYigit Boyarpackage android.arch.lifecycle; 186ca8525782f16bcb4403dc692a1fefd77934aa31Sergey Vasilinets 196ca8525782f16bcb4403dc692a1fefd77934aa31Sergey Vasilinetsimport static org.hamcrest.CoreMatchers.is; 206ca8525782f16bcb4403dc692a1fefd77934aa31Sergey Vasilinetsimport static org.hamcrest.MatcherAssert.assertThat; 216ca8525782f16bcb4403dc692a1fefd77934aa31Sergey Vasilinetsimport static org.mockito.Matchers.any; 226ca8525782f16bcb4403dc692a1fefd77934aa31Sergey Vasilinetsimport static org.mockito.Mockito.mock; 236ca8525782f16bcb4403dc692a1fefd77934aa31Sergey Vasilinetsimport static org.mockito.Mockito.never; 246ca8525782f16bcb4403dc692a1fefd77934aa31Sergey Vasilinetsimport static org.mockito.Mockito.reset; 256ca8525782f16bcb4403dc692a1fefd77934aa31Sergey Vasilinetsimport static org.mockito.Mockito.verify; 266ca8525782f16bcb4403dc692a1fefd77934aa31Sergey Vasilinetsimport static org.mockito.Mockito.when; 276ca8525782f16bcb4403dc692a1fefd77934aa31Sergey Vasilinets 28ae36c8b11a64d3cdc9ba6e37d9f3d1d250fdc4a8Yigit Boyarimport android.arch.core.executor.ArchTaskExecutor; 2964db0cc15b78b62a1d44a70fc8b4552e660d952cYigit Boyarimport android.arch.lifecycle.util.InstantTaskExecutor; 307b81f6101e2c1c68108243688f7d1d7302d1179eSergey Vasilinetsimport android.support.annotation.Nullable; 316ca8525782f16bcb4403dc692a1fefd77934aa31Sergey Vasilinets 326ca8525782f16bcb4403dc692a1fefd77934aa31Sergey Vasilinetsimport org.junit.Before; 336ca8525782f16bcb4403dc692a1fefd77934aa31Sergey Vasilinetsimport org.junit.Test; 346ca8525782f16bcb4403dc692a1fefd77934aa31Sergey Vasilinetsimport org.junit.runner.RunWith; 356ca8525782f16bcb4403dc692a1fefd77934aa31Sergey Vasilinetsimport org.junit.runners.JUnit4; 366ca8525782f16bcb4403dc692a1fefd77934aa31Sergey Vasilinets 376ca8525782f16bcb4403dc692a1fefd77934aa31Sergey Vasilinets@SuppressWarnings("unchecked") 386ca8525782f16bcb4403dc692a1fefd77934aa31Sergey Vasilinets@RunWith(JUnit4.class) 396ca8525782f16bcb4403dc692a1fefd77934aa31Sergey Vasilinetspublic class MediatorLiveDataTest { 406ca8525782f16bcb4403dc692a1fefd77934aa31Sergey Vasilinets 416ca8525782f16bcb4403dc692a1fefd77934aa31Sergey Vasilinets private LifecycleOwner mOwner; 426ca8525782f16bcb4403dc692a1fefd77934aa31Sergey Vasilinets private LifecycleRegistry mRegistry; 436ca8525782f16bcb4403dc692a1fefd77934aa31Sergey Vasilinets private MediatorLiveData<String> mMediator; 446ca8525782f16bcb4403dc692a1fefd77934aa31Sergey Vasilinets private LiveData<String> mSource; 456ca8525782f16bcb4403dc692a1fefd77934aa31Sergey Vasilinets private boolean mSourceActive; 466ca8525782f16bcb4403dc692a1fefd77934aa31Sergey Vasilinets 476ca8525782f16bcb4403dc692a1fefd77934aa31Sergey Vasilinets @Before 486ca8525782f16bcb4403dc692a1fefd77934aa31Sergey Vasilinets public void setup() { 496ca8525782f16bcb4403dc692a1fefd77934aa31Sergey Vasilinets mOwner = mock(LifecycleOwner.class); 506ca8525782f16bcb4403dc692a1fefd77934aa31Sergey Vasilinets mRegistry = new LifecycleRegistry(mOwner); 516ca8525782f16bcb4403dc692a1fefd77934aa31Sergey Vasilinets when(mOwner.getLifecycle()).thenReturn(mRegistry); 526ca8525782f16bcb4403dc692a1fefd77934aa31Sergey Vasilinets mMediator = new MediatorLiveData<>(); 536ca8525782f16bcb4403dc692a1fefd77934aa31Sergey Vasilinets mSource = new LiveData<String>() { 546ca8525782f16bcb4403dc692a1fefd77934aa31Sergey Vasilinets @Override 556ca8525782f16bcb4403dc692a1fefd77934aa31Sergey Vasilinets protected void onActive() { 566ca8525782f16bcb4403dc692a1fefd77934aa31Sergey Vasilinets mSourceActive = true; 576ca8525782f16bcb4403dc692a1fefd77934aa31Sergey Vasilinets } 586ca8525782f16bcb4403dc692a1fefd77934aa31Sergey Vasilinets 596ca8525782f16bcb4403dc692a1fefd77934aa31Sergey Vasilinets @Override 606ca8525782f16bcb4403dc692a1fefd77934aa31Sergey Vasilinets protected void onInactive() { 616ca8525782f16bcb4403dc692a1fefd77934aa31Sergey Vasilinets mSourceActive = false; 626ca8525782f16bcb4403dc692a1fefd77934aa31Sergey Vasilinets } 636ca8525782f16bcb4403dc692a1fefd77934aa31Sergey Vasilinets }; 646ca8525782f16bcb4403dc692a1fefd77934aa31Sergey Vasilinets mSourceActive = false; 656ca8525782f16bcb4403dc692a1fefd77934aa31Sergey Vasilinets mMediator.observe(mOwner, mock(Observer.class)); 66b86bef286718da421268bc52cf4fab7cccb3104cSergey Vasilinets mRegistry.handleLifecycleEvent(Lifecycle.Event.ON_CREATE); 67b86bef286718da421268bc52cf4fab7cccb3104cSergey Vasilinets mRegistry.handleLifecycleEvent(Lifecycle.Event.ON_START); 686ca8525782f16bcb4403dc692a1fefd77934aa31Sergey Vasilinets } 696ca8525782f16bcb4403dc692a1fefd77934aa31Sergey Vasilinets 706ca8525782f16bcb4403dc692a1fefd77934aa31Sergey Vasilinets @Before 716ca8525782f16bcb4403dc692a1fefd77934aa31Sergey Vasilinets public void swapExecutorDelegate() { 72ae36c8b11a64d3cdc9ba6e37d9f3d1d250fdc4a8Yigit Boyar ArchTaskExecutor.getInstance().setDelegate(new InstantTaskExecutor()); 736ca8525782f16bcb4403dc692a1fefd77934aa31Sergey Vasilinets } 746ca8525782f16bcb4403dc692a1fefd77934aa31Sergey Vasilinets 756ca8525782f16bcb4403dc692a1fefd77934aa31Sergey Vasilinets @Test 766ca8525782f16bcb4403dc692a1fefd77934aa31Sergey Vasilinets public void testSingleDelivery() { 776ca8525782f16bcb4403dc692a1fefd77934aa31Sergey Vasilinets Observer observer = mock(Observer.class); 786ca8525782f16bcb4403dc692a1fefd77934aa31Sergey Vasilinets mMediator.addSource(mSource, observer); 796ca8525782f16bcb4403dc692a1fefd77934aa31Sergey Vasilinets mSource.setValue("flatfoot"); 806ca8525782f16bcb4403dc692a1fefd77934aa31Sergey Vasilinets verify(observer).onChanged("flatfoot"); 81b86bef286718da421268bc52cf4fab7cccb3104cSergey Vasilinets mRegistry.handleLifecycleEvent(Lifecycle.Event.ON_STOP); 826ca8525782f16bcb4403dc692a1fefd77934aa31Sergey Vasilinets reset(observer); 836ca8525782f16bcb4403dc692a1fefd77934aa31Sergey Vasilinets verify(observer, never()).onChanged(any()); 846ca8525782f16bcb4403dc692a1fefd77934aa31Sergey Vasilinets } 856ca8525782f16bcb4403dc692a1fefd77934aa31Sergey Vasilinets 866ca8525782f16bcb4403dc692a1fefd77934aa31Sergey Vasilinets @Test 876ca8525782f16bcb4403dc692a1fefd77934aa31Sergey Vasilinets public void testChangeWhileInactive() { 886ca8525782f16bcb4403dc692a1fefd77934aa31Sergey Vasilinets Observer observer = mock(Observer.class); 896ca8525782f16bcb4403dc692a1fefd77934aa31Sergey Vasilinets mMediator.addSource(mSource, observer); 906ca8525782f16bcb4403dc692a1fefd77934aa31Sergey Vasilinets mMediator.observe(mOwner, mock(Observer.class)); 916ca8525782f16bcb4403dc692a1fefd77934aa31Sergey Vasilinets mSource.setValue("one"); 926ca8525782f16bcb4403dc692a1fefd77934aa31Sergey Vasilinets verify(observer).onChanged("one"); 93b86bef286718da421268bc52cf4fab7cccb3104cSergey Vasilinets mRegistry.handleLifecycleEvent(Lifecycle.Event.ON_STOP); 946ca8525782f16bcb4403dc692a1fefd77934aa31Sergey Vasilinets reset(observer); 956ca8525782f16bcb4403dc692a1fefd77934aa31Sergey Vasilinets mSource.setValue("flatfoot"); 96b86bef286718da421268bc52cf4fab7cccb3104cSergey Vasilinets mRegistry.handleLifecycleEvent(Lifecycle.Event.ON_START); 976ca8525782f16bcb4403dc692a1fefd77934aa31Sergey Vasilinets verify(observer).onChanged("flatfoot"); 986ca8525782f16bcb4403dc692a1fefd77934aa31Sergey Vasilinets } 996ca8525782f16bcb4403dc692a1fefd77934aa31Sergey Vasilinets 1006ca8525782f16bcb4403dc692a1fefd77934aa31Sergey Vasilinets 1016ca8525782f16bcb4403dc692a1fefd77934aa31Sergey Vasilinets @Test 1026ca8525782f16bcb4403dc692a1fefd77934aa31Sergey Vasilinets public void testAddSourceToActive() { 1036ca8525782f16bcb4403dc692a1fefd77934aa31Sergey Vasilinets mSource.setValue("flatfoot"); 1046ca8525782f16bcb4403dc692a1fefd77934aa31Sergey Vasilinets Observer observer = mock(Observer.class); 1056ca8525782f16bcb4403dc692a1fefd77934aa31Sergey Vasilinets mMediator.addSource(mSource, observer); 1066ca8525782f16bcb4403dc692a1fefd77934aa31Sergey Vasilinets verify(observer).onChanged("flatfoot"); 1076ca8525782f16bcb4403dc692a1fefd77934aa31Sergey Vasilinets } 1086ca8525782f16bcb4403dc692a1fefd77934aa31Sergey Vasilinets 1096ca8525782f16bcb4403dc692a1fefd77934aa31Sergey Vasilinets @Test 1106ca8525782f16bcb4403dc692a1fefd77934aa31Sergey Vasilinets public void testAddSourceToInActive() { 1116ca8525782f16bcb4403dc692a1fefd77934aa31Sergey Vasilinets mSource.setValue("flatfoot"); 112b86bef286718da421268bc52cf4fab7cccb3104cSergey Vasilinets mRegistry.handleLifecycleEvent(Lifecycle.Event.ON_STOP); 1136ca8525782f16bcb4403dc692a1fefd77934aa31Sergey Vasilinets Observer observer = mock(Observer.class); 1146ca8525782f16bcb4403dc692a1fefd77934aa31Sergey Vasilinets mMediator.addSource(mSource, observer); 1156ca8525782f16bcb4403dc692a1fefd77934aa31Sergey Vasilinets verify(observer, never()).onChanged(any()); 116b86bef286718da421268bc52cf4fab7cccb3104cSergey Vasilinets mRegistry.handleLifecycleEvent(Lifecycle.Event.ON_START); 1176ca8525782f16bcb4403dc692a1fefd77934aa31Sergey Vasilinets verify(observer).onChanged("flatfoot"); 1186ca8525782f16bcb4403dc692a1fefd77934aa31Sergey Vasilinets } 1196ca8525782f16bcb4403dc692a1fefd77934aa31Sergey Vasilinets 1206ca8525782f16bcb4403dc692a1fefd77934aa31Sergey Vasilinets @Test 1216ca8525782f16bcb4403dc692a1fefd77934aa31Sergey Vasilinets public void testRemoveSource() { 1226ca8525782f16bcb4403dc692a1fefd77934aa31Sergey Vasilinets mSource.setValue("flatfoot"); 1236ca8525782f16bcb4403dc692a1fefd77934aa31Sergey Vasilinets Observer observer = mock(Observer.class); 1246ca8525782f16bcb4403dc692a1fefd77934aa31Sergey Vasilinets mMediator.addSource(mSource, observer); 1256ca8525782f16bcb4403dc692a1fefd77934aa31Sergey Vasilinets verify(observer).onChanged("flatfoot"); 1266ca8525782f16bcb4403dc692a1fefd77934aa31Sergey Vasilinets mMediator.removeSource(mSource); 1276ca8525782f16bcb4403dc692a1fefd77934aa31Sergey Vasilinets reset(observer); 1286ca8525782f16bcb4403dc692a1fefd77934aa31Sergey Vasilinets mSource.setValue("failure"); 1296ca8525782f16bcb4403dc692a1fefd77934aa31Sergey Vasilinets verify(observer, never()).onChanged(any()); 1306ca8525782f16bcb4403dc692a1fefd77934aa31Sergey Vasilinets } 1316ca8525782f16bcb4403dc692a1fefd77934aa31Sergey Vasilinets 1326ca8525782f16bcb4403dc692a1fefd77934aa31Sergey Vasilinets @Test 1336ca8525782f16bcb4403dc692a1fefd77934aa31Sergey Vasilinets public void testSourceInactive() { 1346ca8525782f16bcb4403dc692a1fefd77934aa31Sergey Vasilinets Observer observer = mock(Observer.class); 1356ca8525782f16bcb4403dc692a1fefd77934aa31Sergey Vasilinets mMediator.addSource(mSource, observer); 1366ca8525782f16bcb4403dc692a1fefd77934aa31Sergey Vasilinets assertThat(mSourceActive, is(true)); 137b86bef286718da421268bc52cf4fab7cccb3104cSergey Vasilinets mRegistry.handleLifecycleEvent(Lifecycle.Event.ON_STOP); 1386ca8525782f16bcb4403dc692a1fefd77934aa31Sergey Vasilinets assertThat(mSourceActive, is(false)); 139b86bef286718da421268bc52cf4fab7cccb3104cSergey Vasilinets mRegistry.handleLifecycleEvent(Lifecycle.Event.ON_START); 1406ca8525782f16bcb4403dc692a1fefd77934aa31Sergey Vasilinets assertThat(mSourceActive, is(true)); 1416ca8525782f16bcb4403dc692a1fefd77934aa31Sergey Vasilinets } 1426ca8525782f16bcb4403dc692a1fefd77934aa31Sergey Vasilinets 1436ca8525782f16bcb4403dc692a1fefd77934aa31Sergey Vasilinets @Test 1446ca8525782f16bcb4403dc692a1fefd77934aa31Sergey Vasilinets public void testNoLeakObserver() { 1456ca8525782f16bcb4403dc692a1fefd77934aa31Sergey Vasilinets // Imitates a destruction of a ViewModel: a listener of LiveData is destroyed, 1466ca8525782f16bcb4403dc692a1fefd77934aa31Sergey Vasilinets // a reference to MediatorLiveData is cleaned up. In this case we shouldn't leak 1476ca8525782f16bcb4403dc692a1fefd77934aa31Sergey Vasilinets // MediatorLiveData as an observer of mSource. 148abf6c87826e1a86fed71d945dc7e7f1aa643ea6cSergey Vasilinets assertThat(mSource.hasObservers(), is(false)); 1496ca8525782f16bcb4403dc692a1fefd77934aa31Sergey Vasilinets Observer observer = mock(Observer.class); 1506ca8525782f16bcb4403dc692a1fefd77934aa31Sergey Vasilinets mMediator.addSource(mSource, observer); 151abf6c87826e1a86fed71d945dc7e7f1aa643ea6cSergey Vasilinets assertThat(mSource.hasObservers(), is(true)); 152b86bef286718da421268bc52cf4fab7cccb3104cSergey Vasilinets mRegistry.handleLifecycleEvent(Lifecycle.Event.ON_STOP); 153b86bef286718da421268bc52cf4fab7cccb3104cSergey Vasilinets mRegistry.handleLifecycleEvent(Lifecycle.Event.ON_DESTROY); 1546ca8525782f16bcb4403dc692a1fefd77934aa31Sergey Vasilinets mMediator = null; 155abf6c87826e1a86fed71d945dc7e7f1aa643ea6cSergey Vasilinets assertThat(mSource.hasObservers(), is(false)); 1566ca8525782f16bcb4403dc692a1fefd77934aa31Sergey Vasilinets } 1576ca8525782f16bcb4403dc692a1fefd77934aa31Sergey Vasilinets 1586ca8525782f16bcb4403dc692a1fefd77934aa31Sergey Vasilinets @Test 1596ca8525782f16bcb4403dc692a1fefd77934aa31Sergey Vasilinets public void testMultipleSources() { 1606ca8525782f16bcb4403dc692a1fefd77934aa31Sergey Vasilinets Observer observer1 = mock(Observer.class); 1616ca8525782f16bcb4403dc692a1fefd77934aa31Sergey Vasilinets mMediator.addSource(mSource, observer1); 1626ca8525782f16bcb4403dc692a1fefd77934aa31Sergey Vasilinets MutableLiveData<Integer> source2 = new MutableLiveData<>(); 1636ca8525782f16bcb4403dc692a1fefd77934aa31Sergey Vasilinets Observer observer2 = mock(Observer.class); 1646ca8525782f16bcb4403dc692a1fefd77934aa31Sergey Vasilinets mMediator.addSource(source2, observer2); 1656ca8525782f16bcb4403dc692a1fefd77934aa31Sergey Vasilinets mSource.setValue("flatfoot"); 1666ca8525782f16bcb4403dc692a1fefd77934aa31Sergey Vasilinets verify(observer1).onChanged("flatfoot"); 1676ca8525782f16bcb4403dc692a1fefd77934aa31Sergey Vasilinets verify(observer2, never()).onChanged(any()); 1686ca8525782f16bcb4403dc692a1fefd77934aa31Sergey Vasilinets reset(observer1, observer2); 1696ca8525782f16bcb4403dc692a1fefd77934aa31Sergey Vasilinets source2.setValue(1703); 1706ca8525782f16bcb4403dc692a1fefd77934aa31Sergey Vasilinets verify(observer1, never()).onChanged(any()); 1716ca8525782f16bcb4403dc692a1fefd77934aa31Sergey Vasilinets verify(observer2).onChanged(1703); 1726ca8525782f16bcb4403dc692a1fefd77934aa31Sergey Vasilinets reset(observer1, observer2); 173b86bef286718da421268bc52cf4fab7cccb3104cSergey Vasilinets mRegistry.handleLifecycleEvent(Lifecycle.Event.ON_STOP); 1746ca8525782f16bcb4403dc692a1fefd77934aa31Sergey Vasilinets mSource.setValue("failure"); 1756ca8525782f16bcb4403dc692a1fefd77934aa31Sergey Vasilinets source2.setValue(0); 1766ca8525782f16bcb4403dc692a1fefd77934aa31Sergey Vasilinets verify(observer1, never()).onChanged(any()); 1776ca8525782f16bcb4403dc692a1fefd77934aa31Sergey Vasilinets verify(observer2, never()).onChanged(any()); 1786ca8525782f16bcb4403dc692a1fefd77934aa31Sergey Vasilinets } 1797b81f6101e2c1c68108243688f7d1d7302d1179eSergey Vasilinets 1807b81f6101e2c1c68108243688f7d1d7302d1179eSergey Vasilinets @Test 1817b81f6101e2c1c68108243688f7d1d7302d1179eSergey Vasilinets public void removeSourceDuringOnActive() { 1827b81f6101e2c1c68108243688f7d1d7302d1179eSergey Vasilinets // to trigger ConcurrentModificationException, 1837b81f6101e2c1c68108243688f7d1d7302d1179eSergey Vasilinets // we have to call remove from a collection during "for" loop. 1847b81f6101e2c1c68108243688f7d1d7302d1179eSergey Vasilinets // ConcurrentModificationException is thrown from next() method of an iterator 1857b81f6101e2c1c68108243688f7d1d7302d1179eSergey Vasilinets // so this modification shouldn't be at the last iteration, 1867b81f6101e2c1c68108243688f7d1d7302d1179eSergey Vasilinets // because if it is a last iteration, then next() wouldn't be called. 1877b81f6101e2c1c68108243688f7d1d7302d1179eSergey Vasilinets // And the last: an order of an iteration over sources is not defined, 1887b81f6101e2c1c68108243688f7d1d7302d1179eSergey Vasilinets // so I have to call it remove operation from all observers. 1897b81f6101e2c1c68108243688f7d1d7302d1179eSergey Vasilinets mRegistry.handleLifecycleEvent(Lifecycle.Event.ON_STOP); 1907b81f6101e2c1c68108243688f7d1d7302d1179eSergey Vasilinets Observer<String> removingObserver = new Observer<String>() { 1917b81f6101e2c1c68108243688f7d1d7302d1179eSergey Vasilinets @Override 1927b81f6101e2c1c68108243688f7d1d7302d1179eSergey Vasilinets public void onChanged(@Nullable String s) { 1937b81f6101e2c1c68108243688f7d1d7302d1179eSergey Vasilinets mMediator.removeSource(mSource); 1947b81f6101e2c1c68108243688f7d1d7302d1179eSergey Vasilinets } 1957b81f6101e2c1c68108243688f7d1d7302d1179eSergey Vasilinets }; 1967b81f6101e2c1c68108243688f7d1d7302d1179eSergey Vasilinets mMediator.addSource(mSource, removingObserver); 1977b81f6101e2c1c68108243688f7d1d7302d1179eSergey Vasilinets MutableLiveData<String> source2 = new MutableLiveData<>(); 1987b81f6101e2c1c68108243688f7d1d7302d1179eSergey Vasilinets source2.setValue("nana"); 1997b81f6101e2c1c68108243688f7d1d7302d1179eSergey Vasilinets mMediator.addSource(source2, removingObserver); 2007b81f6101e2c1c68108243688f7d1d7302d1179eSergey Vasilinets mSource.setValue("petjack"); 2017b81f6101e2c1c68108243688f7d1d7302d1179eSergey Vasilinets mRegistry.handleLifecycleEvent(Lifecycle.Event.ON_START); 2027b81f6101e2c1c68108243688f7d1d7302d1179eSergey Vasilinets } 2037b81f6101e2c1c68108243688f7d1d7302d1179eSergey Vasilinets 2047b81f6101e2c1c68108243688f7d1d7302d1179eSergey Vasilinets @Test(expected = IllegalArgumentException.class) 2057b81f6101e2c1c68108243688f7d1d7302d1179eSergey Vasilinets public void reAddSameSourceWithDifferentObserver() { 2067b81f6101e2c1c68108243688f7d1d7302d1179eSergey Vasilinets mMediator.addSource(mSource, mock(Observer.class)); 2077b81f6101e2c1c68108243688f7d1d7302d1179eSergey Vasilinets mMediator.addSource(mSource, mock(Observer.class)); 2087b81f6101e2c1c68108243688f7d1d7302d1179eSergey Vasilinets } 2097b81f6101e2c1c68108243688f7d1d7302d1179eSergey Vasilinets 2107b81f6101e2c1c68108243688f7d1d7302d1179eSergey Vasilinets @Test 21194209fa7c603b9b0e226ce7e351461a479b5b595Sergey Vasilinets public void addSameSourceWithSameObserver() { 21294209fa7c603b9b0e226ce7e351461a479b5b595Sergey Vasilinets Observer observer = mock(Observer.class); 21394209fa7c603b9b0e226ce7e351461a479b5b595Sergey Vasilinets mMediator.addSource(mSource, observer); 21494209fa7c603b9b0e226ce7e351461a479b5b595Sergey Vasilinets mMediator.addSource(mSource, observer); 21594209fa7c603b9b0e226ce7e351461a479b5b595Sergey Vasilinets // no exception was thrown 21694209fa7c603b9b0e226ce7e351461a479b5b595Sergey Vasilinets } 21794209fa7c603b9b0e226ce7e351461a479b5b595Sergey Vasilinets 21894209fa7c603b9b0e226ce7e351461a479b5b595Sergey Vasilinets @Test 2197b81f6101e2c1c68108243688f7d1d7302d1179eSergey Vasilinets public void addSourceDuringOnActive() { 2207b81f6101e2c1c68108243688f7d1d7302d1179eSergey Vasilinets mRegistry.handleLifecycleEvent(Lifecycle.Event.ON_STOP); 2217b81f6101e2c1c68108243688f7d1d7302d1179eSergey Vasilinets mSource.setValue("a"); 2227b81f6101e2c1c68108243688f7d1d7302d1179eSergey Vasilinets mMediator.addSource(mSource, new Observer<String>() { 2237b81f6101e2c1c68108243688f7d1d7302d1179eSergey Vasilinets @Override 2247b81f6101e2c1c68108243688f7d1d7302d1179eSergey Vasilinets public void onChanged(@Nullable String s) { 2257b81f6101e2c1c68108243688f7d1d7302d1179eSergey Vasilinets MutableLiveData<String> source = new MutableLiveData<>(); 2267b81f6101e2c1c68108243688f7d1d7302d1179eSergey Vasilinets source.setValue("b"); 2277b81f6101e2c1c68108243688f7d1d7302d1179eSergey Vasilinets mMediator.addSource(source, new Observer<String>() { 2287b81f6101e2c1c68108243688f7d1d7302d1179eSergey Vasilinets @Override 2297b81f6101e2c1c68108243688f7d1d7302d1179eSergey Vasilinets public void onChanged(@Nullable String s) { 2307b81f6101e2c1c68108243688f7d1d7302d1179eSergey Vasilinets mMediator.setValue("c"); 2317b81f6101e2c1c68108243688f7d1d7302d1179eSergey Vasilinets } 2327b81f6101e2c1c68108243688f7d1d7302d1179eSergey Vasilinets }); 2337b81f6101e2c1c68108243688f7d1d7302d1179eSergey Vasilinets } 2347b81f6101e2c1c68108243688f7d1d7302d1179eSergey Vasilinets }); 2357b81f6101e2c1c68108243688f7d1d7302d1179eSergey Vasilinets mRegistry.handleLifecycleEvent(Lifecycle.Event.ON_START); 2367b81f6101e2c1c68108243688f7d1d7302d1179eSergey Vasilinets assertThat(mMediator.getValue(), is("c")); 2377b81f6101e2c1c68108243688f7d1d7302d1179eSergey Vasilinets } 2387b81f6101e2c1c68108243688f7d1d7302d1179eSergey Vasilinets 2396ca8525782f16bcb4403dc692a1fefd77934aa31Sergey Vasilinets} 240