Skip to content

Commit 803c1ed

Browse files
committed
Restore support for old implementation
1 parent c8b01ee commit 803c1ed

29 files changed

+734
-104
lines changed
Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,12 @@
1+
package com.powersync.sync
2+
3+
import com.powersync.ExperimentalPowerSyncAPI
4+
5+
abstract class AbstractSyncTest(private val useNewSyncImplementation: Boolean) {
6+
7+
@OptIn(ExperimentalPowerSyncAPI::class)
8+
val options: SyncOptions get() {
9+
return SyncOptions(useNewSyncImplementation)
10+
}
11+
}
12+

core/src/commonIntegrationTest/kotlin/com/powersync/sync/SyncIntegrationTest.kt

Lines changed: 36 additions & 26 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,10 @@
1-
package com.powersync
1+
package com.powersync.sync
22

33
import app.cash.turbine.turbineScope
44
import co.touchlab.kermit.ExperimentalKermitApi
5+
import com.powersync.PowerSyncDatabase
6+
import com.powersync.PowerSyncException
7+
import com.powersync.TestConnector
58
import com.powersync.bucket.BucketChecksum
69
import com.powersync.bucket.BucketPriority
710
import com.powersync.bucket.Checkpoint
@@ -11,14 +14,12 @@ import com.powersync.bucket.WriteCheckpointData
1114
import com.powersync.bucket.WriteCheckpointResponse
1215
import com.powersync.db.PowerSyncDatabaseImpl
1316
import com.powersync.db.schema.Schema
14-
import com.powersync.sync.SyncLine
1517
import com.powersync.testutils.UserRow
1618
import com.powersync.testutils.databaseTest
1719
import com.powersync.testutils.waitFor
1820
import com.powersync.utils.JsonUtil
1921
import dev.mokkery.answering.returns
2022
import dev.mokkery.every
21-
import dev.mokkery.everySuspend
2223
import dev.mokkery.verify
2324
import dev.mokkery.verifyNoMoreCalls
2425
import dev.mokkery.verifySuspend
@@ -27,26 +28,27 @@ import io.kotest.matchers.shouldBe
2728
import kotlinx.coroutines.CompletableDeferred
2829
import kotlinx.coroutines.DelicateCoroutinesApi
2930
import kotlinx.coroutines.launch
30-
import kotlinx.serialization.encodeToString
3131
import kotlin.test.Test
3232
import kotlin.test.assertEquals
3333
import kotlin.test.assertFailsWith
3434
import kotlin.test.assertNotNull
3535
import 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))

core/src/commonIntegrationTest/kotlin/com/powersync/sync/SyncProgressTest.kt

Lines changed: 13 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -18,7 +18,10 @@ import kotlin.test.assertFalse
1818
import kotlin.test.assertNull
1919
import kotlin.test.assertTrue
2020

21-
class SyncProgressTest {
21+
@OptIn(LegacySyncImplementation::class)
22+
abstract class BaseSyncProgressTest(useNewSyncImplementation: Boolean) : AbstractSyncTest(
23+
useNewSyncImplementation
24+
) {
2225
private var lastOpId = 0
2326

2427
@BeforeTest
@@ -104,7 +107,7 @@ class SyncProgressTest {
104107
@Test
105108
fun withoutPriorities() =
106109
databaseTest {
107-
database.connect(connector)
110+
database.connect(connector, options = options)
108111

109112
turbineScope {
110113
val turbine = database.currentStatus.asFlow().testIn(this)
@@ -153,7 +156,7 @@ class SyncProgressTest {
153156
@Test
154157
fun interruptedSync() =
155158
databaseTest {
156-
database.connect(connector)
159+
database.connect(connector, options = options)
157160

158161
turbineScope {
159162
val turbine = database.currentStatus.asFlow().testIn(this)
@@ -183,7 +186,7 @@ class SyncProgressTest {
183186
// And reconnecting
184187
database = openDatabase()
185188
syncLines = Channel()
186-
database.connect(connector)
189+
database.connect(connector, options = options)
187190

188191
turbineScope {
189192
val turbine = database.currentStatus.asFlow().testIn(this)
@@ -217,7 +220,7 @@ class SyncProgressTest {
217220
@Test
218221
fun interruptedSyncWithNewCheckpoint() =
219222
databaseTest {
220-
database.connect(connector)
223+
database.connect(connector, options = options)
221224

222225
turbineScope {
223226
val turbine = database.currentStatus.asFlow().testIn(this)
@@ -243,7 +246,7 @@ class SyncProgressTest {
243246
syncLines.close()
244247
database = openDatabase()
245248
syncLines = Channel()
246-
database.connect(connector)
249+
database.connect(connector, options = options)
247250

248251
turbineScope {
249252
val turbine = database.currentStatus.asFlow().testIn(this)
@@ -276,7 +279,7 @@ class SyncProgressTest {
276279
@Test
277280
fun differentPriorities() =
278281
databaseTest {
279-
database.connect(connector)
282+
database.connect(connector, options = options)
280283

281284
turbineScope {
282285
val turbine = database.currentStatus.asFlow().testIn(this)
@@ -341,3 +344,6 @@ class SyncProgressTest {
341344
syncLines.close()
342345
}
343346
}
347+
348+
class LegacySyncProgressTest: BaseSyncProgressTest(false)
349+
class NewSyncProgressTest: BaseSyncProgressTest(true)

core/src/commonIntegrationTest/kotlin/com/powersync/testutils/TestUtils.kt

Lines changed: 7 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,5 @@
1+
@file:OptIn(LegacySyncImplementation::class)
2+
13
package com.powersync.testutils
24

35
import co.touchlab.kermit.ExperimentalKermitApi
@@ -7,14 +9,17 @@ import co.touchlab.kermit.Severity
79
import co.touchlab.kermit.TestConfig
810
import co.touchlab.kermit.TestLogWriter
911
import com.powersync.DatabaseDriverFactory
12+
import com.powersync.ExperimentalPowerSyncAPI
1013
import com.powersync.bucket.WriteCheckpointData
1114
import com.powersync.bucket.WriteCheckpointResponse
1215
import com.powersync.connectors.PowerSyncBackendConnector
1316
import com.powersync.connectors.PowerSyncCredentials
1417
import com.powersync.createPowerSyncDatabaseImpl
1518
import com.powersync.db.PowerSyncDatabaseImpl
1619
import com.powersync.db.schema.Schema
20+
import com.powersync.sync.LegacySyncImplementation
1721
import com.powersync.sync.SyncLine
22+
import com.powersync.sync.SyncOptions
1823
import dev.mokkery.answering.returns
1924
import dev.mokkery.everySuspend
2025
import dev.mokkery.mock
@@ -82,6 +87,7 @@ internal class ActiveDatabaseTest(
8287
),
8388
)
8489

90+
@OptIn(LegacySyncImplementation::class)
8591
var syncLines = Channel<SyncLine>()
8692
var checkpointResponse: () -> WriteCheckpointResponse = {
8793
WriteCheckpointResponse(WriteCheckpointData("1000"))
@@ -143,10 +149,7 @@ internal class ActiveDatabaseTest(
143149
item()
144150
}
145151

146-
var path = databaseName
147-
testDirectory?.let {
148-
path = Path(it, path).name
149-
}
152+
val path = Path(testDirectory, databaseName).name
150153
cleanup(path)
151154
}
152155
}
Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,6 @@
1+
package com.powersync
2+
3+
@RequiresOptIn(message = "This API is experimental and not covered by PowerSync semver releases. It can be changed at any time")
4+
@Retention(AnnotationRetention.BINARY)
5+
@Target(AnnotationTarget.CLASS, AnnotationTarget.FUNCTION, AnnotationTarget.CONSTRUCTOR)
6+
public annotation class ExperimentalPowerSyncAPI

core/src/commonMain/kotlin/com/powersync/PowerSyncDatabase.kt

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -95,7 +95,7 @@ public interface PowerSyncDatabase : Queries {
9595
crudThrottleMs: Long = 1000L,
9696
retryDelayMs: Long = 5000L,
9797
params: Map<String, JsonParam?> = emptyMap(),
98-
options: SyncOptions = SyncOptions()
98+
options: SyncOptions = SyncOptions.defaults
9999
)
100100

101101
/**

core/src/commonMain/kotlin/com/powersync/bucket/BucketChecksum.kt

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,10 @@
11
package com.powersync.bucket
22

3+
import com.powersync.sync.LegacySyncImplementation
34
import kotlinx.serialization.SerialName
45
import kotlinx.serialization.Serializable
56

7+
@LegacySyncImplementation
68
@Serializable
79
internal data class BucketChecksum(
810
val bucket: String,

0 commit comments

Comments
 (0)