blob: d823981133f33c5548c4d64425c4c09d608750cc [file] [log] [blame]
Jason Monk8c09ac72017-03-16 11:53:40 -04001/*
2 * Copyright (C) 2017 The Android Open Source Project
3 *
4 * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file
5 * except in compliance with the License. You may obtain a copy of the License at
6 *
7 * http://www.apache.org/licenses/LICENSE-2.0
8 *
9 * Unless required by applicable law or agreed to in writing, software distributed under the
10 * License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
11 * KIND, either express or implied. See the License for the specific language governing
12 * permissions and limitations under the License.
13 */
14
15package com.android.systemui.qs.tileimpl;
16
17import static com.android.internal.logging.nano.MetricsProto.MetricsEvent.ACTION_QS_CLICK;
18import static com.android.internal.logging.nano.MetricsProto.MetricsEvent.ACTION_QS_LONG_PRESS;
19import static com.android.internal.logging.nano.MetricsProto.MetricsEvent.ACTION_QS_SECONDARY_CLICK;
20import static com.android.internal.logging.nano.MetricsProto.MetricsEvent.FIELD_QS_POSITION;
21import static com.android.internal.logging.nano.MetricsProto.MetricsEvent.FIELD_QS_VALUE;
22import static com.android.internal.logging.nano.MetricsProto.MetricsEvent.TYPE_ACTION;
23
Jason Monk2ef8ed62017-09-07 14:51:41 -040024import static org.mockito.ArgumentMatchers.any;
Jason Monk8c09ac72017-03-16 11:53:40 -040025import static org.mockito.ArgumentMatchers.anyInt;
26import static org.mockito.ArgumentMatchers.eq;
27import static org.mockito.Matchers.argThat;
28import static org.mockito.Mockito.mock;
29import static org.mockito.Mockito.verify;
30import static org.mockito.Mockito.when;
31
32import android.content.Intent;
33import android.metrics.LogMaker;
Jason Monkfba8faf2017-05-23 10:42:59 -040034import android.support.test.filters.SmallTest;
Jason Monk8c09ac72017-03-16 11:53:40 -040035import android.testing.AndroidTestingRunner;
36import android.testing.TestableLooper;
37import android.testing.TestableLooper.RunWithLooper;
38
39import com.android.internal.logging.MetricsLogger;
40import com.android.systemui.Dependency;
41import com.android.systemui.SysuiTestCase;
42import com.android.systemui.plugins.qs.QSTile;
43import com.android.systemui.qs.QSHost;
44import com.android.systemui.qs.QSTileHost;
45
46import org.junit.Before;
47import org.junit.Test;
48import org.junit.runner.RunWith;
49import org.mockito.ArgumentMatcher;
50
51@RunWith(AndroidTestingRunner.class)
52@RunWithLooper
Jason Monkfba8faf2017-05-23 10:42:59 -040053@SmallTest
Jason Monk8c09ac72017-03-16 11:53:40 -040054public class QSTileImplTest extends SysuiTestCase {
55
56 public static final int POSITION = 14;
57 private TestableLooper mTestableLooper;
58 private TileImpl mTile;
59 private QSTileHost mHost;
60 private MetricsLogger mMetricsLogger;
61
62 @Before
63 public void setup() throws Exception {
64 String spec = "spec";
65 mTestableLooper = TestableLooper.get(this);
66 mDependency.injectTestDependency(Dependency.BG_LOOPER, mTestableLooper.getLooper());
67 mMetricsLogger = mDependency.injectMockDependency(MetricsLogger.class);
68 mHost = mock(QSTileHost.class);
69 when(mHost.indexOf(spec)).thenReturn(POSITION);
70 mTestableLooper.runWithLooper(() -> {
71 mTile = new TileImpl(mHost);
72 mTile.setTileSpec(spec);
73 });
74 }
75
76 @Test
77 public void testClick_Metrics() {
78 mTile.click();
79 verify(mMetricsLogger).write(argThat(new TileLogMatcher(ACTION_QS_CLICK)));
80 }
81
82 @Test
83 public void testSecondaryClick_Metrics() {
84 mTile.secondaryClick();
85 verify(mMetricsLogger).write(argThat(new TileLogMatcher(ACTION_QS_SECONDARY_CLICK)));
86 }
87
88 @Test
89 public void testLongClick_Metrics() {
90 mTile.longClick();
91 verify(mMetricsLogger).write(argThat(new TileLogMatcher(ACTION_QS_LONG_PRESS)));
92 }
93
94 @Test
95 public void testPopulate() {
96 LogMaker maker = mock(LogMaker.class);
97 when(maker.setSubtype(anyInt())).thenReturn(maker);
Jason Monk2ef8ed62017-09-07 14:51:41 -040098 when(maker.addTaggedData(anyInt(), any())).thenReturn(maker);
Jason Monk8c09ac72017-03-16 11:53:40 -040099 mTile.getState().value = true;
100 mTile.populate(maker);
101 verify(maker).addTaggedData(eq(FIELD_QS_VALUE), eq(1));
102 verify(maker).addTaggedData(eq(FIELD_QS_POSITION), eq(POSITION));
103 }
104
105 private class TileLogMatcher implements ArgumentMatcher<LogMaker> {
106
107 private final int mCategory;
108 public String mInvalid;
109
110 public TileLogMatcher(int category) {
111 mCategory = category;
112 }
113
114 @Override
115 public boolean matches(LogMaker arg) {
116 if (arg.getCategory() != mCategory) {
117 mInvalid = "Expected category " + mCategory + " but was " + arg.getCategory();
118 return false;
119 }
120 if (arg.getType() != TYPE_ACTION) {
121 mInvalid = "Expected type " + TYPE_ACTION + " but was " + arg.getType();
122 return false;
123 }
124 if (arg.getSubtype() != mTile.getMetricsCategory()) {
125 mInvalid = "Expected subtype " + mTile.getMetricsCategory() + " but was "
126 + arg.getSubtype();
127 return false;
128 }
129 return true;
130 }
131
132 @Override
133 public String toString() {
134 return mInvalid;
135 }
136 }
137
138 private static class TileImpl extends QSTileImpl<QSTile.BooleanState> {
139 protected TileImpl(QSHost host) {
140 super(host);
141 }
142
143 @Override
144 public BooleanState newTileState() {
145 return new BooleanState();
146 }
147
148 @Override
149 protected void handleClick() {
150
151 }
152
153 @Override
154 protected void handleUpdateState(BooleanState state, Object arg) {
155
156 }
157
158 @Override
159 public int getMetricsCategory() {
160 return 42;
161 }
162
163 @Override
164 public Intent getLongClickIntent() {
165 return null;
166 }
167
168 @Override
169 protected void setListening(boolean listening) {
170
171 }
172
173 @Override
174 public CharSequence getTileLabel() {
175 return null;
176 }
177 }
178}