• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 /*
2  * Copyright (C) 2018 The Android Open Source Project
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 
17 package com.android.textclassifier.downloader;
18 
19 import static com.google.common.truth.Truth.assertThat;
20 
21 import androidx.test.ext.junit.runners.AndroidJUnit4;
22 import com.android.os.AtomsProto.TextClassifierDownloadReported;
23 import com.android.os.AtomsProto.TextClassifierDownloadWorkCompleted;
24 import com.android.os.AtomsProto.TextClassifierDownloadWorkScheduled;
25 import com.android.textclassifier.common.ModelType;
26 import com.android.textclassifier.common.statsd.TextClassifierDownloadLoggerTestRule;
27 import com.google.common.collect.Iterables;
28 import org.junit.Rule;
29 import org.junit.Test;
30 import org.junit.runner.RunWith;
31 
32 @RunWith(AndroidJUnit4.class)
33 public final class TextClassifierDownloadLoggerTest {
34   private static final String MODEL_TYPE = ModelType.LANG_ID;
35   private static final TextClassifierDownloadReported.ModelType MODEL_TYPE_ATOM =
36       TextClassifierDownloadReported.ModelType.LANG_ID;
37   private static final String URL =
38       "https://www.gstatic.com/android/text_classifier/x/v123/en.fb.manifest";
39   private static final int ERROR_CODE = ModelDownloadException.FAILED_TO_DOWNLOAD_404_ERROR;
40   private static final TextClassifierDownloadReported.FailureReason FAILURE_REASON_ATOM =
41       TextClassifierDownloadReported.FailureReason.FAILED_TO_DOWNLOAD_404_ERROR;
42   private static final int RUN_ATTEMPT_COUNT = 1;
43   private static final long WORK_ID = 123456789L;
44   private static final long DOWNLOAD_DURATION_MILLIS = 666L;
45   private static final int DOWNLOADER_LIB_ERROR_CODE = 500;
46   private static final int REASON_TO_SCHEDULE =
47       TextClassifierDownloadLogger.REASON_TO_SCHEDULE_TCS_STARTED;
48   private static final TextClassifierDownloadWorkScheduled.ReasonToSchedule
49       REASON_TO_SCHEDULE_ATOM = TextClassifierDownloadWorkScheduled.ReasonToSchedule.TCS_STARTED;
50   private static final int WORK_RESULT =
51       TextClassifierDownloadLogger.WORK_RESULT_SUCCESS_MODEL_DOWNLOADED;
52   private static final TextClassifierDownloadWorkCompleted.WorkResult WORK_RESULT_ATOM =
53       TextClassifierDownloadWorkCompleted.WorkResult.SUCCESS_MODEL_DOWNLOADED;
54   private static final long SCHEDULED_TO_START_DURATION_MILLIS = 777L;
55   private static final long STARTED_TO_FINISHED_DURATION_MILLIS = 888L;
56 
57   @Rule
58   public final TextClassifierDownloadLoggerTestRule loggerTestRule =
59       new TextClassifierDownloadLoggerTestRule();
60 
61   @Test
downloadSucceeded()62   public void downloadSucceeded() throws Exception {
63     TextClassifierDownloadLogger.downloadSucceeded(
64         WORK_ID, MODEL_TYPE, URL, RUN_ATTEMPT_COUNT, DOWNLOAD_DURATION_MILLIS);
65 
66     TextClassifierDownloadReported atom =
67         Iterables.getOnlyElement(loggerTestRule.getLoggedDownloadReportedAtoms());
68     assertThat(atom.getWorkId()).isEqualTo(WORK_ID);
69     assertThat(atom.getDownloadStatus())
70         .isEqualTo(TextClassifierDownloadReported.DownloadStatus.SUCCEEDED);
71     assertThat(atom.getModelType()).isEqualTo(MODEL_TYPE_ATOM);
72     assertThat(atom.getUrlSuffix()).isEqualTo(URL);
73     assertThat(atom.getRunAttemptCount()).isEqualTo(RUN_ATTEMPT_COUNT);
74     assertThat(atom.getDownloadDurationMillis()).isEqualTo(DOWNLOAD_DURATION_MILLIS);
75   }
76 
77   @Test
downloadFailed()78   public void downloadFailed() throws Exception {
79     TextClassifierDownloadLogger.downloadFailed(
80         WORK_ID,
81         MODEL_TYPE,
82         URL,
83         ERROR_CODE,
84         RUN_ATTEMPT_COUNT,
85         DOWNLOADER_LIB_ERROR_CODE,
86         DOWNLOAD_DURATION_MILLIS);
87 
88     TextClassifierDownloadReported atom =
89         Iterables.getOnlyElement(loggerTestRule.getLoggedDownloadReportedAtoms());
90     assertThat(atom.getWorkId()).isEqualTo(WORK_ID);
91     assertThat(atom.getDownloadStatus())
92         .isEqualTo(TextClassifierDownloadReported.DownloadStatus.FAILED_AND_RETRY);
93     assertThat(atom.getModelType()).isEqualTo(MODEL_TYPE_ATOM);
94     assertThat(atom.getUrlSuffix()).isEqualTo(URL);
95     assertThat(atom.getRunAttemptCount()).isEqualTo(RUN_ATTEMPT_COUNT);
96     assertThat(atom.getFailureReason()).isEqualTo(FAILURE_REASON_ATOM);
97     assertThat(atom.getDownloaderLibFailureCode()).isEqualTo(DOWNLOADER_LIB_ERROR_CODE);
98     assertThat(atom.getDownloadDurationMillis()).isEqualTo(DOWNLOAD_DURATION_MILLIS);
99   }
100 
101   @Test
downloadWorkScheduled_succeeded()102   public void downloadWorkScheduled_succeeded() throws Exception {
103     TextClassifierDownloadLogger.downloadWorkScheduled(
104         WORK_ID, REASON_TO_SCHEDULE, /* failedToSchedule= */ false);
105 
106     TextClassifierDownloadWorkScheduled atom =
107         Iterables.getOnlyElement(loggerTestRule.getLoggedDownloadWorkScheduledAtoms());
108     assertThat(atom.getWorkId()).isEqualTo(WORK_ID);
109     assertThat(atom.getReasonToSchedule()).isEqualTo(REASON_TO_SCHEDULE_ATOM);
110     assertThat(atom.getFailedToSchedule()).isFalse();
111   }
112 
113   @Test
downloadWorkScheduled_failed()114   public void downloadWorkScheduled_failed() throws Exception {
115     TextClassifierDownloadLogger.downloadWorkScheduled(
116         WORK_ID, REASON_TO_SCHEDULE, /* failedToSchedule= */ true);
117 
118     TextClassifierDownloadWorkScheduled atom =
119         Iterables.getOnlyElement(loggerTestRule.getLoggedDownloadWorkScheduledAtoms());
120     assertThat(atom.getWorkId()).isEqualTo(WORK_ID);
121     assertThat(atom.getReasonToSchedule()).isEqualTo(REASON_TO_SCHEDULE_ATOM);
122     assertThat(atom.getFailedToSchedule()).isTrue();
123   }
124 
125   @Test
downloadWorkCompleted()126   public void downloadWorkCompleted() throws Exception {
127     TextClassifierDownloadLogger.downloadWorkCompleted(
128         WORK_ID,
129         WORK_RESULT,
130         RUN_ATTEMPT_COUNT,
131         SCHEDULED_TO_START_DURATION_MILLIS,
132         STARTED_TO_FINISHED_DURATION_MILLIS);
133 
134     TextClassifierDownloadWorkCompleted atom =
135         Iterables.getOnlyElement(loggerTestRule.getLoggedDownloadWorkCompletedAtoms());
136     assertThat(atom.getWorkId()).isEqualTo(WORK_ID);
137     assertThat(atom.getWorkResult()).isEqualTo(WORK_RESULT_ATOM);
138     assertThat(atom.getRunAttemptCount()).isEqualTo(RUN_ATTEMPT_COUNT);
139     assertThat(atom.getWorkScheduledToStartedDurationMillis())
140         .isEqualTo(SCHEDULED_TO_START_DURATION_MILLIS);
141     assertThat(atom.getWorkStartedToEndedDurationMillis())
142         .isEqualTo(STARTED_TO_FINISHED_DURATION_MILLIS);
143   }
144 }
145