1 /* 2 * Copyright 2023 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 package com.android.server.bluetooth.test 17 18 import android.content.ContentResolver 19 import android.content.Context 20 import android.os.Looper 21 import android.provider.Settings 22 import androidx.test.core.app.ApplicationProvider 23 import com.android.server.bluetooth.BleScanSettingListener.initialize 24 import com.android.server.bluetooth.BleScanSettingListener.isScanAllowed 25 import com.google.common.truth.Truth.assertThat 26 import org.junit.Before 27 import org.junit.Test 28 import org.junit.runner.RunWith 29 import org.robolectric.RobolectricTestRunner 30 import org.robolectric.Shadows.shadowOf 31 32 @RunWith(RobolectricTestRunner::class) 33 class BleScanSettingListenerTest { 34 private val resolver: ContentResolver = 35 ApplicationProvider.getApplicationContext<Context>().getContentResolver() 36 37 private val looper: Looper = Looper.getMainLooper() 38 39 private var callbackTriggered: Boolean = false 40 41 @Before setupnull42 public fun setup() { 43 callbackTriggered = false 44 } 45 startListenernull46 private fun startListener() { 47 initialize(looper, resolver, this::callback) 48 } 49 enableSettingnull50 private fun enableSetting() { 51 Settings.Global.putInt(resolver, Settings.Global.BLE_SCAN_ALWAYS_AVAILABLE, 1) 52 shadowOf(looper).idle() 53 } 54 disableSettingnull55 private fun disableSetting() { 56 Settings.Global.putInt(resolver, Settings.Global.BLE_SCAN_ALWAYS_AVAILABLE, 0) 57 shadowOf(looper).idle() 58 } 59 callbacknull60 private fun callback() { 61 callbackTriggered = true 62 } 63 64 @Test initialize_whenNoSettings_isOffnull65 fun initialize_whenNoSettings_isOff() { 66 startListener() 67 68 assertThat(isScanAllowed).isFalse() 69 assertThat(callbackTriggered).isFalse() 70 } 71 72 @Test initialize_whenSettingsOff_isOffnull73 fun initialize_whenSettingsOff_isOff() { 74 disableSetting() 75 76 startListener() 77 78 assertThat(isScanAllowed).isFalse() 79 assertThat(callbackTriggered).isFalse() 80 } 81 82 @Test initialize_whenSettingsOn_isScanAllowednull83 fun initialize_whenSettingsOn_isScanAllowed() { 84 enableSetting() 85 startListener() 86 87 assertThat(isScanAllowed).isTrue() 88 assertThat(callbackTriggered).isFalse() 89 } 90 91 @Test changeModeToOn_whenSettingsOn_isScanAllowedAndEventDiscardednull92 fun changeModeToOn_whenSettingsOn_isScanAllowedAndEventDiscarded() { 93 enableSetting() 94 startListener() 95 96 enableSetting() 97 98 assertThat(isScanAllowed).isTrue() 99 assertThat(callbackTriggered).isFalse() 100 } 101 102 @Test changeModeToOff_whenSettingsOff_isOffAndEventDiscardednull103 fun changeModeToOff_whenSettingsOff_isOffAndEventDiscarded() { 104 startListener() 105 106 disableSetting() 107 108 assertThat(isScanAllowed).isFalse() 109 assertThat(callbackTriggered).isFalse() 110 } 111 112 @Test changeModeToOn_whenSettingsOff_isScanAllowedWithoutCallbacknull113 fun changeModeToOn_whenSettingsOff_isScanAllowedWithoutCallback() { 114 startListener() 115 116 enableSetting() 117 118 assertThat(isScanAllowed).isTrue() 119 assertThat(callbackTriggered).isFalse() 120 } 121 122 @Test changeModeToOff_whenSettingsOn_isOffAndCallbackTriggerednull123 fun changeModeToOff_whenSettingsOn_isOffAndCallbackTriggered() { 124 enableSetting() 125 startListener() 126 127 disableSetting() 128 129 assertThat(isScanAllowed).isFalse() 130 assertThat(callbackTriggered).isTrue() 131 } 132 } 133