Skip to content

Commit c046b68

Browse files
authored
Merge pull request #153 from progaudi/fix/forward-compatibility-error-packet
2 parents 89c91c6 + a346b54 commit c046b68

File tree

18 files changed

+86
-72
lines changed

18 files changed

+86
-72
lines changed

src/progaudi.tarantool/Converters/ErrorResponsePacketConverter.cs

Lines changed: 16 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,6 @@
44

55
using ProGaudi.Tarantool.Client.Model.Enums;
66
using ProGaudi.Tarantool.Client.Model.Responses;
7-
using ProGaudi.Tarantool.Client.Utils;
87

98
namespace ProGaudi.Tarantool.Client.Converters
109
{
@@ -29,19 +28,25 @@ public ErrorResponse Read(IMsgPackReader reader)
2928
string errorMessage = null;
3029
var length = reader.ReadMapLength();
3130

32-
if (length != 1u)
31+
for (var i = 0; i < length; i++)
3332
{
34-
throw ExceptionHelper.InvalidMapLength(length, 1u);
33+
var errorKey = _keyConverter.Read(reader);
34+
35+
switch (errorKey)
36+
{
37+
case Key.Error24:
38+
errorMessage = _stringConverter.Read(reader);
39+
break;
40+
case Key.Error:
41+
// TODO: add parsing of new error metadata
42+
reader.SkipToken();
43+
break;
44+
default:
45+
reader.SkipToken();
46+
break;
47+
}
3548
}
3649

37-
var errorKey = _keyConverter.Read(reader);
38-
if (errorKey != Key.Error)
39-
{
40-
throw ExceptionHelper.UnexpectedKey(errorKey, Key.Error);
41-
}
42-
43-
errorMessage = _stringConverter.Read(reader);
44-
4550
return new ErrorResponse(errorMessage);
4651
}
4752
}

src/progaudi.tarantool/Model/Enums/Key.cs

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -21,8 +21,9 @@ public enum Key : uint
2121

2222
// Response keys
2323
Data = 0x30,
24-
Error = 0x31,
24+
Error24 = 0x31,
2525
Metadata = 0x32,
26+
Error = 0x52,
2627

2728
// Sql keys
2829
SqlQueryText = 0x40,

tests/progaudi.tarantool.tests/Box/Call_Should.cs

Lines changed: 13 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -15,7 +15,7 @@ public class Call_Should : TestBase
1515
[Fact]
1616
public async Task call_method()
1717
{
18-
using (var tarantoolClient = await Client.Box.Connect(ConnectionStringFactory.GetReplicationSource_1_7()))
18+
using (var tarantoolClient = await Client.Box.Connect(await ConnectionStringFactory.GetReplicationSource_1_7()))
1919
{
2020
var result = await tarantoolClient.Call_1_6<TarantoolTuple<double>, TarantoolTuple<double>>("math.sqrt", TarantoolTuple.Create(1.3));
2121

@@ -28,7 +28,7 @@ public async Task call_method()
2828
[Fact]
2929
public async Task return_null_v1_6_should_not_throw()
3030
{
31-
using (var tarantoolClient = await Client.Box.Connect(ConnectionStringFactory.GetReplicationSource_1_7()))
31+
using (var tarantoolClient = await Client.Box.Connect(await ConnectionStringFactory.GetReplicationSource_1_7()))
3232
{
3333
await Should.ThrowAsync<ArgumentException>(async () => await tarantoolClient.Call_1_6<TarantoolTuple<string, int>>("return_null"));
3434
}
@@ -37,7 +37,7 @@ public async Task return_null_v1_6_should_not_throw()
3737
[Fact]
3838
public async Task return_tuple_v1_6_with_null_should_not_throw()
3939
{
40-
using (var tarantoolClient = await Client.Box.Connect(ConnectionStringFactory.GetReplicationSource_1_7()))
40+
using (var tarantoolClient = await Client.Box.Connect(await ConnectionStringFactory.GetReplicationSource_1_7()))
4141
{
4242
var result = await tarantoolClient.Call_1_6<TarantoolTuple<string>>("return_tuple_with_null");
4343
result.Data.ShouldBe(new[] { TarantoolTuple.Create(default(string)) });
@@ -47,7 +47,7 @@ public async Task return_tuple_v1_6_with_null_should_not_throw()
4747
[Fact]
4848
public async Task return_tuple_v1_6_should_not_throw()
4949
{
50-
using (var tarantoolClient = await Client.Box.Connect(ConnectionStringFactory.GetReplicationSource_1_7()))
50+
using (var tarantoolClient = await Client.Box.Connect(await ConnectionStringFactory.GetReplicationSource_1_7()))
5151
{
5252
var result = await tarantoolClient.Call_1_6<TarantoolTuple<int, int>>("return_tuple");
5353
result.Data.ShouldBe(new[] {TarantoolTuple.Create(1, 2)});
@@ -57,7 +57,7 @@ public async Task return_tuple_v1_6_should_not_throw()
5757
[Fact]
5858
public async Task return_int_v1_6_should_not_throw()
5959
{
60-
using (var tarantoolClient = await Client.Box.Connect(ConnectionStringFactory.GetReplicationSource_1_7()))
60+
using (var tarantoolClient = await Client.Box.Connect(await ConnectionStringFactory.GetReplicationSource_1_7()))
6161
{
6262
var result = await tarantoolClient.Call_1_6<TarantoolTuple<int>>("return_scalar");
6363
result.Data.ShouldBe(new[] { TarantoolTuple.Create(1) });
@@ -67,7 +67,7 @@ public async Task return_int_v1_6_should_not_throw()
6767
[Fact]
6868
public async Task return_nothing_v1_6_should_not_throw()
6969
{
70-
using (var tarantoolClient = await Client.Box.Connect(ConnectionStringFactory.GetReplicationSource_1_7()))
70+
using (var tarantoolClient = await Client.Box.Connect(await ConnectionStringFactory.GetReplicationSource_1_7()))
7171
{
7272
Should.NotThrow(async () => await tarantoolClient.Call_1_6("return_nothing"));
7373
}
@@ -76,7 +76,7 @@ public async Task return_nothing_v1_6_should_not_throw()
7676
[Fact]
7777
public async Task return_null_should_not_throw()
7878
{
79-
using (var tarantoolClient = await Client.Box.Connect(ConnectionStringFactory.GetReplicationSource_1_7()))
79+
using (var tarantoolClient = await Client.Box.Connect(await ConnectionStringFactory.GetReplicationSource_1_7()))
8080
{
8181
var result = await tarantoolClient.Call<TarantoolTuple<string, int>>("return_null");
8282
result.Data.ShouldBe(new[] { default(TarantoolTuple<string, int>) });
@@ -86,7 +86,7 @@ public async Task return_null_should_not_throw()
8686
[Fact]
8787
public async Task return_tuple_with_null_should_not_throw()
8888
{
89-
using (var tarantoolClient = await Client.Box.Connect(ConnectionStringFactory.GetReplicationSource_1_7()))
89+
using (var tarantoolClient = await Client.Box.Connect(await ConnectionStringFactory.GetReplicationSource_1_7()))
9090
{
9191
var result = await tarantoolClient.Call<TarantoolTuple<string>>("return_tuple_with_null");
9292
result.Data.ShouldBe(new[] { TarantoolTuple.Create(default(string)) });
@@ -96,7 +96,7 @@ public async Task return_tuple_with_null_should_not_throw()
9696
[Fact]
9797
public async Task return_tuple_should_not_throw()
9898
{
99-
using (var tarantoolClient = await Client.Box.Connect(ConnectionStringFactory.GetReplicationSource_1_7()))
99+
using (var tarantoolClient = await Client.Box.Connect(await ConnectionStringFactory.GetReplicationSource_1_7()))
100100
{
101101
var result = await tarantoolClient.Call<TarantoolTuple<int, int>>("return_tuple");
102102
result.Data.ShouldBe(new[] { TarantoolTuple.Create(1, 2) });
@@ -106,7 +106,7 @@ public async Task return_tuple_should_not_throw()
106106
[Fact]
107107
public async Task return_array_should_not_throw()
108108
{
109-
using (var tarantoolClient = await Client.Box.Connect(ConnectionStringFactory.GetReplicationSource_1_7()))
109+
using (var tarantoolClient = await Client.Box.Connect(await ConnectionStringFactory.GetReplicationSource_1_7()))
110110
{
111111
var result = await tarantoolClient.Call<TarantoolTuple<string[]>>("return_array");
112112
result.Data[0].Item1.ShouldBe(new[] {"abc", "def"});
@@ -116,7 +116,7 @@ public async Task return_array_should_not_throw()
116116
[Fact]
117117
public async Task return_int_should_not_throw()
118118
{
119-
using (var tarantoolClient = await Client.Box.Connect(ConnectionStringFactory.GetReplicationSource_1_7()))
119+
using (var tarantoolClient = await Client.Box.Connect(await ConnectionStringFactory.GetReplicationSource_1_7()))
120120
{
121121
var result = await tarantoolClient.Call<int>("return_scalar");
122122
result.Data.ShouldBe(new[] { 1 });
@@ -126,7 +126,7 @@ public async Task return_int_should_not_throw()
126126
[Fact]
127127
public async Task return_nothing_should_not_throw()
128128
{
129-
using (var tarantoolClient = await Client.Box.Connect(ConnectionStringFactory.GetReplicationSource_1_7()))
129+
using (var tarantoolClient = await Client.Box.Connect(await ConnectionStringFactory.GetReplicationSource_1_7()))
130130
{
131131
Should.NotThrow(async () => await tarantoolClient.Call("return_nothing"));
132132
}
@@ -135,7 +135,7 @@ public async Task return_nothing_should_not_throw()
135135
[Fact]
136136
public async Task replace_via_call()
137137
{
138-
using (var tarantoolClient = await Client.Box.Connect(ConnectionStringFactory.GetReplicationSource_1_8()))
138+
using (var tarantoolClient = await Client.Box.Connect(await ConnectionStringFactory.GetReplicationSource_1_8()))
139139
{
140140
var tuple = ("123", new byte[] { 1, 2, 3 });
141141
var result = await tarantoolClient.Call<ValueTuple<string, byte[]>[], ValueTuple<string, byte[]>>(

tests/progaudi.tarantool.tests/Box/Connect_Should.cs

Lines changed: 8 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -14,40 +14,40 @@ public class Connect_Should : TestBase
1414
[Fact]
1515
public async Task connect_if_UserName_is_null_and_GuestMode()
1616
{
17-
using (await Client.Box.Connect(ConnectionStringFactory.GetReplicationSource_1_7()))
17+
using (await Client.Box.Connect(await ConnectionStringFactory.GetReplicationSource_1_7()))
1818
{ }
1919
}
2020

2121
[Fact]
2222
public async Task throw_exception_if_password_is_wrong()
2323
{
24-
await Client.Box.Connect(ConnectionStringFactory.GetReplicationSource_1_7("operator:wrongPassword")).ShouldThrowAsync<ArgumentException>();
24+
await Client.Box.Connect(await ConnectionStringFactory.GetReplicationSource_1_7("operator:wrongPassword")).ShouldThrowAsync<ArgumentException>();
2525
}
2626

2727
[Fact]
2828
public async Task throw_exception_if_password_is_empty_for_user_with_unset_password()
2929
{
30-
await Client.Box.Connect(ConnectionStringFactory.GetReplicationSource_1_7("notSetPassword:")).ShouldThrowAsync<ArgumentException>();
30+
await Client.Box.Connect(await ConnectionStringFactory.GetReplicationSource_1_7("notSetPassword:")).ShouldThrowAsync<ArgumentException>();
3131
}
3232

3333
[Fact]
3434
public async Task connect_if_password_is_empty_for_user_with_empty_password()
3535
{
36-
using (await Client.Box.Connect(ConnectionStringFactory.GetReplicationSource_1_7("emptyPassword:")))
36+
using (await Client.Box.Connect(await ConnectionStringFactory.GetReplicationSource_1_7("emptyPassword:")))
3737
{ }
3838
}
3939

4040
[Fact]
4141
public async Task connect_with_credentials()
4242
{
43-
using (await Client.Box.Connect(ConnectionStringFactory.GetReplicationSource_1_7("operator:operator")))
43+
using (await Client.Box.Connect(await ConnectionStringFactory.GetReplicationSource_1_7("operator:operator")))
4444
{ }
4545
}
4646

4747
[Fact]
4848
public async Task do_nothing_if_already_connected()
4949
{
50-
using (var box = await Client.Box.Connect(ConnectionStringFactory.GetReplicationSource_1_7("operator:operator")))
50+
using (var box = await Client.Box.Connect(await ConnectionStringFactory.GetReplicationSource_1_7("operator:operator")))
5151
{
5252
var result = await box.Call_1_6<TarantoolTuple<double>, TarantoolTuple<double>>("math.sqrt", TarantoolTuple.Create(1.3));
5353

@@ -68,7 +68,7 @@ public async Task do_nothing_if_already_connected()
6868
[Fact]
6969
public async Task not_throw_expection_if_used_inside_another_class()
7070
{
71-
using (var box = await Client.Box.Connect(ConnectionStringFactory.GetReplicationSource_1_7("operator:operator")))
71+
using (var box = await Client.Box.Connect(await ConnectionStringFactory.GetReplicationSource_1_7("operator:operator")))
7272
using (var boxUser = new BoxUser(box))
7373
{
7474
var result = await boxUser.TestMethod();
@@ -81,7 +81,7 @@ public async Task not_throw_expection_if_used_inside_another_class()
8181
[Fact]
8282
public async Task change_IsConnected_state()
8383
{
84-
using (var box = new Client.Box(new ClientOptions(ConnectionStringFactory.GetReplicationSource_1_7("operator:operator"))))
84+
using (var box = new Client.Box(new ClientOptions(await ConnectionStringFactory.GetReplicationSource_1_7("operator:operator"))))
8585
{
8686
box.IsConnected.ShouldBeFalse();
8787
await box.Connect();

tests/progaudi.tarantool.tests/Box/Eval_Should.cs

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -13,7 +13,7 @@ public class Eval_Should : TestBase
1313
[Fact]
1414
public async Task evaluate_expression()
1515
{
16-
using (var tarantoolClient = await Client.Box.Connect(ConnectionStringFactory.GetReplicationSource_1_7()))
16+
using (var tarantoolClient = await Client.Box.Connect(await ConnectionStringFactory.GetReplicationSource_1_7()))
1717
{
1818
var result = await tarantoolClient.Eval<TarantoolTuple<int, int, int>, int>("return ...", TarantoolTuple.Create(1, 2, 3));
1919

@@ -24,7 +24,7 @@ public async Task evaluate_expression()
2424
[Fact]
2525
public async Task evaluate_scalar()
2626
{
27-
using (var tarantoolClient = await Client.Box.Connect(ConnectionStringFactory.GetReplicationSource_1_7()))
27+
using (var tarantoolClient = await Client.Box.Connect(await ConnectionStringFactory.GetReplicationSource_1_7()))
2828
{
2929
var result = await tarantoolClient.Eval<int>("return 1");
3030

@@ -35,7 +35,7 @@ public async Task evaluate_scalar()
3535
[Fact]
3636
public async Task evaluate_call_function()
3737
{
38-
using (var tarantoolClient = await Client.Box.Connect(ConnectionStringFactory.GetReplicationSource_1_7()))
38+
using (var tarantoolClient = await Client.Box.Connect(await ConnectionStringFactory.GetReplicationSource_1_7()))
3939
{
4040
var result = await tarantoolClient.Eval<TarantoolTuple<int, int, int>, TarantoolTuple<int, int>>("return return_tuple()", TarantoolTuple.Create(1, 2, 3));
4141

@@ -46,7 +46,7 @@ public async Task evaluate_call_function()
4646
[Fact]
4747
public async Task evaluate_return_null()
4848
{
49-
using (var tarantoolClient = await Client.Box.Connect(ConnectionStringFactory.GetReplicationSource_1_7()))
49+
using (var tarantoolClient = await Client.Box.Connect(await ConnectionStringFactory.GetReplicationSource_1_7()))
5050
{
5151
var result = await tarantoolClient.Eval<TarantoolTuple, TarantoolTuple<int, int>>("return return_null()", TarantoolTuple.Empty);
5252

tests/progaudi.tarantool.tests/Box/Options.cs

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,7 @@ public class Options
1111
[Fact]
1212
public async Task ReadSchemaOnConnectEnabled()
1313
{
14-
using (var box = await Client.Box.Connect(ConnectionStringFactory.GetReplicationSource_1_7()))
14+
using (var box = await Client.Box.Connect(await ConnectionStringFactory.GetReplicationSource_1_7()))
1515
{
1616
var utcnow = DateTimeOffset.UtcNow;
1717
box.Schema.LastReloadTime.ShouldBeInRange(utcnow.AddSeconds(-2), utcnow);
@@ -21,7 +21,7 @@ public async Task ReadSchemaOnConnectEnabled()
2121
[Fact]
2222
public async Task ReadSchemaOnConnectDisabled()
2323
{
24-
var options = new ClientOptions(ConnectionStringFactory.GetReplicationSource_1_7());
24+
var options = new ClientOptions(await ConnectionStringFactory.GetReplicationSource_1_7());
2525
options.ConnectionOptions.ReadSchemaOnConnect = false;
2626
using (var box = new Client.Box(options))
2727
{
@@ -33,7 +33,7 @@ public async Task ReadSchemaOnConnectDisabled()
3333
[Fact]
3434
public async Task ReadBoxInfoOnConnectEnabled()
3535
{
36-
using (var box = await Client.Box.Connect(ConnectionStringFactory.GetReplicationSource_1_7()))
36+
using (var box = await Client.Box.Connect(await ConnectionStringFactory.GetReplicationSource_1_7()))
3737
{
3838
box.Info.ShouldNotBeNull();
3939
}
@@ -42,7 +42,7 @@ public async Task ReadBoxInfoOnConnectEnabled()
4242
[Fact]
4343
public async Task ReadBoxInfoOnConnectDisabled()
4444
{
45-
var options = new ClientOptions(ConnectionStringFactory.GetReplicationSource_1_7());
45+
var options = new ClientOptions(await ConnectionStringFactory.GetReplicationSource_1_7());
4646
options.ConnectionOptions.ReadBoxInfoOnConnect = false;
4747
using (var box = new Client.Box(options))
4848
{

tests/progaudi.tarantool.tests/Box/Version.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,7 @@ public class Version : TestBase
1010
[Fact]
1111
public async Task Smoke()
1212
{
13-
var options = new ClientOptions(ConnectionStringFactory.GetReplicationSource_1_7());
13+
var options = new ClientOptions(await ConnectionStringFactory.GetReplicationSource_1_7());
1414
options.ConnectionOptions.ReadBoxInfoOnConnect = false;
1515
using (var box = new Client.Box(options))
1616
{

tests/progaudi.tarantool.tests/ConnectionStringFactory.cs

Lines changed: 17 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -7,28 +7,36 @@ namespace ProGaudi.Tarantool.Client.Tests
77
{
88
internal class ConnectionStringFactory
99
{
10-
public static string GetReplicationSource_1_7(string userName = null)
10+
public static async Task<string> GetReplicationSource_1_7(string userName = null)
1111
{
12-
return GetReplicationSource(userName, "localhost:3301", "TARANTOOL_1_7_REPLICATION_SOURCE");
12+
return GetReplicationSource(userName, $"{await ResolveHostname("localhost")}:3301", "TARANTOOL_1_7_REPLICATION_SOURCE");
1313
}
1414

15-
public static string GetReplicationSource_1_8(string userName = null)
15+
public static async Task<string> GetReplicationSource_1_8(string userName = null)
1616
{
17-
return GetReplicationSource(userName, "localhost:3302", "TARANTOOL_1_8_REPLICATION_SOURCE");
17+
return GetReplicationSource(userName, $"{await ResolveHostname("localhost")}:3302", "TARANTOOL_1_8_REPLICATION_SOURCE");
1818
}
1919

2020
public static async Task<string> GetRedisConnectionString()
2121
{
2222
var redisUrl = Environment.GetEnvironmentVariable("REDIS_HOST");
2323

24-
var host = "127.0.0.1";
25-
if (!string.IsNullOrWhiteSpace(redisUrl))
24+
return $"{await ResolveHostname(redisUrl)}:6379";
25+
}
26+
27+
private static async Task<string> ResolveHostname(string host)
28+
{
29+
if (!string.IsNullOrWhiteSpace(host))
2630
{
27-
var resolved = await Dns.GetHostAddressesAsync(redisUrl);
28-
host = resolved.First().ToString();
31+
var resolved = await Dns.GetHostAddressesAsync(host);
32+
var ip = resolved.First().ToString();
33+
if (ip == "::1")
34+
{
35+
return "127.0.0.1";
36+
}
2937
}
3038

31-
return $"{host}:6379";
39+
return "127.0.0.1";
3240
}
3341

3442
private static string GetReplicationSource(string userName, string defaultString, string envName)

tests/progaudi.tarantool.tests/Index/Smoke.cs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -18,7 +18,7 @@ public async Task HashIndexMethods()
1818

1919
await ClearDataAsync(spaceName);
2020

21-
using (var tarantoolClient = await Client.Box.Connect(ConnectionStringFactory.GetReplicationSource_1_7()))
21+
using (var tarantoolClient = await Client.Box.Connect(await ConnectionStringFactory.GetReplicationSource_1_7()))
2222
{
2323
var index = tarantoolClient.GetSchema()[spaceName]["primary"];
2424

@@ -53,7 +53,7 @@ public async Task TreeIndexMethods()
5353

5454
await ClearDataAsync(spaceName);
5555

56-
using (var tarantoolClient = await Client.Box.Connect(ConnectionStringFactory.GetReplicationSource_1_7()))
56+
using (var tarantoolClient = await Client.Box.Connect(await ConnectionStringFactory.GetReplicationSource_1_7()))
5757
{
5858
var schema = tarantoolClient.GetSchema();
5959

0 commit comments

Comments
 (0)