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.BLE_SCAN_ALWAYS_AVAILABLE 24 import com.android.server.bluetooth.BleScanSettingListener.initialize 25 import com.android.server.bluetooth.BleScanSettingListener.isScanAllowed 26 import com.google.common.truth.Truth.assertThat 27 import org.junit.Before 28 import org.junit.Test 29 import org.junit.runner.RunWith 30 import org.robolectric.RobolectricTestRunner 31 import org.robolectric.Shadows.shadowOf 32 33 @RunWith(RobolectricTestRunner::class) 34 class BleScanSettingListenerTest { 35 private val resolver: ContentResolver = 36 ApplicationProvider.getApplicationContext<Context>().getContentResolver() 37 38 private val looper: Looper = Looper.getMainLooper() 39 40 private var callbackTriggered: Boolean = false 41 42 @Before setupnull43 public fun setup() { 44 callbackTriggered = false 45 } 46 startListenernull47 private fun startListener() { 48 initialize(looper, resolver, this::callback) 49 } 50 enableSettingnull51 private fun enableSetting() { 52 Settings.Global.putInt(resolver, BLE_SCAN_ALWAYS_AVAILABLE, 1) 53 shadowOf(looper).idle() 54 } 55 disableSettingnull56 private fun disableSetting() { 57 Settings.Global.putInt(resolver, BLE_SCAN_ALWAYS_AVAILABLE, 0) 58 shadowOf(looper).idle() 59 } 60 callbacknull61 private fun callback() { 62 callbackTriggered = true 63 } 64 65 @Test initialize_whenNoSettings_isOffnull66 fun initialize_whenNoSettings_isOff() { 67 startListener() 68 69 assertThat(isScanAllowed).isFalse() 70 assertThat(callbackTriggered).isFalse() 71 } 72 73 @Test initialize_whenSettingsOff_isOffnull74 fun initialize_whenSettingsOff_isOff() { 75 disableSetting() 76 77 startListener() 78 79 assertThat(isScanAllowed).isFalse() 80 assertThat(callbackTriggered).isFalse() 81 } 82 83 @Test initialize_whenSettingsOn_isScanAllowednull84 fun initialize_whenSettingsOn_isScanAllowed() { 85 enableSetting() 86 startListener() 87 88 assertThat(isScanAllowed).isTrue() 89 assertThat(callbackTriggered).isFalse() 90 } 91 92 @Test changeModeToOn_whenSettingsOn_isScanAllowedAndEventDiscardednull93 fun changeModeToOn_whenSettingsOn_isScanAllowedAndEventDiscarded() { 94 enableSetting() 95 startListener() 96 97 enableSetting() 98 99 assertThat(isScanAllowed).isTrue() 100 assertThat(callbackTriggered).isFalse() 101 } 102 103 @Test changeModeToOff_whenSettingsOff_isOffAndEventDiscardednull104 fun changeModeToOff_whenSettingsOff_isOffAndEventDiscarded() { 105 startListener() 106 107 disableSetting() 108 109 assertThat(isScanAllowed).isFalse() 110 assertThat(callbackTriggered).isFalse() 111 } 112 113 @Test changeModeToOn_whenSettingsOff_isScanAllowedWithoutCallbacknull114 fun changeModeToOn_whenSettingsOff_isScanAllowedWithoutCallback() { 115 startListener() 116 117 enableSetting() 118 119 assertThat(isScanAllowed).isTrue() 120 assertThat(callbackTriggered).isFalse() 121 } 122 123 @Test changeModeToOff_whenSettingsOn_isOffAndCallbackTriggerednull124 fun changeModeToOff_whenSettingsOn_isOffAndCallbackTriggered() { 125 enableSetting() 126 startListener() 127 128 disableSetting() 129 130 assertThat(isScanAllowed).isFalse() 131 assertThat(callbackTriggered).isTrue() 132 } 133 } 134