public async Task Rebuild_Change_Culture_Error() { using (var file = new TempFile()) using (var db = new LiteDatabaseAsync(file.Filename)) { // remove string comparer ignore case await db.RebuildAsync(new RebuildOptions { Collation = new Collation("en-US/None") }); // insert 2 documents with different ID in case sensitive await db.GetCollection("col1").InsertAsync(new BsonDocument[] { new BsonDocument { ["_id"] = "ana" }, new BsonDocument { ["_id"] = "ANA" } }); // try migrate to ignorecase this.Invoking(async x => { await db.RebuildAsync(new RebuildOptions { Collation = new Collation("en-US/IgnoreCase") }); }).Should().Throw <LiteAsyncException>(); // test if current pragma still with collation none (await db.PragmaAsync(Pragmas.COLLATION)).AsString.Should().Be("en-US/None"); } }
public async Task Transaction_Write_Lock_Timeout() { var data1 = DataGen.Person(1, 100).ToArray(); var data2 = DataGen.Person(101, 200).ToArray(); using (var db = new LiteDatabase("filename=:memory:")) using (var asyncDb = new LiteDatabaseAsync(db, false)) { // small timeout await asyncDb.PragmaAsync(Pragmas.TIMEOUT, 1); var asyncPerson = asyncDb.GetCollection <Person>(); var person = db.GetCollection <Person>(); // init person collection with 100 document await asyncPerson.InsertAsync(data1); var taskASemaphore = new SemaphoreSlim(0, 1); var taskBSemaphore = new SemaphoreSlim(0, 1); // task A will open transaction and will insert +100 documents // but will commit only 2s later var ta = Task.Run(async() => { await asyncDb.BeginTransAsync(); await asyncPerson.InsertAsync(data2); taskBSemaphore.Release(); taskASemaphore.Wait(); var count = await asyncPerson.CountAsync(); count.Should().Be(data1.Length + data2.Length); await asyncDb.CommitAsync(); }); // task B will try delete all documents but will be locked during 1 second var tb = Task.Run(() => { taskBSemaphore.Wait(); db.BeginTrans(); person .Invoking(personCol => personCol.DeleteMany("1 = 1")) .Should() .Throw <LiteException>() .Where(ex => ex.ErrorCode == LiteException.LOCK_TIMEOUT); taskASemaphore.Release(); }); await Task.WhenAll(ta, tb); } }