Repository navigation
Expand file tree
/
Copy pathToolLocatorTests.cs
More file actions
156 lines (132 loc) · 4.51 KB
/
Copy pathToolLocatorTests.cs
File metadata and controls
156 lines (132 loc) · 4.51 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
148
149
150
151
152
153
154
155
156
namespace XISOSharp.Tests;
/// <summary>
/// Tests for <see cref="ToolLocator"/>'s shared lookup chain (explicit override,
/// app-directory sibling, <c>PATH</c>) that the GUI uses to find the shipped
/// <c>XISOSharp</c> CLI. Extraction-directory behavior of single-file bundles
/// cannot be simulated from the test host (its process directory equals the app
/// base directory), so that case is covered by the published-bundle probe.
/// </summary>
[Collection("Sequential")]
public class ToolLocatorTests : IDisposable
{
private readonly List<string> _tempDirs = [];
private readonly List<string> _appDirFiles = [];
private readonly string? _savedPath;
public ToolLocatorTests()
{
_savedPath = Environment.GetEnvironmentVariable("PATH");
}
public void Dispose()
{
Environment.SetEnvironmentVariable("PATH", _savedPath);
foreach (string file in _appDirFiles)
{
TryDelete(file);
}
foreach (string dir in _tempDirs)
{
try
{
if (Directory.Exists(dir))
{
Directory.Delete(dir, recursive: true);
}
}
catch
{
// ignored
}
}
GC.SuppressFinalize(this);
}
private static string UniqueName() => $"xiso_tool_{Guid.NewGuid():N}";
private string TempDir()
{
string dir = Path.Combine(Path.GetTempPath(), $"xiso_locator_{Guid.NewGuid():N}");
Directory.CreateDirectory(dir);
_tempDirs.Add(dir);
return dir;
}
private string CreateAppDirSibling(string baseName)
{
string path = Path.Combine(AppContext.BaseDirectory, ToolLocator.GetFileName(baseName));
File.WriteAllText(path, "stub");
_appDirFiles.Add(path);
return path;
}
[Fact]
public void Resolve_ExistingOverride_IsReturnedVerbatim()
{
string overridePath = Path.Combine(TempDir(), ToolLocator.GetFileName(UniqueName()));
File.WriteAllText(overridePath, "stub");
Assert.Equal(overridePath, ToolLocator.Resolve(overridePath, "missing.exe", "missing"));
}
[Fact]
public void Resolve_BlankOverride_IsIgnored()
{
string baseName = UniqueName();
Assert.Equal(CreateAppDirSibling(baseName), ToolLocator.ResolveByBaseName(" ", baseName));
}
[Fact]
public void Resolve_MissingOverride_FallsThroughToAppDirSibling()
{
string baseName = UniqueName();
Assert.Equal(
CreateAppDirSibling(baseName),
ToolLocator.ResolveByBaseName(Path.Combine(TempDir(), "nope.exe"), baseName));
}
[Fact]
public void ResolveByBaseName_FindsAppDirSibling()
{
string baseName = UniqueName();
Assert.Equal(CreateAppDirSibling(baseName), ToolLocator.ResolveByBaseName(null, baseName));
}
[Fact]
public void Resolve_UnknownName_ReturnsNull()
{
// A GUID name can neither exist as a sibling nor on PATH.
Assert.Null(ToolLocator.ResolveByBaseName(null, UniqueName()));
}
[Fact]
public void Resolve_NotBesideApp_FallsThroughToPath()
{
string baseName = UniqueName();
string dir = TempDir();
string onPath = Path.Combine(dir, ToolLocator.GetFileName(baseName));
File.WriteAllText(onPath, "stub");
Environment.SetEnvironmentVariable("PATH", dir + Path.PathSeparator + _savedPath);
Assert.Equal(onPath, ToolLocator.ResolveByBaseName(null, baseName));
}
[Fact]
public void FindOnPath_DirectMatch_IsReturned()
{
string baseName = UniqueName();
string dir = TempDir();
string file = Path.Combine(dir, ToolLocator.GetFileName(baseName));
File.WriteAllText(file, "stub");
Environment.SetEnvironmentVariable("PATH", dir);
Assert.Equal(file, ToolLocator.FindOnPath(ToolLocator.GetFileName(baseName)));
}
[Fact]
public void GetFileName_IsOsAware() =>
Assert.Equal(
OperatingSystem.IsWindows() ? "extract-xiso.exe" : "extract-xiso",
ToolLocator.GetFileName("extract-xiso"));
[Fact]
public void GetFileName_EmptyBaseName_Throws() =>
Assert.Throws<ArgumentException>(() => ToolLocator.GetFileName(string.Empty));
private static void TryDelete(string path)
{
try
{
if (File.Exists(path))
{
File.Delete(path);
}
}
catch
{
// ignored
}
}
}