Skip to content

Commit b152193

Browse files
committed
Merge branch 'lukebakken/string-types-3' into stringallocations
2 parents 58c2cec + 9cd8259 commit b152193

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

43 files changed

+243
-210
lines changed

projects/Benchmarks/Networking/Networking_BasicDeliver_Commons.cs

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,7 @@ public static async Task Publish_Hello_World(IConnection connection, uint messag
1515
using (IChannel channel = await connection.CreateChannelAsync())
1616
{
1717
QueueDeclareOk queue = await channel.QueueDeclareAsync();
18+
QueueName qname = (QueueName)queue;
1819
int consumed = 0;
1920
var consumer = new EventingBasicConsumer(channel);
2021
consumer.Received += (s, args) =>
@@ -24,11 +25,11 @@ public static async Task Publish_Hello_World(IConnection connection, uint messag
2425
tcs.SetResult(true);
2526
}
2627
};
27-
await channel.BasicConsumeAsync(queue.QueueName, true, consumer);
28+
await channel.BasicConsumeAsync(qname, true, consumer);
2829

2930
for (int i = 0; i < messageCount; i++)
3031
{
31-
await channel.BasicPublishAsync(ExchangeName.Empty, queue.QueueName, body);
32+
await channel.BasicPublishAsync(ExchangeName.Empty, (RoutingKey)qname, body);
3233
}
3334

3435
await tcs.Task;

projects/RabbitMQ.Client/PublicAPI.Unshipped.txt

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -982,11 +982,14 @@ virtual RabbitMQ.Client.TcpClientAdapter.ReceiveTimeout.set -> void
982982
~static RabbitMQ.Client.IConnectionExtensions.CloseAsync(this RabbitMQ.Client.IConnection connection, ushort reasonCode, string reasonText) -> System.Threading.Tasks.Task
983983
~static RabbitMQ.Client.IConnectionExtensions.CloseAsync(this RabbitMQ.Client.IConnection connection, ushort reasonCode, string reasonText, System.TimeSpan timeout) -> System.Threading.Tasks.Task
984984
~static RabbitMQ.Client.QueueDeclareOk.implicit operator RabbitMQ.Client.QueueName(RabbitMQ.Client.QueueDeclareOk declareOk) -> RabbitMQ.Client.QueueName
985+
~static RabbitMQ.Client.QueueName.explicit operator RabbitMQ.Client.QueueName(string value) -> RabbitMQ.Client.QueueName
985986
~static RabbitMQ.Client.QueueName.explicit operator RabbitMQ.Client.RoutingKey(RabbitMQ.Client.QueueName value) -> RabbitMQ.Client.RoutingKey
986-
~static RabbitMQ.Client.QueueName.implicit operator RabbitMQ.Client.QueueName(string value) -> RabbitMQ.Client.QueueName
987-
~static RabbitMQ.Client.RoutingKey.implicit operator RabbitMQ.Client.RoutingKey(string value) -> RabbitMQ.Client.RoutingKey
987+
~static RabbitMQ.Client.RoutingKey.explicit operator RabbitMQ.Client.RoutingKey(string value) -> RabbitMQ.Client.RoutingKey
988988
~static readonly RabbitMQ.Client.ConsumerTag.Empty -> RabbitMQ.Client.ConsumerTag
989989
~static readonly RabbitMQ.Client.ExchangeName.AmqDirect -> RabbitMQ.Client.ExchangeName
990+
~static readonly RabbitMQ.Client.ExchangeName.AmqFanout -> RabbitMQ.Client.ExchangeName
991+
~static readonly RabbitMQ.Client.ExchangeName.AmqHeaders -> RabbitMQ.Client.ExchangeName
992+
~static readonly RabbitMQ.Client.ExchangeName.AmqTopic -> RabbitMQ.Client.ExchangeName
990993
~static readonly RabbitMQ.Client.ExchangeName.Empty -> RabbitMQ.Client.ExchangeName
991994
~static readonly RabbitMQ.Client.ExchangeType.Direct -> RabbitMQ.Client.ExchangeType
992995
~static readonly RabbitMQ.Client.ExchangeType.Fanout -> RabbitMQ.Client.ExchangeType

projects/RabbitMQ.Client/client/api/AmqpString.cs

Lines changed: 5 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -232,6 +232,9 @@ public class ExchangeName : AmqpString
232232
{
233233
public static readonly ExchangeName Empty = new ExchangeName();
234234
public static readonly ExchangeName AmqDirect = new ExchangeName("amq.direct");
235+
public static readonly ExchangeName AmqFanout = new ExchangeName("amq.fanout");
236+
public static readonly ExchangeName AmqTopic = new ExchangeName("amq.topic");
237+
public static readonly ExchangeName AmqHeaders = new ExchangeName("amq.headers");
235238

236239
private ExchangeName() : base()
237240
{
@@ -301,8 +304,7 @@ public QueueName(string queueName, bool strictValidation)
301304
{
302305
}
303306

304-
// TODO explicit
305-
public static implicit operator QueueName(string value)
307+
public static explicit operator QueueName(string value)
306308
{
307309
return new QueueName(value);
308310
}
@@ -349,8 +351,7 @@ public RoutingKey(string routingKey, bool strictValidation)
349351
{
350352
}
351353

352-
// TODO explicit
353-
public static implicit operator RoutingKey(string value)
354+
public static explicit operator RoutingKey(string value)
354355
{
355356
return new RoutingKey(value);
356357
}

projects/RabbitMQ.Client/client/impl/AutorecoveringConnection.Recording.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -216,7 +216,7 @@ private void DoRecordQueue(RecordedQueue queue)
216216
_recordedQueues[queue.Name] = queue;
217217
}
218218

219-
internal async ValueTask DeleteRecordedQueueAsync(string queueName,
219+
internal async ValueTask DeleteRecordedQueueAsync(QueueName queueName,
220220
bool recordedEntitiesSemaphoreHeld, CancellationToken cancellationToken)
221221
{
222222
if (_disposed)

projects/Test/Common/TestConnectionRecoveryBase.cs

Lines changed: 7 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -52,7 +52,7 @@ public TestConnectionRecoveryBase(ITestOutputHelper output, bool dispatchConsume
5252
_messageBody = GetRandomBody(4096);
5353
}
5454

55-
protected Task AssertConsumerCountAsync(string q, int count)
55+
protected Task AssertConsumerCountAsync(QueueName q, int count)
5656
{
5757
return WithTemporaryChannelAsync(async ch =>
5858
{
@@ -61,7 +61,7 @@ protected Task AssertConsumerCountAsync(string q, int count)
6161
});
6262
}
6363

64-
protected async Task AssertConsumerCountAsync(IChannel ch, string q, uint count)
64+
protected async Task AssertConsumerCountAsync(IChannel ch, QueueName q, uint count)
6565
{
6666
RabbitMQ.Client.QueueDeclareOk ok = await ch.QueueDeclarePassiveAsync(q);
6767
Assert.Equal(count, ok.ConsumerCount);
@@ -72,7 +72,7 @@ protected async Task AssertExchangeRecoveryAsync(IChannel m, ExchangeName x)
7272
await m.ConfirmSelectAsync();
7373
await WithTemporaryNonExclusiveQueueAsync(m, async (_, q) =>
7474
{
75-
string rk = "routing-key";
75+
RoutingKey rk = new RoutingKey("routing-key");
7676
await m.QueueBindAsync(q, x, rk);
7777
await m.BasicPublishAsync(x, rk, _messageBody);
7878

@@ -81,12 +81,12 @@ await WithTemporaryNonExclusiveQueueAsync(m, async (_, q) =>
8181
});
8282
}
8383

84-
protected Task AssertExclusiveQueueRecoveryAsync(IChannel m, string q)
84+
protected Task AssertExclusiveQueueRecoveryAsync(IChannel m, QueueName q)
8585
{
8686
return AssertQueueRecoveryAsync(m, q, true);
8787
}
8888

89-
protected async Task AssertQueueRecoveryAsync(IChannel ch, string q, bool exclusive, IDictionary<string, object> arguments = null)
89+
protected async Task AssertQueueRecoveryAsync(IChannel ch, QueueName q, bool exclusive, IDictionary<string, object> arguments = null)
9090
{
9191
await ch.ConfirmSelectAsync();
9292
await ch.QueueDeclareAsync(queue: q, passive: true, durable: false, exclusive: false, autoDelete: false, arguments: null);
@@ -95,7 +95,7 @@ protected async Task AssertQueueRecoveryAsync(IChannel ch, string q, bool exclus
9595
durable: false, exclusive: exclusive, autoDelete: false, arguments: arguments);
9696
Assert.Equal(0u, ok1.MessageCount);
9797

98-
await ch.BasicPublishAsync(ExchangeName.Empty, q, _messageBody);
98+
await ch.BasicPublishAsync(ExchangeName.Empty, (RoutingKey)q, _messageBody);
9999
Assert.True(await WaitForConfirmsWithCancellationAsync(ch));
100100

101101
RabbitMQ.Client.QueueDeclareOk ok2 = await ch.QueueDeclareAsync(queue: q, passive: false,
@@ -250,7 +250,7 @@ protected static Task WaitForShutdownAsync(IConnection conn)
250250
return WaitAsync(tcs, "connection shutdown");
251251
}
252252

253-
protected async Task WithTemporaryExclusiveQueueNoWaitAsync(IChannel channel, Func<IChannel, string, Task> action, string queue)
253+
protected async Task WithTemporaryExclusiveQueueNoWaitAsync(IChannel channel, Func<IChannel, QueueName, Task> action, QueueName queue)
254254
{
255255
try
256256
{

projects/Test/Integration/ConnectionRecovery/EventHandlerRecovery/Connection/TestRecoveringConsumerEventHandlers.cs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -51,7 +51,7 @@ public TestRecoveringConsumerEventHandlers(ITestOutputHelper output) : base(outp
5151
[InlineData(3)]
5252
public async Task TestRecoveringConsumerEventHandlers_Called(int iterations)
5353
{
54-
string q = (await _channel.QueueDeclareAsync(GenerateQueueName(), false, false, false)).QueueName;
54+
RabbitMQ.Client.QueueDeclareOk q = await _channel.QueueDeclareAsync(GenerateQueueName(), false, false, false);
5555
var cons = new EventingBasicConsumer(_channel);
5656
await _channel.BasicConsumeAsync(q, true, cons);
5757

@@ -70,7 +70,7 @@ public async Task TestRecoveringConsumerEventHandlers_Called(int iterations)
7070
public async Task TestRecoveringConsumerEventHandler_EventArgumentsArePassedDown()
7171
{
7272
var myArgs = new Dictionary<string, object> { { "first-argument", "some-value" } };
73-
string q = (await _channel.QueueDeclareAsync(GenerateQueueName(), false, false, false)).QueueName;
73+
RabbitMQ.Client.QueueDeclareOk q = await _channel.QueueDeclareAsync(GenerateQueueName(), false, false, false);
7474
var cons = new EventingBasicConsumer(_channel);
7575
string expectedCTag = await _channel.BasicConsumeAsync(cons, q, arguments: myArgs);
7676

projects/Test/Integration/ConnectionRecovery/TestBasicAckAndBasicNack.cs

Lines changed: 15 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -29,7 +29,6 @@
2929
// Copyright (c) 2007-2020 VMware, Inc. All rights reserved.
3030
//---------------------------------------------------------------------------
3131

32-
using System;
3332
using System.Threading.Tasks;
3433
using RabbitMQ.Client;
3534
using RabbitMQ.Client.Impl;
@@ -41,11 +40,11 @@ namespace Test.Integration.ConnectionRecovery
4140
{
4241
public class TestBasicAckAndBasicNack : TestConnectionRecoveryBase
4342
{
44-
private readonly string _queueName;
43+
private readonly QueueName _queueName;
4544

4645
public TestBasicAckAndBasicNack(ITestOutputHelper output) : base(output)
4746
{
48-
_queueName = $"{nameof(TestBasicAckAndBasicNack)}-{Guid.NewGuid()}";
47+
_queueName = GenerateQueueName();
4948
}
5049

5150
public override async Task DisposeAsync()
@@ -72,8 +71,8 @@ public async Task TestBasicAckAfterChannelRecovery()
7271
var cons = new AckingBasicConsumer(_channel, TotalMessageCount, allMessagesSeenTcs);
7372

7473
QueueDeclareOk q = await _channel.QueueDeclareAsync(_queueName, false, false, false);
75-
string queueName = q.QueueName;
76-
Assert.Equal(queueName, _queueName);
74+
QueueName queueName = (QueueName)q;
75+
Assert.Equal(_queueName, queueName);
7776

7877
await _channel.BasicQosAsync(0, 1, false);
7978
await _channel.BasicConsumeAsync(queueName, false, cons);
@@ -95,16 +94,16 @@ public async Task TestBasicNackAfterChannelRecovery()
9594
var cons = new NackingBasicConsumer(_channel, TotalMessageCount, allMessagesSeenTcs);
9695

9796
QueueDeclareOk q = await _channel.QueueDeclareAsync(_queueName, false, false, false);
98-
string queueName = q.QueueName;
99-
Assert.Equal(queueName, _queueName);
97+
QueueName qname = (QueueName)q;
98+
Assert.Equal(_queueName, qname);
10099

101100
await _channel.BasicQosAsync(0, 1, false);
102-
await _channel.BasicConsumeAsync(queueName, false, cons);
101+
await _channel.BasicConsumeAsync(qname, false, cons);
103102

104103
TaskCompletionSource<bool> sl = PrepareForShutdown(_conn);
105104
TaskCompletionSource<bool> rl = PrepareForRecovery(_conn);
106105

107-
await PublishMessagesWhileClosingConnAsync(queueName);
106+
await PublishMessagesWhileClosingConnAsync(qname);
108107

109108
await WaitAsync(sl, "connection shutdown");
110109
await WaitAsync(rl, "connection recovery");
@@ -117,16 +116,17 @@ public async Task TestBasicRejectAfterChannelRecovery()
117116
var allMessagesSeenTcs = new TaskCompletionSource<bool>(TaskCreationOptions.RunContinuationsAsynchronously);
118117
var cons = new RejectingBasicConsumer(_channel, TotalMessageCount, allMessagesSeenTcs);
119118

120-
string queueName = (await _channel.QueueDeclareAsync(_queueName, false, false, false)).QueueName;
121-
Assert.Equal(queueName, _queueName);
119+
QueueDeclareOk q = await _channel.QueueDeclareAsync(_queueName, false, false, false);
120+
QueueName qname = (QueueName)q;
121+
Assert.Equal(_queueName, qname);
122122

123123
await _channel.BasicQosAsync(0, 1, false);
124-
await _channel.BasicConsumeAsync(queueName, false, cons);
124+
await _channel.BasicConsumeAsync(qname, false, cons);
125125

126126
TaskCompletionSource<bool> sl = PrepareForShutdown(_conn);
127127
TaskCompletionSource<bool> rl = PrepareForRecovery(_conn);
128128

129-
await PublishMessagesWhileClosingConnAsync(queueName);
129+
await PublishMessagesWhileClosingConnAsync(qname);
130130

131131
await WaitAsync(sl, "connection shutdown");
132132
await WaitAsync(rl, "connection recovery");
@@ -136,10 +136,10 @@ public async Task TestBasicRejectAfterChannelRecovery()
136136
[Fact]
137137
public async Task TestBasicAckAfterBasicGetAndChannelRecovery()
138138
{
139-
string q = GenerateQueueName();
139+
QueueName q = GenerateQueueName();
140140
await _channel.QueueDeclareAsync(q, false, false, false);
141141
// create an offset
142-
await _channel.BasicPublishAsync(ExchangeName.Empty, q, _messageBody);
142+
await _channel.BasicPublishAsync(ExchangeName.Empty, (RoutingKey)q, _messageBody);
143143
await Task.Delay(50);
144144
BasicGetResult g = await _channel.BasicGetAsync(q, false);
145145
await CloseAndWaitForRecoveryAsync();

projects/Test/Integration/ConnectionRecovery/TestConnectionRecovery.cs

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -50,7 +50,7 @@ public TestConnectionRecovery(ITestOutputHelper output)
5050
[Fact]
5151
public async Task TestBindingRecovery_GH1035()
5252
{
53-
const string routingKey = "unused";
53+
RoutingKey routingKey = new RoutingKey("unused");
5454
byte[] body = GetRandomBody();
5555

5656
var receivedMessageSemaphore = new SemaphoreSlim(0, 1);
@@ -63,7 +63,7 @@ Task MessageReceived(object sender, BasicDeliverEventArgs e)
6363

6464
var guid = Guid.NewGuid();
6565
ExchangeName exchangeName = new ExchangeName($"ex-gh-1035-{guid}");
66-
string queueName = $"q-gh-1035-{guid}";
66+
QueueName queueName = new QueueName($"q-gh-1035-{guid}");
6767

6868
await _channel.ExchangeDeclareAsync(exchange: exchangeName,
6969
type: "fanout", durable: false, autoDelete: true,
@@ -108,7 +108,7 @@ await _channel.ExchangeDeclareAsync(exchange: exchangeName,
108108

109109
using (IChannel pubCh = await _conn.CreateChannelAsync())
110110
{
111-
await pubCh.BasicPublishAsync(exchange: exchangeName, routingKey: "unused", body: body);
111+
await pubCh.BasicPublishAsync(exchange: exchangeName, routingKey: (RoutingKey)"unused", body: body);
112112
await pubCh.CloseAsync();
113113
}
114114

projects/Test/Integration/ConnectionRecovery/TestConsumerRecovery.cs

Lines changed: 8 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -48,13 +48,14 @@ public TestConsumerRecovery(ITestOutputHelper output)
4848
[Fact]
4949
public async Task TestConsumerRecoveryWithManyConsumers()
5050
{
51-
string q = (await _channel.QueueDeclareAsync(GenerateQueueName(), false, false, false)).QueueName;
51+
RabbitMQ.Client.QueueDeclareOk q = (await _channel.QueueDeclareAsync(GenerateQueueName(), false, false, false));
52+
QueueName qname = (QueueName)q;
5253
int n = 1024;
5354

5455
for (int i = 0; i < n; i++)
5556
{
5657
var cons = new AsyncEventingBasicConsumer(_channel);
57-
await _channel.BasicConsumeAsync(q, true, cons);
58+
await _channel.BasicConsumeAsync(qname, true, cons);
5859
}
5960

6061
var tcs = new TaskCompletionSource<bool>(TaskCreationOptions.RunContinuationsAsynchronously);
@@ -63,24 +64,25 @@ public async Task TestConsumerRecoveryWithManyConsumers()
6364
await CloseAndWaitForRecoveryAsync();
6465
await WaitAsync(tcs, "consumer tag change after recovery");
6566
Assert.True(_channel.IsOpen);
66-
await AssertConsumerCountAsync(q, n);
67+
await AssertConsumerCountAsync(qname, n);
6768
}
6869

6970
[Fact]
7071
public async Task TestThatCancelledConsumerDoesNotReappearOnRecovery()
7172
{
72-
string q = (await _channel.QueueDeclareAsync(GenerateQueueName(), false, false, false)).QueueName;
73+
RabbitMQ.Client.QueueDeclareOk q = await _channel.QueueDeclareAsync(GenerateQueueName(), false, false, false);
74+
QueueName qname = (QueueName)q;
7375
int n = 1024;
7476

7577
for (int i = 0; i < n; i++)
7678
{
7779
var cons = new AsyncEventingBasicConsumer(_channel);
78-
ConsumerTag tag = await _channel.BasicConsumeAsync(q, true, cons);
80+
ConsumerTag tag = await _channel.BasicConsumeAsync(qname, true, cons);
7981
await _channel.BasicCancelAsync(tag);
8082
}
8183
await CloseAndWaitForRecoveryAsync();
8284
Assert.True(_channel.IsOpen);
83-
await AssertConsumerCountAsync(q, 0);
85+
await AssertConsumerCountAsync(qname, 0);
8486
}
8587
}
8688
}

projects/Test/Integration/ConnectionRecovery/TestDeclaration.cs

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -58,7 +58,7 @@ public async Task TestDeclarationOfManyAutoDeleteExchangesWithTransientExchanges
5858
var x2 = new ExchangeName($"destination-{Guid.NewGuid()}");
5959
await _channel.ExchangeDeclareAsync(x2, ExchangeType.Fanout, false, false);
6060

61-
await _channel.ExchangeBindAsync(x2, x1, "");
61+
await _channel.ExchangeBindAsync(x2, x1, RoutingKey.Empty);
6262
await _channel.ExchangeDeleteAsync(x2);
6363
}
6464
AssertRecordedExchanges((AutorecoveringConnection)_conn, 0);
@@ -76,8 +76,8 @@ public async Task TestDeclarationOfManyAutoDeleteExchangesWithTransientExchanges
7676
var x2 = new ExchangeName($"destination-{Guid.NewGuid()}");
7777
await _channel.ExchangeDeclareAsync(x2, ExchangeType.Fanout, false, false);
7878

79-
await _channel.ExchangeBindAsync(x2, x1, "");
80-
await _channel.ExchangeUnbindAsync(x2, x1, "");
79+
await _channel.ExchangeBindAsync(x2, x1, RoutingKey.Empty);
80+
await _channel.ExchangeUnbindAsync(x2, x1, RoutingKey.Empty);
8181
await _channel.ExchangeDeleteAsync(x2);
8282
}
8383
AssertRecordedExchanges((AutorecoveringConnection)_conn, 0);
@@ -93,7 +93,7 @@ public async Task TestDeclarationOfManyAutoDeleteExchangesWithTransientQueuesTha
9393
await _channel.ExchangeDeclareAsync(x, ExchangeType.Fanout, false, true);
9494
QueueDeclareOk q = await _channel.QueueDeclareAsync();
9595
var qname = new QueueName(q.QueueName);
96-
await _channel.QueueBindAsync(qname, x, "");
96+
await _channel.QueueBindAsync(qname, x, RoutingKey.Empty);
9797
await _channel.QueueDeleteAsync(qname);
9898
}
9999
AssertRecordedExchanges((AutorecoveringConnection)_conn, 0);
@@ -109,8 +109,8 @@ public async Task TestDeclarationOfManyAutoDeleteExchangesWithTransientQueuesTha
109109
await _channel.ExchangeDeclareAsync(exchangeName, ExchangeType.Fanout, false, true);
110110
QueueDeclareOk q = await _channel.QueueDeclareAsync();
111111
var qname = new QueueName(q.QueueName);
112-
await _channel.QueueBindAsync(qname, exchangeName, "");
113-
await _channel.QueueUnbindAsync(qname, exchangeName, "", null);
112+
await _channel.QueueBindAsync(qname, exchangeName, RoutingKey.Empty);
113+
await _channel.QueueUnbindAsync(qname, exchangeName, RoutingKey.Empty, null);
114114
}
115115
AssertRecordedExchanges((AutorecoveringConnection)_conn, 0);
116116
}

0 commit comments

Comments
 (0)