blob: ed0857ca21dc183fbafadd825aebf16b9843fbad [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
Fan Zhang99d042d2018-11-12 00:57:37 -080018import static com.google.common.truth.Truth.assertThat;
19
Leif Wilden5eb77482018-01-23 23:54:05 +000020import static org.mockito.Mockito.verify;
21import static org.mockito.Mockito.verifyNoMoreInteractions;
Leif Wilden5eb77482018-01-23 23:54:05 +000022
Fan Zhang99d042d2018-11-12 00:57:37 -080023import android.app.Activity;
24import android.app.settings.SettingsEnums;
Leif Wilden5eb77482018-01-23 23:54:05 +000025import android.content.ComponentName;
26import android.content.Context;
27import android.content.Intent;
Leif Wilden5eb77482018-01-23 23:54:05 +000028
Jason Chiu4f6a1c02019-12-12 17:31:32 +080029import androidx.preference.Preference;
30
Leif Wilden5eb77482018-01-23 23:54:05 +000031import com.android.internal.logging.nano.MetricsProto.MetricsEvent;
Leif Wilden5eb77482018-01-23 23:54:05 +000032
33import org.junit.Before;
34import org.junit.Test;
35import org.junit.runner.RunWith;
Leif Wilden5eb77482018-01-23 23:54:05 +000036import org.mockito.Mock;
37import org.mockito.MockitoAnnotations;
Fan Zhang99d042d2018-11-12 00:57:37 -080038import org.robolectric.Robolectric;
James Lemieuxec3ad9e2018-11-28 17:49:14 -080039import org.robolectric.RobolectricTestRunner;
Leif Wilden5eb77482018-01-23 23:54:05 +000040import org.robolectric.RuntimeEnvironment;
Leif Wilden5eb77482018-01-23 23:54:05 +000041import org.robolectric.util.ReflectionHelpers;
42
43import java.util.ArrayList;
44import java.util.List;
45
James Lemieuxec3ad9e2018-11-28 17:49:14 -080046@RunWith(RobolectricTestRunner.class)
Leif Wilden5eb77482018-01-23 23:54:05 +000047public class MetricsFeatureProviderTest {
Fan Zhang793cbdd2018-10-23 13:20:57 -070048 @Mock
49 private LogWriter mLogWriter;
Leif Wilden5eb77482018-01-23 23:54:05 +000050
51 private Context mContext;
52 private MetricsFeatureProvider mProvider;
53
Leif Wilden5eb77482018-01-23 23:54:05 +000054 @Before
55 public void setUp() {
56 MockitoAnnotations.initMocks(this);
57 mContext = RuntimeEnvironment.application;
58 mProvider = new MetricsFeatureProvider();
59 List<LogWriter> writers = new ArrayList<>();
Fan Zhang793cbdd2018-10-23 13:20:57 -070060 writers.add(mLogWriter);
Leif Wilden5eb77482018-01-23 23:54:05 +000061 ReflectionHelpers.setField(mProvider, "mLoggerWriters", writers);
Leif Wilden5eb77482018-01-23 23:54:05 +000062 }
63
64 @Test
Jason Chiu4f6a1c02019-12-12 17:31:32 +080065 public void logClickedPreference_preferenceEmpty_shouldNotLog() {
66 final boolean loggable = mProvider.logClickedPreference(null /* preference */,
Leif Wilden5eb77482018-01-23 23:54:05 +000067 MetricsEvent.SETTINGS_GESTURES);
68
Jason Chiu4f6a1c02019-12-12 17:31:32 +080069 assertThat(loggable).isFalse();
Fan Zhang793cbdd2018-10-23 13:20:57 -070070 verifyNoMoreInteractions(mLogWriter);
Leif Wilden5eb77482018-01-23 23:54:05 +000071 }
72
73 @Test
Jason Chiu4f6a1c02019-12-12 17:31:32 +080074 public void logClickedPreference_preferenceHasKey_shouldLog() {
75 final String key = "abc";
76 final Preference preference = new Preference(mContext);
77 preference.setKey(key);
78
79 final boolean loggable = mProvider.logClickedPreference(preference,
80 MetricsEvent.SETTINGS_GESTURES);
81
82 assertThat(loggable).isTrue();
83 verify(mLogWriter).action(
84 MetricsEvent.SETTINGS_GESTURES,
85 MetricsEvent.ACTION_SETTINGS_TILE_CLICK,
86 SettingsEnums.PAGE_UNKNOWN,
87 key,
88 0);
89 }
90
91 @Test
92 public void logClickedPreference_preferenceHasIntent_shouldLog() {
93 final Preference preference = new Preference(mContext);
Leif Wilden5eb77482018-01-23 23:54:05 +000094 final Intent intent = new Intent(Intent.ACTION_ASSIST);
Jason Chiu4f6a1c02019-12-12 17:31:32 +080095 preference.setIntent(intent);
Leif Wilden5eb77482018-01-23 23:54:05 +000096
Jason Chiu4f6a1c02019-12-12 17:31:32 +080097 final boolean loggable = mProvider.logClickedPreference(preference,
98 MetricsEvent.SETTINGS_GESTURES);
Leif Wilden5eb77482018-01-23 23:54:05 +000099
Jason Chiu4f6a1c02019-12-12 17:31:32 +0800100 assertThat(loggable).isTrue();
Fan Zhang793cbdd2018-10-23 13:20:57 -0700101 verify(mLogWriter).action(
Fan Zhangf63a61d2018-11-12 23:34:32 -0800102 MetricsEvent.SETTINGS_GESTURES,
103 MetricsEvent.ACTION_SETTINGS_TILE_CLICK,
104 SettingsEnums.PAGE_UNKNOWN,
105 Intent.ACTION_ASSIST,
106 0);
Leif Wilden5eb77482018-01-23 23:54:05 +0000107 }
108
109 @Test
Jason Chiu4f6a1c02019-12-12 17:31:32 +0800110 public void logClickedPreference_preferenceHasFragment_shouldLog() {
111 final Preference preference = new Preference(mContext);
112 final String fragment = "com.android.settings.tts.TextToSpeechSettings";
113 preference.setFragment(fragment);
114
115 final boolean loggable = mProvider.logClickedPreference(preference,
116 MetricsEvent.SETTINGS_GESTURES);
117
118 assertThat(loggable).isTrue();
119 verify(mLogWriter).action(
120 MetricsEvent.SETTINGS_GESTURES,
121 MetricsEvent.ACTION_SETTINGS_TILE_CLICK,
122 SettingsEnums.PAGE_UNKNOWN,
123 fragment,
124 0);
125 }
126
127 @Test
128 public void logStartedIntent_intentEmpty_shouldNotLog() {
129 final boolean loggable = mProvider.logStartedIntent(null /* intent */,
130 MetricsEvent.SETTINGS_GESTURES);
131
132 assertThat(loggable).isFalse();
133 verifyNoMoreInteractions(mLogWriter);
134 }
135
136 @Test
137 public void logStartedIntent_intentHasNoComponent_shouldLog() {
138 final Intent intent = new Intent(Intent.ACTION_ASSIST);
139
140 final boolean loggable = mProvider.logStartedIntent(intent, MetricsEvent.SETTINGS_GESTURES);
141
142 assertThat(loggable).isTrue();
143 verify(mLogWriter).action(
144 MetricsEvent.SETTINGS_GESTURES,
145 MetricsEvent.ACTION_SETTINGS_TILE_CLICK,
146 SettingsEnums.PAGE_UNKNOWN,
147 Intent.ACTION_ASSIST,
148 0);
149 }
150
151 @Test
152 public void logStartedIntent_intentIsExternal_shouldLog() {
Leif Wilden5eb77482018-01-23 23:54:05 +0000153 final Intent intent = new Intent().setComponent(new ComponentName("pkg", "cls"));
154
Jason Chiu4f6a1c02019-12-12 17:31:32 +0800155 final boolean loggable = mProvider.logStartedIntent(intent, MetricsEvent.SETTINGS_GESTURES);
Leif Wilden5eb77482018-01-23 23:54:05 +0000156
Jason Chiu4f6a1c02019-12-12 17:31:32 +0800157 assertThat(loggable).isTrue();
Fan Zhang793cbdd2018-10-23 13:20:57 -0700158 verify(mLogWriter).action(
Fan Zhangf63a61d2018-11-12 23:34:32 -0800159 MetricsEvent.SETTINGS_GESTURES,
160 MetricsEvent.ACTION_SETTINGS_TILE_CLICK,
161 SettingsEnums.PAGE_UNKNOWN,
162 "pkg/cls",
163 0);
Leif Wilden5eb77482018-01-23 23:54:05 +0000164 }
Fan Zhang99d042d2018-11-12 00:57:37 -0800165
166 @Test
167 public void getAttribution_noActivity_shouldReturnUnknown() {
168 assertThat(mProvider.getAttribution(null /* activity */))
169 .isEqualTo(SettingsEnums.PAGE_UNKNOWN);
170 }
171
172 @Test
173 public void getAttribution_notSet_shouldReturnUnknown() {
174 final Activity activity = Robolectric.setupActivity(Activity.class);
175
176 assertThat(mProvider.getAttribution(activity))
177 .isEqualTo(SettingsEnums.PAGE_UNKNOWN);
178 }
179
180 @Test
181 public void getAttribution_set_shouldReturnAttribution() {
182 final Intent intent = new Intent()
183 .putExtra(MetricsFeatureProvider.EXTRA_SOURCE_METRICS_CATEGORY, 100);
184
185 final Activity activity = Robolectric.buildActivity(Activity.class, intent).create().get();
186
187 assertThat(mProvider.getAttribution(activity)).isEqualTo(100);
188 }
Leif Wilden5eb77482018-01-23 23:54:05 +0000189}