Skip to content

Commit bccd14a

Browse files
authored
Merge pull request #110 from wooln/feature/test-msg-requetion-timeout
Add SetRequestTimeout method to Msg class
2 parents ebb10f1 + 15b2bde commit bccd14a

4 files changed

Lines changed: 163 additions & 0 deletions

File tree

src/Dtmcli/Msg/Msg.cs

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -130,6 +130,17 @@ public Msg SetRetryInterval(long retryInterval)
130130
this._transBase.RetryInterval = retryInterval;
131131
return this;
132132
}
133+
134+
/// <summary>
135+
/// Set timeout for sub branch, unit is second
136+
/// </summary>
137+
/// <param name="requestTimeout">timeout to fail</param>
138+
/// <returns></returns>
139+
public Msg SetRequestTimeout(long requestTimeout)
140+
{
141+
this._transBase.RequestTimeout = requestTimeout;
142+
return this;
143+
}
133144

134145
/// <summary>
135146
/// Set branch headers for trans

tests/Dtmcli.IntegrationTests/ITTestHelper.cs

Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -24,6 +24,20 @@ public static async Task<string> GetTranStatus(string gid)
2424

2525
return string.Empty;
2626
}
27+
28+
public static async Task<QueryResult> GetTran(string gid)
29+
{
30+
var resp = await _client.GetAsync($"{DTMHttpUrl}/api/dtmsvr/query?gid={gid}").ConfigureAwait(false);
31+
32+
if (resp.IsSuccessStatusCode)
33+
{
34+
var content = await resp.Content.ReadAsStringAsync();
35+
var res = System.Text.Json.JsonSerializer.Deserialize<QueryResult>(content);
36+
return res;
37+
}
38+
39+
return null;
40+
}
2741

2842
public class QueryResult
2943
{
@@ -35,6 +49,12 @@ public class TransGlobalStore
3549
{
3650
[System.Text.Json.Serialization.JsonPropertyName("status")]
3751
public string Status { get; set; }
52+
53+
[System.Text.Json.Serialization.JsonPropertyName("request_timeout")]
54+
public long RequestTimeout { get; set; }
55+
56+
[System.Text.Json.Serialization.JsonPropertyName("timeout_to_fail")]
57+
public long TimeoutToFail { get; set; }
3858
}
3959

4060

tests/Dtmcli.IntegrationTests/MsgHttpTest.cs

Lines changed: 93 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -91,4 +91,97 @@ public async Task Submit_With_Delay_Should_Succeed_Later()
9191
status = await ITTestHelper.GetTranStatus(gid);
9292
Assert.Equal("succeed", status);
9393
}
94+
95+
[Fact]
96+
public async Task SetRequestTimeoutTest_default()
97+
{
98+
var provider = ITTestHelper.AddDtmHttp();
99+
var transFactory = provider.GetRequiredService<Dtmcli.IDtmTransFactory>();
100+
101+
var gid = "msgTestGid" + Guid.NewGuid().ToString();
102+
var msg = transFactory.NewMsg(gid);
103+
// msg.SetRequestTimeout(30);
104+
msg.EnableWaitResult();
105+
var req = ITTestHelper.GenBusiReq(false, false);
106+
var busiUrl = ITTestHelper.BuisHttpUrl;
107+
msg.Add(busiUrl + "/busi.Busi/TransOut", req)
108+
.Add(busiUrl + "/busi.Busi/TransIn", req);
109+
110+
await msg.Prepare(busiUrl + "/busi.Busi/QueryPrepared_404");
111+
await msg.Submit();
112+
113+
var trans = await ITTestHelper.GetTran(gid);
114+
Assert.Equal("succeed", trans.Transaction.Status);
115+
Assert.Equal(0, trans.Transaction.RequestTimeout);
116+
}
117+
118+
[Fact]
119+
public async Task SetRequestTimeoutTest_30s()
120+
{
121+
var provider = ITTestHelper.AddDtmHttp();
122+
var transFactory = provider.GetRequiredService<Dtmcli.IDtmTransFactory>();
123+
124+
var gid = "msgTestGid" + Guid.NewGuid().ToString();
125+
var msg = transFactory.NewMsg(gid);
126+
msg.SetRequestTimeout(30);
127+
msg.EnableWaitResult();
128+
var req = ITTestHelper.GenBusiReq(false, false);
129+
var busiUrl = ITTestHelper.BuisHttpUrl;
130+
msg.Add(busiUrl + "/busi.Busi/TransOut", req)
131+
.Add(busiUrl + "/busi.Busi/TransIn", req);
132+
133+
await msg.Prepare(busiUrl + "/busi.Busi/QueryPrepared_404");
134+
await msg.Submit();
135+
136+
var trans = await ITTestHelper.GetTran(gid);
137+
Assert.Equal("succeed", trans.Transaction.Status);
138+
Assert.Equal(30, trans.Transaction.RequestTimeout);
139+
}
140+
141+
142+
[Fact]
143+
public async Task SetTimeoutToFail_default()
144+
{
145+
var provider = ITTestHelper.AddDtmHttp();
146+
var transFactory = provider.GetRequiredService<Dtmcli.IDtmTransFactory>();
147+
148+
var gid = "msgTestGid" + Guid.NewGuid().ToString();
149+
var msg = transFactory.NewMsg(gid);
150+
// msg.SetTimeoutToFail(30);
151+
msg.EnableWaitResult();
152+
var req = ITTestHelper.GenBusiReq(false, false);
153+
var busiUrl = ITTestHelper.BuisHttpUrl;
154+
msg.Add(busiUrl + "/busi.Busi/TransOut", req)
155+
.Add(busiUrl + "/busi.Busi/TransIn", req);
156+
157+
await msg.Prepare(busiUrl + "/busi.Busi/QueryPrepared_404");
158+
await msg.Submit();
159+
160+
var trans = await ITTestHelper.GetTran(gid);
161+
Assert.Equal("succeed", trans.Transaction.Status);
162+
Assert.Equal(0, trans.Transaction.RequestTimeout);
163+
}
164+
165+
[Fact]
166+
public async Task SetTimeoutToFail_30s()
167+
{
168+
var provider = ITTestHelper.AddDtmHttp();
169+
var transFactory = provider.GetRequiredService<Dtmcli.IDtmTransFactory>();
170+
171+
var gid = "msgTestGid" + Guid.NewGuid().ToString();
172+
var msg = transFactory.NewMsg(gid);
173+
msg.SetTimeoutToFail(30);
174+
msg.EnableWaitResult();
175+
var req = ITTestHelper.GenBusiReq(false, false);
176+
var busiUrl = ITTestHelper.BuisHttpUrl;
177+
msg.Add(busiUrl + "/busi.Busi/TransOut", req)
178+
.Add(busiUrl + "/busi.Busi/TransIn", req);
179+
180+
await msg.Prepare(busiUrl + "/busi.Busi/QueryPrepared_404");
181+
await msg.Submit();
182+
183+
var trans = await ITTestHelper.GetTran(gid);
184+
Assert.Equal("succeed", trans.Transaction.Status);
185+
Assert.Equal(30, trans.Transaction.TimeoutToFail);
186+
}
94187
}

tests/Dtmcli.Tests/MsgTests.cs

Lines changed: 39 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -50,6 +50,7 @@ public async void Submit_Should_Succeed()
5050
.EnableWaitResult()
5151
.SetRetryInterval(10)
5252
.SetTimeoutToFail(100)
53+
.SetRequestTimeout(30)
5354
.SetDelay(10)
5455
.SetBranchHeaders(new Dictionary<string, string>
5556
{
@@ -192,6 +193,43 @@ public async void DoAndSubmitDB_Should_QueryPrepared_When_BusiCall_ThrowExeption
192193
dtmClient.Verify(x => x.TransRequestBranch(It.IsAny<TransBase>(), It.IsAny<HttpMethod>(), It.IsAny<object>(), It.IsAny<string>(), It.IsAny<string>(), It.IsAny<string>(), It.IsAny<CancellationToken>()), Times.Once);
193194
}
194195

196+
[Fact]
197+
public async void SetRequestTimeoutTest()
198+
{
199+
var fakeFactory = new Mock<IHttpClientFactory>();
200+
201+
var mockHttpMessageHandler = new MsgMockHttpMessageHandler();
202+
var httpClient = new HttpClient(mockHttpMessageHandler);
203+
fakeFactory.Setup(x=>x.CreateClient(It.IsAny<string>())).Returns(httpClient);
204+
205+
var dtmOptions = new DtmOptions { DtmUrl = "http://localhost:36789" };
206+
var dtmClient = new DtmClient(fakeFactory.Object, Microsoft.Extensions.Options.Options.Create(dtmOptions));
207+
208+
var gid = "TestMsgNormal";
209+
var msg = new Msg(dtmClient, _branchBarrierFactory, gid);
210+
211+
var req = new { Amount = 30 };
212+
213+
msg.Add(busi + "/TransOut", req)
214+
.Add(busi + "/TransIn", req)
215+
.AddTopic("test-topic", req)
216+
.EnableWaitResult()
217+
.SetRetryInterval(10)
218+
.SetTimeoutToFail(100)
219+
.SetRequestTimeout(30)
220+
.SetDelay(10)
221+
.SetBranchHeaders(new Dictionary<string, string>
222+
{
223+
{ "bh1", "123" },
224+
{ "bh2", "456" },
225+
});
226+
227+
await msg.Prepare(busi + "/query");
228+
await msg.Submit();
229+
230+
Assert.True(true);
231+
}
232+
195233
public class MsgMockHttpMessageHandler : DelegatingHandler
196234
{
197235
public MsgMockHttpMessageHandler()
@@ -209,6 +247,7 @@ protected override async Task<HttpResponseMessage> SendAsync(HttpRequestMessage
209247
Assert.True(transBase.WaitResult);
210248
Assert.Equal(10, transBase.RetryInterval);
211249
Assert.Equal(100, transBase.TimeoutToFail);
250+
Assert.Equal(30, transBase.RequestTimeout);
212251
Assert.Contains("bh1", transBase.BranchHeaders.Keys);
213252
Assert.Contains("bh2", transBase.BranchHeaders.Keys);
214253
Assert.Equal(3, transBase.Payloads.Count);

0 commit comments

Comments
 (0)