-
Notifications
You must be signed in to change notification settings - Fork 1.2k
Expand file tree
/
Copy pathConnectionTokenTests.cs
More file actions
136 lines (115 loc) · 4.27 KB
/
ConnectionTokenTests.cs
File metadata and controls
136 lines (115 loc) · 4.27 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
/*---------------------------------------------------------------------------------------------
* Copyright (c) Microsoft Corporation. All rights reserved.
*--------------------------------------------------------------------------------------------*/
using GitHub.Copilot.Test.Harness;
using Xunit;
namespace GitHub.Copilot.Test;
/// <summary>
/// Custom fixture that spawns a CLI in TCP mode with an explicit connection token, so
/// sibling clients can attempt to connect to the same port with the right/wrong/no token.
/// </summary>
public class ConnectionTokenTestFixture : IAsyncLifetime
{
public E2ETestContext Ctx { get; private set; } = null!;
public CopilotClient GoodClient { get; private set; } = null!;
public int Port { get; private set; }
public const string Token = "right-token";
public async Task InitializeAsync()
{
Ctx = await E2ETestContext.CreateAsync();
GoodClient = Ctx.CreateClient(options: new CopilotClientOptions { Connection = RuntimeConnection.ForTcp(connectionToken: Token) });
await GoodClient.StartAsync();
Port = GoodClient.RuntimePort
?? throw new InvalidOperationException("GoodClient is not using TCP mode; RuntimePort is null");
}
public async Task DisposeAsync()
{
if (GoodClient is not null)
{
await GoodClient.ForceStopAsync();
}
await Ctx.DisposeAsync();
}
}
public class ConnectionTokenTests : IClassFixture<ConnectionTokenTestFixture>
{
private readonly ConnectionTokenTestFixture _fixture;
public ConnectionTokenTests(ConnectionTokenTestFixture fixture)
{
_fixture = fixture;
}
[Fact]
public async Task Connects_With_The_Matching_Token()
{
var pong = await _fixture.GoodClient.PingAsync("hi");
Assert.Equal("pong: hi", pong.Message);
}
[Fact]
public async Task Rejects_A_Wrong_Token()
{
var wrongClient = new CopilotClient(new CopilotClientOptions { Connection = RuntimeConnection.ForUri($"localhost:{_fixture.Port}", connectionToken: "wrong") });
try
{
var ex = await Assert.ThrowsAnyAsync<Exception>(() => wrongClient.StartAsync());
Assert.Contains("AUTHENTICATION_FAILED", GetFullMessage(ex));
}
finally
{
// Best-effort cleanup; ignore stop errors when the client failed to start.
try { await wrongClient.ForceStopAsync(); } catch (Exception) { }
}
}
[Fact]
public async Task Rejects_A_Missing_Token_When_One_Is_Required()
{
var noTokenClient = new CopilotClient(new CopilotClientOptions { Connection = RuntimeConnection.ForUri($"localhost:{_fixture.Port}") });
try
{
var ex = await Assert.ThrowsAnyAsync<Exception>(() => noTokenClient.StartAsync());
Assert.Contains("AUTHENTICATION_FAILED", GetFullMessage(ex));
}
finally
{
// Best-effort cleanup; ignore stop errors when the client failed to start.
try { await noTokenClient.ForceStopAsync(); } catch (Exception) { }
}
}
private static string GetFullMessage(Exception ex)
{
var messages = new List<string>();
for (var cur = ex; cur is not null; cur = cur.InnerException)
{
messages.Add(cur.Message);
}
return string.Join(" | ", messages);
}
}
/// <summary>
/// When the SDK spawns its own CLI in TCP mode without an explicit token, it auto-generates
/// a GUID and round-trips it through the spawned CLI.
/// </summary>
public class ConnectionTokenAutoGeneratedTests : IAsyncLifetime
{
private E2ETestContext _ctx = null!;
private CopilotClient _client = null!;
public async Task InitializeAsync()
{
_ctx = await E2ETestContext.CreateAsync();
_client = _ctx.CreateClient(useStdio: false);
}
public async Task DisposeAsync()
{
if (_client is not null)
{
await _client.ForceStopAsync();
}
await _ctx.DisposeAsync();
}
[Fact]
public async Task The_SDK_Auto_Generated_Guid_Round_Trips_Through_The_Spawned_CLI()
{
await _client.StartAsync();
var pong = await _client.PingAsync("hi");
Assert.Equal("pong: hi", pong.Message);
}
}