• 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 
20 import com.google.mobiledatadownload.internal.MetadataProto.DataFile;
21 import com.google.mobiledatadownload.internal.MetadataProto.DataFileGroupBookkeeping;
22 import com.google.mobiledatadownload.internal.MetadataProto.DataFileGroupInternal;
23 import com.google.android.libraries.mobiledatadownload.internal.logging.DownloadStateLogger.Operation;
24 import com.google.android.libraries.mobiledatadownload.internal.logging.testing.FakeEventLogger;
25 import com.google.common.collect.ImmutableMap;
26 import com.google.mobiledatadownload.LogEnumsProto.MddClientEvent;
27 import com.google.mobiledatadownload.LogProto.DataDownloadFileGroupStats;
28 import java.util.Map;
29 import org.junit.Before;
30 import org.junit.Test;
31 import org.junit.runner.RunWith;
32 import org.robolectric.ParameterizedRobolectricTestRunner;
33 import org.robolectric.ParameterizedRobolectricTestRunner.Parameter;
34 import org.robolectric.ParameterizedRobolectricTestRunner.Parameters;
35 
36 @RunWith(ParameterizedRobolectricTestRunner.class)
37 public final class DownloadStateLoggerTest {
38 
39   @Parameter(value = 0)
40   public Operation operation;
41 
42   @Parameter(value = 1)
43   public Map<String, MddClientEvent.Code> expectedCodeMap;
44 
45   @Parameters(name = "{index}: operation = {0}, expectedCodeMap = {1}")
parameters()46   public static Object[][] parameters() {
47     return new Object[][] {
48       {
49         Operation.DOWNLOAD,
50         ImmutableMap.builder()
51             .put("started", MddClientEvent.Code.EVENT_CODE_UNSPECIFIED)
52             .put("pending", MddClientEvent.Code.EVENT_CODE_UNSPECIFIED)
53             .put("failed", MddClientEvent.Code.EVENT_CODE_UNSPECIFIED)
54             .put("complete", MddClientEvent.Code.EVENT_CODE_UNSPECIFIED)
55             .buildOrThrow(),
56       },
57       {
58         Operation.IMPORT,
59         ImmutableMap.builder()
60             .put("started", MddClientEvent.Code.EVENT_CODE_UNSPECIFIED)
61             .put("pending", MddClientEvent.Code.EVENT_CODE_UNSPECIFIED)
62             .put("failed", MddClientEvent.Code.EVENT_CODE_UNSPECIFIED)
63             .put("complete", MddClientEvent.Code.EVENT_CODE_UNSPECIFIED)
64             .buildOrThrow(),
65       },
66     };
67   }
68 
69   private static final DataFileGroupBookkeeping FILE_GROUP_BOOKKEEPING =
70       DataFileGroupBookkeeping.newBuilder()
71           .setGroupNewFilesReceivedTimestamp(100L)
72           .setGroupDownloadStartedTimestampInMillis(1000L)
73           .setGroupDownloadedTimestampInMillis(10000L)
74           .setDownloadStartedCount(5)
75           .build();
76 
77   private static final DataFileGroupInternal FILE_GROUP =
78       DataFileGroupInternal.newBuilder()
79           .setGroupName("test-group")
80           .setBuildId(100L)
81           .setVariantId("variant")
82           .setFileGroupVersionNumber(10)
83           .addFile(DataFile.getDefaultInstance())
84           .setBookkeeping(FILE_GROUP_BOOKKEEPING)
85           .build();
86 
87   private static final DataDownloadFileGroupStats EXPECTED_FILE_GROUP_STATS =
88       DataDownloadFileGroupStats.newBuilder()
89           .setFileGroupName(FILE_GROUP.getGroupName())
90           .setFileGroupVersionNumber(FILE_GROUP.getFileGroupVersionNumber())
91           .setBuildId(FILE_GROUP.getBuildId())
92           .setVariantId(FILE_GROUP.getVariantId())
93           .setOwnerPackage("")
94           .setFileCount(1)
95           .build();
96 
97   private static final Void EXPECTED_DOWNLOAD_LATENCY = null;
98 
99   private final FakeEventLogger fakeEventLogger = new FakeEventLogger();
100 
101   private DownloadStateLogger downloadStateLogger;
102 
103   @Before
setUp()104   public void setUp() {
105     downloadStateLogger = loggerForOperation(operation);
106   }
107 
108   @Test
logStarted_logsExpectedCode()109   public void logStarted_logsExpectedCode() throws Exception {
110     downloadStateLogger.logStarted(FILE_GROUP);
111 
112     assertExpectedCodeIsLogged(expectedCodeMap.get("started"));
113   }
114 
115   @Test
logPending_logsExpectedCode()116   public void logPending_logsExpectedCode() throws Exception {
117     downloadStateLogger.logPending(FILE_GROUP);
118 
119     assertExpectedCodeIsLogged(expectedCodeMap.get("pending"));
120   }
121 
122   @Test
logFailed_logsExpectedCode()123   public void logFailed_logsExpectedCode() throws Exception {
124     downloadStateLogger.logFailed(FILE_GROUP);
125 
126     assertExpectedCodeIsLogged(expectedCodeMap.get("failed"));
127   }
128 
129   @Test
logComplete_logsExpectedCode()130   public void logComplete_logsExpectedCode() throws Exception {
131     downloadStateLogger.logComplete(FILE_GROUP);
132 
133     assertExpectedCodeIsLogged(expectedCodeMap.get("complete"));
134 
135     if (operation == Operation.DOWNLOAD) {
136       assertThat(fakeEventLogger.getLoggedLatencies()).hasSize(1);
137       assertThat(fakeEventLogger.getLoggedLatencies()).containsKey(EXPECTED_FILE_GROUP_STATS);
138       assertThat(fakeEventLogger.getLoggedLatencies().values()).contains(EXPECTED_DOWNLOAD_LATENCY);
139     } else {
140       assertThat(fakeEventLogger.getLoggedLatencies()).isEmpty();
141     }
142   }
143 
loggerForOperation(Operation operation)144   private DownloadStateLogger loggerForOperation(Operation operation) {
145     switch (operation) {
146       case DOWNLOAD:
147         return DownloadStateLogger.forDownload(fakeEventLogger);
148       case IMPORT:
149         return DownloadStateLogger.forImport(fakeEventLogger);
150     }
151     throw new AssertionError();
152   }
153 
assertExpectedCodeIsLogged(MddClientEvent.Code code)154   private void assertExpectedCodeIsLogged(MddClientEvent.Code code) {
155     assertThat(fakeEventLogger.getLoggedCodes()).contains(code);
156   }
157 }
158