1- package com.powersync
1+ package com.powersync.sync
22
33import app.cash.turbine.turbineScope
44import co.touchlab.kermit.ExperimentalKermitApi
5+ import com.powersync.PowerSyncDatabase
6+ import com.powersync.PowerSyncException
7+ import com.powersync.TestConnector
58import com.powersync.bucket.BucketChecksum
69import com.powersync.bucket.BucketPriority
710import com.powersync.bucket.Checkpoint
@@ -11,14 +14,12 @@ import com.powersync.bucket.WriteCheckpointData
1114import com.powersync.bucket.WriteCheckpointResponse
1215import com.powersync.db.PowerSyncDatabaseImpl
1316import com.powersync.db.schema.Schema
14- import com.powersync.sync.SyncLine
1517import com.powersync.testutils.UserRow
1618import com.powersync.testutils.databaseTest
1719import com.powersync.testutils.waitFor
1820import com.powersync.utils.JsonUtil
1921import dev.mokkery.answering.returns
2022import dev.mokkery.every
21- import dev.mokkery.everySuspend
2223import dev.mokkery.verify
2324import dev.mokkery.verifyNoMoreCalls
2425import dev.mokkery.verifySuspend
@@ -27,26 +28,27 @@ import io.kotest.matchers.shouldBe
2728import kotlinx.coroutines.CompletableDeferred
2829import kotlinx.coroutines.DelicateCoroutinesApi
2930import kotlinx.coroutines.launch
30- import kotlinx.serialization.encodeToString
3131import kotlin.test.Test
3232import kotlin.test.assertEquals
3333import kotlin.test.assertFailsWith
3434import kotlin.test.assertNotNull
3535import kotlin.time.Duration.Companion.seconds
3636
37- class SyncIntegrationTest {
37+ @OptIn(LegacySyncImplementation ::class )
38+ abstract class BaseSyncIntegrationTest (useNewSyncImplementation : Boolean ) : AbstractSyncTest(
39+ useNewSyncImplementation
40+ ) {
3841 private suspend fun PowerSyncDatabase.expectUserCount (amount : Int ) {
3942 val users = getAll(" SELECT * FROM users;" ) { UserRow .from(it) }
4043 users shouldHaveSize amount
4144 }
4245
4346 @Test
44- @OptIn(DelicateCoroutinesApi ::class )
4547 fun connectImmediately () =
4648 databaseTest(createInitialDatabase = false ) {
4749 // Regression test for https://github.com/powersync-ja/powersync-kotlin/issues/169
4850 val database = openDatabase()
49- database.connect(connector)
51+ database.connect(connector, options = options )
5052
5153 turbineScope(timeout = 10.0 .seconds) {
5254 val turbine = database.currentStatus.asFlow().testIn(this )
@@ -59,7 +61,7 @@ class SyncIntegrationTest {
5961 @OptIn(DelicateCoroutinesApi ::class )
6062 fun closesResponseStreamOnDatabaseClose () =
6163 databaseTest {
62- database.connect(connector)
64+ database.connect(connector, options = options )
6365
6466 turbineScope(timeout = 10.0 .seconds) {
6567 val turbine = database.currentStatus.asFlow().testIn(this )
@@ -78,7 +80,7 @@ class SyncIntegrationTest {
7880 @OptIn(DelicateCoroutinesApi ::class )
7981 fun cleansResourcesOnDisconnect () =
8082 databaseTest {
81- database.connect(connector)
83+ database.connect(connector, options = options )
8284
8385 turbineScope(timeout = 10.0 .seconds) {
8486 val turbine = database.currentStatus.asFlow().testIn(this )
@@ -99,7 +101,7 @@ class SyncIntegrationTest {
99101 @Test
100102 fun cannotUpdateSchemaWhileConnected () =
101103 databaseTest {
102- database.connect(connector)
104+ database.connect(connector, options = options )
103105
104106 turbineScope(timeout = 10.0 .seconds) {
105107 val turbine = database.currentStatus.asFlow().testIn(this )
@@ -117,7 +119,7 @@ class SyncIntegrationTest {
117119 @Test
118120 fun testPartialSync () =
119121 databaseTest {
120- database.connect(connector)
122+ database.connect(connector, options = options )
121123
122124 val checksums =
123125 buildList {
@@ -208,7 +210,7 @@ class SyncIntegrationTest {
208210 @Test
209211 fun testRemembersLastPartialSync () =
210212 databaseTest {
211- database.connect(connector)
213+ database.connect(connector, options = options )
212214
213215 syncLines.send(
214216 SyncLine .FullCheckpoint (
@@ -244,7 +246,7 @@ class SyncIntegrationTest {
244246 @Test
245247 fun setsDownloadingState () =
246248 databaseTest {
247- database.connect(connector)
249+ database.connect(connector, options = options )
248250
249251 turbineScope(timeout = 10.0 .seconds) {
250252 val turbine = database.currentStatus.asFlow().testIn(this )
@@ -278,7 +280,7 @@ class SyncIntegrationTest {
278280 turbineScope(timeout = 10.0 .seconds) {
279281 val turbine = database.currentStatus.asFlow().testIn(this )
280282
281- database.connect(connector)
283+ database.connect(connector, options = options )
282284 turbine.waitFor { it.connecting }
283285
284286 database.disconnect()
@@ -291,7 +293,7 @@ class SyncIntegrationTest {
291293 @Test
292294 fun testMultipleSyncsDoNotCreateMultipleStatusEntries () =
293295 databaseTest {
294- database.connect(connector)
296+ database.connect(connector, options = options )
295297
296298 turbineScope(timeout = 10.0 .seconds) {
297299 val turbine = database.currentStatus.asFlow().testIn(this )
@@ -337,8 +339,8 @@ class SyncIntegrationTest {
337339
338340 turbineScope(timeout = 10.0 .seconds) {
339341 // Connect the first database
340- database.connect(connector)
341- db2.connect(connector)
342+ database.connect(connector, options = options )
343+ db2.connect(connector, options = options )
342344
343345 waitFor {
344346 assertNotNull(
@@ -363,10 +365,10 @@ class SyncIntegrationTest {
363365 val turbine2 = db2.currentStatus.asFlow().testIn(this )
364366
365367 // Connect the first database
366- database.connect(connector)
368+ database.connect(connector, options = options )
367369
368370 turbine1.waitFor { it.connecting }
369- db2.connect(connector)
371+ db2.connect(connector, options = options )
370372
371373 // Should not be connecting yet
372374 db2.currentStatus.connecting shouldBe false
@@ -390,13 +392,13 @@ class SyncIntegrationTest {
390392 turbineScope(timeout = 10.0 .seconds) {
391393 val turbine = database.currentStatus.asFlow().testIn(this )
392394
393- database.connect(connector, 1000L )
395+ database.connect(connector, 1000L , options = options )
394396 turbine.waitFor { it.connecting }
395397
396398 database.disconnect()
397399 turbine.waitFor { ! it.connecting }
398400
399- database.connect(connector, 1000L )
401+ database.connect(connector, 1000L , options = options )
400402 turbine.waitFor { it.connecting }
401403 database.disconnect()
402404 turbine.waitFor { ! it.connecting }
@@ -411,10 +413,10 @@ class SyncIntegrationTest {
411413 turbineScope(timeout = 10.0 .seconds) {
412414 val turbine = database.currentStatus.asFlow().testIn(this )
413415
414- database.connect(connector, 1000L , retryDelayMs = 5000 )
416+ database.connect(connector, 1000L , retryDelayMs = 5000 , options = options )
415417 turbine.waitFor { it.connecting }
416418
417- database.connect(connector, 1000L , retryDelayMs = 5000 )
419+ database.connect(connector, 1000L , retryDelayMs = 5000 , options = options )
418420 turbine.waitFor { it.connecting }
419421
420422 turbine.cancel()
@@ -427,7 +429,7 @@ class SyncIntegrationTest {
427429 databaseTest {
428430 val testConnector = TestConnector ()
429431 connector = testConnector
430- database.connect(testConnector)
432+ database.connect(testConnector, options = options )
431433
432434 suspend fun expectUserRows (amount : Int ) {
433435 val row = database.get(" SELECT COUNT(*) FROM users" ) { it.getLong(0 )!! }
@@ -521,6 +523,7 @@ class SyncIntegrationTest {
521523 }
522524 completeUpload.complete(Unit )
523525 requestedCheckpoint.await()
526+ logger.d { " Did request checkpoint" }
524527
525528 // This should apply the checkpoint
526529 turbineScope {
@@ -539,7 +542,7 @@ class SyncIntegrationTest {
539542 turbineScope(timeout = 10.0 .seconds) {
540543 val turbine = database.currentStatus.asFlow().testIn(this )
541544
542- database.connect(connector, 1000L , retryDelayMs = 5000 )
545+ database.connect(connector, 1000L , retryDelayMs = 5000 , options = options )
543546 turbine.waitFor { it.connecting }
544547
545548 syncLines.send(SyncLine .KeepAlive (tokenExpiresIn = 4000 ))
@@ -555,7 +558,14 @@ class SyncIntegrationTest {
555558 turbine.cancel()
556559 }
557560 }
561+ }
562+
563+ class LegacySyncIntegrationTest : BaseSyncIntegrationTest (false )
564+
565+ class NewSyncIntegrationTest : BaseSyncIntegrationTest (true ) {
566+ // The legacy sync implementation doesn't prefetch credentials.
558567
568+ @OptIn(LegacySyncImplementation ::class )
559569 @Test
560570 fun testTokenPrefetch () =
561571 databaseTest {
@@ -569,7 +579,7 @@ class SyncIntegrationTest {
569579 turbineScope(timeout = 10.0 .seconds) {
570580 val turbine = database.currentStatus.asFlow().testIn(this )
571581
572- database.connect(connector, 1000L , retryDelayMs = 5000 )
582+ database.connect(connector, 1000L , retryDelayMs = 5000 , options = options )
573583 turbine.waitFor { it.connecting }
574584
575585 syncLines.send(SyncLine .KeepAlive (tokenExpiresIn = 4000 ))
0 commit comments