blob: 8bea51d1696ddafce0914c32d1c852142db8e00f [file] [log] [blame]
Leif Wilden5eb77482018-01-23 23:54:05 +00001/*
2 * Copyright (C) 2016 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 */
16package com.android.settingslib.core.instrumentation;
17
18import static com.google.common.truth.Truth.assertThat;
19import static org.mockito.Matchers.anyString;
20import static org.mockito.Matchers.eq;
21import static org.mockito.Mockito.verify;
22import static org.mockito.Mockito.verifyNoMoreInteractions;
23import static org.mockito.Mockito.when;
24
25import android.content.ComponentName;
26import android.content.Context;
27import android.content.Intent;
28import android.util.Pair;
29
30import com.android.internal.logging.nano.MetricsProto.MetricsEvent;
31import com.android.settingslib.TestConfig;
32import com.android.settingslib.SettingsLibRobolectricTestRunner;
33
34import org.junit.Before;
35import org.junit.Test;
36import org.junit.runner.RunWith;
37import org.mockito.ArgumentCaptor;
38import org.mockito.Captor;
39import org.mockito.Mock;
40import org.mockito.MockitoAnnotations;
41import org.robolectric.RuntimeEnvironment;
42import org.robolectric.annotation.Config;
43import org.robolectric.util.ReflectionHelpers;
44
45import java.util.ArrayList;
46import java.util.List;
47
48@RunWith(SettingsLibRobolectricTestRunner.class)
49@Config(manifest = TestConfig.MANIFEST_PATH, sdk = TestConfig.SDK_VERSION)
50public class MetricsFeatureProviderTest {
51 private static int CATEGORY = 10;
52 private static boolean SUBTYPE_BOOLEAN = true;
53 private static int SUBTYPE_INTEGER = 1;
54 private static long ELAPSED_TIME = 1000;
55
56 @Mock private LogWriter mockLogWriter;
57 @Mock private VisibilityLoggerMixin mockVisibilityLogger;
58
59 private Context mContext;
60 private MetricsFeatureProvider mProvider;
61
62 @Captor
63 private ArgumentCaptor<Pair> mPairCaptor;
64
65 @Before
66 public void setUp() {
67 MockitoAnnotations.initMocks(this);
68 mContext = RuntimeEnvironment.application;
69 mProvider = new MetricsFeatureProvider();
70 List<LogWriter> writers = new ArrayList<>();
71 writers.add(mockLogWriter);
72 ReflectionHelpers.setField(mProvider, "mLoggerWriters", writers);
73
74 when(mockVisibilityLogger.elapsedTimeSinceVisible()).thenReturn(ELAPSED_TIME);
75 }
76
77 @Test
78 public void logDashboardStartIntent_intentEmpty_shouldNotLog() {
79 mProvider.logDashboardStartIntent(mContext, null /* intent */,
80 MetricsEvent.SETTINGS_GESTURES);
81
82 verifyNoMoreInteractions(mockLogWriter);
83 }
84
85 @Test
86 public void logDashboardStartIntent_intentHasNoComponent_shouldLog() {
87 final Intent intent = new Intent(Intent.ACTION_ASSIST);
88
89 mProvider.logDashboardStartIntent(mContext, intent, MetricsEvent.SETTINGS_GESTURES);
90
91 verify(mockLogWriter).action(
92 eq(mContext),
93 eq(MetricsEvent.ACTION_SETTINGS_TILE_CLICK),
94 anyString(),
95 eq(Pair.create(MetricsEvent.FIELD_CONTEXT, MetricsEvent.SETTINGS_GESTURES)));
96 }
97
98 @Test
99 public void logDashboardStartIntent_intentIsExternal_shouldLog() {
100 final Intent intent = new Intent().setComponent(new ComponentName("pkg", "cls"));
101
102 mProvider.logDashboardStartIntent(mContext, intent, MetricsEvent.SETTINGS_GESTURES);
103
104 verify(mockLogWriter).action(
105 eq(mContext),
106 eq(MetricsEvent.ACTION_SETTINGS_TILE_CLICK),
107 anyString(),
108 eq(Pair.create(MetricsEvent.FIELD_CONTEXT, MetricsEvent.SETTINGS_GESTURES)));
109 }
110
111 @Test
112 public void action_BooleanLogsElapsedTime() {
113 mProvider.action(mockVisibilityLogger, CATEGORY, SUBTYPE_BOOLEAN);
114 verify(mockLogWriter).action(eq(CATEGORY), eq(SUBTYPE_BOOLEAN), mPairCaptor.capture());
115
116 Pair value = mPairCaptor.getValue();
117 assertThat(value.first instanceof Integer).isTrue();
118 assertThat((int) value.first).isEqualTo(MetricsEvent.NOTIFICATION_SINCE_VISIBLE_MILLIS);
119 assertThat(value.second).isEqualTo(ELAPSED_TIME);
120 }
121
122 @Test
123 public void action_IntegerLogsElapsedTime() {
124 mProvider.action(mockVisibilityLogger, CATEGORY, SUBTYPE_INTEGER);
125 verify(mockLogWriter).action(eq(CATEGORY), eq(SUBTYPE_INTEGER), mPairCaptor.capture());
126
127 Pair value = mPairCaptor.getValue();
128 assertThat(value.first instanceof Integer).isTrue();
129 assertThat((int) value.first).isEqualTo(MetricsEvent.NOTIFICATION_SINCE_VISIBLE_MILLIS);
130 assertThat(value.second).isEqualTo(ELAPSED_TIME);
131 }
132}