Skip to content

Commit

Permalink
Implement support for connecting to ClusterTests
Browse files Browse the repository at this point in the history
Fixes #95

* Start adding Uris to ConnectionSettings.
* Add ClusterTests file.
  • Loading branch information
lukebakken committed Nov 22, 2024
1 parent e8118c7 commit f7ebd0e
Show file tree
Hide file tree
Showing 5 changed files with 70 additions and 7 deletions.
21 changes: 15 additions & 6 deletions RabbitMQ.AMQP.Client/ConnectionSettings.cs
Original file line number Diff line number Diff line change
Expand Up @@ -3,13 +3,16 @@
// Copyright (c) 2017-2024 Broadcom. All Rights Reserved. The term "Broadcom" refers to Broadcom Inc. and/or its subsidiaries.

using System;
using System.Collections.Generic;
using System.Linq;
using System.Net.Security;
using System.Security.Authentication;
using System.Security.Cryptography.X509Certificates;
using Amqp;

namespace RabbitMQ.AMQP.Client
{
// TODO rename to ConnectionSettingsBuilder
public class ConnectionSettingBuilder
{
// TODO: maybe add the event "LifeCycle" to the builder
Expand All @@ -23,10 +26,7 @@ public class ConnectionSettingBuilder
private uint _maxFrameSize = Consts.DefaultMaxFrameSize;
private SaslMechanism _saslMechanism = Client.SaslMechanism.Anonymous;
private IRecoveryConfiguration _recoveryConfiguration = Impl.RecoveryConfiguration.Create();

private ConnectionSettingBuilder()
{
}
private IList<Uri>? _uris;

public static ConnectionSettingBuilder Create()
{
Expand Down Expand Up @@ -105,8 +105,15 @@ public ConnectionSettingBuilder RecoveryConfiguration(IRecoveryConfiguration rec
return this;
}

public ConnectionSettingBuilder Uris(IEnumerable<Uri> uris)
{
_uris = uris.ToList();
return this;
}

public ConnectionSettings Build()
{
// TODO this should do something similar to consolidate in the Java code
var c = new ConnectionSettings(_scheme, _host, _port, _user,
_password, _virtualHost,
_containerId, _saslMechanism,
Expand All @@ -129,9 +136,9 @@ public class ConnectionSettings : IEquatable<ConnectionSettings>
private readonly SaslMechanism _saslMechanism = SaslMechanism.Plain;
private readonly IRecoveryConfiguration _recoveryConfiguration = Impl.RecoveryConfiguration.Create();

public ConnectionSettings(string address, TlsSettings? tlsSettings = null)
public ConnectionSettings(string uri, TlsSettings? tlsSettings = null)
{
_address = new Address(address);
_address = new Address(uri);
_tlsSettings = tlsSettings;

if (_address.UseSsl && _tlsSettings == null)
Expand Down Expand Up @@ -252,6 +259,8 @@ bool IEquatable<ConnectionSettings>.Equals(ConnectionSettings? other)

internal Address Address => _address;

public IEnumerable<Uri>? Uris => throw new NotImplementedException();

// public RecoveryConfiguration RecoveryConfiguration { get; set; } = RecoveryConfiguration.Create();
}

Expand Down
2 changes: 2 additions & 0 deletions RabbitMQ.AMQP.Client/IConnectionSettings.cs
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,7 @@

#if TOOMANYINTERFACES
using System;
using System.Collections.Generic;
using System.Net.Security;
using System.Security.Authentication;
using System.Security.Cryptography.X509Certificates;
Expand All @@ -25,6 +26,7 @@ public interface ConnectionSettings : IEquatable<ConnectionSettings>
SaslMechanism SaslMechanism { get; }
TlsSettings? TlsSettings { get; }
IRecoveryConfiguration Recovery { get; }
IEnumerable<Uri>? Uris { get; }
}

/// <summary>
Expand Down
3 changes: 3 additions & 0 deletions RabbitMQ.AMQP.Client/Impl/AmqpConnection.cs
Original file line number Diff line number Diff line change
Expand Up @@ -359,6 +359,9 @@ void OnOpened(Amqp.IConnection connection, Open openOnOpened)
}
else
{
// TODO
// There is absolutely NO POINT in having an interface if this
// is what will be done!
connectionSettings = (ConnectionSettings)_connectionSettings;
Address address = connectionSettings.Address;
_nativeConnection = await cf.CreateAsync(address: address, open: open, onOpened: OnOpened)
Expand Down
5 changes: 4 additions & 1 deletion RabbitMQ.AMQP.Client/PublicAPI.Unshipped.txt
Original file line number Diff line number Diff line change
Expand Up @@ -51,6 +51,7 @@ RabbitMQ.AMQP.Client.ConnectionException.ConnectionException(string! message) ->
RabbitMQ.AMQP.Client.ConnectionException.ConnectionException(string! message, System.Exception! innerException) -> void
RabbitMQ.AMQP.Client.ConnectionSettingBuilder
RabbitMQ.AMQP.Client.ConnectionSettingBuilder.Build() -> RabbitMQ.AMQP.Client.ConnectionSettings!
RabbitMQ.AMQP.Client.ConnectionSettingBuilder.ConnectionSettingBuilder() -> void
RabbitMQ.AMQP.Client.ConnectionSettingBuilder.ContainerId(string! containerId) -> RabbitMQ.AMQP.Client.ConnectionSettingBuilder!
RabbitMQ.AMQP.Client.ConnectionSettingBuilder.Host(string! host) -> RabbitMQ.AMQP.Client.ConnectionSettingBuilder!
RabbitMQ.AMQP.Client.ConnectionSettingBuilder.MaxFrameSize(uint maxFrameSize) -> RabbitMQ.AMQP.Client.ConnectionSettingBuilder!
Expand All @@ -59,11 +60,12 @@ RabbitMQ.AMQP.Client.ConnectionSettingBuilder.Port(int port) -> RabbitMQ.AMQP.Cl
RabbitMQ.AMQP.Client.ConnectionSettingBuilder.RecoveryConfiguration(RabbitMQ.AMQP.Client.IRecoveryConfiguration! recoveryConfiguration) -> RabbitMQ.AMQP.Client.ConnectionSettingBuilder!
RabbitMQ.AMQP.Client.ConnectionSettingBuilder.SaslMechanism(RabbitMQ.AMQP.Client.SaslMechanism! saslMechanism) -> RabbitMQ.AMQP.Client.ConnectionSettingBuilder!
RabbitMQ.AMQP.Client.ConnectionSettingBuilder.Scheme(string! scheme) -> RabbitMQ.AMQP.Client.ConnectionSettingBuilder!
RabbitMQ.AMQP.Client.ConnectionSettingBuilder.Uris(System.Collections.Generic.IEnumerable<System.Uri!>! uris) -> RabbitMQ.AMQP.Client.ConnectionSettingBuilder!
RabbitMQ.AMQP.Client.ConnectionSettingBuilder.User(string! user) -> RabbitMQ.AMQP.Client.ConnectionSettingBuilder!
RabbitMQ.AMQP.Client.ConnectionSettingBuilder.VirtualHost(string! virtualHost) -> RabbitMQ.AMQP.Client.ConnectionSettingBuilder!
RabbitMQ.AMQP.Client.ConnectionSettings
RabbitMQ.AMQP.Client.ConnectionSettings.ConnectionSettings(string! address, RabbitMQ.AMQP.Client.TlsSettings? tlsSettings = null) -> void
RabbitMQ.AMQP.Client.ConnectionSettings.ConnectionSettings(string! scheme, string! host, int port, string? user, string? password, string! virtualHost, string! containerId, RabbitMQ.AMQP.Client.SaslMechanism! saslMechanism, RabbitMQ.AMQP.Client.IRecoveryConfiguration! recoveryConfiguration, uint maxFrameSize = 0, RabbitMQ.AMQP.Client.TlsSettings? tlsSettings = null) -> void
RabbitMQ.AMQP.Client.ConnectionSettings.ConnectionSettings(string! uri, RabbitMQ.AMQP.Client.TlsSettings? tlsSettings = null) -> void
RabbitMQ.AMQP.Client.ConnectionSettings.ContainerId.get -> string!
RabbitMQ.AMQP.Client.ConnectionSettings.Equals(RabbitMQ.AMQP.Client.ConnectionSettings! other) -> bool
RabbitMQ.AMQP.Client.ConnectionSettings.Host.get -> string!
Expand All @@ -75,6 +77,7 @@ RabbitMQ.AMQP.Client.ConnectionSettings.Recovery.get -> RabbitMQ.AMQP.Client.IRe
RabbitMQ.AMQP.Client.ConnectionSettings.SaslMechanism.get -> RabbitMQ.AMQP.Client.SaslMechanism!
RabbitMQ.AMQP.Client.ConnectionSettings.Scheme.get -> string!
RabbitMQ.AMQP.Client.ConnectionSettings.TlsSettings.get -> RabbitMQ.AMQP.Client.TlsSettings?
RabbitMQ.AMQP.Client.ConnectionSettings.Uris.get -> System.Collections.Generic.IEnumerable<System.Uri!>?
RabbitMQ.AMQP.Client.ConnectionSettings.User.get -> string?
RabbitMQ.AMQP.Client.ConnectionSettings.UseSsl.get -> bool
RabbitMQ.AMQP.Client.ConnectionSettings.VirtualHost.get -> string!
Expand Down
46 changes: 46 additions & 0 deletions Tests/ClusterTests.cs
Original file line number Diff line number Diff line change
@@ -0,0 +1,46 @@
// This source code is dual-licensed under the Apache License, version 2.0,
// and the Mozilla Public License, version 2.0.
// Copyright (c) 2017-2024 Broadcom. All Rights Reserved. The term "Broadcom" refers to Broadcom Inc. and/or its subsidiaries.

using System;
using System.Collections.Generic;
using System.Threading.Tasks;
using RabbitMQ.AMQP.Client;
using Xunit;
using Xunit.Abstractions;

namespace Tests;

public class ClusterTests(ITestOutputHelper testOutputHelper)
: IntegrationTest(testOutputHelper, setupConnectionAndManagement: false)
{
[SkippableFact]
public Task CreateConnectionWithEnvironmentAndMultipleUris()
{
Skip.IfNot(SystemUtils.IsCluster);

Assert.Null(_connection);
Assert.Null(_management);

Uri uri0 = new("amqp://localhost:5672");
Uri uri1 = new("amqp://localhost:5673");
Uri uri2 = new("amqp://localhost:5674");
List<Uri> uris = [uri0, uri1, uri2];

ConnectionSettingBuilder connectionSettingBuilder = new();
connectionSettingBuilder.Uris(uris);
ConnectionSettings connectionSettings = connectionSettingBuilder.Build();

/*
IEnvironment env = AmqpEnvironment.Create(ConnectionSettingBuilder.Create().Build());
IConnection connection = await env.CreateConnectionAsync();
Assert.NotNull(connection);
Assert.NotEmpty(env.GetConnections());
await env.CloseAsync();
Assert.Equal(State.Closed, connection.State);
Assert.Empty(env.GetConnections());
*/

return Task.CompletedTask;
}
}

0 comments on commit f7ebd0e

Please sign in to comment.