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