chr
2026-04-05 fe750b791d5b517cc4e9bc8e99a9a75139a0cfba
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
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
using System;
using System.Diagnostics;
using System.IO;
using System.Linq;
using NUnit.Framework;
 
namespace OpenTap.Package.UnitTests
{
    [TestFixture]
    public class PackageTestTest
    {
        #region Utils
 
        (string Timestamp, string Source, string Type, string Message)? Parse(string line)
        {
            var logParts = line.Split(new string[] {" : "}, StringSplitOptions.None);
 
            if (logParts.Length == 4)
                return (logParts[0].Trim(), logParts[1].Trim(), logParts[2].Trim(), logParts[3].Trim());
            return null;
        }
 
        (string Timestamp, string Source, string Type, string Message)[] ParseStdout(string stdout)
        {
            return stdout.Split('\n')
                .Select(Parse)
                .Where(v => v.HasValue)
                .Select(v => v.Value).ToArray();
        }
        private (string Stdout, string Stderr, int ExitCode) RunTest(bool verbose)
        {
            string arguments = "package test MyPlugin5";
            if (verbose)
                arguments += " -v";
 
            var process = new Process
            {
                StartInfo =
                {
                    FileName = "tap",
                    Arguments = arguments,
                    WorkingDirectory = WorkingDirectory,
                    UseShellExecute = false,
                    RedirectStandardOutput = true,
                    RedirectStandardError = true,
                    CreateNoWindow = true
                }
            };
            process.Start();
 
            // For some reason, the process is kept open when running in verbose.. ?
            if (verbose)
                process.WaitForExit(5000);
            else
            {
                process.WaitForExit();
            }
 
            return (process.StandardOutput.ReadToEnd(), process.StandardError.ReadToEnd(), process.ExitCode);
        }
 
        private void InstallTestPackage()
        {
            var process = new Process
            {
                StartInfo =
                {
                    FileName = "tap",
                    Arguments = $"package install -f ./TapPackages/MyPlugin5.TapPackage",
                    WorkingDirectory = WorkingDirectory,
                    UseShellExecute = false,
                    RedirectStandardOutput = false,
                    RedirectStandardError = false,
                    CreateNoWindow = true
                }
            };
            process.Start();
            process.WaitForExit();
        }
 
        private void Backup()
        {
            var original = PackageXml;
            var backup = Path.Combine(PackageDir, "backup.xml");
            if (File.Exists(backup) == false)
                File.Copy(original, backup);
        }
 
        private string PackageDir => Path.Combine(WorkingDirectory, "Packages", "MyPlugin5");
        private string PackageXml => Path.Combine(PackageDir, "package.xml");
 
        private void AddTestElement(string testAction)
        {
            var xmlContent = $@"
<PackageActionExtensions>
  {testAction}
</PackageActionExtensions>";
            string content = "";
            using (var reader = new StreamReader(PackageXml))
                content = reader.ReadToEnd();
            var lines = content.Split('\n').ToList();
            var idx = lines.FindIndex(l => l.Contains("</Package>"));
            lines.Insert(idx, xmlContent);
 
            using (var writer = new StreamWriter(PackageXml))
                writer.Write(string.Join("\n", lines));
        }
 
        private void Restore()
        {
            var original = PackageXml;
            var backup = Path.Combine(PackageDir, "backup.xml");
            if (File.Exists(original))
                File.Delete(original);
            File.Copy(backup, original);
        }
 
        private string WorkingDirectory => Directory.GetCurrentDirectory();
        #endregion
        public PackageTestTest()
        {
            InstallTestPackage();
            Backup();
            Restore();
        }
 
        [Test]
        public void BasicTest()
        {
            Restore();
            var (stdout, stderr, exitCode) = RunTest(true);
 
            StringAssert.Contains("Tried to test MyPlugin5, but there was nothing to do.", stdout);
            Assert.AreEqual(exitCode, 0);
        }
 
        [Ignore("Echo not available on Windows runner")]
        [Test]
        public void EchoTest()
        {
            Restore();
            var testAction = @"<ActionStep ActionName = ""test"" ExeFile=""echo"" Arguments='hello' />";
            AddTestElement(testAction);
 
            var normalOutput = RunTest(false);
            StringAssert.Contains("Starting test step 'echo hello'", normalOutput.Stdout);
            // The echoed "hello" should only appear in debug output 
            CollectionAssert.DoesNotContain(normalOutput.Stdout.Split('\n'), "hello");
            StringAssert.Contains("Successfully ran test step  'echo hello'", normalOutput.Stdout);
            Assert.AreEqual(0, normalOutput.ExitCode);
 
            var verboseOutput = RunTest(true);
            var verboseLines = ParseStdout(verboseOutput.Stdout);
            CollectionAssert.Contains(verboseLines.Select(v => v.Message), "hello");
            Assert.AreEqual(0, verboseOutput.ExitCode);
        }
 
        [Test]
        public void LogInheritTest()
        {
            Restore();
            var testAction = @"<ActionStep ActionName = ""test"" ExeFile=""tap"" Arguments='sdk gitversion' />";
            AddTestElement(testAction);
 
            var actualGitversion = new GitVersionCalulator(WorkingDirectory).GetVersion().ToString();
 
            {   // Normal output tests
                var normalOutput = RunTest(false);
                
                StringAssert.Contains("Starting test step 'tap sdk gitversion'", normalOutput.Stdout);
                StringAssert.Contains("Successfully tested MyPlugin5 version 1.0.0.", normalOutput.Stdout);
                StringAssert.Contains("Successfully ran test step  'tap sdk gitversion'", normalOutput.Stdout);
                StringAssert.Contains(actualGitversion, normalOutput.Stdout);
                Assert.AreEqual(0, normalOutput.ExitCode);
            }
            {   // Verbose output tests
                var verboseOutput = RunTest(true);
 
                StringAssert.Contains("Successfully tested MyPlugin5 version 1.0.0.", verboseOutput.Stdout);
 
                var verboseLines = ParseStdout(verboseOutput.Stdout);
 
                var gitversionInfos = verboseLines.Where(l => l.Source == "GitVersion" && l.Type == "Information");
                var gitversionMessages = gitversionInfos.Select(i => i.Message).ToArray();
 
                Assert.Contains(actualGitversion, gitversionMessages);
                Assert.AreEqual(0, verboseOutput.ExitCode);
            }
        }
 
        [Test]
        public void FailingTest()
        {
            var exeName = "SomeExeFileWhichDoesNotExist";
            Restore();
            var testAction = $@"<ActionStep ActionName = ""test"" ExeFile=""{exeName}"" Arguments='hello' />";
            AddTestElement(testAction);
 
            var normalOutput = RunTest(false);
            StringAssert.Contains($"Starting test step '{exeName} hello'", normalOutput.Stdout);
            StringAssert.DoesNotContain("Successfully ran test step", normalOutput.Stdout);
            Assert.AreNotEqual(0, normalOutput.ExitCode);
            StringAssert.Contains("Failed to run test package action", normalOutput.Stderr);
        }
    }
}