mirror of
https://github.com/velopack/velopack.git
synced 2025-10-25 15:19:22 +00:00
ci: still trying to fix test deadlock
This commit is contained in:
@@ -54,11 +54,14 @@ public static class Exe
|
|||||||
FileName = fileName,
|
FileName = fileName,
|
||||||
Arguments = args,
|
Arguments = args,
|
||||||
UseShellExecute = false,
|
UseShellExecute = false,
|
||||||
WorkingDirectory = workDir,
|
WorkingDirectory = workDir ?? "",
|
||||||
CreateNoWindow = true,
|
CreateNoWindow = true,
|
||||||
};
|
};
|
||||||
|
|
||||||
using var process = Process.Start(psi);
|
using var process = Process.Start(psi);
|
||||||
|
if (process == null)
|
||||||
|
throw new Exception("Failed to start process");
|
||||||
|
|
||||||
process.WaitForExit();
|
process.WaitForExit();
|
||||||
|
|
||||||
var stdout = Utility.Retry(() => File.ReadAllText(outputFile).Trim(), 10, 1000);
|
var stdout = Utility.Retry(() => File.ReadAllText(outputFile).Trim(), 10, 1000);
|
||||||
@@ -67,6 +70,32 @@ public static class Exe
|
|||||||
return result.Item2;
|
return result.Item2;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public static void RunHostedCommandNoWait(string command, string workDir = null)
|
||||||
|
{
|
||||||
|
using var _1 = Utility.GetTempFileName(out var outputFile);
|
||||||
|
File.Create(outputFile).Close();
|
||||||
|
|
||||||
|
var fileName = "cmd.exe";
|
||||||
|
var args = $"/S /C \"{command} >> \"{outputFile}\" 2>&1\"";
|
||||||
|
|
||||||
|
if (!VelopackRuntimeInfo.IsWindows) {
|
||||||
|
fileName = "/bin/bash";
|
||||||
|
string escapedCommand = command.Replace("'", "'\\''");
|
||||||
|
args = $"-c '{escapedCommand} >> \"{outputFile}\" 2>&1'";
|
||||||
|
}
|
||||||
|
|
||||||
|
var psi = new ProcessStartInfo {
|
||||||
|
FileName = fileName,
|
||||||
|
Arguments = args,
|
||||||
|
UseShellExecute = false,
|
||||||
|
WorkingDirectory = workDir ?? "",
|
||||||
|
CreateNoWindow = true,
|
||||||
|
};
|
||||||
|
|
||||||
|
if (Process.Start(psi) == null)
|
||||||
|
throw new Exception("Failed to start process");
|
||||||
|
}
|
||||||
|
|
||||||
public static string InvokeAndThrowIfNonZero(string exePath, IEnumerable<string> args, string workingDir, IDictionary<string, string> envVar = null)
|
public static string InvokeAndThrowIfNonZero(string exePath, IEnumerable<string> args, string workingDir, IDictionary<string, string> envVar = null)
|
||||||
{
|
{
|
||||||
var result = InvokeProcess(exePath, args, workingDir, CancellationToken.None, envVar);
|
var result = InvokeProcess(exePath, args, workingDir, CancellationToken.None, envVar);
|
||||||
@@ -76,39 +105,37 @@ public static class Exe
|
|||||||
|
|
||||||
public static (int ExitCode, string StdOutput) InvokeProcess(ProcessStartInfo psi, CancellationToken ct)
|
public static (int ExitCode, string StdOutput) InvokeProcess(ProcessStartInfo psi, CancellationToken ct)
|
||||||
{
|
{
|
||||||
var pi = Process.Start(psi);
|
|
||||||
|
|
||||||
var process = new Process();
|
var process = new Process();
|
||||||
process.StartInfo = psi;
|
process.StartInfo = psi;
|
||||||
|
|
||||||
var sOut = new StringBuilder();
|
var sOut = new StringBuilder();
|
||||||
var sErr = new StringBuilder();
|
var sErr = new StringBuilder();
|
||||||
|
|
||||||
pi.OutputDataReceived += (sender, e) => {
|
process.OutputDataReceived += (sender, e) => {
|
||||||
if (e.Data != null) sOut.AppendLine(e.Data);
|
if (e.Data != null) sOut.AppendLine(e.Data);
|
||||||
};
|
};
|
||||||
|
|
||||||
pi.ErrorDataReceived += (sender, e) => {
|
process.ErrorDataReceived += (sender, e) => {
|
||||||
if (e.Data != null) sErr.AppendLine(e.Data);
|
if (e.Data != null) sErr.AppendLine(e.Data);
|
||||||
};
|
};
|
||||||
|
|
||||||
if (!pi.Start())
|
if (!process.Start())
|
||||||
throw new Exception("Failed to start process");
|
throw new Exception("Failed to start process");
|
||||||
|
|
||||||
pi.BeginOutputReadLine();
|
process.BeginOutputReadLine();
|
||||||
pi.BeginErrorReadLine();
|
process.BeginErrorReadLine();
|
||||||
|
|
||||||
while (!ct.IsCancellationRequested) {
|
while (!ct.IsCancellationRequested) {
|
||||||
if (pi.WaitForExit(500)) break;
|
if (process.WaitForExit(500)) break;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (ct.IsCancellationRequested && !pi.HasExited) {
|
if (ct.IsCancellationRequested && !process.HasExited) {
|
||||||
pi.Kill();
|
process.Kill();
|
||||||
ct.ThrowIfCancellationRequested();
|
ct.ThrowIfCancellationRequested();
|
||||||
}
|
}
|
||||||
|
|
||||||
var all = (sOut.ToString().Trim()) + Environment.NewLine + (sOut.ToString().Trim());
|
var all = (sOut.ToString().Trim()) + Environment.NewLine + (sOut.ToString().Trim());
|
||||||
return (pi.ExitCode, all.Trim());
|
return (process.ExitCode, all.Trim());
|
||||||
}
|
}
|
||||||
|
|
||||||
public static (int ExitCode, string StdOutput, string Command) InvokeProcess(string fileName, IEnumerable<string> args, string workingDirectory, CancellationToken ct = default,
|
public static (int ExitCode, string StdOutput, string Command) InvokeProcess(string fileName, IEnumerable<string> args, string workingDirectory, CancellationToken ct = default,
|
||||||
|
|||||||
@@ -46,8 +46,9 @@ public class CrossCompile
|
|||||||
public void RunCrossAppLinux(string artifactId)
|
public void RunCrossAppLinux(string artifactId)
|
||||||
{
|
{
|
||||||
using var logger = _output.BuildLoggerFor<CrossCompile>();
|
using var logger = _output.BuildLoggerFor<CrossCompile>();
|
||||||
Skip.If(String.IsNullOrWhiteSpace(Environment.GetEnvironmentVariable("VELOPACK_CROSS_ARTIFACTS")),
|
Skip.If(
|
||||||
"VELOPACK_CROSS_ARTIFACTS not set");
|
String.IsNullOrWhiteSpace(Environment.GetEnvironmentVariable("VELOPACK_CROSS_ARTIFACTS")),
|
||||||
|
"VELOPACK_CROSS_ARTIFACTS not set");
|
||||||
Skip.IfNot(VelopackRuntimeInfo.IsLinux, "AppImage's can only run on Linux");
|
Skip.IfNot(VelopackRuntimeInfo.IsLinux, "AppImage's can only run on Linux");
|
||||||
|
|
||||||
var artifactsDir = PathHelper.GetTestRootPath("artifacts");
|
var artifactsDir = PathHelper.GetTestRootPath("artifacts");
|
||||||
@@ -68,7 +69,8 @@ public class CrossCompile
|
|||||||
public void RunCrossAppWindows(string artifactId)
|
public void RunCrossAppWindows(string artifactId)
|
||||||
{
|
{
|
||||||
using var logger = _output.BuildLoggerFor<CrossCompile>();
|
using var logger = _output.BuildLoggerFor<CrossCompile>();
|
||||||
Skip.If(String.IsNullOrWhiteSpace(Environment.GetEnvironmentVariable("VELOPACK_CROSS_ARTIFACTS")),
|
Skip.If(
|
||||||
|
String.IsNullOrWhiteSpace(Environment.GetEnvironmentVariable("VELOPACK_CROSS_ARTIFACTS")),
|
||||||
"VELOPACK_CROSS_ARTIFACTS not set");
|
"VELOPACK_CROSS_ARTIFACTS not set");
|
||||||
Skip.IfNot(VelopackRuntimeInfo.IsWindows, "PE files can only run on Windows");
|
Skip.IfNot(VelopackRuntimeInfo.IsWindows, "PE files can only run on Windows");
|
||||||
|
|
||||||
@@ -85,7 +87,8 @@ public class CrossCompile
|
|||||||
Utility.DeleteFileOrDirectoryHard(appRoot);
|
Utility.DeleteFileOrDirectoryHard(appRoot);
|
||||||
|
|
||||||
Assert.False(File.Exists(appExe));
|
Assert.False(File.Exists(appExe));
|
||||||
var installOutput = Exe.InvokeAndThrowIfNonZero(artifactPath, new[] { "--silent" }, null);
|
|
||||||
|
var installOutput = Exe.InvokeAndThrowIfNonZero(artifactPath, new[] { "--silent", "--nocolor" }, null);
|
||||||
logger.LogInformation(installOutput);
|
logger.LogInformation(installOutput);
|
||||||
|
|
||||||
Assert.True(File.Exists(appExe));
|
Assert.True(File.Exists(appExe));
|
||||||
@@ -94,7 +97,11 @@ public class CrossCompile
|
|||||||
logger.LogInformation(output);
|
logger.LogInformation(output);
|
||||||
Assert.EndsWith(artifactId, output.Trim());
|
Assert.EndsWith(artifactId, output.Trim());
|
||||||
|
|
||||||
Exe.RunHostedCommand($"\"{appUpdate}\" --uninstall --silent");
|
var uninstallOutput = Exe.RunHostedCommand($"\"{appUpdate}\" --uninstall --silent --nocolor");
|
||||||
|
logger.LogInformation(uninstallOutput);
|
||||||
|
|
||||||
Assert.False(File.Exists(appExe));
|
Assert.False(File.Exists(appExe));
|
||||||
|
Assert.True(File.Exists(Path.Combine(appRoot, ".dead")));
|
||||||
|
Utility.DeleteFileOrDirectoryHard(appRoot);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
Reference in New Issue
Block a user