Skip to content

Commit 038a8c0

Browse files
committed
chore: add basic tests
1 parent 0977d86 commit 038a8c0

File tree

7 files changed

+97
-22
lines changed

7 files changed

+97
-22
lines changed

.ci/ubuntu/one-node/gha-setup.sh

Lines changed: 3 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -14,7 +14,7 @@ readonly rabbitmq_image="${RABBITMQ_IMAGE:-rabbitmq:4-management}"
1414
readonly docker_name_prefix='rabbitmq-amqp-dotnet-client'
1515
readonly docker_network_name="$docker_name_prefix-network"
1616

17-
if [[ ! -v GITHUB_ACTIONS ]]
17+
if [ -z GITHUB_ACTIONS ]
1818
then
1919
GITHUB_ACTIONS='false'
2020
fi
@@ -126,7 +126,7 @@ function get_rabbitmq_id
126126
local rabbitmq_docker_id
127127
rabbitmq_docker_id="$(docker inspect --format='{{.Id}}' "$rabbitmq_docker_name")"
128128
echo "[INFO] '$rabbitmq_docker_name' docker id is '$rabbitmq_docker_id'"
129-
if [[ -v GITHUB_OUTPUT ]]
129+
if [ -z GITHUB_OUTPUT ]
130130
then
131131
if [[ -f $GITHUB_OUTPUT ]]
132132
then
@@ -146,14 +146,8 @@ function install_ca_certificate
146146
openssl version -d
147147
set -o errexit
148148

149-
if [[ $GITHUB_ACTIONS == 'true' ]]
150-
then
151-
readonly openssl_store_dir='/usr/lib/ssl/certs'
152-
sudo cp -vf "$GITHUB_WORKSPACE/.ci/certs/ca_certificate.pem" "$openssl_store_dir"
153-
sudo ln -vsf "$openssl_store_dir/ca_certificate.pem" "$openssl_store_dir/$(openssl x509 -hash -noout -in $openssl_store_dir/ca_certificate.pem).0"
154-
else
155149
echo "[WARNING] you must install '$GITHUB_WORKSPACE/.ci/certs/ca_certificate.pem' manually into your trusted root store"
156-
fi
150+
157151

158152
openssl s_client -connect localhost:5671 \
159153
-CAfile "$GITHUB_WORKSPACE/.ci/certs/ca_certificate.pem" \

Directory.Packages.props

Lines changed: 2 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -2,10 +2,10 @@
22
<PropertyGroup>
33
<ManagePackageVersionsCentrally>true</ManagePackageVersionsCentrally>
44
</PropertyGroup>
5-
65
<ItemGroup>
76
<!-- RabbitMQ.Amqp.Client -->
87
<PackageVersion Include="AMQPNetLite.Core" Version="2.4.11" />
8+
<PackageVersion Include="Microsoft.Extensions.Diagnostics.Testing" Version="8.10.0" />
99
<!-- Tests -->
1010
<PackageVersion Include="xunit" Version="2.9.0" />
1111
<PackageVersion Include="xunit.runner.visualstudio" Version="2.8.2" />
@@ -14,7 +14,6 @@
1414
<PackageVersion Include="Microsoft.NET.Test.Sdk" Version="17.11.0" />
1515
<PackageVersion Include="EasyNetQ.Management.Client" Version="3.0.0" />
1616
</ItemGroup>
17-
1817
<ItemGroup Condition="$(TargetFramework)=='netstandard2.0'">
1918
<!--
2019
Note: do NOT upgrade these dependencies unless necessary
@@ -25,22 +24,18 @@
2524
<PackageVersion Include="System.Diagnostics.DiagnosticSource" Version="6.0.0" />
2625
<PackageVersion Include="System.Runtime.CompilerServices.Unsafe" Version="6.0.0" />
2726
</ItemGroup>
28-
2927
<ItemGroup Condition="'$(TargetFramework)'=='net6.0'">
3028
<PackageVersion Include="System.Diagnostics.DiagnosticSource" Version="6.0.0" />
3129
</ItemGroup>
32-
3330
<ItemGroup Condition="'$(TargetFramework)'=='net8.0'">
3431
<PackageVersion Include="System.Diagnostics.DiagnosticSource" Version="8.0.1" />
3532
</ItemGroup>
36-
3733
<ItemGroup Condition="'$(TargetFrameworkIdentifier)'=='.NETFramework'">
3834
<GlobalPackageReference Include="Microsoft.NETFramework.ReferenceAssemblies" Version="1.0.3" />
3935
</ItemGroup>
40-
4136
<ItemGroup Condition="'$(IsPackable)'=='true'">
4237
<GlobalPackageReference Include="Microsoft.CodeAnalysis.PublicApiAnalyzers" Version="3.3.4" />
4338
<GlobalPackageReference Include="Microsoft.SourceLink.GitHub" Version="8.0.0" />
4439
<GlobalPackageReference Include="MinVer" Version="5.0.0" />
4540
</ItemGroup>
46-
</Project>
41+
</Project>

RabbitMQ.AMQP.Client/Impl/AmqpConsumer.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -158,7 +158,7 @@ private async Task ProcessMessages()
158158

159159
IContext context = new DeliveryContext(_receiverLink, nativeMessage, _unsettledMessageCounter);
160160
var amqpMessage = new AmqpMessage(nativeMessage);
161-
161+
162162
// TODO catch exceptions thrown by handlers,
163163
// then call exception handler?
164164
if (_configuration.Handler != null)

RabbitMQ.AMQP.Client/Impl/MetricsReporter.cs

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -35,7 +35,7 @@ internal sealed class MetricsReporter : IMetricsReporter
3535
private const string MessagingSystem = "messaging.system";
3636
private const string ErrorType = "error.type";
3737
private const string MessageDestinationName = "messaging.destination.name";
38-
private const string ServerAddress = "server.adress";
38+
private const string ServerAddress = "server.address";
3939
private const string ServerPort = "server.port";
4040

4141
private const string ProcessOperation = "process";
@@ -135,7 +135,7 @@ public void ReportMessageDeliverSuccess(IMetricsReporter.ConsumerContext context
135135
#endif
136136
s_messagingProcessDuration.Record(duration.TotalSeconds, serverAddress, serverPort,
137137
destination,
138-
_messagingOperationSystemTag, _sendOperationType, _publishOperationName);
138+
_messagingOperationSystemTag, _processOperationType, _deliverOperationName);
139139
}
140140
}
141141

@@ -159,7 +159,7 @@ public void ReportMessageDeliverFailure(IMetricsReporter.ConsumerContext context
159159
#endif
160160
s_messagingProcessDuration.Record(duration.TotalSeconds, errorType, serverAddress, serverPort,
161161
destination,
162-
_messagingOperationSystemTag, _sendOperationType, _publishOperationName);
162+
_messagingOperationSystemTag, _processOperationType, _deliverOperationName);
163163
}
164164
}
165165
#if !NET7_0_OR_GREATER
Lines changed: 83 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,83 @@
1+
// This source code is dual-licensed under the Apache License, version
2+
// 2.0, and the Mozilla Public License, version 2.0.
3+
// Copyright (c) 2017-2023 Broadcom. All Rights Reserved. The term "Broadcom" refers to Broadcom Inc. and/or its subsidiaries.
4+
5+
using System;
6+
using System.Collections.Generic;
7+
using System.Threading;
8+
using System.Threading.Tasks;
9+
using Microsoft.Extensions.Diagnostics.Metrics.Testing;
10+
using RabbitMQ.AMQP.Client;
11+
using RabbitMQ.AMQP.Client.Impl;
12+
using Xunit;
13+
using Xunit.Abstractions;
14+
15+
namespace Tests.Consumer;
16+
17+
public class MetricsConsumerTests(ITestOutputHelper testOutputHelper) : IntegrationTest(testOutputHelper)
18+
{
19+
[Fact]
20+
public async Task RecordMessageDeliverySuccessAndDuration()
21+
{
22+
// Be careful specifying scope=null. This binds the collector to a global Meter and tests
23+
// that use global state should not be configured to run in parallel.
24+
var messageConsumedCollector = new MetricCollector<int>(null, "RabbitMQ.Amqp", "messaging.client.consumed.messages");
25+
var messageProcessingDurationCollector = new MetricCollector<double>(null, "RabbitMQ.Amqp", "messaging.process.duration");
26+
27+
Assert.NotNull(_connection);
28+
Assert.NotNull(_management);
29+
30+
IQueueSpecification queueSpec = _management.Queue().Name(_queueName);
31+
await queueSpec.DeclareAsync();
32+
33+
await PublishAsync(queueSpec, 2);
34+
35+
TaskCompletionSource<IMessage> tcs = new();
36+
//Need to send 2 message, metrics are recorded after message consumption so want on first message consumption will end tests before metrics being incremented
37+
bool isPairMessage = true;
38+
IConsumer consumer = await _connection.ConsumerBuilder()
39+
.Queue(queueSpec)
40+
.MessageHandler(async (context, message) =>
41+
{
42+
await context.AcceptAsync();
43+
isPairMessage = !isPairMessage;
44+
if (isPairMessage)
45+
{
46+
tcs.SetResult(message);
47+
}
48+
}
49+
).BuildAndStartAsync();
50+
51+
await WhenTcsCompletes(tcs);
52+
53+
54+
var consumedMessagesMeasurements = messageConsumedCollector.GetMeasurementSnapshot();
55+
Assert.NotEmpty(consumedMessagesMeasurements);
56+
Assert.Equal(1, consumedMessagesMeasurements[0].Value);
57+
Assert.Equal(consumedMessagesMeasurements[0].Tags["messaging.system"], "rabbitmq");
58+
Assert.Equal(consumedMessagesMeasurements[0].Tags["messaging.operation.name"], "deliver");
59+
Assert.Equal(consumedMessagesMeasurements[0].Tags["messaging.operation.type"], "process");
60+
Assert.Equal(consumedMessagesMeasurements[0].Tags["messaging.destination.name"],
61+
$"/queues/{Utils.EncodePathSegment(queueSpec.QueueName)}");
62+
Assert.Equal(consumedMessagesMeasurements[0].Tags["server.port"],
63+
_connectionSettings!.Port);
64+
Assert.Equal(consumedMessagesMeasurements[0].Tags["server.address"],
65+
_connectionSettings!.Host);
66+
67+
var consumedMessageDurationMeasurements = messageProcessingDurationCollector.GetMeasurementSnapshot();
68+
Assert.NotEmpty(consumedMessageDurationMeasurements);
69+
Assert.True( consumedMessageDurationMeasurements[0].Value > 0);
70+
Assert.Equal(consumedMessageDurationMeasurements[0].Tags["messaging.system"], "rabbitmq");
71+
Assert.Equal(consumedMessageDurationMeasurements[0].Tags["messaging.operation.name"], "deliver");
72+
Assert.Equal(consumedMessageDurationMeasurements[0].Tags["messaging.operation.type"], "process");
73+
Assert.Equal(consumedMessageDurationMeasurements[0].Tags["messaging.destination.name"],
74+
$"/queues/{Utils.EncodePathSegment(queueSpec.QueueName)}");
75+
Assert.Equal(consumedMessageDurationMeasurements[0].Tags["server.port"],
76+
_connectionSettings!.Port);
77+
Assert.Equal(consumedMessageDurationMeasurements[0].Tags["server.address"],
78+
_connectionSettings!.Host);
79+
80+
await consumer.CloseAsync();
81+
consumer.Dispose();
82+
}
83+
}

Tests/IntegrationTest.cs

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -16,11 +16,13 @@ namespace Tests;
1616

1717
public abstract class IntegrationTest : IAsyncLifetime
1818
{
19+
1920
protected readonly ITestOutputHelper _testOutputHelper;
2021
protected readonly string _testDisplayName = nameof(IntegrationTest);
2122
protected readonly TimeSpan _waitSpan = TimeSpan.FromSeconds(5);
2223

2324
protected IConnection? _connection;
25+
protected ConnectionSettings? _connectionSettings;
2426
protected IManagement? _management;
2527
protected string _queueName;
2628
protected string _exchangeName;
@@ -48,8 +50,8 @@ public virtual async Task InitializeAsync()
4850
{
4951
if (_setupConnectionAndManagement)
5052
{
51-
ConnectionSettings connectionSettings = _connectionSettingBuilder.Build();
52-
_connection = await AmqpConnection.CreateAsync(connectionSettings);
53+
_connectionSettings = _connectionSettingBuilder.Build();
54+
_connection = await AmqpConnection.CreateAsync(_connectionSettings);
5355
_management = _connection.Management();
5456
}
5557

Tests/Tests.csproj

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,7 @@
1818

1919
<ItemGroup>
2020
<PackageReference Include="EasyNetQ.Management.Client" />
21+
<PackageReference Include="Microsoft.Extensions.Diagnostics.Testing" />
2122
<PackageReference Include="Microsoft.NET.Test.Sdk" />
2223
<PackageReference Include="xunit" />
2324
<PackageReference Include="xunit.runner.visualstudio" PrivateAssets="all" />

0 commit comments

Comments
 (0)