@@ -2,6 +2,6 @@ namespace DotNetCore.CAP.MongoDB.Test | |||||
{ | { | ||||
public class ConnectionUtil | public class ConnectionUtil | ||||
{ | { | ||||
public static string ConnectionString = "mongodb://mongo1:27017,mongo2:27018,mongo3:27019/?replicaSet=my-mongo-set"; | |||||
public static string ConnectionString = "mongodb://localhost:27017"; | |||||
} | } | ||||
} | } |
@@ -0,0 +1,55 @@ | |||||
using System; | |||||
using System.Threading; | |||||
using Microsoft.Extensions.DependencyInjection; | |||||
using MongoDB.Driver; | |||||
namespace DotNetCore.CAP.MongoDB.Test | |||||
{ | |||||
public abstract class DatabaseTestHost : IDisposable | |||||
{ | |||||
private string _connectionString; | |||||
protected IServiceProvider Provider { get; private set; } | |||||
protected IMongoClient MongoClient => Provider.GetService<IMongoClient>(); | |||||
protected IMongoDatabase Database => MongoClient.GetDatabase(MongoDBOptions.DatabaseName); | |||||
protected CapOptions CapOptions => Provider.GetService<CapOptions>(); | |||||
protected MongoDBOptions MongoDBOptions => Provider.GetService<MongoDBOptions>(); | |||||
protected DatabaseTestHost() | |||||
{ | |||||
CreateServiceCollection(); | |||||
CreateDatabase(); | |||||
} | |||||
private void CreateDatabase() | |||||
{ | |||||
Provider.GetService<MongoDBStorage>().InitializeAsync(CancellationToken.None).GetAwaiter().GetResult(); | |||||
} | |||||
protected virtual void AddService(ServiceCollection serviceCollection) | |||||
{ | |||||
} | |||||
private void CreateServiceCollection() | |||||
{ | |||||
var services = new ServiceCollection(); | |||||
services.AddOptions(); | |||||
services.AddLogging(); | |||||
_connectionString = ConnectionUtil.ConnectionString; | |||||
services.AddSingleton(new MongoDBOptions() { DatabaseConnection = _connectionString }); | |||||
services.AddSingleton(new CapOptions()); | |||||
services.AddSingleton<IMongoClient>(x => new MongoClient(_connectionString)); | |||||
services.AddSingleton<MongoDBStorage>(); | |||||
AddService(services); | |||||
Provider = services.BuildServiceProvider(); | |||||
} | |||||
public void Dispose() | |||||
{ | |||||
MongoClient.DropDatabase(MongoDBOptions.DatabaseName); | |||||
} | |||||
} | |||||
} |
@@ -1,19 +1,18 @@ | |||||
<Project Sdk="Microsoft.NET.Sdk"> | |||||
<Project Sdk="Microsoft.NET.Sdk"> | |||||
<PropertyGroup> | <PropertyGroup> | ||||
<TargetFramework>netcoreapp2.1</TargetFramework> | <TargetFramework>netcoreapp2.1</TargetFramework> | ||||
<IsPackable>false</IsPackable> | <IsPackable>false</IsPackable> | ||||
</PropertyGroup> | </PropertyGroup> | ||||
<ItemGroup> | <ItemGroup> | ||||
<PackageReference Include="Microsoft.Extensions.DependencyInjection" Version="2.1.1" /> | |||||
<PackageReference Include="Microsoft.Extensions.Logging" Version="2.1.1" /> | |||||
<PackageReference Include="FluentAssertions" Version="5.4.1" /> | <PackageReference Include="FluentAssertions" Version="5.4.1" /> | ||||
<PackageReference Include="Microsoft.Extensions.Logging.Abstractions" Version="2.1.1" /> | <PackageReference Include="Microsoft.Extensions.Logging.Abstractions" Version="2.1.1" /> | ||||
<PackageReference Include="Microsoft.NET.Test.Sdk" Version="15.7.0" /> | |||||
<PackageReference Include="Microsoft.NET.Test.Sdk" Version="15.7.2" /> | |||||
<PackageReference Include="xunit" Version="2.3.1" /> | <PackageReference Include="xunit" Version="2.3.1" /> | ||||
<PackageReference Include="Xunit.Priority" Version="1.0.10" /> | |||||
<PackageReference Include="xunit.runner.visualstudio" Version="2.3.1" /> | |||||
<DotNetCliToolReference Include="dotnet-xunit" Version="2.3.1" /> | |||||
<PackageReference Include="xunit.runner.visualstudio" Version="2.3.1" /> | |||||
</ItemGroup> | </ItemGroup> | ||||
<ItemGroup> | <ItemGroup> | ||||
@@ -1,47 +1,36 @@ | |||||
using MongoDB.Driver; | |||||
using DotNetCore.CAP.MongoDB; | |||||
using Xunit; | |||||
using System; | using System; | ||||
using DotNetCore.CAP.Models; | |||||
using FluentAssertions; | |||||
using System.Linq; | |||||
using DotNetCore.CAP.Dashboard.Monitoring; | using DotNetCore.CAP.Dashboard.Monitoring; | ||||
using DotNetCore.CAP.Infrastructure; | using DotNetCore.CAP.Infrastructure; | ||||
using System.Linq; | |||||
using DotNetCore.CAP.Models; | |||||
using FluentAssertions; | |||||
using Xunit; | |||||
namespace DotNetCore.CAP.MongoDB.Test | namespace DotNetCore.CAP.MongoDB.Test | ||||
{ | { | ||||
public class MongoDBMonitoringApiTest | |||||
[Collection("MongoDB")] | |||||
public class MongoDBMonitoringApiTest : DatabaseTestHost | |||||
{ | { | ||||
private readonly MongoClient _client; | |||||
private readonly MongoDBOptions _options; | |||||
private readonly MongoDBMonitoringApi _api; | private readonly MongoDBMonitoringApi _api; | ||||
public MongoDBMonitoringApiTest() | public MongoDBMonitoringApiTest() | ||||
{ | { | ||||
_client = new MongoClient(ConnectionUtil.ConnectionString); | |||||
_options = new MongoDBOptions(); | |||||
_api = new MongoDBMonitoringApi(_client, _options); | |||||
_api = new MongoDBMonitoringApi(MongoClient, MongoDBOptions); | |||||
Init(); | |||||
} | |||||
private void Init() | |||||
{ | |||||
var helper = new MongoDBUtil(); | var helper = new MongoDBUtil(); | ||||
var database = _client.GetDatabase(_options.Database); | |||||
var collection = database.GetCollection<CapPublishedMessage>(_options.PublishedCollection); | |||||
collection.InsertMany(new CapPublishedMessage[] | |||||
var collection = Database.GetCollection<CapPublishedMessage>(MongoDBOptions.PublishedCollection); | |||||
collection.InsertMany(new[] | |||||
{ | { | ||||
new CapPublishedMessage | new CapPublishedMessage | ||||
{ | { | ||||
Id = helper.GetNextSequenceValue(database,_options.PublishedCollection), | |||||
Id = helper.GetNextSequenceValue(Database,MongoDBOptions.PublishedCollection), | |||||
Added = DateTime.Now.AddHours(-1), | Added = DateTime.Now.AddHours(-1), | ||||
StatusName = "Failed", | StatusName = "Failed", | ||||
Content = "abc" | Content = "abc" | ||||
}, | }, | ||||
new CapPublishedMessage | new CapPublishedMessage | ||||
{ | { | ||||
Id = helper.GetNextSequenceValue(database,_options.PublishedCollection), | |||||
Id = helper.GetNextSequenceValue(Database,MongoDBOptions.PublishedCollection), | |||||
Added = DateTime.Now, | Added = DateTime.Now, | ||||
StatusName = "Failed", | StatusName = "Failed", | ||||
Content = "bbc" | Content = "bbc" | ||||
@@ -1,63 +1,71 @@ | |||||
using System.Threading; | |||||
using System; | |||||
using DotNetCore.CAP.Infrastructure; | using DotNetCore.CAP.Infrastructure; | ||||
using DotNetCore.CAP.Models; | using DotNetCore.CAP.Models; | ||||
using FluentAssertions; | using FluentAssertions; | ||||
using Microsoft.Extensions.Logging.Abstractions; | |||||
using Microsoft.Extensions.DependencyInjection; | |||||
using MongoDB.Driver; | using MongoDB.Driver; | ||||
using Xunit; | using Xunit; | ||||
using Xunit.Priority; | |||||
namespace DotNetCore.CAP.MongoDB.Test | namespace DotNetCore.CAP.MongoDB.Test | ||||
{ | { | ||||
[TestCaseOrderer(PriorityOrderer.Name, PriorityOrderer.Assembly)] | |||||
public class MongoDBStorageConnectionTest | |||||
[Collection("MongoDB")] | |||||
public class MongoDBStorageConnectionTest : DatabaseTestHost | |||||
{ | { | ||||
private readonly MongoClient _client; | |||||
private readonly MongoDBOptions _options; | |||||
private readonly MongoDBStorage _storage; | |||||
private readonly IStorageConnection _connection; | |||||
private IStorageConnection _connection => | |||||
Provider.GetService<MongoDBStorage>().GetConnection(); | |||||
public MongoDBStorageConnectionTest() | |||||
{ | |||||
_client = new MongoClient(ConnectionUtil.ConnectionString); | |||||
_options = new MongoDBOptions(); | |||||
_storage = new MongoDBStorage(new CapOptions(), _options, _client, NullLogger<MongoDBStorage>.Instance); | |||||
_connection = _storage.GetConnection(); | |||||
} | |||||
[Fact, Priority(1)] | |||||
[Fact] | |||||
public async void StoreReceivedMessageAsync_TestAsync() | public async void StoreReceivedMessageAsync_TestAsync() | ||||
{ | { | ||||
await _storage.InitializeAsync(default(CancellationToken)); | |||||
var id = await | |||||
_connection.StoreReceivedMessageAsync(new CapReceivedMessage(new MessageContext | |||||
var id = await _connection.StoreReceivedMessageAsync(new CapReceivedMessage(new MessageContext | |||||
{ | { | ||||
Group = "test", | Group = "test", | ||||
Name = "test", | Name = "test", | ||||
Content = "test-content" | Content = "test-content" | ||||
})); | })); | ||||
id.Should().BeGreaterThan(0); | id.Should().BeGreaterThan(0); | ||||
} | } | ||||
[Fact, Priority(2)] | |||||
[Fact] | |||||
public void ChangeReceivedState_Test() | public void ChangeReceivedState_Test() | ||||
{ | { | ||||
var collection = _client.GetDatabase(_options.Database).GetCollection<CapReceivedMessage>(_options.ReceivedCollection); | |||||
StoreReceivedMessageAsync_TestAsync(); | |||||
var collection = Database.GetCollection<CapReceivedMessage>(MongoDBOptions.ReceivedCollection); | |||||
var msg = collection.Find(x => true).FirstOrDefault(); | var msg = collection.Find(x => true).FirstOrDefault(); | ||||
_connection.ChangeReceivedState(msg.Id, StatusName.Scheduled).Should().BeTrue(); | _connection.ChangeReceivedState(msg.Id, StatusName.Scheduled).Should().BeTrue(); | ||||
collection.Find(x => x.Id == msg.Id).FirstOrDefault()?.StatusName.Should().Be(StatusName.Scheduled); | collection.Find(x => x.Id == msg.Id).FirstOrDefault()?.StatusName.Should().Be(StatusName.Scheduled); | ||||
} | } | ||||
[Fact, Priority(3)] | |||||
[Fact] | |||||
public async void GetReceivedMessagesOfNeedRetry_TestAsync() | public async void GetReceivedMessagesOfNeedRetry_TestAsync() | ||||
{ | { | ||||
var msgs = await _connection.GetReceivedMessagesOfNeedRetry(); | var msgs = await _connection.GetReceivedMessagesOfNeedRetry(); | ||||
msgs.Should().BeEmpty(); | |||||
var msg = new CapReceivedMessage | |||||
{ | |||||
Group = "test", | |||||
Name = "test", | |||||
Content = "test-content", | |||||
StatusName = StatusName.Failed | |||||
}; | |||||
var id = await _connection.StoreReceivedMessageAsync(msg); | |||||
var collection = Database.GetCollection<CapReceivedMessage>(MongoDBOptions.ReceivedCollection); | |||||
var updateDef = Builders<CapReceivedMessage> | |||||
.Update.Set(x => x.Added, DateTime.Now.AddMinutes(-5)); | |||||
await collection.UpdateOneAsync(x => x.Id == id, updateDef); | |||||
msgs = await _connection.GetReceivedMessagesOfNeedRetry(); | |||||
msgs.Should().HaveCountGreaterThan(0); | msgs.Should().HaveCountGreaterThan(0); | ||||
} | } | ||||
[Fact, Priority(4)] | |||||
[Fact] | |||||
public void GetReceivedMessageAsync_Test() | public void GetReceivedMessageAsync_Test() | ||||
{ | { | ||||
var msg = _connection.GetReceivedMessageAsync(1); | var msg = _connection.GetReceivedMessageAsync(1); | ||||
@@ -1,38 +1,29 @@ | |||||
using System.Threading; | |||||
using FluentAssertions; | using FluentAssertions; | ||||
using Microsoft.Extensions.Logging.Abstractions; | |||||
using Microsoft.Extensions.DependencyInjection; | |||||
using MongoDB.Bson; | using MongoDB.Bson; | ||||
using MongoDB.Driver; | using MongoDB.Driver; | ||||
using Xunit; | using Xunit; | ||||
namespace DotNetCore.CAP.MongoDB.Test | namespace DotNetCore.CAP.MongoDB.Test | ||||
{ | { | ||||
public class MongoDBStorageTest | |||||
[Collection("MongoDB")] | |||||
public class MongoDBStorageTest : DatabaseTestHost | |||||
{ | { | ||||
private readonly MongoClient _client; | |||||
public MongoDBStorageTest() | |||||
{ | |||||
_client = new MongoClient(ConnectionUtil.ConnectionString); | |||||
} | |||||
[Fact] | [Fact] | ||||
public async void InitializeAsync_Test() | |||||
public void InitializeAsync_Test() | |||||
{ | { | ||||
var options = new MongoDBOptions(); | |||||
var storage = new MongoDBStorage(new CapOptions(), options, _client, NullLogger<MongoDBStorage>.Instance); | |||||
await storage.InitializeAsync(default(CancellationToken)); | |||||
var names = _client.ListDatabaseNames()?.ToList(); | |||||
names.Should().Contain(options.Database); | |||||
var storage = Provider.GetService<MongoDBStorage>(); | |||||
var names = MongoClient.ListDatabaseNames()?.ToList(); | |||||
names.Should().Contain(MongoDBOptions.DatabaseName); | |||||
var collections = _client.GetDatabase(options.Database).ListCollectionNames()?.ToList(); | |||||
collections.Should().Contain(options.PublishedCollection); | |||||
collections.Should().Contain(options.ReceivedCollection); | |||||
collections.Should().Contain("Counter"); | |||||
var collections = Database.ListCollectionNames()?.ToList(); | |||||
collections.Should().Contain(MongoDBOptions.PublishedCollection); | |||||
collections.Should().Contain(MongoDBOptions.ReceivedCollection); | |||||
collections.Should().Contain(MongoDBOptions.CounterCollection); | |||||
var collection = _client.GetDatabase(options.Database).GetCollection<BsonDocument>("Counter"); | |||||
collection.CountDocuments(new BsonDocument { { "_id", options.PublishedCollection } }).Should().Be(1); | |||||
collection.CountDocuments(new BsonDocument { { "_id", options.ReceivedCollection } }).Should().Be(1); | |||||
var collection = Database.GetCollection<BsonDocument>(MongoDBOptions.CounterCollection); | |||||
collection.CountDocuments(new BsonDocument { { "_id", MongoDBOptions.PublishedCollection } }).Should().Be(1); | |||||
collection.CountDocuments(new BsonDocument { { "_id", MongoDBOptions.ReceivedCollection } }).Should().Be(1); | |||||
} | } | ||||
} | } | ||||
} | } |
@@ -6,23 +6,17 @@ using Xunit; | |||||
namespace DotNetCore.CAP.MongoDB.Test | namespace DotNetCore.CAP.MongoDB.Test | ||||
{ | { | ||||
public class MongoDBTest | |||||
[Collection("MongoDB")] | |||||
public class MongoDBTransactionTest : DatabaseTestHost | |||||
{ | { | ||||
private readonly MongoClient _client; | |||||
public MongoDBTest() | |||||
{ | |||||
_client = new MongoClient(ConnectionUtil.ConnectionString); | |||||
} | |||||
[Fact] | [Fact] | ||||
public void MongoDB_Connection_Test() | public void MongoDB_Connection_Test() | ||||
{ | { | ||||
var names = _client.ListDatabaseNames(); | |||||
var names = MongoClient.ListDatabaseNames(); | |||||
names.ToList().Should().NotBeNullOrEmpty(); | names.ToList().Should().NotBeNullOrEmpty(); | ||||
} | } | ||||
[Fact] | |||||
[Fact(Skip = "Because of Appveyor dose not support MongoDB 4.0, so we skip this test for now.")] | |||||
public void Transaction_Test() | public void Transaction_Test() | ||||
{ | { | ||||
var document = new BsonDocument | var document = new BsonDocument | ||||
@@ -36,10 +30,10 @@ namespace DotNetCore.CAP.MongoDB.Test | |||||
{ "y", 102 } | { "y", 102 } | ||||
}} | }} | ||||
}; | }; | ||||
var db = _client.GetDatabase("test"); | |||||
var db = MongoClient.GetDatabase("test"); | |||||
var collection1 = db.GetCollection<BsonDocument>("test1"); | var collection1 = db.GetCollection<BsonDocument>("test1"); | ||||
var collection2 = db.GetCollection<BsonDocument>("test2"); | var collection2 = db.GetCollection<BsonDocument>("test2"); | ||||
using (var sesstion = _client.StartSession()) | |||||
using (var sesstion = MongoClient.StartSession()) | |||||
{ | { | ||||
sesstion.StartTransaction(); | sesstion.StartTransaction(); | ||||
collection1.InsertOne(document); | collection1.InsertOne(document); | ||||
@@ -51,7 +45,7 @@ namespace DotNetCore.CAP.MongoDB.Test | |||||
collection2.CountDocuments(filter).Should().BeGreaterThan(0); | collection2.CountDocuments(filter).Should().BeGreaterThan(0); | ||||
} | } | ||||
[Fact] | |||||
[Fact(Skip = "Because of Appveyor dose not support MongoDB 4.0, so we skip this test for now.")] | |||||
public void Transaction_Rollback_Test() | public void Transaction_Rollback_Test() | ||||
{ | { | ||||
var document = new BsonDocument | var document = new BsonDocument | ||||
@@ -59,12 +53,12 @@ namespace DotNetCore.CAP.MongoDB.Test | |||||
{"name", "MongoDB"}, | {"name", "MongoDB"}, | ||||
{"date", DateTimeOffset.Now.ToString()} | {"date", DateTimeOffset.Now.ToString()} | ||||
}; | }; | ||||
var db = _client.GetDatabase("test"); | |||||
var db = MongoClient.GetDatabase("test"); | |||||
var collection = db.GetCollection<BsonDocument>("test3"); | var collection = db.GetCollection<BsonDocument>("test3"); | ||||
var collection4 = db.GetCollection<BsonDocument>("test4"); | var collection4 = db.GetCollection<BsonDocument>("test4"); | ||||
using (var session = _client.StartSession()) | |||||
using (var session = MongoClient.StartSession()) | |||||
{ | { | ||||
session.IsInTransaction.Should().BeFalse(); | session.IsInTransaction.Should().BeFalse(); | ||||
session.StartTransaction(); | session.StartTransaction(); |
@@ -1,36 +1,17 @@ | |||||
using System.Collections.Concurrent; | using System.Collections.Concurrent; | ||||
using System.Linq; | |||||
using System.Threading.Tasks; | using System.Threading.Tasks; | ||||
using DotNetCore.CAP.Models; | |||||
using FluentAssertions; | using FluentAssertions; | ||||
using MongoDB.Bson; | |||||
using MongoDB.Driver; | |||||
using Xunit; | using Xunit; | ||||
namespace DotNetCore.CAP.MongoDB.Test | namespace DotNetCore.CAP.MongoDB.Test | ||||
{ | { | ||||
public class MongoDBUtilTest | |||||
[Collection("MongoDB")] | |||||
public class MongoDBUtilTest : DatabaseTestHost | |||||
{ | { | ||||
private readonly IMongoDatabase _database; | |||||
string _recieved = "ReceivedTest"; | |||||
public MongoDBUtilTest() | |||||
{ | |||||
var client = new MongoClient(ConnectionUtil.ConnectionString); | |||||
_database = client.GetDatabase("CAP_Test"); | |||||
//Initialize MongoDB | |||||
if (_database.ListCollectionNames().ToList().All(x => x != "Counter")) | |||||
{ | |||||
var collection = _database.GetCollection<BsonDocument>("Counter"); | |||||
collection.InsertOne(new BsonDocument { { "_id", _recieved }, { "sequence_value", 0 } }); | |||||
} | |||||
} | |||||
[Fact] | [Fact] | ||||
public async void GetNextSequenceValueAsync_Test() | public async void GetNextSequenceValueAsync_Test() | ||||
{ | { | ||||
var id = await new MongoDBUtil().GetNextSequenceValueAsync(_database, _recieved); | |||||
var id = await new MongoDBUtil().GetNextSequenceValueAsync(Database, MongoDBOptions.ReceivedCollection); | |||||
id.Should().BeGreaterThan(0); | id.Should().BeGreaterThan(0); | ||||
} | } | ||||
@@ -40,7 +21,7 @@ namespace DotNetCore.CAP.MongoDB.Test | |||||
var dic = new ConcurrentDictionary<int, int>(); | var dic = new ConcurrentDictionary<int, int>(); | ||||
Parallel.For(0, 30, (x) => | Parallel.For(0, 30, (x) => | ||||
{ | { | ||||
var id = new MongoDBUtil().GetNextSequenceValue(_database, _recieved); | |||||
var id = new MongoDBUtil().GetNextSequenceValue(Database, MongoDBOptions.ReceivedCollection); | |||||
id.Should().BeGreaterThan(0); | id.Should().BeGreaterThan(0); | ||||
dic.TryAdd(id, x).Should().BeTrue(); //The id shouldn't be same. | dic.TryAdd(id, x).Should().BeTrue(); //The id shouldn't be same. | ||||
}); | }); | ||||