-
Notifications
You must be signed in to change notification settings - Fork 49
Expand file tree
/
Copy pathDeadLetterQueueCheckTests.cs
More file actions
148 lines (126 loc) · 4.62 KB
/
DeadLetterQueueCheckTests.cs
File metadata and controls
148 lines (126 loc) · 4.62 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
namespace ServiceControl.Transport.Tests;
using System;
using System.Collections;
using System.Threading.Tasks;
using System.Web;
using IBM.WMQ;
using NUnit.Framework;
using Transports;
using Transports.IBMMQ;
[TestFixture]
class DeadLetterQueueCheckTests
{
[Test]
public async Task Should_pass_when_custom_checks_disabled()
{
var settings = new TransportSettings
{
ConnectionString = ConnectionString,
RunCustomChecks = false
};
var check = new DeadLetterQueueCheck(settings);
var result = await check.PerformCheck().ConfigureAwait(false);
Assert.That(result.HasFailed, Is.False);
}
[Test]
public async Task Should_pass_when_dlq_is_empty()
{
DrainDeadLetterQueue();
var settings = new TransportSettings
{
ConnectionString = ConnectionString,
RunCustomChecks = true
};
var check = new DeadLetterQueueCheck(settings);
var result = await check.PerformCheck().ConfigureAwait(false);
Assert.That(result.HasFailed, Is.False);
}
[Test]
public async Task Should_fail_when_dlq_has_messages()
{
DrainDeadLetterQueue();
PutMessageOnDeadLetterQueue();
try
{
var settings = new TransportSettings
{
ConnectionString = ConnectionString,
RunCustomChecks = true
};
var check = new DeadLetterQueueCheck(settings);
var result = await check.PerformCheck().ConfigureAwait(false);
Assert.That(result.HasFailed, Is.True);
Assert.That(result.FailureReason, Does.Contain("messages in the Dead Letter Queue"));
}
finally
{
DrainDeadLetterQueue();
}
}
[Test]
public async Task Should_fail_when_connection_is_invalid()
{
var settings = new TransportSettings
{
ConnectionString = "mq://admin:passw0rd@localhost:19999/BOGUS",
RunCustomChecks = true
};
var check = new DeadLetterQueueCheck(settings);
var result = await check.PerformCheck().ConfigureAwait(false);
Assert.That(result.HasFailed, Is.True);
Assert.That(result.FailureReason, Does.Contain("Unable to check Dead Letter Queue"));
Assert.That(result.FailureReason, Does.Contain("RC="));
}
static void PutMessageOnDeadLetterQueue()
{
var (qmName, props) = ParseConnectionString();
using var qm = new MQQueueManager(qmName, props);
var dlqName = qm.DeadLetterQueueName.Trim();
using var dlq = qm.AccessQueue(dlqName, MQC.MQOO_OUTPUT);
var msg = new MQMessage();
msg.WriteString("DLQ test message");
dlq.Put(msg);
}
static void DrainDeadLetterQueue()
{
var (qmName, props) = ParseConnectionString();
using var qm = new MQQueueManager(qmName, props);
var dlqName = qm.DeadLetterQueueName.Trim();
using var dlq = qm.AccessQueue(dlqName, MQC.MQOO_INPUT_SHARED | MQC.MQOO_FAIL_IF_QUIESCING);
var gmo = new MQGetMessageOptions { WaitInterval = 0, Options = MQC.MQGMO_NO_WAIT };
while (true)
{
try
{
dlq.Get(new MQMessage(), gmo);
}
catch (MQException e) when (e.ReasonCode == MQC.MQRC_NO_MSG_AVAILABLE)
{
break;
}
}
}
static (string queueManagerName, Hashtable properties) ParseConnectionString()
{
var uri = new Uri(ConnectionString);
var query = HttpUtility.ParseQueryString(uri.Query);
var qmName = uri.AbsolutePath.Trim('/') is { Length: > 0 } path
? Uri.UnescapeDataString(path)
: "QM1";
var props = new Hashtable
{
[MQC.TRANSPORT_PROPERTY] = MQC.TRANSPORT_MQSERIES_MANAGED,
[MQC.HOST_NAME_PROPERTY] = uri.Host,
[MQC.PORT_PROPERTY] = uri.Port > 0 ? uri.Port : 1414,
[MQC.CHANNEL_PROPERTY] = query["channel"] ?? "DEV.ADMIN.SVRCONN",
[MQC.USE_MQCSP_AUTHENTICATION_PROPERTY] = true,
[MQC.USER_ID_PROPERTY] = Uri.UnescapeDataString(uri.UserInfo.Split(':')[0]),
[MQC.PASSWORD_PROPERTY] = Uri.UnescapeDataString(uri.UserInfo.Split(':')[1])
};
return (qmName, props);
}
static readonly string ConnectionString =
Environment.GetEnvironmentVariable("ServiceControl_TransportTests_IBMMQ_ConnectionString")
?? Environment.GetEnvironmentVariable("SERVICECONTROL_TRANSPORTTESTS_IBMMQ_CONNECTIONSTRING")
?? "mq://admin:passw0rd@localhost:1414";
}