Skip to content

Commit cbe5b73

Browse files
committed
Remove Moq
Fixes #1369 Use mock test objects instead of Moq Use reset events rather than sleeps
1 parent 6c68581 commit cbe5b73

File tree

3 files changed

+222
-74
lines changed

3 files changed

+222
-74
lines changed

projects/Unit/TestOAuth2ClientCredentialsProvider.cs

Lines changed: 119 additions & 43 deletions
Original file line numberDiff line numberDiff line change
@@ -30,93 +30,169 @@
3030
//---------------------------------------------------------------------------
3131

3232
using System;
33+
using System.Diagnostics;
3334
using System.Threading;
34-
using Moq;
3535
using RabbitMQ.Client.OAuth2;
3636
using Xunit;
37+
using Xunit.Abstractions;
3738

3839
namespace RabbitMQ.Client.Unit
3940
{
41+
public class MockIOAuth2Client : IOAuth2Client
42+
{
43+
private readonly ITestOutputHelper _testOutputHelper;
44+
private IToken _refreshToken;
45+
private IToken _requestToken;
46+
47+
public MockIOAuth2Client(ITestOutputHelper testOutputHelper)
48+
{
49+
_testOutputHelper = testOutputHelper;
50+
}
51+
52+
public IToken RefreshTokenValue
53+
{
54+
get { return _refreshToken; }
55+
set
56+
{
57+
if (value == null)
58+
{
59+
throw new ArgumentNullException(nameof(value));
60+
}
61+
62+
_refreshToken = value;
63+
}
64+
}
65+
66+
public IToken RequestTokenValue
67+
{
68+
get { return _requestToken; }
69+
set
70+
{
71+
if (value == null)
72+
{
73+
throw new ArgumentNullException(nameof(value));
74+
}
75+
76+
_requestToken = value;
77+
}
78+
}
79+
80+
public IToken RefreshToken(IToken initialToken)
81+
{
82+
Debug.Assert(Object.ReferenceEquals(_requestToken, initialToken));
83+
return _refreshToken;
84+
}
85+
86+
public IToken RequestToken()
87+
{
88+
return _requestToken;
89+
}
90+
}
91+
4092
public class TestOAuth2CredentialsProvider
4193
{
42-
protected OAuth2ClientCredentialsProvider _provider;
43-
protected Mock<IOAuth2Client> _oAuth2Client;
94+
private readonly ITestOutputHelper _testOutputHelper;
4495

45-
public TestOAuth2CredentialsProvider()
96+
public TestOAuth2CredentialsProvider(ITestOutputHelper testOutputHelper)
4697
{
47-
_oAuth2Client = new Mock<IOAuth2Client>();
48-
_provider = new OAuth2ClientCredentialsProvider("aName", _oAuth2Client.Object);
98+
_testOutputHelper = testOutputHelper;
4999
}
50100

51101
[Fact]
52-
public void shouldHaveAName()
102+
public void ShouldHaveAName()
53103
{
54-
Assert.Equal("aName", _provider.Name);
104+
const string name = "aName";
105+
IOAuth2Client oAuth2Client = new MockIOAuth2Client(_testOutputHelper);
106+
var provider = new OAuth2ClientCredentialsProvider(name, oAuth2Client);
107+
108+
Assert.Equal(name, provider.Name);
55109
}
56110

57111
[Fact]
58112
public void ShouldRequestTokenWhenAskToRefresh()
59113
{
60-
_oAuth2Client.Setup(p => p.RequestToken()).Returns(newToken("the_access_token", TimeSpan.FromSeconds(60)));
61-
_provider.Refresh();
62-
Assert.Equal("the_access_token", _provider.Password);
114+
const string newTokenValue = "the_access_token";
115+
IToken newToken = NewToken(newTokenValue, TimeSpan.FromSeconds(60));
116+
var oAuth2Client = new MockIOAuth2Client(_testOutputHelper);
117+
oAuth2Client.RequestTokenValue = newToken;
118+
var provider = new OAuth2ClientCredentialsProvider(nameof(ShouldRequestTokenWhenAskToRefresh), oAuth2Client);
119+
120+
provider.Refresh();
121+
122+
Assert.Equal(newTokenValue, provider.Password);
63123
}
64124

65125
[Fact]
66126
public void ShouldRequestTokenWhenGettingPasswordOrValidUntilForFirstTimeAccess()
67127
{
68-
IToken firstToken = newToken("the_access_token", "the_refresh_token", TimeSpan.FromSeconds(1));
69-
_oAuth2Client.Setup(p => p.RequestToken()).Returns(firstToken);
70-
Assert.Equal(firstToken.AccessToken, _provider.Password);
71-
Assert.Equal(firstToken.ExpiresIn, _provider.ValidUntil.Value);
128+
const string accessToken = "the_access_token";
129+
const string refreshToken = "the_refresh_token";
130+
IToken firstToken = NewToken(accessToken, refreshToken, TimeSpan.FromSeconds(1));
131+
var oAuth2Client = new MockIOAuth2Client(_testOutputHelper);
132+
oAuth2Client.RequestTokenValue = firstToken;
133+
var provider = new OAuth2ClientCredentialsProvider(nameof(ShouldRequestTokenWhenGettingPasswordOrValidUntilForFirstTimeAccess), oAuth2Client);
134+
135+
Assert.Equal(firstToken.AccessToken, provider.Password);
136+
Assert.Equal(firstToken.ExpiresIn, provider.ValidUntil.Value);
72137
}
73138

74139
[Fact]
75140
public void ShouldRefreshTokenUsingRefreshTokenWhenAvailable()
76141
{
77-
IToken firstToken = newToken("the_access_token", "the_refresh_token", TimeSpan.FromSeconds(1));
78-
IToken refreshedToken = newToken("the_access_token2", "the_refresh_token_2", TimeSpan.FromSeconds(60));
79-
_oAuth2Client.Setup(p => p.RequestToken()).Returns(firstToken);
80-
_provider.Refresh();
81-
Assert.Equal(firstToken.AccessToken, _provider.Password);
82-
Assert.Equal(firstToken.ExpiresIn, _provider.ValidUntil.Value);
83-
84-
_oAuth2Client.Reset();
85-
Thread.Sleep(1000);
86-
_oAuth2Client.Setup(p => p.RefreshToken(firstToken)).Returns(refreshedToken);
87-
_provider.Refresh();
88-
89-
Assert.Equal(refreshedToken.AccessToken, _provider.Password);
90-
Assert.Equal(refreshedToken.ExpiresIn, _provider.ValidUntil.Value);
142+
const string accessToken = "the_access_token";
143+
const string refreshToken = "the_refresh_token";
144+
const string accessToken2 = "the_access_token_2";
145+
const string refreshToken2 = "the_refresh_token_2";
146+
147+
IToken firstToken = NewToken(accessToken, refreshToken, TimeSpan.FromSeconds(1));
148+
IToken refreshedToken = NewToken(accessToken2, refreshToken2, TimeSpan.FromSeconds(60));
149+
var oAuth2Client = new MockIOAuth2Client(_testOutputHelper);
150+
oAuth2Client.RequestTokenValue = firstToken;
151+
var provider = new OAuth2ClientCredentialsProvider(nameof(ShouldRequestTokenWhenGettingPasswordOrValidUntilForFirstTimeAccess), oAuth2Client);
152+
153+
provider.Refresh();
154+
155+
Assert.Equal(firstToken.AccessToken, provider.Password);
156+
Assert.Equal(firstToken.ExpiresIn, provider.ValidUntil.Value);
157+
158+
oAuth2Client.RefreshTokenValue = refreshedToken;
159+
provider.Refresh();
160+
161+
Assert.Equal(refreshedToken.AccessToken, provider.Password);
162+
Assert.Equal(refreshedToken.ExpiresIn, provider.ValidUntil.Value);
91163
}
92164

93165
[Fact]
94166
public void ShouldRequestTokenWhenRefreshTokenNotAvailable()
95167
{
96-
IToken firstToken = newToken("the_access_token", null, TimeSpan.FromSeconds(1));
97-
IToken refreshedToken = newToken("the_access_token2", null, TimeSpan.FromSeconds(1));
98-
_oAuth2Client.SetupSequence(p => p.RequestToken())
99-
.Returns(firstToken)
100-
.Returns(refreshedToken);
101-
_provider.Refresh();
168+
const string accessToken = "the_access_token";
169+
const string accessToken2 = "the_access_token_2";
170+
IToken firstToken = NewToken(accessToken, null, TimeSpan.FromSeconds(1));
171+
IToken secondToken = NewToken(accessToken2, null, TimeSpan.FromSeconds(60));
172+
173+
var oAuth2Client = new MockIOAuth2Client(_testOutputHelper);
174+
oAuth2Client.RequestTokenValue = firstToken;
175+
var provider = new OAuth2ClientCredentialsProvider(nameof(ShouldRequestTokenWhenRefreshTokenNotAvailable), oAuth2Client);
176+
177+
provider.Refresh();
102178

103-
Assert.Equal(firstToken.AccessToken, _provider.Password);
104-
Assert.Equal(firstToken.ExpiresIn, _provider.ValidUntil.Value);
179+
Assert.Equal(firstToken.AccessToken, provider.Password);
180+
Assert.Equal(firstToken.ExpiresIn, provider.ValidUntil.Value);
105181

106-
_provider.Refresh();
182+
oAuth2Client.RequestTokenValue = secondToken;
183+
provider.Refresh();
107184

108-
Assert.Equal(refreshedToken.AccessToken, _provider.Password);
109-
Assert.Equal(refreshedToken.ExpiresIn, _provider.ValidUntil.Value);
110-
Mock.Verify(_oAuth2Client);
185+
Assert.Equal(secondToken.AccessToken, provider.Password);
186+
Assert.Equal(secondToken.ExpiresIn, provider.ValidUntil.Value);
111187
}
112188

113-
private static Token newToken(string access_token, TimeSpan expiresIn)
189+
private static Token NewToken(string access_token, TimeSpan expiresIn)
114190
{
115191
var token = new JsonToken(access_token, string.Empty, expiresIn);
116192
return new Token(token);
117193
}
118194

119-
private static Token newToken(string access_token, string refresh_token, TimeSpan expiresIn)
195+
private static Token NewToken(string access_token, string refresh_token, TimeSpan expiresIn)
120196
{
121197
JsonToken token = new JsonToken(access_token, refresh_token, expiresIn);
122198
return new Token(token);

projects/Unit/TestTimerBasedCredentialRefresher.cs

Lines changed: 103 additions & 30 deletions
Original file line numberDiff line numberDiff line change
@@ -30,70 +30,143 @@
3030
//---------------------------------------------------------------------------
3131

3232
using System;
33+
using System.Reflection.Metadata.Ecma335;
3334
using System.Threading;
34-
using Moq;
35+
using System.Threading.Tasks;
3536
using Xunit;
37+
using Xunit.Abstractions;
3638

3739
namespace RabbitMQ.Client.Unit
3840
{
41+
public class MockCredentialsProvider : ICredentialsProvider
42+
{
43+
private readonly ITestOutputHelper _testOutputHelper;
44+
private readonly TimeSpan? _validUntil = TimeSpan.FromSeconds(1);
45+
private Exception _ex = null;
46+
private bool _refreshCalled = false;
47+
48+
public MockCredentialsProvider(ITestOutputHelper testOutputHelper)
49+
{
50+
_testOutputHelper = testOutputHelper;
51+
}
52+
53+
public MockCredentialsProvider(ITestOutputHelper testOutputHelper, TimeSpan validUntil)
54+
{
55+
_testOutputHelper = testOutputHelper;
56+
_validUntil = validUntil;
57+
}
58+
59+
public bool RefreshCalled
60+
{
61+
get
62+
{
63+
return _refreshCalled;
64+
}
65+
}
66+
67+
public string Name => this.GetType().Name;
68+
69+
public string UserName => "guest";
70+
71+
public string Password
72+
{
73+
get
74+
{
75+
if (_ex == null)
76+
{
77+
return "guest";
78+
}
79+
else
80+
{
81+
throw _ex;
82+
}
83+
}
84+
}
85+
86+
public TimeSpan? ValidUntil => _validUntil;
87+
88+
public void Refresh()
89+
{
90+
_refreshCalled = true;
91+
}
92+
93+
public void PasswordThrows(Exception ex)
94+
{
95+
_ex = ex;
96+
}
97+
}
98+
3999
public class TestTimerBasedCredentialsRefresher
40100
{
41-
protected TimerBasedCredentialRefresher _refresher;
42-
protected Mock<ICredentialsProvider> _credentialsProvider;
43-
protected Mock<ICredentialsRefresher.NotifyCredentialRefreshed> _callback = new Mock<ICredentialsRefresher.NotifyCredentialRefreshed>();
101+
private readonly ITestOutputHelper _testOutputHelper;
102+
private readonly TimerBasedCredentialRefresher _refresher = new TimerBasedCredentialRefresher();
44103

45-
public TestTimerBasedCredentialsRefresher()
104+
public TestTimerBasedCredentialsRefresher(ITestOutputHelper testOutputHelper)
46105
{
47-
_refresher = new TimerBasedCredentialRefresher();
48-
_credentialsProvider = new Mock<ICredentialsProvider>();
106+
_testOutputHelper = testOutputHelper;
49107
}
50108

51109
[Fact]
52110
public void TestRegister()
53111
{
54-
_credentialsProvider.Setup(p => p.ValidUntil).Returns(TimeSpan.FromSeconds(1));
55-
Assert.True(_credentialsProvider.Object == _refresher.Register(_credentialsProvider.Object, _callback.Object));
56-
Assert.True(_refresher.Unregister(_credentialsProvider.Object));
112+
ICredentialsRefresher.NotifyCredentialRefreshed cb = (bool unused) => { };
113+
ICredentialsProvider credentialsProvider = new MockCredentialsProvider(_testOutputHelper);
114+
115+
Assert.True(credentialsProvider == _refresher.Register(credentialsProvider, cb));
116+
Assert.True(_refresher.Unregister(credentialsProvider));
57117
}
58118

59119
[Fact]
60120
public void TestDoNotRegisterWhenHasNoExpiry()
61121
{
122+
ICredentialsProvider credentialsProvider = new MockCredentialsProvider(_testOutputHelper, TimeSpan.Zero);
123+
ICredentialsRefresher.NotifyCredentialRefreshed cb = (bool unused) => { };
62124

63-
_credentialsProvider.Setup(p => p.ValidUntil).Returns(TimeSpan.Zero);
64-
_refresher.Register(_credentialsProvider.Object, _callback.Object);
65-
Assert.False(_refresher.Unregister(_credentialsProvider.Object));
66-
_credentialsProvider.Verify();
125+
_refresher.Register(credentialsProvider, cb);
126+
127+
Assert.False(_refresher.Unregister(credentialsProvider));
67128
}
68129

69130
[Fact]
70131
public void TestRefreshToken()
71132
{
72-
_credentialsProvider.Setup(p => p.ValidUntil).Returns(TimeSpan.FromSeconds(1));
73-
_credentialsProvider.Setup(p => p.Password).Returns("the-token").Verifiable();
74-
_callback.Setup(p => p.Invoke(true));
75-
_refresher.Register(_credentialsProvider.Object, _callback.Object);
133+
var cbevt = new ManualResetEvent(false);
134+
bool? callbackArg = null;
135+
var credentialsProvider = new MockCredentialsProvider(_testOutputHelper, TimeSpan.FromSeconds(1));
136+
ICredentialsRefresher.NotifyCredentialRefreshed cb = (bool arg) =>
137+
{
138+
callbackArg = arg;
139+
cbevt.Set();
140+
};
141+
142+
_refresher.Register(credentialsProvider, cb);
76143

77-
Thread.Sleep(TimeSpan.FromSeconds(1));
144+
cbevt.WaitOne(TimeSpan.FromSeconds(2));
78145

79-
_credentialsProvider.Verify();
80-
_callback.Verify();
146+
Assert.True(credentialsProvider.RefreshCalled);
147+
Assert.True(callbackArg);
81148
}
82149

83150
[Fact]
84151
public void TestRefreshTokenFailed()
85152
{
86-
_credentialsProvider.Setup(p => p.ValidUntil).Returns(TimeSpan.FromSeconds(1));
87-
_credentialsProvider.SetupSequence(p => p.Password)
88-
.Returns("the-token")
89-
.Throws(new Exception());
90-
_callback.Setup(p => p.Invoke(false));
91-
_refresher.Register(_credentialsProvider.Object, _callback.Object);
153+
var cbevt = new ManualResetEvent(false);
154+
bool? callbackArg = null;
155+
var credentialsProvider = new MockCredentialsProvider(_testOutputHelper, TimeSpan.FromSeconds(1));
156+
ICredentialsRefresher.NotifyCredentialRefreshed cb = (bool arg) =>
157+
{
158+
callbackArg = arg;
159+
cbevt.Set();
160+
};
161+
162+
var ex = new Exception();
163+
credentialsProvider.PasswordThrows(ex);
92164

93-
Thread.Sleep(TimeSpan.FromSeconds(1));
165+
_refresher.Register(credentialsProvider, cb);
166+
cbevt.WaitOne(TimeSpan.FromSeconds(2));
94167

95-
_credentialsProvider.Verify();
96-
_callback.Verify();
168+
Assert.True(credentialsProvider.RefreshCalled);
169+
Assert.False(callbackArg);
97170
}
98171
}
99172
}

projects/Unit/Unit.csproj

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -28,7 +28,6 @@
2828
<IncludeAssets>runtime; build; native; contentfiles; analyzers; buildtransitive</IncludeAssets>
2929
<PrivateAssets>all</PrivateAssets>
3030
</PackageReference>
31-
<PackageReference Include="moq" Version="4.18.4" />
3231
<PackageReference Include="PublicApiGenerator" Version="11.0.0" />
3332
<PackageReference Include="xunit" Version="2.5.0" />
3433
<PackageReference Include="xunit.runner.visualstudio" Version="2.5.0" />

0 commit comments

Comments
 (0)