1/* 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.SettingsLibRobolectricTestRunner; 32 33import org.junit.Before; 34import org.junit.Test; 35import org.junit.runner.RunWith; 36import org.mockito.ArgumentCaptor; 37import org.mockito.Captor; 38import org.mockito.Mock; 39import org.mockito.MockitoAnnotations; 40import org.robolectric.RuntimeEnvironment; 41import org.robolectric.util.ReflectionHelpers; 42 43import java.util.ArrayList; 44import java.util.List; 45 46@RunWith(SettingsLibRobolectricTestRunner.class) 47public class MetricsFeatureProviderTest { 48 private static int CATEGORY = 10; 49 private static boolean SUBTYPE_BOOLEAN = true; 50 private static int SUBTYPE_INTEGER = 1; 51 private static long ELAPSED_TIME = 1000; 52 53 @Mock private LogWriter mockLogWriter; 54 @Mock private VisibilityLoggerMixin mockVisibilityLogger; 55 56 private Context mContext; 57 private MetricsFeatureProvider mProvider; 58 59 @Captor 60 private ArgumentCaptor<Pair> mPairCaptor; 61 62 @Before 63 public void setUp() { 64 MockitoAnnotations.initMocks(this); 65 mContext = RuntimeEnvironment.application; 66 mProvider = new MetricsFeatureProvider(); 67 List<LogWriter> writers = new ArrayList<>(); 68 writers.add(mockLogWriter); 69 ReflectionHelpers.setField(mProvider, "mLoggerWriters", writers); 70 71 when(mockVisibilityLogger.elapsedTimeSinceVisible()).thenReturn(ELAPSED_TIME); 72 } 73 74 @Test 75 public void logDashboardStartIntent_intentEmpty_shouldNotLog() { 76 mProvider.logDashboardStartIntent(mContext, null /* intent */, 77 MetricsEvent.SETTINGS_GESTURES); 78 79 verifyNoMoreInteractions(mockLogWriter); 80 } 81 82 @Test 83 public void logDashboardStartIntent_intentHasNoComponent_shouldLog() { 84 final Intent intent = new Intent(Intent.ACTION_ASSIST); 85 86 mProvider.logDashboardStartIntent(mContext, intent, MetricsEvent.SETTINGS_GESTURES); 87 88 verify(mockLogWriter).action( 89 eq(mContext), 90 eq(MetricsEvent.ACTION_SETTINGS_TILE_CLICK), 91 anyString(), 92 eq(Pair.create(MetricsEvent.FIELD_CONTEXT, MetricsEvent.SETTINGS_GESTURES))); 93 } 94 95 @Test 96 public void logDashboardStartIntent_intentIsExternal_shouldLog() { 97 final Intent intent = new Intent().setComponent(new ComponentName("pkg", "cls")); 98 99 mProvider.logDashboardStartIntent(mContext, intent, MetricsEvent.SETTINGS_GESTURES); 100 101 verify(mockLogWriter).action( 102 eq(mContext), 103 eq(MetricsEvent.ACTION_SETTINGS_TILE_CLICK), 104 anyString(), 105 eq(Pair.create(MetricsEvent.FIELD_CONTEXT, MetricsEvent.SETTINGS_GESTURES))); 106 } 107 108 @Test 109 public void action_BooleanLogsElapsedTime() { 110 mProvider.action(mockVisibilityLogger, CATEGORY, SUBTYPE_BOOLEAN); 111 verify(mockLogWriter).action(eq(CATEGORY), eq(SUBTYPE_BOOLEAN), mPairCaptor.capture()); 112 113 Pair value = mPairCaptor.getValue(); 114 assertThat(value.first instanceof Integer).isTrue(); 115 assertThat((int) value.first).isEqualTo(MetricsEvent.NOTIFICATION_SINCE_VISIBLE_MILLIS); 116 assertThat(value.second).isEqualTo(ELAPSED_TIME); 117 } 118 119 @Test 120 public void action_IntegerLogsElapsedTime() { 121 mProvider.action(mockVisibilityLogger, CATEGORY, SUBTYPE_INTEGER); 122 verify(mockLogWriter).action(eq(CATEGORY), eq(SUBTYPE_INTEGER), mPairCaptor.capture()); 123 124 Pair value = mPairCaptor.getValue(); 125 assertThat(value.first instanceof Integer).isTrue(); 126 assertThat((int) value.first).isEqualTo(MetricsEvent.NOTIFICATION_SINCE_VISIBLE_MILLIS); 127 assertThat(value.second).isEqualTo(ELAPSED_TIME); 128 } 129} 130