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