• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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