blob: 65fa4d432585987db6ef1c2a5343f181e68ebc30 [file] [log] [blame]
// Copyright 2016 The Vanadium Authors. All rights reserved.
// Use of this source code is governed by a BSD-style
// license that can be found in the LICENSE file.
import XCTest
@testable import Syncbase
import enum Syncbase.Syncbase
@testable import SyncbaseCore
let testQueue = dispatch_queue_create("SyncbaseQueue", DISPATCH_QUEUE_SERIAL)
class BasicDatabaseTests: XCTestCase {
override class func setUp() {
configureDb(disableUserdataSyncgroup: true, disableSyncgroupPublishing: true)
}
override class func tearDown() {
Syncbase.shutdown()
}
func testDatabaseInit() {
withDb { db in
// Must be idempotent.
try db.createIfMissing()
try db.createIfMissing()
}
}
func testCollection() {
withDb { db in
var collections = try db.collections()
XCTAssertEqual(collections.count, 0)
let collection = try db.collection("collection1")
// Must be idempotent.
try collection.createIfMissing()
try collection.createIfMissing()
collections = try db.collections()
XCTAssertEqual(collections.count, 1)
// Should be empty.
XCTAssertFalse(try collection.exists("a"))
try collection.destroy()
collections = try db.collections()
XCTAssertEqual(collections.count, 0)
}
}
// TODO(zinman): Add more unit tests.
}
class SyncgroupTests: XCTestCase {
override class func setUp() {
configureDb(disableUserdataSyncgroup: false, disableSyncgroupPublishing: true)
}
override class func tearDown() {
Syncbase.shutdown()
}
func testUserdata() {
withDb { db in
let coreCollections = try db.coreDatabase.listCollections()
XCTAssertEqual(coreCollections.count, 1)
XCTAssertEqual(coreCollections[0].name, Syncbase.USERDATA_SYNCGROUP_NAME)
// Expect filtered from HLAPI
let collections = try db.collections()
XCTAssertEqual(collections.count, 0)
let coreSyncgroups = try db.coreDatabase.listSyncgroups()
XCTAssertEqual(coreSyncgroups.count, 1)
XCTAssertEqual(coreSyncgroups[0].name, Syncbase.USERDATA_SYNCGROUP_NAME)
// Expect filtered from HLAPI
let syncgroups = try db.syncgroups()
XCTAssertEqual(syncgroups.count, 0)
let verSpec = try db.coreDatabase.syncgroup(Syncbase.USERDATA_SYNCGROUP_NAME).getSpec()
XCTAssertEqual(verSpec.spec.collections.count, 1)
// TODO(razvanm): Make the userdata syncgroup private.
XCTAssertEqual(verSpec.spec.isPrivate, false)
}
}
func testWatchIgnoresUserData() {
withDb { db in
var semaphore = dispatch_semaphore_create(0)
// Nothing for a generic watch.
try db.addWatchChangeHandler(handler: WatchChangeHandler(
onInitialState: { changes in
XCTAssertEqual(changes.count, 0)
dispatch_semaphore_signal(semaphore)
},
onChangeBatch: { changes in
XCTFail("Unexpected changes: \(changes)") },
onError: { err in
XCTFail("Unexpected error: \(err)")
}))
dispatch_semaphore_wait(semaphore, DISPATCH_TIME_FOREVER)
// TODO(zinman): Add this when we support canceling watches.
// db.removeAllWatchChangeHandlers()
// Userdata only appears when explicitly asking for it.
semaphore = dispatch_semaphore_create(0)
try db.addUserDataWatchChangeHandler(
handler: WatchChangeHandler(
onInitialState: { changes in
XCTAssertEqual(changes.count, 1)
XCTAssert(changes[0].collectionId?.name == Syncbase.USERDATA_SYNCGROUP_NAME)
dispatch_semaphore_signal(semaphore)
},
onChangeBatch: { changes in
XCTFail("Unexpected changes: \(changes)") },
onError: { err in
XCTFail("Unexpected error: \(err)")
}))
dispatch_semaphore_wait(semaphore, DISPATCH_TIME_FOREVER)
}
}
}