public async Task Stream_CreateCollectionWithOptions() { var tailer = new Tailer(m_client); IOutlet outlet = Substitute.For <IOutlet>(); var stream = new Stream(tailer, outlet); Oplog lastOplog = await tailer.GetMostRecentOplog(); var collectionOptions = new CreateCollectionOptions { Capped = true, MaxSize = 10 }; var collectionOptionsDocument = new BsonDocument(new List <BsonElement> { new BsonElement("capped", true), new BsonElement("size", 10) }); var databaseName = "_Test_MongoRiver"; var collectionName = "_Test_MongoRiver"; IMongoDatabase database = m_client.GetDatabase(databaseName); await database.CreateCollectionAsync(collectionName, collectionOptions); await m_client.DropDatabaseAsync(databaseName); await RunStream(stream, lastOplog); outlet.Received(2).UpdateOptime(Arg.Any <BsonTimestamp>()); Received.InOrder(() => { outlet.CreateCollection(databaseName, collectionName, collectionOptionsDocument); outlet.DeleteDatabase(databaseName); }); }
/// <summary> /// Run stream for 5 seconds. /// </summary> private async Task RunStream(Stream stream, Oplog startOplog) { var task = stream.RunForever(startOplog); await Task.WhenAny(task, Task.Delay(5000)); stream.Stop(); }
public async Task Stream_IgnoresEverythingBeforeOperationPassedIn() { var tailer = new Tailer(m_client); IOutlet outlet = Substitute.For <IOutlet>(); var stream = new Stream(tailer, outlet); var databaseName = "_Test_MongoRiver"; var collectionName = "_Test_MongoRiver"; var insertedDocument = new FooBarDocument { Id = "foo", Bar = "baz" }; IMongoDatabase database = m_client.GetDatabase(databaseName); IMongoCollection <FooBarDocument> collection = database.GetCollection <FooBarDocument>(collectionName); await collection.InsertOneAsync(insertedDocument); // Need a little delay to make sure previous insert is available in the oplog await Task.Delay(100); Oplog lastOplog = await tailer.GetMostRecentOplog(); await m_client.DropDatabaseAsync(databaseName); await RunStream(stream, lastOplog); outlet.Received(1).UpdateOptime(Arg.Any <BsonTimestamp>()); outlet.DidNotReceive().Insert(databaseName, collectionName, insertedDocument.ToBsonDocument()); outlet.Received().DeleteDatabase(databaseName); }
public async Task Stream_IgnoresEverythingBeforeTimestampPassedIn() { var tailer = new Tailer(m_client); IOutlet outlet = Substitute.For <IOutlet>(); var stream = new Stream(tailer, outlet); var databaseName = "_Test_MongoRiver"; var collectionName = "_Test_MongoRiver"; var insertedDocument = new FooBarDocument { Id = "foo", Bar = "baz" }; var filterDocument = new BsonDocument("_id", "foo"); var updatedDocument = new FooBarDocument { Id = "foo", Bar = "qux" }; IMongoDatabase database = m_client.GetDatabase(databaseName); IMongoCollection <FooBarDocument> collection = database.GetCollection <FooBarDocument>(collectionName); await collection.InsertOneAsync(insertedDocument); await collection.ReplaceOneAsync(filterDocument, updatedDocument); Oplog lastOplog = await tailer.GetMostRecentOplog(DateTime.UtcNow.AddSeconds(-3)); await m_client.DropDatabaseAsync(databaseName); await RunStream(stream, lastOplog); outlet.Received(4).UpdateOptime(Arg.Any <BsonTimestamp>()); outlet.Received().Insert(databaseName, collectionName, insertedDocument.ToBsonDocument()); outlet.Received().Update(databaseName, collectionName, filterDocument.ToBsonDocument(), updatedDocument.ToBsonDocument()); outlet.Received().DeleteDatabase(databaseName); }
public static Result AddOplog(int userId, string content, OpType type) { LogHelper.WriteInfo(string.Format("********【操作】:{0}", content)); if (content.Length > 250) { content = content.Substring(0, 250); } var log = new Oplog() { UserId = userId, Content = content, OpType = type, Time = DateTime.Now }; try { using (var db = new App.AppContext()) { db.Oplogs.Add(log); db.SaveChanges(); } } catch (Exception ex) { return(new Result(ex.Message)); } return(Result.Success); }
public void Stream_HandleOperationDelete() { var filterDocument = new BsonDocument("_id", "baz"); Oplog op = CreateOperation("foo.bar", "d", filterDocument); m_stream.HandleOperation(op); m_outlet.Received(1).Delete("foo", "bar", filterDocument); m_outlet.Received(1).UpdateOptime(m_timestamp); }
public void Stream_HandleOperationInsert() { var insertedDocument = new BsonDocument("_id", "baz"); Oplog op = CreateOperation("foo.bar", "i", insertedDocument); m_stream.HandleOperation(op); m_outlet.Received(1).Insert("foo", "bar", insertedDocument); m_outlet.Received(1).UpdateOptime(m_timestamp); }
public void Stream_HandleOperationDeleteDatabase() { var deleteDocument = new BsonDocument("dropDatabase", 1); Oplog op = CreateOperation("foo.$cmd", "c", deleteDocument); m_stream.HandleOperation(op); m_outlet.Received(1).DeleteDatabase("foo"); m_outlet.Received(1).UpdateOptime(m_timestamp); }
public void Stream_HandleOperationDeleteCollection() { var deleteDocument = new BsonDocument(new BsonElement("drop", "bar")); Oplog op = CreateOperation("foo.$cmd", "c", deleteDocument); m_stream.HandleOperation(op); m_outlet.Received(1).DeleteCollection("foo", "bar"); m_outlet.Received(1).UpdateOptime(m_timestamp); }
public void Stream_HandleOperationRenameCollection() { var renameDocument = new BsonDocument(new List <BsonElement> { new BsonElement("renameCollection", "foo.bar"), new BsonElement("to", "foo.bar_2") }); Oplog op = CreateOperation("admin.$cmd", "c", renameDocument); m_stream.HandleOperation(op); m_outlet.Received(1).RenameCollection("foo", "bar", "bar_2"); m_outlet.Received(1).UpdateOptime(m_timestamp); }
public void Stream_HandleOperationDeleteIndex() { var deleteDocument = new BsonDocument(new List <BsonElement> { new BsonElement("dropIndexes", "bar"), new BsonElement("index", "baz_1") }); Oplog op = CreateOperation("foo.$cmd", "c", deleteDocument); m_stream.HandleOperation(op); m_outlet.Received(1).DeleteIndex("foo", "bar", "baz_1"); m_outlet.Received(1).UpdateOptime(m_timestamp); }
private void Send(Oplog oplog) { using (var channel = _rabbitConnection.CreateModel()) { channel.ExchangeDeclare(LogCreatedExchange, "fanout", true); var properties = channel.CreateBasicProperties(); properties.Persistent = true; properties.MessageId = Guid.NewGuid().ToString("N"); properties.Timestamp = new AmqpTimestamp(DateTimeOffset.UtcNow.ToUnixTimeMilliseconds()); var logCreatedEvent = new LogCreatedEvent { Oplog = oplog }; var json = _jsonUtil.SerializeObject(logCreatedEvent); channel.BasicPublish(LogCreatedExchange, string.Empty, properties, json.StringToBytes()); } }
public void Stream_HandleOperationCreateIndex() { var indexKeyDocument = new BsonDocument("baz", 1); var optionsDocument = new BsonDocument(new List <BsonElement> { new BsonElement("_id", "index_id"), new BsonElement("name", "baz_1"), new BsonElement("ns", "foo.bar"), new BsonElement("key", indexKeyDocument) }); var receivedOptionsDocument = new BsonDocument("name", "baz_1"); Oplog op = CreateOperation("foo.system.indexes", "i", optionsDocument); m_stream.HandleOperation(op); m_outlet.Received(1).CreateIndex("foo", "bar", indexKeyDocument, receivedOptionsDocument); m_outlet.Received(1).UpdateOptime(m_timestamp); }
public void Stream_HandleOperationCreateCollection() { var createDocument = new BsonDocument(new List <BsonElement> { new BsonElement("create", "bar"), new BsonElement("capped", true), new BsonElement("size", 10) }); var receivedCreateDocument = new BsonDocument(new List <BsonElement> { new BsonElement("capped", true), new BsonElement("size", 10) }); Oplog op = CreateOperation("foo.$cmd", "c", createDocument); m_stream.HandleOperation(op); m_outlet.Received(1).CreateCollection("foo", "bar", receivedCreateDocument); m_outlet.Received(1).UpdateOptime(m_timestamp); }
public async Task Stream_ExecuteCorrectOperationsInCorrectOrder() { var tailer = new Tailer(m_client); IOutlet outlet = Substitute.For <IOutlet>(); var stream = new Stream(tailer, outlet); Oplog lastOplog = await tailer.GetMostRecentOplog(); var databaseName = "_Test_MongoRiver"; var collectionName = "_Test_MongoRiver"; var newCollectionName = string.Concat(collectionName, "_foo"); var insertedDocument = new FooBarDocument { Id = "foo", Bar = "baz" }; var filterDocument = new BsonDocument("_id", "foo"); var updatedDocument = new FooBarDocument { Id = "foo", Bar = "qux" }; var indexName = "FooBar_Index"; var indexKeyDocument = new BsonDocument("Bar", 1); var indexOptionsDocument = new BsonDocument("name", indexName); IMongoDatabase database = m_client.GetDatabase(databaseName); IMongoCollection <FooBarDocument> collection = database.GetCollection <FooBarDocument>(collectionName); await collection.InsertOneAsync(insertedDocument); await collection.ReplaceOneAsync(filterDocument, updatedDocument); await collection.DeleteOneAsync(filterDocument); IndexKeysDefinition <FooBarDocument> indexDef = new IndexKeysDefinitionBuilder <FooBarDocument>().Ascending(d => d.Bar); await collection.Indexes.CreateOneAsync(indexDef, new CreateIndexOptions { Name = indexName }); await collection.Indexes.DropOneAsync(indexName); await database.RenameCollectionAsync(collectionName, newCollectionName); await database.DropCollectionAsync(newCollectionName); await m_client.DropDatabaseAsync(databaseName); await RunStream(stream, lastOplog); outlet.Received(9).UpdateOptime(Arg.Any <BsonTimestamp>()); Received.InOrder(() => { outlet.CreateCollection(databaseName, collectionName, new BsonDocument()); outlet.Insert(databaseName, collectionName, insertedDocument.ToBsonDocument()); outlet.Update(databaseName, collectionName, filterDocument, updatedDocument.ToBsonDocument()); outlet.Delete(databaseName, collectionName, filterDocument); outlet.CreateIndex(databaseName, collectionName, indexKeyDocument, indexOptionsDocument); outlet.DeleteIndex(databaseName, collectionName, indexName); outlet.RenameCollection(databaseName, collectionName, newCollectionName); outlet.DeleteCollection(databaseName, newCollectionName); outlet.DeleteDatabase(databaseName); }); }