|
27 | 27 | import com.google.android.gms.tasks.TaskCompletionSource;
|
28 | 28 | import com.google.firebase.inject.Provider;
|
29 | 29 | import com.google.firebase.perf.FirebasePerformanceTestBase;
|
| 30 | +import com.google.firebase.perf.provider.FirebasePerfProvider; |
30 | 31 | import com.google.firebase.remoteconfig.FirebaseRemoteConfig;
|
31 | 32 | import com.google.firebase.remoteconfig.FirebaseRemoteConfigInfo;
|
32 | 33 | import com.google.firebase.remoteconfig.FirebaseRemoteConfigSettings;
|
@@ -796,6 +797,57 @@ public void isLastFetchFailed_frcIsNonNullAndStatusOtherThanFailed_returnsFalse(
|
796 | 797 | assertThat(testRemoteConfigManager.isLastFetchFailed()).isFalse();
|
797 | 798 | }
|
798 | 799 |
|
| 800 | + @Test |
| 801 | + public void triggerRemoteConfigFetchIfNecessary_doesNotFetchBeforeAppStartRandomDelay() { |
| 802 | + long appStartConfigFetchDelay = 5000; |
| 803 | + RemoteConfigManager remoteConfigManagerPartialMock = |
| 804 | + spy( |
| 805 | + setupTestRemoteConfigManager( |
| 806 | + createFakeTaskThatDoesNothing(), |
| 807 | + true, |
| 808 | + createDefaultRcConfigMap(), |
| 809 | + appStartConfigFetchDelay)); |
| 810 | + |
| 811 | + // Simulate time fast forward to some time before fetch time is up |
| 812 | + long appStartTimeInMs = |
| 813 | + TimeUnit.MICROSECONDS.toMillis(FirebasePerfProvider.getAppStartTime().getMicros()); |
| 814 | + when(remoteConfigManagerPartialMock.getCurrentSystemTimeMillis()) |
| 815 | + .thenReturn(appStartTimeInMs + appStartConfigFetchDelay - 2000); |
| 816 | + |
| 817 | + simulateFirebaseRemoteConfigLastFetchStatus( |
| 818 | + FirebaseRemoteConfig.LAST_FETCH_STATUS_NO_FETCH_YET); |
| 819 | + remoteConfigManagerPartialMock.getRemoteConfigValueOrDefault("some_key", 5L); |
| 820 | + remoteConfigManagerPartialMock.getRemoteConfigValueOrDefault("some_other_key", 5.0f); |
| 821 | + remoteConfigManagerPartialMock.getRemoteConfigValueOrDefault("some_other_key_2", true); |
| 822 | + remoteConfigManagerPartialMock.getRemoteConfigValueOrDefault("some_other_key_3", "1.0.0"); |
| 823 | + |
| 824 | + verify(mockFirebaseRemoteConfig, times(0)).fetchAndActivate(); |
| 825 | + } |
| 826 | + |
| 827 | + @Test |
| 828 | + public void triggerRemoteConfigFetchIfNecessary_fetchesAfterAppStartRandomDelay() { |
| 829 | + long appStartConfigFetchDelay = 5000; |
| 830 | + RemoteConfigManager remoteConfigManagerPartialMock = |
| 831 | + spy( |
| 832 | + setupTestRemoteConfigManager( |
| 833 | + createFakeTaskThatDoesNothing(), |
| 834 | + true, |
| 835 | + createDefaultRcConfigMap(), |
| 836 | + appStartConfigFetchDelay)); |
| 837 | + |
| 838 | + // Simulate time fast forward to 2s after fetch delay time is up |
| 839 | + long appStartTimeInMs = |
| 840 | + TimeUnit.MICROSECONDS.toMillis(FirebasePerfProvider.getAppStartTime().getMicros()); |
| 841 | + when(remoteConfigManagerPartialMock.getCurrentSystemTimeMillis()) |
| 842 | + .thenReturn(appStartTimeInMs + appStartConfigFetchDelay + 2000); |
| 843 | + |
| 844 | + simulateFirebaseRemoteConfigLastFetchStatus( |
| 845 | + FirebaseRemoteConfig.LAST_FETCH_STATUS_NO_FETCH_YET); |
| 846 | + remoteConfigManagerPartialMock.getRemoteConfigValueOrDefault("some_key", 5L); |
| 847 | + |
| 848 | + verify(mockFirebaseRemoteConfig, times(1)).fetchAndActivate(); |
| 849 | + } |
| 850 | + |
799 | 851 | private void simulateFirebaseRemoteConfigLastFetchStatus(int lastFetchStatus) {
|
800 | 852 | when(mockFirebaseRemoteConfig.getInfo())
|
801 | 853 | .thenReturn(
|
@@ -830,17 +882,27 @@ private Task<Boolean> createFakeTaskThatDoesNothing() {
|
830 | 882 | private RemoteConfigManager setupTestRemoteConfigManager(
|
831 | 883 | Task<Boolean> fakeTask,
|
832 | 884 | boolean initializeFrc,
|
833 |
| - Map<String, FirebaseRemoteConfigValue> configs) { |
| 885 | + Map<String, FirebaseRemoteConfigValue> configs, |
| 886 | + long appStartConfigFetchDelayInMs) { |
834 | 887 | simulateFirebaseRemoteConfigLastFetchStatus(FirebaseRemoteConfig.LAST_FETCH_STATUS_SUCCESS);
|
835 | 888 | when(mockFirebaseRemoteConfig.fetchAndActivate()).thenReturn(fakeTask);
|
836 | 889 | when(mockFirebaseRemoteConfig.getAll()).thenReturn(configs);
|
837 | 890 | if (initializeFrc) {
|
838 |
| - return new RemoteConfigManager(fakeExecutor, mockFirebaseRemoteConfig); |
| 891 | + return new RemoteConfigManager( |
| 892 | + fakeExecutor, mockFirebaseRemoteConfig, appStartConfigFetchDelayInMs); |
839 | 893 | } else {
|
840 |
| - return new RemoteConfigManager(fakeExecutor, /* firebaseRemoteConfig= */ null); |
| 894 | + return new RemoteConfigManager( |
| 895 | + fakeExecutor, /* firebaseRemoteConfig= */ null, appStartConfigFetchDelayInMs); |
841 | 896 | }
|
842 | 897 | }
|
843 | 898 |
|
| 899 | + private RemoteConfigManager setupTestRemoteConfigManager( |
| 900 | + Task<Boolean> fakeTask, |
| 901 | + boolean initializeFrc, |
| 902 | + Map<String, FirebaseRemoteConfigValue> configs) { |
| 903 | + return setupTestRemoteConfigManager(fakeTask, initializeFrc, configs, 0); |
| 904 | + } |
| 905 | + |
844 | 906 | /**
|
845 | 907 | * Creates and returns a test instance of RemoteConfigManager that has {@link
|
846 | 908 | * RemoteConfigManagerTest#fakeExecutor} and {@link
|
|
0 commit comments