Skip to content

Commit 8e97db4

Browse files
committed
Add unit tests.
1 parent fbc0307 commit 8e97db4

File tree

1 file changed

+220
-0
lines changed

1 file changed

+220
-0
lines changed
Lines changed: 220 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,220 @@
1+
// Copyright 2021 Google LLC
2+
//
3+
// Licensed under the Apache License, Version 2.0 (the "License");
4+
// you may not use this file except in compliance with the License.
5+
// You may obtain a copy of the License at
6+
//
7+
// http://www.apache.org/licenses/LICENSE-2.0
8+
//
9+
// Unless required by applicable law or agreed to in writing, software
10+
// distributed under the License is distributed on an "AS IS" BASIS,
11+
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12+
// See the License for the specific language governing permissions and
13+
// limitations under the License.
14+
15+
package com.google.firebase.firestore.auth;
16+
17+
import static com.google.common.truth.Truth.assertThat;
18+
import static org.mockito.ArgumentMatchers.anyBoolean;
19+
import static org.mockito.Mockito.verify;
20+
import static org.mockito.Mockito.when;
21+
22+
import androidx.annotation.NonNull;
23+
import com.google.android.gms.tasks.Task;
24+
import com.google.android.gms.tasks.Tasks;
25+
import com.google.firebase.FirebaseApiNotAvailableException;
26+
import com.google.firebase.appcheck.AppCheckTokenResult;
27+
import com.google.firebase.appcheck.interop.AppCheckTokenListener;
28+
import com.google.firebase.appcheck.interop.InternalAppCheckTokenProvider;
29+
import com.google.firebase.firestore.util.Listener;
30+
import com.google.firebase.inject.Provider;
31+
import java.util.ArrayList;
32+
import java.util.concurrent.atomic.AtomicReference;
33+
import org.junit.Rule;
34+
import org.junit.Test;
35+
import org.junit.runner.RunWith;
36+
import org.mockito.ArgumentCaptor;
37+
import org.mockito.Captor;
38+
import org.mockito.Mock;
39+
import org.mockito.junit.MockitoJUnit;
40+
import org.mockito.junit.MockitoRule;
41+
import org.mockito.quality.Strictness;
42+
import org.robolectric.RobolectricTestRunner;
43+
import org.robolectric.annotation.Config;
44+
45+
class TestListenersInternalAppCheckTokenProvider implements InternalAppCheckTokenProvider {
46+
public ArrayList<AppCheckTokenListener> listeners = new ArrayList<>();
47+
48+
@NonNull
49+
@Override
50+
public Task<AppCheckTokenResult> getToken(boolean forceRefresh) {
51+
return null;
52+
}
53+
54+
@Override
55+
public void addAppCheckTokenListener(@NonNull AppCheckTokenListener listener) {
56+
listeners.add(listener);
57+
}
58+
59+
@Override
60+
public void removeAppCheckTokenListener(@NonNull AppCheckTokenListener listener) {
61+
listeners.remove(listener);
62+
}
63+
64+
void triggerTokenChange(AppCheckTokenResult newToken) {
65+
for (AppCheckTokenListener listener : listeners) {
66+
listener.onAppCheckTokenChanged(newToken);
67+
}
68+
}
69+
}
70+
71+
@RunWith(RobolectricTestRunner.class)
72+
@Config(manifest = Config.NONE)
73+
public class FirebaseAppCheckTokenProviderTest {
74+
75+
@Rule public final MockitoRule mocks = MockitoJUnit.rule().strictness(Strictness.STRICT_STUBS);
76+
77+
@Mock InternalAppCheckTokenProvider mockInternalAppCheckTokenProvider;
78+
@Mock Listener<String> mockAppCheckTokenListener;
79+
@Mock AppCheckTokenResult mockAppCheckTokenResult;
80+
@Captor ArgumentCaptor<AppCheckTokenListener> idTokenListenerCaptor;
81+
82+
Provider<InternalAppCheckTokenProvider> getProvider(InternalAppCheckTokenProvider internal) {
83+
return () -> {
84+
return internal;
85+
};
86+
}
87+
88+
@Test
89+
public void setChangeListenerShouldBeCalledWhenIdTokenChanges() {
90+
TestListenersInternalAppCheckTokenProvider internalAppCheckTokenProvider =
91+
new TestListenersInternalAppCheckTokenProvider();
92+
FirebaseAppCheckTokenProvider firebaseAppCheckTokenProvider =
93+
new FirebaseAppCheckTokenProvider(getProvider(internalAppCheckTokenProvider));
94+
AtomicReference<String> receivedToken = new AtomicReference<String>();
95+
Listener<String> appCheckTokenListener =
96+
(String token) -> {
97+
receivedToken.set(token);
98+
};
99+
firebaseAppCheckTokenProvider.setChangeListener(appCheckTokenListener);
100+
when(mockAppCheckTokenResult.getToken()).thenReturn("TestToken");
101+
internalAppCheckTokenProvider.triggerTokenChange(mockAppCheckTokenResult);
102+
assertThat(receivedToken.equals("TestToken"));
103+
when(mockAppCheckTokenResult.getToken()).thenReturn("NewTestToken");
104+
internalAppCheckTokenProvider.triggerTokenChange(mockAppCheckTokenResult);
105+
assertThat(receivedToken.equals("NewTestToken"));
106+
}
107+
108+
@Test
109+
public void removeChangeListenerShouldStopNotifyingTheListener() {
110+
TestListenersInternalAppCheckTokenProvider internalAppCheckTokenProvider =
111+
new TestListenersInternalAppCheckTokenProvider();
112+
FirebaseAppCheckTokenProvider firebaseAppCheckTokenProvider =
113+
new FirebaseAppCheckTokenProvider(getProvider(internalAppCheckTokenProvider));
114+
firebaseAppCheckTokenProvider.setChangeListener(mockAppCheckTokenListener);
115+
assertThat(internalAppCheckTokenProvider.listeners.size() == 1);
116+
assertThat(internalAppCheckTokenProvider.listeners.contains(mockAppCheckTokenListener));
117+
firebaseAppCheckTokenProvider.removeChangeListener();
118+
assertThat(internalAppCheckTokenProvider.listeners.size() == 0);
119+
}
120+
121+
@Test
122+
public void removeChangeListenerShouldNotThrowIfProviderIsNotAvailable() {
123+
FirebaseAppCheckTokenProvider firebaseAppCheckTokenProvider =
124+
new FirebaseAppCheckTokenProvider(getProvider(null));
125+
firebaseAppCheckTokenProvider.removeChangeListener();
126+
}
127+
128+
@Test
129+
public void removeChangeListenerShouldUnregisterTheIdTokenListener() {
130+
FirebaseAppCheckTokenProvider firebaseAppCheckTokenProvider =
131+
new FirebaseAppCheckTokenProvider(getProvider(mockInternalAppCheckTokenProvider));
132+
verify(mockInternalAppCheckTokenProvider)
133+
.addAppCheckTokenListener(idTokenListenerCaptor.capture());
134+
firebaseAppCheckTokenProvider.removeChangeListener();
135+
verify(mockInternalAppCheckTokenProvider)
136+
.removeAppCheckTokenListener(idTokenListenerCaptor.getValue());
137+
}
138+
139+
@Test
140+
public void getTokenShouldReturnAFailedTaskIfProviderIsNotAvailable() {
141+
FirebaseAppCheckTokenProvider firebaseAppCheckTokenProvider =
142+
new FirebaseAppCheckTokenProvider(getProvider(null));
143+
Task<String> task = firebaseAppCheckTokenProvider.getToken();
144+
assertThat(task.isComplete()).isTrue();
145+
assertThat(task.isSuccessful()).isFalse();
146+
assertThat(task.getException()).isInstanceOf(FirebaseApiNotAvailableException.class);
147+
}
148+
149+
@Test
150+
public void getTokenShouldReturnAFailedTaskIfAppCheckGetTokenFails() {
151+
Exception getTokenException = new Exception();
152+
when(mockInternalAppCheckTokenProvider.getToken(anyBoolean()))
153+
.thenReturn(Tasks.forException(getTokenException));
154+
155+
FirebaseAppCheckTokenProvider firebaseAppCheckTokenProvider =
156+
new FirebaseAppCheckTokenProvider(getProvider(mockInternalAppCheckTokenProvider));
157+
158+
Task<String> task = firebaseAppCheckTokenProvider.getToken();
159+
assertThat(task.isComplete()).isTrue();
160+
assertThat(task.isSuccessful()).isFalse();
161+
assertThat(task.getException()).isSameInstanceAs(getTokenException);
162+
}
163+
164+
@Test
165+
public void getTokenShouldReturnASuccessfulTaskIfAppCheckGetTokenSucceeds() {
166+
when(mockAppCheckTokenResult.getToken()).thenReturn("TestToken");
167+
when(mockInternalAppCheckTokenProvider.getToken(anyBoolean()))
168+
.thenReturn(Tasks.forResult(mockAppCheckTokenResult));
169+
170+
FirebaseAppCheckTokenProvider firebaseAppCheckTokenProvider =
171+
new FirebaseAppCheckTokenProvider(getProvider(mockInternalAppCheckTokenProvider));
172+
Task<String> task = firebaseAppCheckTokenProvider.getToken();
173+
174+
assertThat(task.isComplete()).isTrue();
175+
assertThat(task.isSuccessful()).isTrue();
176+
assertThat(task.getResult()).isEqualTo("TestToken");
177+
}
178+
179+
@Test
180+
public void getTokenShouldNotForceRefreshTheTokenIfInvalidateTokenIsNotCalled() {
181+
when(mockAppCheckTokenResult.getToken()).thenReturn("TestToken");
182+
when(mockInternalAppCheckTokenProvider.getToken(anyBoolean()))
183+
.thenReturn(Tasks.forResult(mockAppCheckTokenResult));
184+
185+
FirebaseAppCheckTokenProvider firebaseAppCheckTokenProvider =
186+
new FirebaseAppCheckTokenProvider(getProvider(mockInternalAppCheckTokenProvider));
187+
firebaseAppCheckTokenProvider.getToken();
188+
verify(mockInternalAppCheckTokenProvider).getToken(false);
189+
}
190+
191+
@Test
192+
public void invalidateTokenShouldCauseGetTokenToForceRefresh() {
193+
when(mockAppCheckTokenResult.getToken()).thenReturn("TestToken");
194+
when(mockInternalAppCheckTokenProvider.getToken(anyBoolean()))
195+
.thenReturn(Tasks.forResult(mockAppCheckTokenResult));
196+
197+
FirebaseAppCheckTokenProvider firebaseAppCheckTokenProvider =
198+
new FirebaseAppCheckTokenProvider(getProvider(mockInternalAppCheckTokenProvider));
199+
firebaseAppCheckTokenProvider.invalidateToken();
200+
firebaseAppCheckTokenProvider.getToken();
201+
verify(mockInternalAppCheckTokenProvider).getToken(true);
202+
}
203+
204+
@Test
205+
public void invalidateTokenShouldOnlyForceRefreshOnTheImmediatelyFollowingGetTokenInvocation() {
206+
when(mockAppCheckTokenResult.getToken()).thenReturn("TestToken");
207+
when(mockInternalAppCheckTokenProvider.getToken(anyBoolean()))
208+
.thenReturn(Tasks.forResult(mockAppCheckTokenResult));
209+
210+
FirebaseAppCheckTokenProvider firebaseAppCheckTokenProvider =
211+
new FirebaseAppCheckTokenProvider(getProvider(mockInternalAppCheckTokenProvider));
212+
213+
firebaseAppCheckTokenProvider.invalidateToken();
214+
firebaseAppCheckTokenProvider.getToken();
215+
firebaseAppCheckTokenProvider.getToken();
216+
217+
verify(mockInternalAppCheckTokenProvider).getToken(true);
218+
verify(mockInternalAppCheckTokenProvider).getToken(false);
219+
}
220+
}

0 commit comments

Comments
 (0)