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