/* * Copyright (C) 2017 The Android Open Source Project * * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file * except in compliance with the License. You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software distributed under the * License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY * KIND, either express or implied. See the License for the specific language governing * permissions and limitations under the License. */ package com.android.systemui.qs.tileimpl; import static com.android.internal.logging.nano.MetricsProto.MetricsEvent.ACTION_QS_CLICK; import static com.android.internal.logging.nano.MetricsProto.MetricsEvent.ACTION_QS_LONG_PRESS; import static com.android.internal.logging.nano.MetricsProto.MetricsEvent.ACTION_QS_SECONDARY_CLICK; import static com.android.internal.logging.nano.MetricsProto.MetricsEvent.FIELD_QS_POSITION; import static com.android.internal.logging.nano.MetricsProto.MetricsEvent.FIELD_QS_VALUE; import static com.android.internal.logging.nano.MetricsProto.MetricsEvent.TYPE_ACTION; import static org.mockito.ArgumentMatchers.anyInt; import static org.mockito.ArgumentMatchers.eq; import static org.mockito.Matchers.argThat; import static org.mockito.Mockito.mock; import static org.mockito.Mockito.verify; import static org.mockito.Mockito.when; import android.content.Intent; import android.metrics.LogMaker; import android.support.test.filters.SmallTest; import android.testing.AndroidTestingRunner; import android.testing.TestableLooper; import android.testing.TestableLooper.RunWithLooper; import com.android.internal.logging.MetricsLogger; import com.android.systemui.Dependency; import com.android.systemui.SysuiTestCase; import com.android.systemui.plugins.qs.QSTile; import com.android.systemui.qs.QSHost; import com.android.systemui.qs.QSTileHost; import org.junit.Before; import org.junit.Test; import org.junit.runner.RunWith; import org.mockito.ArgumentMatcher; @RunWith(AndroidTestingRunner.class) @RunWithLooper @SmallTest public class QSTileImplTest extends SysuiTestCase { public static final int POSITION = 14; private TestableLooper mTestableLooper; private TileImpl mTile; private QSTileHost mHost; private MetricsLogger mMetricsLogger; @Before public void setup() throws Exception { String spec = "spec"; mTestableLooper = TestableLooper.get(this); mDependency.injectTestDependency(Dependency.BG_LOOPER, mTestableLooper.getLooper()); mMetricsLogger = mDependency.injectMockDependency(MetricsLogger.class); mHost = mock(QSTileHost.class); when(mHost.indexOf(spec)).thenReturn(POSITION); mTestableLooper.runWithLooper(() -> { mTile = new TileImpl(mHost); mTile.setTileSpec(spec); }); } @Test public void testClick_Metrics() { mTile.click(); verify(mMetricsLogger).write(argThat(new TileLogMatcher(ACTION_QS_CLICK))); } @Test public void testSecondaryClick_Metrics() { mTile.secondaryClick(); verify(mMetricsLogger).write(argThat(new TileLogMatcher(ACTION_QS_SECONDARY_CLICK))); } @Test public void testLongClick_Metrics() { mTile.longClick(); verify(mMetricsLogger).write(argThat(new TileLogMatcher(ACTION_QS_LONG_PRESS))); } @Test public void testPopulate() { LogMaker maker = mock(LogMaker.class); when(maker.setSubtype(anyInt())).thenReturn(maker); mTile.getState().value = true; mTile.populate(maker); verify(maker).addTaggedData(eq(FIELD_QS_VALUE), eq(1)); verify(maker).addTaggedData(eq(FIELD_QS_POSITION), eq(POSITION)); } private class TileLogMatcher implements ArgumentMatcher { private final int mCategory; public String mInvalid; public TileLogMatcher(int category) { mCategory = category; } @Override public boolean matches(LogMaker arg) { if (arg.getCategory() != mCategory) { mInvalid = "Expected category " + mCategory + " but was " + arg.getCategory(); return false; } if (arg.getType() != TYPE_ACTION) { mInvalid = "Expected type " + TYPE_ACTION + " but was " + arg.getType(); return false; } if (arg.getSubtype() != mTile.getMetricsCategory()) { mInvalid = "Expected subtype " + mTile.getMetricsCategory() + " but was " + arg.getSubtype(); return false; } return true; } @Override public String toString() { return mInvalid; } } private static class TileImpl extends QSTileImpl { protected TileImpl(QSHost host) { super(host); } @Override public BooleanState newTileState() { return new BooleanState(); } @Override protected void handleClick() { } @Override protected void handleUpdateState(BooleanState state, Object arg) { } @Override public int getMetricsCategory() { return 42; } @Override public Intent getLongClickIntent() { return null; } @Override protected void setListening(boolean listening) { } @Override public CharSequence getTileLabel() { return null; } } }