Skip to content
体验新版
项目
组织
正在加载...
登录
切换导航
打开侧边栏
dotNET Platform
MQTTnet
提交
fc31c307
MQTTnet
项目概览
dotNET Platform
/
MQTTnet
10 个月 前同步成功
通知
0
Star
1
Fork
0
代码
文件
提交
分支
Tags
贡献者
分支图
Diff
Issue
0
列表
看板
标记
里程碑
合并请求
0
DevOps
流水线
流水线任务
计划
Wiki
0
Wiki
分析
仓库
DevOps
项目成员
Pages
MQTTnet
项目概览
项目概览
详情
发布
仓库
仓库
文件
提交
分支
标签
贡献者
分支图
比较
Issue
0
Issue
0
列表
看板
标记
里程碑
合并请求
0
合并请求
0
Pages
DevOps
DevOps
流水线
流水线任务
计划
分析
分析
仓库分析
DevOps
Wiki
0
Wiki
成员
成员
收起侧边栏
关闭侧边栏
动态
分支图
创建新Issue
流水线任务
提交
Issue看板
前往新版Gitcode,体验更适合开发者的 AI 搜索 >>
提交
fc31c307
编写于
8月 22, 2023
作者:
C
Christian
浏览文件
操作
浏览文件
下载
电子邮件补丁
差异文件
Fix Unit Tests
上级
e604345e
变更
1
隐藏空白更改
内联
并排
Showing
1 changed file
with
62 addition
and
62 deletion
+62
-62
Source/MQTTnet.Tests/Server/HotSwapCerts_Tests.cs
Source/MQTTnet.Tests/Server/HotSwapCerts_Tests.cs
+62
-62
未找到文件。
Source/MQTTnet.Tests/Server/HotSwapCerts_Tests.cs
浏览文件 @
fc31c307
#if !(NET452 || NET461)
using
System
;
using
System.Collections.Concurrent
;
using
System.Diagnostics
;
...
...
@@ -12,7 +13,6 @@ using System.Threading.Tasks;
using
Microsoft.VisualStudio.TestTools.UnitTesting
;
using
MQTTnet.Certificates
;
using
MQTTnet.Client
;
using
MQTTnet.Extensions.ManagedClient
;
using
MQTTnet.Formatter
;
using
MQTTnet.Protocol
;
using
MQTTnet.Server
;
...
...
@@ -20,15 +20,14 @@ using MQTTnet.Server;
namespace
MQTTnet.Tests.Server
{
// missing certificate builder api means tests won't work for older frameworks
#if !(NET452 || NET461)
[
TestClass
]
#endif
public
sealed
class
HotSwapCerts_Tests
{
readonly
TimeSpan
DEFAULT_TIMEOUT
=
TimeSpan
.
FromSeconds
(
10
);
static
readonly
TimeSpan
DefaultTimeout
=
TimeSpan
.
FromSeconds
(
10
);
[
TestMethod
]
public
void
ClientCertChangeWithoutServerUpdateFailsReconnect
()
public
async
Task
ClientCertChangeWithoutServerUpdateFailsReconnect
()
{
using
(
var
server
=
new
ServerTestHarness
())
using
(
var
client01
=
new
ClientTestHarness
())
...
...
@@ -36,22 +35,22 @@ namespace MQTTnet.Tests.Server
server
.
InstallNewClientCert
(
client01
.
GetCurrentClientCert
());
client01
.
InstallNewServerCert
(
server
.
GetCurrentServerCert
());
server
.
StartServer
().
Wait
();
await
server
.
StartServer
();
client01
.
Connect
();
await
client01
.
Connect
();
client01
.
WaitForConnectOrFail
(
D
EFAULT_TIMEOUT
);
client01
.
WaitForConnectOrFail
(
D
efaultTimeout
);
client01
.
HotSwapClientCert
();
server
.
ForceDisconnectAsync
(
client01
).
Wait
(
D
EFAULT_TIMEOUT
);
client01
.
WaitForDisconnectOrFail
(
D
EFAULT_TIMEOUT
);
server
.
ForceDisconnectAsync
(
client01
).
Wait
(
D
efaultTimeout
);
client01
.
WaitForDisconnectOrFail
(
D
efaultTimeout
);
client01
.
WaitForConnectToFail
(
D
EFAULT_TIMEOUT
);
client01
.
WaitForConnectToFail
(
D
efaultTimeout
);
}
}
[
TestMethod
]
public
void
ClientCertChangeWithServerUpdateAcceptsReconnect
()
public
async
Task
ClientCertChangeWithServerUpdateAcceptsReconnect
()
{
using
(
var
server
=
new
ServerTestHarness
())
using
(
var
client01
=
new
ClientTestHarness
())
...
...
@@ -59,23 +58,24 @@ namespace MQTTnet.Tests.Server
server
.
InstallNewClientCert
(
client01
.
GetCurrentClientCert
());
client01
.
InstallNewServerCert
(
server
.
GetCurrentServerCert
());
server
.
StartServer
().
Wait
();
client01
.
Connect
();
await
server
.
StartServer
();
client01
.
WaitForConnectOrFail
(
DEFAULT_TIMEOUT
);
await
client01
.
Connect
();
client01
.
WaitForConnectOrFail
(
DefaultTimeout
);
client01
.
HotSwapClientCert
();
server
.
ForceDisconnectAsync
(
client01
).
Wait
(
D
EFAULT_TIMEOUT
);
client01
.
WaitForDisconnectOrFail
(
D
EFAULT_TIMEOUT
);
server
.
ForceDisconnectAsync
(
client01
).
Wait
(
D
efaultTimeout
);
client01
.
WaitForDisconnectOrFail
(
D
efaultTimeout
);
server
.
InstallNewClientCert
(
client01
.
GetCurrentClientCert
());
client01
.
WaitForConnectOrFail
(
D
EFAULT_TIMEOUT
);
client01
.
WaitForConnectOrFail
(
D
efaultTimeout
);
}
}
[
TestMethod
]
public
void
ServerCertChangeWithClientCertUpdateAllowsReconnect
()
public
async
Task
ServerCertChangeWithClientCertUpdateAllowsReconnect
()
{
using
(
var
server
=
new
ServerTestHarness
())
using
(
var
client01
=
new
ClientTestHarness
())
...
...
@@ -83,22 +83,22 @@ namespace MQTTnet.Tests.Server
server
.
InstallNewClientCert
(
client01
.
GetCurrentClientCert
());
client01
.
InstallNewServerCert
(
server
.
GetCurrentServerCert
());
server
.
StartServer
().
Wait
();
client01
.
Connect
();
await
server
.
StartServer
();
await
client01
.
Connect
();
client01
.
WaitForConnectOrFail
(
D
EFAULT_TIMEOUT
);
client01
.
WaitForConnectOrFail
(
D
efaultTimeout
);
server
.
HotSwapServerCert
();
server
.
ForceDisconnectAsync
(
client01
).
Wait
(
D
EFAULT_TIMEOUT
);
client01
.
WaitForDisconnectOrFail
(
D
EFAULT_TIMEOUT
);
server
.
ForceDisconnectAsync
(
client01
).
Wait
(
D
efaultTimeout
);
client01
.
WaitForDisconnectOrFail
(
D
efaultTimeout
);
client01
.
InstallNewServerCert
(
server
.
GetCurrentServerCert
());
client01
.
WaitForConnectOrFail
(
D
EFAULT_TIMEOUT
);
client01
.
WaitForConnectOrFail
(
D
efaultTimeout
);
}
}
[
TestMethod
]
public
void
ServerCertChangeWithoutClientCertUpdateFailsReconnect
()
public
async
Task
ServerCertChangeWithoutClientCertUpdateFailsReconnect
()
{
using
(
var
server
=
new
ServerTestHarness
())
using
(
var
client01
=
new
ClientTestHarness
())
...
...
@@ -106,24 +106,21 @@ namespace MQTTnet.Tests.Server
server
.
InstallNewClientCert
(
client01
.
GetCurrentClientCert
());
client01
.
InstallNewServerCert
(
server
.
GetCurrentServerCert
());
server
.
StartServer
().
Wait
();
client01
.
Connect
();
await
server
.
StartServer
();
await
client01
.
Connect
();
client01
.
WaitForConnectOrFail
(
D
EFAULT_TIMEOUT
);
client01
.
WaitForConnectOrFail
(
D
efaultTimeout
);
server
.
HotSwapServerCert
();
server
.
ForceDisconnectAsync
(
client01
).
Wait
(
D
EFAULT_TIMEOUT
);
client01
.
WaitForDisconnectOrFail
(
D
EFAULT_TIMEOUT
);
server
.
ForceDisconnectAsync
(
client01
).
Wait
(
D
efaultTimeout
);
client01
.
WaitForDisconnectOrFail
(
D
efaultTimeout
);
client01
.
WaitForConnectToFail
(
D
EFAULT_TIMEOUT
);
client01
.
WaitForConnectToFail
(
D
efaultTimeout
);
}
}
static
X509Certificate2
CreateSelfSignedCertificate
(
string
oid
)
{
#if NET452 || NET461
throw
new
NotImplementedException
();
#else
var
sanBuilder
=
new
SubjectAlternativeNameBuilder
();
sanBuilder
.
AddIpAddress
(
IPAddress
.
Loopback
);
sanBuilder
.
AddIpAddress
(
IPAddress
.
IPv6Loopback
);
...
...
@@ -150,24 +147,23 @@ namespace MQTTnet.Tests.Server
return
pfxCertificate
;
}
}
#endif
}
class
ClientTestHarness
:
IDisposable
{
IManagedMqttClient
_client
;
readonly
HotSwappableClientCertProvider
_hotSwapClient
=
new
HotSwappableClientCertProvider
();
IMqttClient
_client
;
public
string
ClientI
D
=>
_client
.
InternalC
lient
.
Options
.
ClientId
;
public
string
ClientI
d
=>
_c
lient
.
Options
.
ClientId
;
public
void
ClearServerCerts
()
{
_hotSwapClient
.
ClearServerCerts
();
}
public
void
Connect
()
public
Task
Connect
()
{
Run_Client_Connection
().
Wait
();
return
Run_Client_Connection
();
}
public
void
Dispose
()
...
...
@@ -191,18 +187,12 @@ namespace MQTTnet.Tests.Server
_hotSwapClient
.
InstallNewServerCert
(
serverCert
);
}
public
void
WaitForConnect
(
TimeSpan
timeout
)
public
void
WaitForConnect
OrFail
(
TimeSpan
timeout
)
{
var
timer
=
Stopwatch
.
StartNew
();
while
((
_client
==
null
||
!
_client
.
IsConnected
)
&&
timer
.
Elapsed
<
timeout
)
if
(!
_client
.
IsConnected
)
{
Thread
.
Sleep
(
5
);
_client
.
ReconnectAsync
().
Wait
(
timeout
);
}
}
public
void
WaitForConnectOrFail
(
TimeSpan
timeout
)
{
Assert
.
IsFalse
(
_client
.
IsConnected
,
"Client should be disconnected before waiting for connect."
);
WaitForConnect
(
timeout
);
...
...
@@ -231,7 +221,7 @@ namespace MQTTnet.Tests.Server
public
void
WaitForDisconnectOrFail
(
TimeSpan
timeout
)
{
WaitFor
C
onnect
(
timeout
);
WaitFor
Disc
onnect
(
timeout
);
Assert
.
IsNotNull
(
_client
,
"Client was never initialized"
);
Assert
.
IsFalse
(
_client
.
IsConnected
,
$"Client connection should have disconnected after
{
timeout
}
"
);
...
...
@@ -242,28 +232,35 @@ namespace MQTTnet.Tests.Server
var
optionsBuilder
=
new
MqttClientOptionsBuilder
()
.
WithTlsOptions
(
o
=>
o
.
WithClientCertificatesProvider
(
_hotSwapClient
)
.
WithCertificateValidationHandler
(
_hotSwapClient
.
OnCertif
ci
ateValidation
)
.
WithCertificateValidationHandler
(
_hotSwapClient
.
OnCertif
ic
ateValidation
)
.
WithSslProtocols
(
SslProtocols
.
Tls12
))
.
WithTcpServer
(
"localhost"
)
.
WithCleanSession
()
.
WithProtocolVersion
(
MqttProtocolVersion
.
V500
);
var
mqttClientOptions
=
optionsBuilder
.
Build
();
var
managedClientOptionsBuilder
=
new
ManagedMqttClientOptionsBuilder
().
WithClientOptions
(
mqttClientOptions
);
var
managedClientOptions
=
managedClientOptionsBuilder
.
Build
();
var
mqttClientOptions
=
optionsBuilder
.
Build
();
var
factory
=
new
MqttFactory
();
var
mqttClient
=
factory
.
CreateM
anagedM
qttClient
();
var
mqttClient
=
factory
.
CreateMqttClient
();
_client
=
mqttClient
;
await
mqttClient
.
StartAsync
(
managedClientOptions
);
await
mqttClient
.
ConnectAsync
(
mqttClientOptions
);
}
void
WaitForConnect
(
TimeSpan
timeout
)
{
var
timer
=
Stopwatch
.
StartNew
();
while
((
_client
==
null
||
!
_client
.
IsConnected
)
&&
timer
.
Elapsed
<
timeout
)
{
Thread
.
Sleep
(
5
);
}
}
}
class
ServerTestHarness
:
IDisposable
{
CancellationTokenSource
_cts
=
new
CancellationTokenSource
();
readonly
HotSwappableServerCertProvider
_hotSwapServer
=
new
HotSwappableServerCertProvider
();
MqttServer
_server
;
public
void
ClearClientCerts
()
...
...
@@ -287,7 +284,7 @@ namespace MQTTnet.Tests.Server
public
async
Task
ForceDisconnectAsync
(
ClientTestHarness
client
)
{
await
_server
.
DisconnectClientAsync
(
client
.
ClientI
D
,
MqttDisconnectReasonCode
.
UnspecifiedError
);
await
_server
.
DisconnectClientAsync
(
client
.
ClientI
d
,
MqttDisconnectReasonCode
.
UnspecifiedError
);
}
public
X509Certificate2
GetCurrentServerCert
()
...
...
@@ -313,6 +310,7 @@ namespace MQTTnet.Tests.Server
.
WithRemoteCertificateValidationCallback
(
_hotSwapServer
.
RemoteCertificateValidationCallback
)
.
WithEncryptedEndpoint
()
.
Build
();
mqttServerOptions
.
TlsEndpointOptions
.
ClientCertificateRequired
=
true
;
_server
=
mqttFactory
.
CreateMqttServer
(
mqttServerOptions
);
await
_server
.
StartAsync
();
...
...
@@ -350,7 +348,7 @@ namespace MQTTnet.Tests.Server
ServerCerts
.
Add
(
serverCert
);
}
public
bool
OnCertif
ci
ateValidation
(
MqttClientCertificateValidationEventArgs
certContext
)
public
bool
OnCertif
ic
ateValidation
(
MqttClientCertificateValidationEventArgs
certContext
)
{
var
serverCerts
=
ServerCerts
.
ToArray
();
...
...
@@ -430,9 +428,9 @@ namespace MQTTnet.Tests.Server
var
providedCert
=
certificate
.
GetRawCertData
();
for
(
int
i
=
0
,
n
=
serverCerts
.
Length
;
i
<
n
;
i
++)
{
var
current
c
ert
=
serverCerts
[
i
];
var
current
C
ert
=
serverCerts
[
i
];
if
(
current
c
ert
.
RawData
.
SequenceEqual
(
providedCert
))
if
(
current
C
ert
.
RawData
.
SequenceEqual
(
providedCert
))
{
return
true
;
}
...
...
@@ -442,4 +440,6 @@ namespace MQTTnet.Tests.Server
}
}
}
}
\ No newline at end of file
}
#
endif
\ No newline at end of file
编辑
预览
Markdown
is supported
0%
请重试
或
添加新附件
.
添加附件
取消
You are about to add
0
people
to the discussion. Proceed with caution.
先完成此消息的编辑!
取消
想要评论请
注册
或
登录