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