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