1/*
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
18import android.content.ComponentName;
19import android.os.Handler;
20import android.os.HandlerThread;
21import android.support.test.runner.AndroidJUnit4;
22import android.test.suitebuilder.annotation.SmallTest;
23import com.android.systemui.SysuiTestCase;
24import org.junit.After;
25import org.junit.Before;
26import org.junit.Test;
27import org.junit.runner.RunWith;
28import org.mockito.ArgumentCaptor;
29import org.mockito.Mockito;
30
31import static junit.framework.Assert.assertEquals;
32import static junit.framework.Assert.assertFalse;
33import static junit.framework.Assert.assertTrue;
34
35@SmallTest
36@RunWith(AndroidJUnit4.class)
37public class TileServiceManagerTest extends SysuiTestCase {
38
39    private TileServices mTileServices;
40    private TileLifecycleManager mTileLifecycle;
41    private HandlerThread mThread;
42    private Handler mHandler;
43    private TileServiceManager mTileServiceManager;
44
45    @Before
46    public void setUp() throws Exception {
47        mThread = new HandlerThread("TestThread");
48        mThread.start();
49        mHandler = new Handler(mThread.getLooper());
50        mTileServices = Mockito.mock(TileServices.class);
51        Mockito.when(mTileServices.getContext()).thenReturn(mContext);
52        mTileLifecycle = Mockito.mock(TileLifecycleManager.class);
53        Mockito.when(mTileLifecycle.isActiveTile()).thenReturn(false);
54        ComponentName componentName = new ComponentName(mContext,
55                TileServiceManagerTest.class);
56        Mockito.when(mTileLifecycle.getComponent()).thenReturn(componentName);
57        mTileServiceManager = new TileServiceManager(mTileServices, mHandler, mTileLifecycle);
58    }
59
60    @After
61    public void tearDown() throws Exception {
62        mThread.quit();
63    }
64
65    @Test
66    public void testSetBindRequested() {
67        // Request binding.
68        mTileServiceManager.setBindRequested(true);
69        mTileServiceManager.setLastUpdate(0);
70        mTileServiceManager.calculateBindPriority(5);
71        Mockito.verify(mTileServices, Mockito.times(2)).recalculateBindAllowance();
72        assertEquals(5, mTileServiceManager.getBindPriority());
73
74        // Verify same state doesn't trigger recalculating for no reason.
75        mTileServiceManager.setBindRequested(true);
76        Mockito.verify(mTileServices, Mockito.times(2)).recalculateBindAllowance();
77
78        mTileServiceManager.setBindRequested(false);
79        mTileServiceManager.calculateBindPriority(5);
80        Mockito.verify(mTileServices, Mockito.times(3)).recalculateBindAllowance();
81        assertEquals(Integer.MIN_VALUE, mTileServiceManager.getBindPriority());
82    }
83
84    @Test
85    public void testPendingClickPriority() {
86        Mockito.when(mTileLifecycle.hasPendingClick()).thenReturn(true);
87        mTileServiceManager.calculateBindPriority(0);
88        assertEquals(Integer.MAX_VALUE, mTileServiceManager.getBindPriority());
89    }
90
91    @Test
92    public void testBind() {
93        // Trigger binding requested and allowed.
94        mTileServiceManager.setBindRequested(true);
95        mTileServiceManager.setBindAllowed(true);
96
97        ArgumentCaptor<Boolean> captor = ArgumentCaptor.forClass(Boolean.class);
98        Mockito.verify(mTileLifecycle, Mockito.times(1)).setBindService(captor.capture());
99        assertTrue((boolean) captor.getValue());
100
101        mTileServiceManager.setBindRequested(false);
102        mTileServiceManager.calculateBindPriority(0);
103        // Priority shouldn't disappear after the request goes away if we just bound, instead
104        // it sticks around to avoid thrashing a bunch of processes.
105        assertEquals(Integer.MAX_VALUE - 2, mTileServiceManager.getBindPriority());
106
107        mTileServiceManager.setBindAllowed(false);
108        captor = ArgumentCaptor.forClass(Boolean.class);
109        Mockito.verify(mTileLifecycle, Mockito.times(2)).setBindService(captor.capture());
110        assertFalse((boolean) captor.getValue());
111    }
112}
113