Skip to content

Commit 19b7e93

Browse files
committed
Add unit tests.
1 parent fbc0307 commit 19b7e93

File tree

1 file changed

+219
-0
lines changed

1 file changed

+219
-0
lines changed
Lines changed: 219 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,219 @@
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.get()).isEqualTo("TestToken");
103+
when(mockAppCheckTokenResult.getToken()).thenReturn("NewTestToken");
104+
internalAppCheckTokenProvider.triggerTokenChange(mockAppCheckTokenResult);
105+
assertThat(receivedToken.get()).isEqualTo("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()).isEqualTo(1);
116+
firebaseAppCheckTokenProvider.removeChangeListener();
117+
assertThat(internalAppCheckTokenProvider.listeners).isEmpty();
118+
}
119+
120+
@Test
121+
public void removeChangeListenerShouldNotThrowIfProviderIsNotAvailable() {
122+
FirebaseAppCheckTokenProvider firebaseAppCheckTokenProvider =
123+
new FirebaseAppCheckTokenProvider(getProvider(null));
124+
firebaseAppCheckTokenProvider.removeChangeListener();
125+
}
126+
127+
@Test
128+
public void removeChangeListenerShouldUnregisterTheIdTokenListener() {
129+
FirebaseAppCheckTokenProvider firebaseAppCheckTokenProvider =
130+
new FirebaseAppCheckTokenProvider(getProvider(mockInternalAppCheckTokenProvider));
131+
verify(mockInternalAppCheckTokenProvider)
132+
.addAppCheckTokenListener(idTokenListenerCaptor.capture());
133+
firebaseAppCheckTokenProvider.removeChangeListener();
134+
verify(mockInternalAppCheckTokenProvider)
135+
.removeAppCheckTokenListener(idTokenListenerCaptor.getValue());
136+
}
137+
138+
@Test
139+
public void getTokenShouldReturnAFailedTaskIfProviderIsNotAvailable() {
140+
FirebaseAppCheckTokenProvider firebaseAppCheckTokenProvider =
141+
new FirebaseAppCheckTokenProvider(getProvider(null));
142+
Task<String> task = firebaseAppCheckTokenProvider.getToken();
143+
assertThat(task.isComplete()).isTrue();
144+
assertThat(task.isSuccessful()).isFalse();
145+
assertThat(task.getException()).isInstanceOf(FirebaseApiNotAvailableException.class);
146+
}
147+
148+
@Test
149+
public void getTokenShouldReturnAFailedTaskIfAppCheckGetTokenFails() {
150+
Exception getTokenException = new Exception();
151+
when(mockInternalAppCheckTokenProvider.getToken(anyBoolean()))
152+
.thenReturn(Tasks.forException(getTokenException));
153+
154+
FirebaseAppCheckTokenProvider firebaseAppCheckTokenProvider =
155+
new FirebaseAppCheckTokenProvider(getProvider(mockInternalAppCheckTokenProvider));
156+
157+
Task<String> task = firebaseAppCheckTokenProvider.getToken();
158+
assertThat(task.isComplete()).isTrue();
159+
assertThat(task.isSuccessful()).isFalse();
160+
assertThat(task.getException()).isSameInstanceAs(getTokenException);
161+
}
162+
163+
@Test
164+
public void getTokenShouldReturnASuccessfulTaskIfAppCheckGetTokenSucceeds() {
165+
when(mockAppCheckTokenResult.getToken()).thenReturn("TestToken");
166+
when(mockInternalAppCheckTokenProvider.getToken(anyBoolean()))
167+
.thenReturn(Tasks.forResult(mockAppCheckTokenResult));
168+
169+
FirebaseAppCheckTokenProvider firebaseAppCheckTokenProvider =
170+
new FirebaseAppCheckTokenProvider(getProvider(mockInternalAppCheckTokenProvider));
171+
Task<String> task = firebaseAppCheckTokenProvider.getToken();
172+
173+
assertThat(task.isComplete()).isTrue();
174+
assertThat(task.isSuccessful()).isTrue();
175+
assertThat(task.getResult()).isEqualTo("TestToken");
176+
}
177+
178+
@Test
179+
public void getTokenShouldNotForceRefreshTheTokenIfInvalidateTokenIsNotCalled() {
180+
when(mockAppCheckTokenResult.getToken()).thenReturn("TestToken");
181+
when(mockInternalAppCheckTokenProvider.getToken(anyBoolean()))
182+
.thenReturn(Tasks.forResult(mockAppCheckTokenResult));
183+
184+
FirebaseAppCheckTokenProvider firebaseAppCheckTokenProvider =
185+
new FirebaseAppCheckTokenProvider(getProvider(mockInternalAppCheckTokenProvider));
186+
firebaseAppCheckTokenProvider.getToken();
187+
verify(mockInternalAppCheckTokenProvider).getToken(false);
188+
}
189+
190+
@Test
191+
public void invalidateTokenShouldCauseGetTokenToForceRefresh() {
192+
when(mockAppCheckTokenResult.getToken()).thenReturn("TestToken");
193+
when(mockInternalAppCheckTokenProvider.getToken(anyBoolean()))
194+
.thenReturn(Tasks.forResult(mockAppCheckTokenResult));
195+
196+
FirebaseAppCheckTokenProvider firebaseAppCheckTokenProvider =
197+
new FirebaseAppCheckTokenProvider(getProvider(mockInternalAppCheckTokenProvider));
198+
firebaseAppCheckTokenProvider.invalidateToken();
199+
firebaseAppCheckTokenProvider.getToken();
200+
verify(mockInternalAppCheckTokenProvider).getToken(true);
201+
}
202+
203+
@Test
204+
public void invalidateTokenShouldOnlyForceRefreshOnTheImmediatelyFollowingGetTokenInvocation() {
205+
when(mockAppCheckTokenResult.getToken()).thenReturn("TestToken");
206+
when(mockInternalAppCheckTokenProvider.getToken(anyBoolean()))
207+
.thenReturn(Tasks.forResult(mockAppCheckTokenResult));
208+
209+
FirebaseAppCheckTokenProvider firebaseAppCheckTokenProvider =
210+
new FirebaseAppCheckTokenProvider(getProvider(mockInternalAppCheckTokenProvider));
211+
212+
firebaseAppCheckTokenProvider.invalidateToken();
213+
firebaseAppCheckTokenProvider.getToken();
214+
firebaseAppCheckTokenProvider.getToken();
215+
216+
verify(mockInternalAppCheckTokenProvider).getToken(true);
217+
verify(mockInternalAppCheckTokenProvider).getToken(false);
218+
}
219+
}

0 commit comments

Comments
 (0)