1 /* 2 * Copyright 2022 Google LLC 3 * 4 * Licensed under the Apache License, Version 2.0 (the "License"); 5 * you may not use this file except in compliance with the License. 6 * You may obtain a copy of the License at 7 * 8 * http://www.apache.org/licenses/LICENSE-2.0 9 * 10 * Unless required by applicable law or agreed to in writing, software 11 * distributed under the License is distributed on an "AS IS" BASIS, 12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13 * See the License for the specific language governing permissions and 14 * limitations under the License. 15 */ 16 package com.google.android.libraries.mobiledatadownload.internal.logging; 17 18 import static com.google.common.truth.Truth.assertThat; 19 import static com.google.common.util.concurrent.Futures.immediateVoidFuture; 20 import static com.google.common.util.concurrent.MoreExecutors.directExecutor; 21 import static org.mockito.ArgumentMatchers.any; 22 import static org.mockito.Mockito.times; 23 import static org.mockito.Mockito.verify; 24 import static org.mockito.Mockito.when; 25 26 import android.content.Context; 27 import androidx.test.core.app.ApplicationProvider; 28 import com.google.mobiledatadownload.internal.MetadataProto.FileGroupLoggingState; 29 import com.google.mobiledatadownload.internal.MetadataProto.GroupKey; 30 import com.google.android.libraries.mobiledatadownload.file.common.testing.TemporaryUri; 31 import com.google.android.libraries.mobiledatadownload.testing.FakeTimeSource; 32 import com.google.android.libraries.mobiledatadownload.testing.MddTestDependencies; 33 import com.google.android.libraries.mobiledatadownload.testing.TestFlags; 34 import com.google.common.base.Optional; 35 import com.google.common.util.concurrent.AsyncCallable; 36 import java.util.Random; 37 import java.util.concurrent.Executor; 38 import org.junit.Before; 39 import org.junit.Rule; 40 import org.junit.Test; 41 import org.junit.runner.RunWith; 42 import org.mockito.ArgumentCaptor; 43 import org.mockito.Captor; 44 import org.mockito.Mock; 45 import org.mockito.junit.MockitoJUnit; 46 import org.mockito.junit.MockitoRule; 47 import org.robolectric.RobolectricTestRunner; 48 49 @RunWith(RobolectricTestRunner.class) 50 public class NetworkLoggerTest { 51 52 private static final String GROUP_NAME_1 = "group-name-1"; 53 private static final String OWNER_PACKAGE_1 = "owner-package-1"; 54 private static final int VERSION_NUMBER_1 = 1; 55 private static final int BUILD_ID_1 = 1; 56 57 private static final String GROUP_NAME_2 = "group-name-2"; 58 private static final String OWNER_PACKAGE_2 = "owner-package-2"; 59 private static final int VERSION_NUMBER_2 = 2; 60 private static final int BUILD_ID_2 = 1; 61 62 private static final String GROUP_NAME_3 = "group-name-3"; 63 private static final String OWNER_PACKAGE_3 = "owner-package-3"; 64 private static final int VERSION_NUMBER_3 = 3; 65 private static final int BUILD_ID_3 = 1; 66 private static final Executor executor = directExecutor(); 67 68 private final Context context = ApplicationProvider.getApplicationContext(); 69 70 private final TestFlags flags = new TestFlags(); 71 72 private LoggingStateStore loggingStateStore; 73 @Mock EventLogger mockEventLogger; 74 75 @Rule public final TemporaryUri tmpUri = new TemporaryUri(); 76 @Rule public final MockitoRule mocks = MockitoJUnit.rule(); 77 78 @Captor ArgumentCaptor<AsyncCallable<Void>> mddNetworkStatsArgumentCaptor; 79 80 @Before setUp()81 public void setUp() throws Exception { 82 loggingStateStore = 83 MddTestDependencies.LoggingStateStoreImpl.SHARED_PREFERENCES.loggingStateStore( 84 context, Optional.absent(), new FakeTimeSource(), executor, new Random()); 85 } 86 87 @Test testLogNetworkStats_log()88 public void testLogNetworkStats_log() throws Exception { 89 flags.networkStatsLoggingSampleInterval = Optional.of(1); 90 91 setupNetworkUsage(); 92 93 NetworkLogger networkLogger = 94 new NetworkLogger(context, mockEventLogger, Optional.absent(), flags, loggingStateStore); 95 when(mockEventLogger.logMddNetworkStats(any())).thenReturn(immediateVoidFuture()); 96 networkLogger.log().get(); 97 98 verify(mockEventLogger, times(1)).logMddNetworkStats(mddNetworkStatsArgumentCaptor.capture()); 99 100 // Verify that all entries are cleared after logging. 101 verifyAllEntriesAreCleared(); 102 } 103 verifyAllEntriesAreCleared()104 private void verifyAllEntriesAreCleared() throws Exception { 105 assertThat(loggingStateStore.getAndResetAllDataUsage().get()).isEmpty(); 106 } 107 108 @Test testLogNetworkStats_noNetworkUsage_logsNoUsage()109 public void testLogNetworkStats_noNetworkUsage_logsNoUsage() throws Exception { 110 flags.networkStatsLoggingSampleInterval = Optional.of(1); 111 112 NetworkLogger networkLogger = 113 new NetworkLogger(context, mockEventLogger, Optional.absent(), flags, loggingStateStore); 114 when(mockEventLogger.logMddNetworkStats(any())).thenReturn(immediateVoidFuture()); 115 116 networkLogger.log().get(); 117 118 verify(mockEventLogger, times(1)).logMddNetworkStats(mddNetworkStatsArgumentCaptor.capture()); 119 120 // Verify that all entries are cleared after logging. 121 verifyAllEntriesAreCleared(); 122 } 123 setupNetworkUsage()124 private void setupNetworkUsage() throws Exception { 125 loggingStateStore 126 .incrementDataUsage( 127 FileGroupLoggingState.newBuilder() 128 .setGroupKey( 129 GroupKey.newBuilder() 130 .setGroupName(GROUP_NAME_1) 131 .setOwnerPackage(OWNER_PACKAGE_1) 132 .build()) 133 .setFileGroupVersionNumber(VERSION_NUMBER_1) 134 .setBuildId(BUILD_ID_1) 135 .setWifiUsage(1) 136 .setCellularUsage(2) 137 .build()) 138 .get(); 139 140 loggingStateStore 141 .incrementDataUsage( 142 FileGroupLoggingState.newBuilder() 143 .setGroupKey( 144 GroupKey.newBuilder() 145 .setGroupName(GROUP_NAME_2) 146 .setOwnerPackage(OWNER_PACKAGE_2) 147 .build()) 148 .setFileGroupVersionNumber(VERSION_NUMBER_2) 149 .setBuildId(BUILD_ID_2) 150 .setWifiUsage(4) 151 .setCellularUsage(0) 152 .build()) 153 .get(); 154 155 loggingStateStore 156 .incrementDataUsage( 157 FileGroupLoggingState.newBuilder() 158 .setGroupKey( 159 GroupKey.newBuilder() 160 .setGroupName(GROUP_NAME_3) 161 .setOwnerPackage(OWNER_PACKAGE_3) 162 .build()) 163 .setFileGroupVersionNumber(VERSION_NUMBER_3) 164 .setBuildId(BUILD_ID_3) 165 .setWifiUsage(0) 166 .setCellularUsage(8) 167 .build()) 168 .get(); 169 } 170 } 171