blob: 824c50dc82bb498071831d88aba4256fea986aa5 [file] [log] [blame]
Jason Monkd5a204f2015-12-21 08:50:01 -05001/*
2 * Copyright (C) 2015 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.systemui.qs.external;
17
Geoffrey Pitsch2c403db2016-08-26 09:09:39 -040018import static junit.framework.Assert.assertEquals;
19import static junit.framework.Assert.assertTrue;
20
Jason Monk4cfd8c72017-02-15 13:52:47 -050021import static org.mockito.Mockito.mock;
Fabian Kozynskie6395dd2019-05-02 13:16:02 -040022import static org.mockito.Mockito.when;
Jason Monk4cfd8c72017-02-15 13:52:47 -050023
Jason Monkd5a204f2015-12-21 08:50:01 -050024import android.content.ComponentName;
Jason Monk5d577202018-12-26 15:43:06 -050025import android.os.Handler;
Jason Monkd5a204f2015-12-21 08:50:01 -050026import android.os.Looper;
Jason Monka3453b8b2016-06-17 12:42:59 -040027import android.service.quicksettings.Tile;
Jason Monk0c6e0992016-03-29 15:49:02 -040028import android.test.suitebuilder.annotation.SmallTest;
Jason Monk340b0e52017-03-08 14:57:56 -050029import android.testing.AndroidTestingRunner;
Jason Monka716bac2018-12-05 15:48:21 -050030import android.testing.TestableLooper;
31import android.testing.TestableLooper.RunWithLooper;
32
Fabian Kozynski00d494d2019-04-04 09:53:50 -040033import com.android.systemui.DumpController;
Jason Monkd5a204f2015-12-21 08:50:01 -050034import com.android.systemui.SysuiTestCase;
Fabian Kozynski5ca7a512019-10-16 19:56:11 +000035import com.android.systemui.broadcast.BroadcastDispatcher;
Jason Monke5b770e2017-03-03 21:49:29 -050036import com.android.systemui.qs.QSTileHost;
Jason Monk5d577202018-12-26 15:43:06 -050037import com.android.systemui.qs.tileimpl.QSFactoryImpl;
Jason Monk30b64fa2018-12-27 13:19:34 -050038import com.android.systemui.shared.plugins.PluginManager;
Jason Monka26641f2018-12-27 14:20:53 -050039import com.android.systemui.statusbar.phone.AutoTileManager;
Jason Monk4cfd8c72017-02-15 13:52:47 -050040import com.android.systemui.statusbar.phone.StatusBarIconController;
Jason Monkb05395f2017-07-11 10:05:03 -040041import com.android.systemui.statusbar.policy.BluetoothController;
Jason Monk30b64fa2018-12-27 13:19:34 -050042import com.android.systemui.tuner.TunerService;
Jason Monkb05395f2017-07-11 10:05:03 -040043
Jason Monk4cfd8c72017-02-15 13:52:47 -050044import org.junit.After;
Geoffrey Pitsch2c403db2016-08-26 09:09:39 -040045import org.junit.Before;
46import org.junit.Test;
47import org.junit.runner.RunWith;
Jason Monkd5a204f2015-12-21 08:50:01 -050048import org.mockito.ArgumentCaptor;
Fabian Kozynski5ca7a512019-10-16 19:56:11 +000049import org.mockito.Mock;
Jason Monkd5a204f2015-12-21 08:50:01 -050050import org.mockito.Mockito;
Fabian Kozynski5ca7a512019-10-16 19:56:11 +000051import org.mockito.MockitoAnnotations;
Jason Monkd5a204f2015-12-21 08:50:01 -050052
Jason Monk4cfd8c72017-02-15 13:52:47 -050053import java.util.ArrayList;
54
Jason Monk0c6e0992016-03-29 15:49:02 -040055@SmallTest
Jason Monk340b0e52017-03-08 14:57:56 -050056@RunWith(AndroidTestingRunner.class)
Jason Monka716bac2018-12-05 15:48:21 -050057@RunWithLooper
Geoffrey Pitschfc2b64e2016-09-02 09:05:25 -040058public class TileServicesTest extends SysuiTestCase {
Jason Monkd5a204f2015-12-21 08:50:01 -050059 private static int NUM_FAKES = TileServices.DEFAULT_MAX_BOUND * 2;
60
61 private TileServices mTileService;
62 private ArrayList<TileServiceManager> mManagers;
Fabian Kozynski5ca7a512019-10-16 19:56:11 +000063 @Mock
64 private BroadcastDispatcher mBroadcastDispatcher;
65 @Mock
66 private StatusBarIconController mStatusBarIconController;
67 @Mock
68 private QSFactoryImpl mQSFactory;
69 @Mock
70 private PluginManager mPluginManager;
71 @Mock
72 private TunerService mTunerService;
73 @Mock
74 private AutoTileManager mAutoTileManager;
75 @Mock
76 private DumpController mDumpController;
Jason Monkd5a204f2015-12-21 08:50:01 -050077
Geoffrey Pitsch2c403db2016-08-26 09:09:39 -040078 @Before
79 public void setUp() throws Exception {
Fabian Kozynski5ca7a512019-10-16 19:56:11 +000080 MockitoAnnotations.initMocks(this);
Jason Monkb05395f2017-07-11 10:05:03 -040081 mDependency.injectMockDependency(BluetoothController.class);
Jason Monkd5a204f2015-12-21 08:50:01 -050082 mManagers = new ArrayList<>();
Jason Monk5d577202018-12-26 15:43:06 -050083 QSTileHost host = new QSTileHost(mContext,
Fabian Kozynski5ca7a512019-10-16 19:56:11 +000084 mStatusBarIconController,
85 mQSFactory,
Jason Monk30b64fa2018-12-27 13:19:34 -050086 new Handler(),
87 Looper.myLooper(),
Fabian Kozynski5ca7a512019-10-16 19:56:11 +000088 mPluginManager,
89 mTunerService,
90 () -> mAutoTileManager,
91 mDumpController,
92 mBroadcastDispatcher);
93 mTileService = new TestTileServices(host, Looper.getMainLooper(), mBroadcastDispatcher);
Jason Monkd5a204f2015-12-21 08:50:01 -050094 }
95
Jason Monk4cfd8c72017-02-15 13:52:47 -050096 @After
97 public void tearDown() throws Exception {
98 mTileService.getHost().destroy();
99 TestableLooper.get(this).processAllMessages();
100 }
101
Geoffrey Pitsch2c403db2016-08-26 09:09:39 -0400102 @Test
Jason Monkd5a204f2015-12-21 08:50:01 -0500103 public void testRecalculateBindAllowance() {
104 // Add some fake tiles.
105 for (int i = 0; i < NUM_FAKES; i++) {
Jason Monk4cfd8c72017-02-15 13:52:47 -0500106 mTileService.getTileWrapper(mock(CustomTile.class));
Jason Monkd5a204f2015-12-21 08:50:01 -0500107 }
108 assertEquals(NUM_FAKES, mManagers.size());
109
110 for (int i = 0; i < NUM_FAKES; i++) {
Fabian Kozynskie6395dd2019-05-02 13:16:02 -0400111 when(mManagers.get(i).getBindPriority()).thenReturn(i);
Jason Monkd5a204f2015-12-21 08:50:01 -0500112 }
113 mTileService.recalculateBindAllowance();
114 for (int i = 0; i < NUM_FAKES; i++) {
115 Mockito.verify(mManagers.get(i), Mockito.times(1)).calculateBindPriority(
116 Mockito.anyLong());
117 ArgumentCaptor<Boolean> captor = ArgumentCaptor.forClass(Boolean.class);
118 Mockito.verify(mManagers.get(i), Mockito.times(1)).setBindAllowed(captor.capture());
119
120 assertEquals("" + i + "th service", i >= (NUM_FAKES - TileServices.DEFAULT_MAX_BOUND),
121 (boolean) captor.getValue());
122 }
123 }
124
Geoffrey Pitsch2c403db2016-08-26 09:09:39 -0400125 @Test
Jason Monkd5a204f2015-12-21 08:50:01 -0500126 public void testSetMemoryPressure() {
127 testRecalculateBindAllowance();
128 mTileService.setMemoryPressure(true);
129
130 for (int i = 0; i < NUM_FAKES; i++) {
131 ArgumentCaptor<Boolean> captor = ArgumentCaptor.forClass(Boolean.class);
132 Mockito.verify(mManagers.get(i), Mockito.times(2)).setBindAllowed(captor.capture());
133
134 assertEquals("" + i + "th service", i >= (NUM_FAKES - TileServices.REDUCED_MAX_BOUND),
135 (boolean) captor.getValue());
136 }
137 }
138
Geoffrey Pitsch2c403db2016-08-26 09:09:39 -0400139 @Test
Jason Monkd5a204f2015-12-21 08:50:01 -0500140 public void testCalcFew() {
141 for (int i = 0; i < TileServices.DEFAULT_MAX_BOUND - 1; i++) {
Jason Monk4cfd8c72017-02-15 13:52:47 -0500142 mTileService.getTileWrapper(mock(CustomTile.class));
Jason Monkd5a204f2015-12-21 08:50:01 -0500143 }
144 mTileService.recalculateBindAllowance();
145
146 for (int i = 0; i < TileServices.DEFAULT_MAX_BOUND - 1; i++) {
147 // Shouldn't get bind prioirities calculated when there are less than the max services.
148 Mockito.verify(mManagers.get(i), Mockito.never()).calculateBindPriority(
149 Mockito.anyLong());
150
151 // All should be bound since there are less than the max services.
152 ArgumentCaptor<Boolean> captor = ArgumentCaptor.forClass(Boolean.class);
153 Mockito.verify(mManagers.get(i), Mockito.times(1)).setBindAllowed(captor.capture());
154
155 assertTrue(captor.getValue());
156 }
157 }
158
159 private class TestTileServices extends TileServices {
Fabian Kozynski5ca7a512019-10-16 19:56:11 +0000160 TestTileServices(QSTileHost host, Looper looper,
161 BroadcastDispatcher broadcastDispatcher) {
162 super(host, looper, broadcastDispatcher);
Jason Monkd5a204f2015-12-21 08:50:01 -0500163 }
164
165 @Override
Fabian Kozynski5ca7a512019-10-16 19:56:11 +0000166 protected TileServiceManager onCreateTileService(ComponentName component, Tile qsTile,
167 BroadcastDispatcher broadcastDispatcher) {
Jason Monk4cfd8c72017-02-15 13:52:47 -0500168 TileServiceManager manager = mock(TileServiceManager.class);
Jason Monkd5a204f2015-12-21 08:50:01 -0500169 mManagers.add(manager);
Fabian Kozynskie6395dd2019-05-02 13:16:02 -0400170 when(manager.isLifecycleStarted()).thenReturn(true);
Jason Monkd5a204f2015-12-21 08:50:01 -0500171 return manager;
172 }
173 }
174}