@@ -57,12 +57,23 @@ internal class DefaultBatteryInfoProviderTest {
57
57
@Mock
58
58
lateinit var mockPowerManager: PowerManager
59
59
60
+ @Mock
61
+ lateinit var mockSystemClockWrapper: SystemClockWrapper
62
+
60
63
@Mock
61
64
lateinit var mockBatteryManager: BatteryManager
62
65
66
+ private val testSuiteStartTime = System .currentTimeMillis()
67
+
68
+ private val shortPollingInterval = 200
69
+
63
70
@BeforeEach
64
71
fun setup () {
65
72
whenever(mockApplicationContext.contentResolver) doReturn mockContentResolver
73
+ whenever(mockSystemClockWrapper.elapsedRealTime()) doReturn testSuiteStartTime
74
+ whenever(mockPowerManager.isPowerSaveMode) doReturn false
75
+ whenever(mockBatteryManager.getIntProperty(BATTERY_PROPERTY_CAPACITY )) doReturn 50
76
+ initializeBatteryManager()
66
77
}
67
78
68
79
// region getBatteryState
@@ -75,13 +86,7 @@ internal class DefaultBatteryInfoProviderTest {
75
86
// Given
76
87
whenever(mockPowerManager.isPowerSaveMode) doReturn fakeLowPowerMode
77
88
whenever(mockBatteryManager.getIntProperty(BATTERY_PROPERTY_CAPACITY )) doReturn fakeBatteryLevel
78
-
79
- // Create provider (initialization happens in constructor)
80
- testedProvider = DefaultBatteryInfoProvider (
81
- applicationContext = mockApplicationContext,
82
- powerManager = mockPowerManager,
83
- batteryManager = mockBatteryManager
84
- )
89
+ initializeBatteryManager()
85
90
86
91
// When
87
92
val batteryInfo = BatteryInfo .fromMap(testedProvider.getState())
@@ -96,11 +101,7 @@ internal class DefaultBatteryInfoProviderTest {
96
101
@Test
97
102
fun `M return battery info with nulls W getBatteryState() { services unavailable }` () {
98
103
// Given
99
- testedProvider = DefaultBatteryInfoProvider (
100
- applicationContext = mockApplicationContext,
101
- powerManager = null ,
102
- batteryManager = null
103
- )
104
+ initializeBatteryManager(null , null )
104
105
105
106
// When
106
107
val batteryInfo = BatteryInfo .fromMap(testedProvider.getState())
@@ -118,17 +119,6 @@ internal class DefaultBatteryInfoProviderTest {
118
119
@SuppressLint(" UnspecifiedRegisterReceiverFlag" )
119
120
@Test
120
121
fun `M register broadcast receiver W constructor { initialization }` () {
121
- // Given
122
- whenever(mockPowerManager.isPowerSaveMode) doReturn false
123
- whenever(mockBatteryManager.getIntProperty(BATTERY_PROPERTY_CAPACITY )) doReturn 50
124
-
125
- // When - provider is created (initialization happens in constructor)
126
- testedProvider = DefaultBatteryInfoProvider (
127
- applicationContext = mockApplicationContext,
128
- powerManager = mockPowerManager,
129
- batteryManager = mockBatteryManager
130
- )
131
-
132
122
// Then
133
123
val receiverCaptor = argumentCaptor<BroadcastReceiver >()
134
124
val filterCaptor = argumentCaptor<IntentFilter >()
@@ -142,15 +132,6 @@ internal class DefaultBatteryInfoProviderTest {
142
132
@SuppressLint(" UnspecifiedRegisterReceiverFlag" )
143
133
@Test
144
134
fun `M unregister receiver W cleanup() { after initialization }` () {
145
- // Given - create provider (initialization happens in constructor)
146
- whenever(mockPowerManager.isPowerSaveMode) doReturn false
147
- whenever(mockBatteryManager.getIntProperty(BATTERY_PROPERTY_CAPACITY )) doReturn 50
148
- testedProvider = DefaultBatteryInfoProvider (
149
- applicationContext = mockApplicationContext,
150
- powerManager = mockPowerManager,
151
- batteryManager = mockBatteryManager
152
- )
153
-
154
135
// When
155
136
testedProvider.cleanup()
156
137
@@ -162,15 +143,6 @@ internal class DefaultBatteryInfoProviderTest {
162
143
163
144
@Test
164
145
fun `M retain initial state W cleanup() then getState() { no re-initialization }` () {
165
- // Given - create provider
166
- whenever(mockPowerManager.isPowerSaveMode) doReturn false
167
- whenever(mockBatteryManager.getIntProperty(BATTERY_PROPERTY_CAPACITY )) doReturn 50
168
- testedProvider = DefaultBatteryInfoProvider (
169
- applicationContext = mockApplicationContext,
170
- powerManager = mockPowerManager,
171
- batteryManager = mockBatteryManager
172
- )
173
-
174
146
// When - cleanup (no re-initialization happens)
175
147
testedProvider.cleanup()
176
148
val batteryInfo = BatteryInfo .fromMap(testedProvider.getState())
@@ -184,48 +156,20 @@ internal class DefaultBatteryInfoProviderTest {
184
156
185
157
// region Polling Tests
186
158
187
- @Test
188
- fun `M respect polling interval W getState() { multiple rapid calls }` () {
189
- // Given
190
- val shortInterval = 500 // 500ms for testing
191
- whenever(mockPowerManager.isPowerSaveMode) doReturn false
192
- whenever(mockBatteryManager.getIntProperty(BATTERY_PROPERTY_CAPACITY )) doReturn 50
193
-
194
- testedProvider = DefaultBatteryInfoProvider (
195
- applicationContext = mockApplicationContext,
196
- powerManager = mockPowerManager,
197
- batteryManager = mockBatteryManager,
198
- batteryLevelPollInterval = shortInterval
199
- )
200
-
201
- // When - rapid calls within polling interval
202
- whenever(mockBatteryManager.getIntProperty(BATTERY_PROPERTY_CAPACITY )) doReturn 75
203
- testedProvider.getState()
204
-
205
- // Then - should still have initial battery level (50) from constructor, not 75
206
- val batteryInfo = BatteryInfo .fromMap(testedProvider.getState())
207
- assertThat(batteryInfo.batteryLevel).isEqualTo(0.5f ) // Still 50, not 75
208
- }
209
-
210
159
@Test
211
160
fun `M update battery level W getState() { after polling interval }` () {
212
- // Given
213
- val shortInterval = 50 // 50ms for testing
214
- whenever(mockPowerManager.isPowerSaveMode) doReturn false
215
- whenever(mockBatteryManager.getIntProperty(BATTERY_PROPERTY_CAPACITY )) doReturn 50
216
-
217
- testedProvider = DefaultBatteryInfoProvider (
218
- applicationContext = mockApplicationContext,
219
- powerManager = mockPowerManager,
220
- batteryManager = mockBatteryManager,
221
- batteryLevelPollInterval = shortInterval
222
- )
223
-
224
161
// When
225
- Thread .sleep(shortInterval + 10L )
226
162
whenever(mockBatteryManager.getIntProperty(BATTERY_PROPERTY_CAPACITY )) doReturn 75
227
- val batteryInfo = BatteryInfo .fromMap(testedProvider.getState())
228
163
164
+ // nothing changes because we are within polling interval
165
+ assertThat(BatteryInfo .fromMap(testedProvider.getState()).batteryLevel).isEqualTo(0.5f )
166
+ whenever(mockSystemClockWrapper.elapsedRealTime()) doReturn testSuiteStartTime + shortPollingInterval / 2
167
+ assertThat(BatteryInfo .fromMap(testedProvider.getState()).batteryLevel).isEqualTo(0.5f )
168
+
169
+ // Then
170
+ // after polling interval level should change
171
+ whenever(mockSystemClockWrapper.elapsedRealTime()) doReturn testSuiteStartTime + shortPollingInterval
172
+ val batteryInfo = BatteryInfo .fromMap(testedProvider.getState())
229
173
assertThat(batteryInfo.batteryLevel).isEqualTo(0.8f ) // Now 75
230
174
}
231
175
@@ -239,13 +183,7 @@ internal class DefaultBatteryInfoProviderTest {
239
183
// Given
240
184
whenever(mockPowerManager.isPowerSaveMode) doReturn false
241
185
whenever(mockBatteryManager.getIntProperty(BATTERY_PROPERTY_CAPACITY )) doReturn Integer .MIN_VALUE
242
-
243
- // Create provider (initialization happens in constructor)
244
- testedProvider = DefaultBatteryInfoProvider (
245
- applicationContext = mockApplicationContext,
246
- powerManager = mockPowerManager,
247
- batteryManager = mockBatteryManager
248
- )
186
+ initializeBatteryManager()
249
187
250
188
// When
251
189
val batteryInfo = BatteryInfo .fromMap(testedProvider.getState())
@@ -261,13 +199,7 @@ internal class DefaultBatteryInfoProviderTest {
261
199
// Given
262
200
whenever(mockPowerManager.isPowerSaveMode) doReturn false
263
201
whenever(mockBatteryManager.getIntProperty(BATTERY_PROPERTY_CAPACITY )) doReturn 0
264
-
265
- // Create provider (initialization happens in constructor)
266
- testedProvider = DefaultBatteryInfoProvider (
267
- applicationContext = mockApplicationContext,
268
- powerManager = mockPowerManager,
269
- batteryManager = mockBatteryManager
270
- )
202
+ initializeBatteryManager()
271
203
272
204
// When
273
205
val batteryInfo = BatteryInfo .fromMap(testedProvider.getState())
@@ -278,4 +210,17 @@ internal class DefaultBatteryInfoProviderTest {
278
210
}
279
211
280
212
// endregion
213
+
214
+ private fun initializeBatteryManager (
215
+ powerManager : PowerManager ? = mockPowerManager,
216
+ batteryManager : BatteryManager ? = mockBatteryManager
217
+ ) {
218
+ testedProvider = DefaultBatteryInfoProvider (
219
+ applicationContext = mockApplicationContext,
220
+ batteryLevelPollInterval = shortPollingInterval,
221
+ powerManager = powerManager,
222
+ batteryManager = batteryManager,
223
+ systemClockWrapper = mockSystemClockWrapper
224
+ )
225
+ }
281
226
}
0 commit comments