1 /*
2  * Copyright (C) 2020 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  */
16 
17 package com.android.systemui.dump
18 
19 import android.content.BroadcastReceiver
20 import android.content.IntentFilter
21 import android.os.UserHandle
22 import androidx.test.filters.SmallTest
23 import com.android.systemui.SysuiTestCase
24 import com.android.systemui.broadcast.BroadcastDispatcher
25 import com.android.systemui.util.concurrency.FakeExecutor
26 import com.android.systemui.util.mockito.any
27 import com.android.systemui.util.mockito.capture
28 import com.android.systemui.util.mockito.eq
29 import com.android.systemui.util.mockito.nullable
30 import com.android.systemui.util.time.FakeSystemClock
31 import org.junit.Before
32 import org.junit.Test
33 import org.mockito.ArgumentCaptor
34 import org.mockito.Captor
35 import org.mockito.Mock
36 import org.mockito.Mockito.anyInt
37 import org.mockito.Mockito.never
38 import org.mockito.Mockito.times
39 import org.mockito.Mockito.verify
40 import org.mockito.MockitoAnnotations
41 
42 @SmallTest
43 class LogBufferFreezerTest : SysuiTestCase() {
44 
45     lateinit var freezer: LogBufferFreezer
46     lateinit var receiver: BroadcastReceiver
47 
48     @Mock
49     lateinit var dumpManager: DumpManager
50     @Mock
51     lateinit var broadcastDispatcher: BroadcastDispatcher
52     @Captor
53     lateinit var receiverCaptor: ArgumentCaptor<BroadcastReceiver>
54 
55     val clock = FakeSystemClock()
56     val executor = FakeExecutor(clock)
57 
58     @Before
59     fun setUp() {
60         MockitoAnnotations.initMocks(this)
61 
62         freezer = LogBufferFreezer(dumpManager, executor, 500)
63 
64         freezer.attach(broadcastDispatcher)
65 
66         verify(broadcastDispatcher)
67                 .registerReceiver(
68                         capture(receiverCaptor),
69                         any(IntentFilter::class.java),
70                         eq(executor),
71                         any(UserHandle::class.java),
72                         anyInt(),
73                         nullable())
74         receiver = receiverCaptor.value
75     }
76 
77     @Test
78     fun testBuffersAreFrozenInResponseToBroadcast() {
79         // WHEN the bugreport intent is fired
80         receiver.onReceive(null, null)
81 
82         // THEN the buffers are frozen
83         verify(dumpManager).freezeBuffers()
84     }
85 
86     @Test
87     fun testBuffersAreUnfrozenAfterTimeout() {
88         // GIVEN that we've already frozen the buffers in response to a broadcast
89         receiver.onReceive(null, null)
90         verify(dumpManager).freezeBuffers()
91 
92         // WHEN the timeout expires
93         clock.advanceTime(501)
94 
95         // THEN the buffers are unfrozen
96         verify(dumpManager).unfreezeBuffers()
97     }
98 
99     @Test
100     fun testBuffersAreNotPrematurelyUnfrozen() {
101         // GIVEN that we received a broadcast 499ms ago (shortly before the timeout would expire)
102         receiver.onReceive(null, null)
103         verify(dumpManager).freezeBuffers()
104         clock.advanceTime(499)
105 
106         // WHEN we receive a second broadcast
107         receiver.onReceive(null, null)
108 
109         // THEN the buffers are frozen a second time
110         verify(dumpManager, times(2)).freezeBuffers()
111 
112         // THEN when we advance beyond the first timeout, nothing happens
113         clock.advanceTime(101)
114         verify(dumpManager, never()).unfreezeBuffers()
115 
116         // THEN only when we advance past the reset timeout window are the buffers unfrozen
117         clock.advanceTime(401)
118         verify(dumpManager).unfreezeBuffers()
119     }
120 }
121