diff --git a/src/NServiceBus.Persistence.CosmosDB.LogicalOutbox.AcceptanceTests/NServiceBus.Persistence.CosmosDB.LogicalOutbox.AcceptanceTests.csproj b/src/NServiceBus.Persistence.CosmosDB.LogicalOutbox.AcceptanceTests/NServiceBus.Persistence.CosmosDB.LogicalOutbox.AcceptanceTests.csproj index ff10bd52..bb206555 100644 --- a/src/NServiceBus.Persistence.CosmosDB.LogicalOutbox.AcceptanceTests/NServiceBus.Persistence.CosmosDB.LogicalOutbox.AcceptanceTests.csproj +++ b/src/NServiceBus.Persistence.CosmosDB.LogicalOutbox.AcceptanceTests/NServiceBus.Persistence.CosmosDB.LogicalOutbox.AcceptanceTests.csproj @@ -11,6 +11,7 @@ + diff --git a/src/NServiceBus.Persistence.CosmosDB.LogicalOutbox.AcceptanceTests/SetupFixture.cs b/src/NServiceBus.Persistence.CosmosDB.LogicalOutbox.AcceptanceTests/SetupFixture.cs index 2e518590..250e3f87 100644 --- a/src/NServiceBus.Persistence.CosmosDB.LogicalOutbox.AcceptanceTests/SetupFixture.cs +++ b/src/NServiceBus.Persistence.CosmosDB.LogicalOutbox.AcceptanceTests/SetupFixture.cs @@ -16,9 +16,7 @@ public class SetupFixture [OneTimeSetUp] public async Task OneTimeSetUp() { - var connectionStringEnvironmentVariableName = "CosmosDBPersistence_ConnectionString"; - var connectionString = GetEnvironmentVariable(connectionStringEnvironmentVariableName, - fallbackEmulatorConnectionString: "AccountEndpoint = https://localhost:8081/;AccountKey=C2y6yDjf5/R+ob0N8A7Cgv30VRDJIWEHLM+4QDU5DE2nQ9nDuVTqobD4b8mGGyPMbIZnqyMsEcaGQy67XIw/Jw=="); + var connectionString = GetConnectionStringOrFallback(); ContainerName = $"{DateTime.UtcNow.Ticks}_{Path.GetFileNameWithoutExtension(Path.GetTempFileName())}"; @@ -51,14 +49,17 @@ public async Task OneTimeTearDown() CosmosDbClient.Dispose(); } - static string GetEnvironmentVariable(string variable, string fallbackEmulatorConnectionString) + public static string GetConnectionStringOrFallback(string environmentVariableName = "CosmosDBPersistence_ConnectionString", string fallbackEmulatorConnectionString = EmulatorConnectionString) { - var candidate = Environment.GetEnvironmentVariable(variable, EnvironmentVariableTarget.User); - var environmentVariableConnectionString = string.IsNullOrWhiteSpace(candidate) ? Environment.GetEnvironmentVariable(variable) : candidate; + var candidate = Environment.GetEnvironmentVariable(environmentVariableName, EnvironmentVariableTarget.User); + var environmentVariableConnectionString = string.IsNullOrWhiteSpace(candidate) ? Environment.GetEnvironmentVariable(environmentVariableName) : candidate; return string.IsNullOrEmpty(environmentVariableConnectionString) ? fallbackEmulatorConnectionString : environmentVariableConnectionString; } + public static bool IsRunningWithEmulator => GetConnectionStringOrFallback() == EmulatorConnectionString; + + const string EmulatorConnectionString = "AccountEndpoint = https://localhost:8081/;AccountKey=C2y6yDjf5/R+ob0N8A7Cgv30VRDJIWEHLM+4QDU5DE2nQ9nDuVTqobD4b8mGGyPMbIZnqyMsEcaGQy67XIw/Jw=="; public const string DatabaseName = "CosmosDBPersistence"; public const string PartitionPathKey = "/deep/down"; public static string ContainerName; diff --git a/src/NServiceBus.Persistence.CosmosDB.NonTransactionalSagas.AcceptanceTests/NServiceBus.Persistence.CosmosDB.NonTransactionalSagas.AcceptanceTests.csproj b/src/NServiceBus.Persistence.CosmosDB.NonTransactionalSagas.AcceptanceTests/NServiceBus.Persistence.CosmosDB.NonTransactionalSagas.AcceptanceTests.csproj index bd935989..79b3d686 100644 --- a/src/NServiceBus.Persistence.CosmosDB.NonTransactionalSagas.AcceptanceTests/NServiceBus.Persistence.CosmosDB.NonTransactionalSagas.AcceptanceTests.csproj +++ b/src/NServiceBus.Persistence.CosmosDB.NonTransactionalSagas.AcceptanceTests/NServiceBus.Persistence.CosmosDB.NonTransactionalSagas.AcceptanceTests.csproj @@ -11,6 +11,7 @@ + diff --git a/src/NServiceBus.Persistence.CosmosDB.NonTransactionalSagas.AcceptanceTests/SetupFixture.cs b/src/NServiceBus.Persistence.CosmosDB.NonTransactionalSagas.AcceptanceTests/SetupFixture.cs index 00faa23f..64e966ce 100644 --- a/src/NServiceBus.Persistence.CosmosDB.NonTransactionalSagas.AcceptanceTests/SetupFixture.cs +++ b/src/NServiceBus.Persistence.CosmosDB.NonTransactionalSagas.AcceptanceTests/SetupFixture.cs @@ -16,9 +16,7 @@ public class SetupFixture [OneTimeSetUp] public async Task OneTimeSetUp() { - var connectionStringEnvironmentVariableName = "CosmosDBPersistence_ConnectionString"; - var connectionString = GetEnvironmentVariable(connectionStringEnvironmentVariableName, - fallbackEmulatorConnectionString: "AccountEndpoint=https://localhost:8081/;AccountKey=C2y6yDjf5/R+ob0N8A7Cgv30VRDJIWEHLM+4QDU5DE2nQ9nDuVTqobD4b8mGGyPMbIZnqyMsEcaGQy67XIw/Jw=="); + var connectionString = GetConnectionStringOrFallback(); ContainerName = $"{DateTime.UtcNow.Ticks}_{Path.GetFileNameWithoutExtension(Path.GetTempFileName())}"; @@ -51,14 +49,17 @@ public async Task OneTimeTearDown() CosmosDbClient.Dispose(); } - static string GetEnvironmentVariable(string variable, string fallbackEmulatorConnectionString) + public static string GetConnectionStringOrFallback(string environmentVariableName = "CosmosDBPersistence_ConnectionString", string fallbackEmulatorConnectionString = EmulatorConnectionString) { - var candidate = Environment.GetEnvironmentVariable(variable, EnvironmentVariableTarget.User); - var environmentVariableConnectionString = string.IsNullOrWhiteSpace(candidate) ? Environment.GetEnvironmentVariable(variable) : candidate; + var candidate = Environment.GetEnvironmentVariable(environmentVariableName, EnvironmentVariableTarget.User); + var environmentVariableConnectionString = string.IsNullOrWhiteSpace(candidate) ? Environment.GetEnvironmentVariable(environmentVariableName) : candidate; return string.IsNullOrEmpty(environmentVariableConnectionString) ? fallbackEmulatorConnectionString : environmentVariableConnectionString; } + public static bool IsRunningWithEmulator => GetConnectionStringOrFallback() == EmulatorConnectionString; + + const string EmulatorConnectionString = "AccountEndpoint = https://localhost:8081/;AccountKey=C2y6yDjf5/R+ob0N8A7Cgv30VRDJIWEHLM+4QDU5DE2nQ9nDuVTqobD4b8mGGyPMbIZnqyMsEcaGQy67XIw/Jw=="; public const string DatabaseName = "CosmosDBPersistence"; public const string PartitionPathKey = "/id"; public static string ContainerName; diff --git a/src/NServiceBus.Persistence.CosmosDB.PessimisticLock.AcceptanceTests/NServiceBus.Persistence.CosmosDB.PessimisticLock.AcceptanceTests.csproj b/src/NServiceBus.Persistence.CosmosDB.PessimisticLock.AcceptanceTests/NServiceBus.Persistence.CosmosDB.PessimisticLock.AcceptanceTests.csproj index 292aa5dc..8e86fe69 100644 --- a/src/NServiceBus.Persistence.CosmosDB.PessimisticLock.AcceptanceTests/NServiceBus.Persistence.CosmosDB.PessimisticLock.AcceptanceTests.csproj +++ b/src/NServiceBus.Persistence.CosmosDB.PessimisticLock.AcceptanceTests/NServiceBus.Persistence.CosmosDB.PessimisticLock.AcceptanceTests.csproj @@ -11,6 +11,7 @@ + diff --git a/src/NServiceBus.Persistence.CosmosDB.PessimisticLock.AcceptanceTests/SetupFixture.cs b/src/NServiceBus.Persistence.CosmosDB.PessimisticLock.AcceptanceTests/SetupFixture.cs index 00faa23f..64e966ce 100644 --- a/src/NServiceBus.Persistence.CosmosDB.PessimisticLock.AcceptanceTests/SetupFixture.cs +++ b/src/NServiceBus.Persistence.CosmosDB.PessimisticLock.AcceptanceTests/SetupFixture.cs @@ -16,9 +16,7 @@ public class SetupFixture [OneTimeSetUp] public async Task OneTimeSetUp() { - var connectionStringEnvironmentVariableName = "CosmosDBPersistence_ConnectionString"; - var connectionString = GetEnvironmentVariable(connectionStringEnvironmentVariableName, - fallbackEmulatorConnectionString: "AccountEndpoint=https://localhost:8081/;AccountKey=C2y6yDjf5/R+ob0N8A7Cgv30VRDJIWEHLM+4QDU5DE2nQ9nDuVTqobD4b8mGGyPMbIZnqyMsEcaGQy67XIw/Jw=="); + var connectionString = GetConnectionStringOrFallback(); ContainerName = $"{DateTime.UtcNow.Ticks}_{Path.GetFileNameWithoutExtension(Path.GetTempFileName())}"; @@ -51,14 +49,17 @@ public async Task OneTimeTearDown() CosmosDbClient.Dispose(); } - static string GetEnvironmentVariable(string variable, string fallbackEmulatorConnectionString) + public static string GetConnectionStringOrFallback(string environmentVariableName = "CosmosDBPersistence_ConnectionString", string fallbackEmulatorConnectionString = EmulatorConnectionString) { - var candidate = Environment.GetEnvironmentVariable(variable, EnvironmentVariableTarget.User); - var environmentVariableConnectionString = string.IsNullOrWhiteSpace(candidate) ? Environment.GetEnvironmentVariable(variable) : candidate; + var candidate = Environment.GetEnvironmentVariable(environmentVariableName, EnvironmentVariableTarget.User); + var environmentVariableConnectionString = string.IsNullOrWhiteSpace(candidate) ? Environment.GetEnvironmentVariable(environmentVariableName) : candidate; return string.IsNullOrEmpty(environmentVariableConnectionString) ? fallbackEmulatorConnectionString : environmentVariableConnectionString; } + public static bool IsRunningWithEmulator => GetConnectionStringOrFallback() == EmulatorConnectionString; + + const string EmulatorConnectionString = "AccountEndpoint = https://localhost:8081/;AccountKey=C2y6yDjf5/R+ob0N8A7Cgv30VRDJIWEHLM+4QDU5DE2nQ9nDuVTqobD4b8mGGyPMbIZnqyMsEcaGQy67XIw/Jw=="; public const string DatabaseName = "CosmosDBPersistence"; public const string PartitionPathKey = "/id"; public static string ContainerName; diff --git a/src/NServiceBus.Persistence.CosmosDB.PhysicalOutbox.AcceptanceTests/NServiceBus.Persistence.CosmosDB.PhysicalOutbox.AcceptanceTests.csproj b/src/NServiceBus.Persistence.CosmosDB.PhysicalOutbox.AcceptanceTests/NServiceBus.Persistence.CosmosDB.PhysicalOutbox.AcceptanceTests.csproj index ff10bd52..bb206555 100644 --- a/src/NServiceBus.Persistence.CosmosDB.PhysicalOutbox.AcceptanceTests/NServiceBus.Persistence.CosmosDB.PhysicalOutbox.AcceptanceTests.csproj +++ b/src/NServiceBus.Persistence.CosmosDB.PhysicalOutbox.AcceptanceTests/NServiceBus.Persistence.CosmosDB.PhysicalOutbox.AcceptanceTests.csproj @@ -11,6 +11,7 @@ + diff --git a/src/NServiceBus.Persistence.CosmosDB.PhysicalOutbox.AcceptanceTests/SetupFixture.cs b/src/NServiceBus.Persistence.CosmosDB.PhysicalOutbox.AcceptanceTests/SetupFixture.cs index 642b2187..250e3f87 100644 --- a/src/NServiceBus.Persistence.CosmosDB.PhysicalOutbox.AcceptanceTests/SetupFixture.cs +++ b/src/NServiceBus.Persistence.CosmosDB.PhysicalOutbox.AcceptanceTests/SetupFixture.cs @@ -16,9 +16,7 @@ public class SetupFixture [OneTimeSetUp] public async Task OneTimeSetUp() { - var connectionStringEnvironmentVariableName = "CosmosDBPersistence_ConnectionString"; - var connectionString = GetEnvironmentVariable(connectionStringEnvironmentVariableName, - fallbackEmulatorConnectionString: "AccountEndpoint=https://localhost:8081/;AccountKey=C2y6yDjf5/R+ob0N8A7Cgv30VRDJIWEHLM+4QDU5DE2nQ9nDuVTqobD4b8mGGyPMbIZnqyMsEcaGQy67XIw/Jw=="); + var connectionString = GetConnectionStringOrFallback(); ContainerName = $"{DateTime.UtcNow.Ticks}_{Path.GetFileNameWithoutExtension(Path.GetTempFileName())}"; @@ -51,14 +49,17 @@ public async Task OneTimeTearDown() CosmosDbClient.Dispose(); } - static string GetEnvironmentVariable(string variable, string fallbackEmulatorConnectionString) + public static string GetConnectionStringOrFallback(string environmentVariableName = "CosmosDBPersistence_ConnectionString", string fallbackEmulatorConnectionString = EmulatorConnectionString) { - var candidate = Environment.GetEnvironmentVariable(variable, EnvironmentVariableTarget.User); - var environmentVariableConnectionString = string.IsNullOrWhiteSpace(candidate) ? Environment.GetEnvironmentVariable(variable) : candidate; + var candidate = Environment.GetEnvironmentVariable(environmentVariableName, EnvironmentVariableTarget.User); + var environmentVariableConnectionString = string.IsNullOrWhiteSpace(candidate) ? Environment.GetEnvironmentVariable(environmentVariableName) : candidate; return string.IsNullOrEmpty(environmentVariableConnectionString) ? fallbackEmulatorConnectionString : environmentVariableConnectionString; } + public static bool IsRunningWithEmulator => GetConnectionStringOrFallback() == EmulatorConnectionString; + + const string EmulatorConnectionString = "AccountEndpoint = https://localhost:8081/;AccountKey=C2y6yDjf5/R+ob0N8A7Cgv30VRDJIWEHLM+4QDU5DE2nQ9nDuVTqobD4b8mGGyPMbIZnqyMsEcaGQy67XIw/Jw=="; public const string DatabaseName = "CosmosDBPersistence"; public const string PartitionPathKey = "/deep/down"; public static string ContainerName; diff --git a/src/NServiceBus.Persistence.CosmosDB.TransactionalSession.AcceptanceTests/SetupFixture.cs b/src/NServiceBus.Persistence.CosmosDB.TransactionalSession.AcceptanceTests/SetupFixture.cs index 25a22ef4..04d12d0e 100644 --- a/src/NServiceBus.Persistence.CosmosDB.TransactionalSession.AcceptanceTests/SetupFixture.cs +++ b/src/NServiceBus.Persistence.CosmosDB.TransactionalSession.AcceptanceTests/SetupFixture.cs @@ -17,8 +17,7 @@ public class SetupFixture [OneTimeSetUp] public async Task OneTimeSetUp() { - var connectionString = GetEnvironmentVariable("CosmosDBPersistence_ConnectionString", - fallbackEmulatorConnectionString: "AccountEndpoint=https://localhost:8081/;AccountKey=C2y6yDjf5/R+ob0N8A7Cgv30VRDJIWEHLM+4QDU5DE2nQ9nDuVTqobD4b8mGGyPMbIZnqyMsEcaGQy67XIw/Jw=="); + var connectionString = GetConnectionStringOrFallback(); ContainerName = $"{DateTime.UtcNow.Ticks}_{Path.GetFileNameWithoutExtension(Path.GetTempFileName())}"; @@ -51,13 +50,17 @@ public async Task OneTimeTearDown() CosmosDbClient.Dispose(); } - static string GetEnvironmentVariable(string variable, string fallbackEmulatorConnectionString) + public static string GetConnectionStringOrFallback(string environmentVariableName = "CosmosDBPersistence_ConnectionString", string fallbackEmulatorConnectionString = EmulatorConnectionString) { - var environmentVariableConnectionString = Environment.GetEnvironmentVariable(variable); + var candidate = Environment.GetEnvironmentVariable(environmentVariableName, EnvironmentVariableTarget.User); + var environmentVariableConnectionString = string.IsNullOrWhiteSpace(candidate) ? Environment.GetEnvironmentVariable(environmentVariableName) : candidate; return string.IsNullOrEmpty(environmentVariableConnectionString) ? fallbackEmulatorConnectionString : environmentVariableConnectionString; } + public static bool IsRunningWithEmulator => GetConnectionStringOrFallback() == EmulatorConnectionString; + + const string EmulatorConnectionString = "AccountEndpoint = https://localhost:8081/;AccountKey=C2y6yDjf5/R+ob0N8A7Cgv30VRDJIWEHLM+4QDU5DE2nQ9nDuVTqobD4b8mGGyPMbIZnqyMsEcaGQy67XIw/Jw=="; public const string DatabaseName = "CosmosDBPersistence"; public const string PartitionPathKey = $"/{PartitionPropertyName}"; public const string PartitionPropertyName = "somekey"; diff --git a/src/SharedAcceptanceTests.All/When_default_credentials_used.cs b/src/SharedAcceptanceTests.All/When_default_credentials_used.cs new file mode 100644 index 00000000..899694bd --- /dev/null +++ b/src/SharedAcceptanceTests.All/When_default_credentials_used.cs @@ -0,0 +1,88 @@ +namespace NServiceBus.AcceptanceTests +{ + using System; + using System.Data.Common; + using System.Threading.Tasks; + using AcceptanceTesting; + using Azure.Identity; + using EndpointTemplates; + using Microsoft.Azure.Cosmos; + using NUnit.Framework; + + public class When_default_credentials_used : NServiceBusAcceptanceTest + { + [Test] + public async Task Should_work() + { + if (SetupFixture.IsRunningWithEmulator) + { + Assert.Ignore("This test uses DefaultAzureCredential which is not supported with the emulator."); + } + + var context = await Scenario.Define() + .WithEndpoint(b => b.When(session => session.SendLocal(new StartSaga1 + { + DataId = Guid.NewGuid() + }))) + .Done(c => c.SagaReceivedMessage) + .Run(); + + Assert.True(context.SagaReceivedMessage); + } + + public class Context : ScenarioContext + { + public bool SagaReceivedMessage { get; set; } + } + + public class EndpointUsingDefaultCredentials : EndpointConfigurationBuilder + { + public EndpointUsingDefaultCredentials() => + EndpointSetup(config => + { + var builder = new DbConnectionStringBuilder + { + ConnectionString = SetupFixture.GetConnectionStringOrFallback() + }; + builder.TryGetValue("AccountEndpoint", out var accountEndpoint); + + var cosmosClient = new CosmosClient($"{accountEndpoint}", new DefaultAzureCredential(), new CosmosClientOptions()); + + var persistence = config.UsePersistence(); + persistence.DisableContainerCreation(); + persistence.CosmosClient(cosmosClient); + // with RBAC data plane operations are not supported, so we are using the existing database and container + persistence.DatabaseName(Environment.GetEnvironmentVariable("CosmosDBPersistence_ConnectionString_DatabaseName")); + persistence.DefaultContainer(Environment.GetEnvironmentVariable("CosmosDBPersistence_ConnectionString_ContainerOrTableName"), "/id"); + }); + + public class JustASaga : Saga, IAmStartedByMessages + { + public JustASaga(Context testContext) => this.testContext = testContext; + + public Task Handle(StartSaga1 message, IMessageHandlerContext context) + { + Data.DataId = message.DataId; + testContext.SagaReceivedMessage = true; + MarkAsComplete(); + return Task.CompletedTask; + } + + protected override void ConfigureHowToFindSaga(SagaPropertyMapper mapper) + => mapper.ConfigureMapping(m => m.DataId).ToSaga(s => s.DataId); + + readonly Context testContext; + } + + public class JustASagaData : ContainSagaData + { + public virtual Guid DataId { get; set; } + } + } + + public class StartSaga1 : ICommand + { + public Guid DataId { get; set; } + } + } +} \ No newline at end of file