Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
11 changes: 11 additions & 0 deletions src/Dtmcli/Msg/Msg.cs
Original file line number Diff line number Diff line change
Expand Up @@ -130,6 +130,17 @@ public Msg SetRetryInterval(long retryInterval)
this._transBase.RetryInterval = retryInterval;
return this;
}

/// <summary>
/// Set timeout for sub branch, unit is second
/// </summary>
/// <param name="requestTimeout">timeout to fail</param>
/// <returns></returns>
public Msg SetRequestTimeout(long requestTimeout)
{
this._transBase.RequestTimeout = requestTimeout;
return this;
}

/// <summary>
/// Set branch headers for trans
Expand Down
20 changes: 20 additions & 0 deletions tests/Dtmcli.IntegrationTests/ITTestHelper.cs
Original file line number Diff line number Diff line change
Expand Up @@ -24,6 +24,20 @@ public static async Task<string> GetTranStatus(string gid)

return string.Empty;
}

public static async Task<QueryResult> GetTran(string gid)
{
var resp = await _client.GetAsync($"{DTMHttpUrl}/api/dtmsvr/query?gid={gid}").ConfigureAwait(false);

if (resp.IsSuccessStatusCode)
{
var content = await resp.Content.ReadAsStringAsync();
var res = System.Text.Json.JsonSerializer.Deserialize<QueryResult>(content);
return res;
}

return null;
}

public class QueryResult
{
Expand All @@ -35,6 +49,12 @@ public class TransGlobalStore
{
[System.Text.Json.Serialization.JsonPropertyName("status")]
public string Status { get; set; }

[System.Text.Json.Serialization.JsonPropertyName("request_timeout")]
public long RequestTimeout { get; set; }

[System.Text.Json.Serialization.JsonPropertyName("timeout_to_fail")]
public long TimeoutToFail { get; set; }
}


Expand Down
93 changes: 93 additions & 0 deletions tests/Dtmcli.IntegrationTests/MsgHttpTest.cs
Original file line number Diff line number Diff line change
Expand Up @@ -91,4 +91,97 @@ public async Task Submit_With_Delay_Should_Succeed_Later()
status = await ITTestHelper.GetTranStatus(gid);
Assert.Equal("succeed", status);
}

[Fact]
public async Task SetRequestTimeoutTest_default()
{
var provider = ITTestHelper.AddDtmHttp();
var transFactory = provider.GetRequiredService<Dtmcli.IDtmTransFactory>();

var gid = "msgTestGid" + Guid.NewGuid().ToString();
var msg = transFactory.NewMsg(gid);
// msg.SetRequestTimeout(30);
msg.EnableWaitResult();
var req = ITTestHelper.GenBusiReq(false, false);
var busiUrl = ITTestHelper.BuisHttpUrl;
msg.Add(busiUrl + "/busi.Busi/TransOut", req)
.Add(busiUrl + "/busi.Busi/TransIn", req);

await msg.Prepare(busiUrl + "/busi.Busi/QueryPrepared_404");
await msg.Submit();

var trans = await ITTestHelper.GetTran(gid);
Assert.Equal("succeed", trans.Transaction.Status);
Assert.Equal(0, trans.Transaction.RequestTimeout);
}

[Fact]
public async Task SetRequestTimeoutTest_30s()
{
var provider = ITTestHelper.AddDtmHttp();
var transFactory = provider.GetRequiredService<Dtmcli.IDtmTransFactory>();

var gid = "msgTestGid" + Guid.NewGuid().ToString();
var msg = transFactory.NewMsg(gid);
msg.SetRequestTimeout(30);
msg.EnableWaitResult();
var req = ITTestHelper.GenBusiReq(false, false);
var busiUrl = ITTestHelper.BuisHttpUrl;
msg.Add(busiUrl + "/busi.Busi/TransOut", req)
.Add(busiUrl + "/busi.Busi/TransIn", req);

await msg.Prepare(busiUrl + "/busi.Busi/QueryPrepared_404");
await msg.Submit();

var trans = await ITTestHelper.GetTran(gid);
Assert.Equal("succeed", trans.Transaction.Status);
Assert.Equal(30, trans.Transaction.RequestTimeout);
}


[Fact]
public async Task SetTimeoutToFail_default()
{
var provider = ITTestHelper.AddDtmHttp();
var transFactory = provider.GetRequiredService<Dtmcli.IDtmTransFactory>();

var gid = "msgTestGid" + Guid.NewGuid().ToString();
var msg = transFactory.NewMsg(gid);
// msg.SetTimeoutToFail(30);
msg.EnableWaitResult();
var req = ITTestHelper.GenBusiReq(false, false);
var busiUrl = ITTestHelper.BuisHttpUrl;
msg.Add(busiUrl + "/busi.Busi/TransOut", req)
.Add(busiUrl + "/busi.Busi/TransIn", req);

await msg.Prepare(busiUrl + "/busi.Busi/QueryPrepared_404");
await msg.Submit();

var trans = await ITTestHelper.GetTran(gid);
Assert.Equal("succeed", trans.Transaction.Status);
Assert.Equal(0, trans.Transaction.RequestTimeout);
}

[Fact]
public async Task SetTimeoutToFail_30s()
{
var provider = ITTestHelper.AddDtmHttp();
var transFactory = provider.GetRequiredService<Dtmcli.IDtmTransFactory>();

var gid = "msgTestGid" + Guid.NewGuid().ToString();
var msg = transFactory.NewMsg(gid);
msg.SetTimeoutToFail(30);
msg.EnableWaitResult();
var req = ITTestHelper.GenBusiReq(false, false);
var busiUrl = ITTestHelper.BuisHttpUrl;
msg.Add(busiUrl + "/busi.Busi/TransOut", req)
.Add(busiUrl + "/busi.Busi/TransIn", req);

await msg.Prepare(busiUrl + "/busi.Busi/QueryPrepared_404");
await msg.Submit();

var trans = await ITTestHelper.GetTran(gid);
Assert.Equal("succeed", trans.Transaction.Status);
Assert.Equal(30, trans.Transaction.TimeoutToFail);
}
}
39 changes: 39 additions & 0 deletions tests/Dtmcli.Tests/MsgTests.cs
Original file line number Diff line number Diff line change
Expand Up @@ -50,6 +50,7 @@ public async void Submit_Should_Succeed()
.EnableWaitResult()
.SetRetryInterval(10)
.SetTimeoutToFail(100)
.SetRequestTimeout(30)
.SetDelay(10)
.SetBranchHeaders(new Dictionary<string, string>
{
Expand Down Expand Up @@ -192,6 +193,43 @@ public async void DoAndSubmitDB_Should_QueryPrepared_When_BusiCall_ThrowExeption
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);
}

[Fact]
public async void SetRequestTimeoutTest()
{
var fakeFactory = new Mock<IHttpClientFactory>();

var mockHttpMessageHandler = new MsgMockHttpMessageHandler();
var httpClient = new HttpClient(mockHttpMessageHandler);
fakeFactory.Setup(x=>x.CreateClient(It.IsAny<string>())).Returns(httpClient);

var dtmOptions = new DtmOptions { DtmUrl = "http://localhost:36789" };
var dtmClient = new DtmClient(fakeFactory.Object, Microsoft.Extensions.Options.Options.Create(dtmOptions));

var gid = "TestMsgNormal";
var msg = new Msg(dtmClient, _branchBarrierFactory, gid);

var req = new { Amount = 30 };

msg.Add(busi + "/TransOut", req)
.Add(busi + "/TransIn", req)
.AddTopic("test-topic", req)
.EnableWaitResult()
.SetRetryInterval(10)
.SetTimeoutToFail(100)
.SetRequestTimeout(30)
.SetDelay(10)
.SetBranchHeaders(new Dictionary<string, string>
{
{ "bh1", "123" },
{ "bh2", "456" },
});

await msg.Prepare(busi + "/query");
await msg.Submit();

Assert.True(true);
}

public class MsgMockHttpMessageHandler : DelegatingHandler
{
public MsgMockHttpMessageHandler()
Expand All @@ -209,6 +247,7 @@ protected override async Task<HttpResponseMessage> SendAsync(HttpRequestMessage
Assert.True(transBase.WaitResult);
Assert.Equal(10, transBase.RetryInterval);
Assert.Equal(100, transBase.TimeoutToFail);
Assert.Equal(30, transBase.RequestTimeout);
Assert.Contains("bh1", transBase.BranchHeaders.Keys);
Assert.Contains("bh2", transBase.BranchHeaders.Keys);
Assert.Equal(3, transBase.Payloads.Count);
Expand Down
Loading