Repository navigation
Expand file tree
/
Copy pathRuntimeWrapperTests.cs
More file actions
147 lines (128 loc) · 5.48 KB
/
Copy pathRuntimeWrapperTests.cs
File metadata and controls
147 lines (128 loc) · 5.48 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
137
138
139
140
141
142
143
144
145
146
147
/*---------------------------------------------------------------------------------------------
* Copyright (c) Microsoft Corporation. All rights reserved.
*--------------------------------------------------------------------------------------------*/
using GitHub.Copilot.Rpc;
using Xunit;
namespace GitHub.Copilot.Test.Unit;
[CollectionDefinition(Name, DisableParallelization = true)]
public sealed class RuntimeWrapperIsolationCollection
{
public const string Name = "Runtime wrapper isolation";
}
[Collection(RuntimeWrapperIsolationCollection.Name)]
public sealed class RuntimeWrapperTests
{
#if !NETFRAMEWORK
[Fact]
public async Task Managed_Launch_Fails_When_Bundled_Runtime_Pair_Is_Missing()
{
var originalBaseDirectory = AppContext.GetData("APP_CONTEXT_BASE_DIRECTORY");
var emptyBaseDirectory = Path.Combine(
Path.GetTempPath(),
$"missing-copilot-runtime-{Guid.NewGuid():N}");
Directory.CreateDirectory(emptyBaseDirectory);
try
{
AppContext.SetData("APP_CONTEXT_BASE_DIRECTORY", emptyBaseDirectory);
await using var client = new CopilotClient(new CopilotClientOptions
{
Connection = RuntimeConnection.ForStdio(),
Environment = new Dictionary<string, string>(),
});
var exception = await Assert.ThrowsAsync<InvalidOperationException>(() => client.StartAsync());
Assert.Contains("runtime wrapper not found", exception.Message, StringComparison.OrdinalIgnoreCase);
}
finally
{
AppContext.SetData("APP_CONTEXT_BASE_DIRECTORY", originalBaseDirectory);
Directory.Delete(emptyBaseDirectory);
}
}
#endif
[Fact]
public async Task Explicit_Path_Does_Not_Require_Adjacent_Runtime_Node()
{
var explicitPath = Path.Combine(
Path.GetTempPath(),
$"missing-explicit-copilot-{Guid.NewGuid():N}");
await using var client = new CopilotClient(new CopilotClientOptions
{
Connection = RuntimeConnection.ForStdio(path: explicitPath),
Environment = new Dictionary<string, string>(),
});
var exception = await Assert.ThrowsAnyAsync<Exception>(() => client.StartAsync());
Assert.DoesNotContain("runtime.node", exception.ToString(), StringComparison.OrdinalIgnoreCase);
}
[Fact]
public async Task Copilot_Cli_Path_Does_Not_Require_Adjacent_Runtime_Node()
{
var explicitPath = Path.Combine(
Path.GetTempPath(),
$"missing-environment-copilot-{Guid.NewGuid():N}");
await using var client = new CopilotClient(new CopilotClientOptions
{
Connection = RuntimeConnection.ForStdio(),
Environment = new Dictionary<string, string> { ["COPILOT_CLI_PATH"] = explicitPath },
});
var exception = await Assert.ThrowsAnyAsync<Exception>(() => client.StartAsync());
Assert.DoesNotContain("runtime.node", exception.ToString(), StringComparison.OrdinalIgnoreCase);
}
#if !NETFRAMEWORK
[Fact]
public async Task Marked_Bundled_Explicit_Cli_Does_Not_Require_Runtime_Pair()
{
var originalBaseDirectory = AppContext.GetData("APP_CONTEXT_BASE_DIRECTORY");
var baseDirectory = Path.Combine(
Path.GetTempPath(),
$"explicit-bundled-copilot-{Guid.NewGuid():N}");
var rid = GetPortableRid();
var nativeDirectory = Path.Combine(baseDirectory, "runtimes", rid, "native");
Directory.CreateDirectory(nativeDirectory);
var cliPath = Path.Combine(nativeDirectory, OperatingSystem.IsWindows() ? "copilot.exe" : "copilot");
await File.WriteAllTextAsync(cliPath, "not an executable");
await File.WriteAllTextAsync(Path.Combine(nativeDirectory, ".copilot-explicit-cli"), "explicit");
try
{
AppContext.SetData("APP_CONTEXT_BASE_DIRECTORY", baseDirectory);
await using var client = new CopilotClient(new CopilotClientOptions
{
Connection = RuntimeConnection.ForStdio(),
Environment = new Dictionary<string, string>(),
});
var exception = await Assert.ThrowsAnyAsync<Exception>(() => client.StartAsync());
Assert.DoesNotContain("runtime wrapper", exception.ToString(), StringComparison.OrdinalIgnoreCase);
Assert.Contains(cliPath, exception.ToString(), StringComparison.OrdinalIgnoreCase);
}
finally
{
AppContext.SetData("APP_CONTEXT_BASE_DIRECTORY", originalBaseDirectory);
Directory.Delete(baseDirectory, recursive: true);
}
}
#endif
private static string GetPortableRid()
{
var os = OperatingSystem.IsWindows() ? "win"
: OperatingSystem.IsMacOS() ? "osx"
: IsMusl()
? "linux-musl"
: "linux";
var architecture = System.Runtime.InteropServices.RuntimeInformation.OSArchitecture switch
{
System.Runtime.InteropServices.Architecture.X64 => "x64",
System.Runtime.InteropServices.Architecture.Arm64 => "arm64",
_ => throw new PlatformNotSupportedException(),
};
return $"{os}-{architecture}";
}
private static bool IsMusl()
{
#if NETFRAMEWORK
return false;
#else
return System.Runtime.InteropServices.RuntimeInformation.RuntimeIdentifier.StartsWith(
"linux-musl-",
StringComparison.Ordinal);
#endif
}
}