@@ -256,39 +256,37 @@ class ThreadManagerImplTest {
256256 }
257257
258258 @Test
259- fun `Given only the server has a dataset and import succeeds when sync then returns OnlyOnServer imported` () =
260- runTest {
261- stubServerSupport(coreSupports = true )
262- mockOrphanCleanup()
263- mockPreferredCredentials(intentSender = null )
264- coEvery { webSocketRepository.getThreadDatasets() } returns
265- listOf (dataset(datasetId = " server" , preferred = true ))
266- // No TLV on the server, so the import is a no-op that completes successfully
267- coEvery { webSocketRepository.getThreadDatasetTlv(any()) } returns null
268-
269- val result = assertInstanceOf(
270- ThreadManager .SyncResult .OnlyOnServer ::class .java,
271- createManager().syncPreferredDataset(serverId = 1 , scope = this ),
272- )
273- assertTrue(result.imported)
274- }
259+ fun `Given only the server has a dataset and import succeeds when sync then returns OnlyOnServer imported` () = runTest {
260+ stubServerSupport(coreSupports = true )
261+ mockOrphanCleanup()
262+ mockPreferredCredentials(intentSender = null )
263+ coEvery { webSocketRepository.getThreadDatasets() } returns
264+ listOf (dataset(datasetId = " server" , preferred = true ))
265+ // No TLV on the server, so the import is a no-op that completes successfully
266+ coEvery { webSocketRepository.getThreadDatasetTlv(any()) } returns null
267+
268+ val result = assertInstanceOf(
269+ ThreadManager .SyncResult .OnlyOnServer ::class .java,
270+ createManager().syncPreferredDataset(serverId = 1 , scope = this ),
271+ )
272+ assertTrue(result.imported)
273+ }
275274
276275 @Test
277- fun `Given only the server has a dataset and import fails when sync then returns OnlyOnServer not imported` () =
278- runTest {
279- stubServerSupport(coreSupports = true )
280- mockOrphanCleanup()
281- mockPreferredCredentials(intentSender = null )
282- coEvery { webSocketRepository.getThreadDatasets() } returns
283- listOf (dataset(datasetId = " server" , preferred = true ))
284- coEvery { webSocketRepository.getThreadDatasetTlv(any()) } throws RuntimeException (" import boom" )
285-
286- val result = assertInstanceOf(
287- ThreadManager .SyncResult .OnlyOnServer ::class .java,
288- createManager().syncPreferredDataset(serverId = 1 , scope = this ),
289- )
290- assertFalse(result.imported)
291- }
276+ fun `Given only the server has a dataset and import fails when sync then returns OnlyOnServer not imported` () = runTest {
277+ stubServerSupport(coreSupports = true )
278+ mockOrphanCleanup()
279+ mockPreferredCredentials(intentSender = null )
280+ coEvery { webSocketRepository.getThreadDatasets() } returns
281+ listOf (dataset(datasetId = " server" , preferred = true ))
282+ coEvery { webSocketRepository.getThreadDatasetTlv(any()) } throws RuntimeException (" import boom" )
283+
284+ val result = assertInstanceOf(
285+ ThreadManager .SyncResult .OnlyOnServer ::class .java,
286+ createManager().syncPreferredDataset(serverId = 1 , scope = this ),
287+ )
288+ assertFalse(result.imported)
289+ }
292290
293291 @Test
294292 fun `Given only the device has a dataset when sync then returns OnlyOnDevice with intent` () = runTest {
@@ -328,24 +326,23 @@ class ThreadManagerImplTest {
328326 }
329327
330328 @Test
331- fun `Given both have datasets and the comparison fails when sync then returns AllHaveCredentials with nulls` () =
332- runTest {
333- stubServerSupport(coreSupports = true )
334- mockOrphanCleanup()
335- mockPreferredCredentials(intentSender = mockk())
336- coEvery { webSocketRepository.getThreadDatasets() } returns
337- listOf (dataset(datasetId = " server" , preferred = true ))
338- coEvery { webSocketRepository.getThreadDatasetTlv(any()) } throws RuntimeException (" compare boom" )
339-
340- val result = assertInstanceOf(
341- ThreadManager .SyncResult .AllHaveCredentials ::class .java,
342- createManager().syncPreferredDataset(serverId = 1 , scope = this ),
343- )
344- assertNull(result.matches)
345- assertNull(result.fromApp)
346- assertNull(result.updated)
347- assertNull(result.exportIntent)
348- }
329+ fun `Given both have datasets and the comparison fails when sync then returns AllHaveCredentials with nulls` () = runTest {
330+ stubServerSupport(coreSupports = true )
331+ mockOrphanCleanup()
332+ mockPreferredCredentials(intentSender = mockk())
333+ coEvery { webSocketRepository.getThreadDatasets() } returns
334+ listOf (dataset(datasetId = " server" , preferred = true ))
335+ coEvery { webSocketRepository.getThreadDatasetTlv(any()) } throws RuntimeException (" compare boom" )
336+
337+ val result = assertInstanceOf(
338+ ThreadManager .SyncResult .AllHaveCredentials ::class .java,
339+ createManager().syncPreferredDataset(serverId = 1 , scope = this ),
340+ )
341+ assertNull(result.matches)
342+ assertNull(result.fromApp)
343+ assertNull(result.updated)
344+ assertNull(result.exportIntent)
345+ }
349346
350347 @Test
351348 fun `Given the device already prefers the server dataset when sync then matches without exporting` () = runTest {
@@ -375,65 +372,62 @@ class ThreadManagerImplTest {
375372 }
376373
377374 @Test
378- fun `Given the device prefers an app-added dataset when sync then updates the device to the server dataset` () =
379- runTest {
380- stubServerSupport(coreSupports = true )
381- mockOrphanCleanup()
382- mockPreferredCredentials(intentSender = mockk())
383- coEvery { webSocketRepository.getThreadDatasets() } returns
384- listOf (dataset(datasetId = " server" , preferred = true ))
385- // No TLV, so the device does not prefer the server dataset directly...
386- coEvery { webSocketRepository.getThreadDatasetTlv(any()) } returns null
387- // ...but it does prefer a credential this app added previously
388- mockDeviceCredentialPrefersApp()
389-
390- val result = assertInstanceOf(
391- ThreadManager .SyncResult .AllHaveCredentials ::class .java,
392- createManager().syncPreferredDataset(serverId = 1 , scope = this ),
393- )
394- assertEquals(false , result.matches)
395- assertEquals(true , result.fromApp)
396- assertEquals(true , result.updated)
397- assertNull(result.exportIntent)
398- }
375+ fun `Given the device prefers an app-added dataset when sync then updates the device to the server dataset` () = runTest {
376+ stubServerSupport(coreSupports = true )
377+ mockOrphanCleanup()
378+ mockPreferredCredentials(intentSender = mockk())
379+ coEvery { webSocketRepository.getThreadDatasets() } returns
380+ listOf (dataset(datasetId = " server" , preferred = true ))
381+ // No TLV, so the device does not prefer the server dataset directly...
382+ coEvery { webSocketRepository.getThreadDatasetTlv(any()) } returns null
383+ // ...but it does prefer a credential this app added previously
384+ mockDeviceCredentialPrefersApp()
385+
386+ val result = assertInstanceOf(
387+ ThreadManager .SyncResult .AllHaveCredentials ::class .java,
388+ createManager().syncPreferredDataset(serverId = 1 , scope = this ),
389+ )
390+ assertEquals(false , result.matches)
391+ assertEquals(true , result.fromApp)
392+ assertEquals(true , result.updated)
393+ assertNull(result.exportIntent)
394+ }
399395
400396 @Test
401- fun `Given a foreign-sourced server dataset preferred via an app credential when sync then removes it` () =
402- runTest {
403- stubServerSupport(coreSupports = true )
404- mockOrphanCleanup()
405- mockPreferredCredentials(intentSender = mockk())
406- // The server's preferred dataset reports it originated from another app (not HA), so HA
407- // should stop managing it: remove its own contributed credential without re-importing.
408- coEvery { webSocketRepository.getThreadDatasets() } returns
409- listOf (dataset(datasetId = " server" , preferred = true , source = " Google" ))
410- // No TLV, so the device does not prefer the server dataset directly...
411- coEvery { webSocketRepository.getThreadDatasetTlv(any()) } returns null
412- // ...but it does prefer a credential this app added previously, which is what lets HA
413- // remove it. A credential added by another app could not be removed here (see the
414- // "neither is device-preferred" test, which exports instead of removing).
415- mockDeviceCredentialPrefersApp()
416-
417- val result = assertInstanceOf(
418- ThreadManager .SyncResult .AllHaveCredentials ::class .java,
419- createManager().syncPreferredDataset(serverId = 1 , scope = this ),
420- )
421- assertEquals(false , result.matches)
422- assertEquals(true , result.fromApp)
423- assertEquals(false , result.updated)
424- assertNull(result.exportIntent)
425- }
397+ fun `Given a foreign-sourced server dataset preferred via an app credential when sync then removes it` () = runTest {
398+ stubServerSupport(coreSupports = true )
399+ mockOrphanCleanup()
400+ mockPreferredCredentials(intentSender = mockk())
401+ // The server's preferred dataset reports it originated from another app (not HA), so HA
402+ // should stop managing it: remove its own contributed credential without re-importing.
403+ coEvery { webSocketRepository.getThreadDatasets() } returns
404+ listOf (dataset(datasetId = " server" , preferred = true , source = " Google" ))
405+ // No TLV, so the device does not prefer the server dataset directly...
406+ coEvery { webSocketRepository.getThreadDatasetTlv(any()) } returns null
407+ // ...but it does prefer a credential this app added previously, which is what lets HA
408+ // remove it. A credential added by another app could not be removed here (see the
409+ // "neither is device-preferred" test, which exports instead of removing).
410+ mockDeviceCredentialPrefersApp()
411+
412+ val result = assertInstanceOf(
413+ ThreadManager .SyncResult .AllHaveCredentials ::class .java,
414+ createManager().syncPreferredDataset(serverId = 1 , scope = this ),
415+ )
416+ assertEquals(false , result.matches)
417+ assertEquals(true , result.fromApp)
418+ assertEquals(false , result.updated)
419+ assertNull(result.exportIntent)
420+ }
426421 }
427422
428- private fun dataset (datasetId : String , preferred : Boolean , source : String = "HomeAssistant ") =
429- ThreadDatasetResponse (
430- datasetId = datasetId,
431- extendedPanId = " extended-pan-id" ,
432- networkName = " network-$datasetId " ,
433- panId = " pan-id" ,
434- preferred = preferred,
435- source = source,
436- )
423+ private fun dataset (datasetId : String , preferred : Boolean , source : String = "HomeAssistant ") = ThreadDatasetResponse (
424+ datasetId = datasetId,
425+ extendedPanId = " extended-pan-id" ,
426+ networkName = " network-$datasetId " ,
427+ panId = " pan-id" ,
428+ preferred = preferred,
429+ source = source,
430+ )
437431
438432 private fun stubServerSupport (coreSupports : Boolean ) {
439433 coEvery { serverManager.isRegistered() } returns true
0 commit comments