-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathProgram.cs
More file actions
154 lines (135 loc) · 6.2 KB
/
Program.cs
File metadata and controls
154 lines (135 loc) · 6.2 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
using System;
using System.Diagnostics;
using System.IO;
using System.Linq;
using System.Reflection;
using System.Runtime.Versioning;
using Common;
using Common.Tests;
using NUnit.Framework;
class Program
{
static readonly TargetFrameworkAttribute TargetFrameworkAttribute = (TargetFrameworkAttribute)Assembly.GetExecutingAssembly()
.GetCustomAttributes(typeof(TargetFrameworkAttribute), false)
.SingleOrDefault();
static readonly FileVersionInfo NsbVersion = FileVersionInfo.GetVersionInfo(Assembly.Load(Assembly.GetCallingAssembly().GetReferencedAssemblies().Single(x => x.Name.Equals("NServiceBus.Core"))).Location);
static readonly Excludes ExcludeList = Excludes.BuildExcludes();
static void Main(string[] args)
{
Console.WriteLine($"Running NServiceBus {NsbVersion.FileMajorPart}.{NsbVersion.FileMinorPart}.{NsbVersion.FileBuildPart}");
Console.WriteLine("Arguments: " + string.Join(Environment.NewLine, args));
var serializers = new[]
{
Type.GetType("JsonSerializerFacade", true),
#if SYSTEMJSON
Type.GetType("SystemJsonSerializerFacade", true),
#endif
Type.GetType("XmlSerializerFacade", true)
};
var testCases = DiscoverTestCases();
if (args.Contains("serialize", StringComparer.OrdinalIgnoreCase) || args.Length == 0)
{
Console.WriteLine("Running Serialization tests for:");
Assert.Multiple(() =>
{
foreach (var serializerType in serializers)
{
foreach (var testCase in testCases)
{
var serializer = (ISerializerFacade)Activator.CreateInstance(serializerType, testCase.MessageType);
if (testCase.IsSupported(serializer.SerializationFormat, new PackageVersion(NsbVersion.FileMajorPart, NsbVersion.FileMinorPart, NsbVersion.FileBuildPart)))
{
Console.WriteLine($"{serializer.SerializationFormat:G} — {testCase.GetType().Name}");
Serialize(serializer, testCase);
}
}
}
});
}
if (args.Contains("deserialize", StringComparer.OrdinalIgnoreCase) || args.Length == 0)
{
Console.WriteLine("Running Deserialization tests for:");
Assert.Multiple(() =>
{
foreach (var serializerType in serializers)
{
foreach (var testCase in testCases)
{
var serializer =
(ISerializerFacade)Activator.CreateInstance(serializerType, testCase.MessageType);
if (testCase.IsSupported(serializer.SerializationFormat,
new PackageVersion(NsbVersion.FileMajorPart, NsbVersion.FileMinorPart,
NsbVersion.FileBuildPart)))
{
Console.WriteLine($"{serializer.SerializationFormat:G} — {testCase.GetType().Name}");
DeserializeAndVerify(serializer, testCase);
}
}
}
}
);
}
}
static void DeserializeAndVerify(ISerializerFacade serializer, TestCase testCase)
{
var expectedValues = testCase.CreateInstance(serializer);
var testCaseFolder = GetTestCaseFolder(testCase, serializer.SerializationFormat);
var files = Directory.GetFiles(testCaseFolder);
if (files.Length == 0)
{
throw new Exception("No available files to deserialize. Make sure to run the serialization test case first.");
}
foreach (var filePath in files)
{
string fileName = Path.GetFileName(filePath);
if (ExcludeList.Contains(testCase, fileName))
{
Console.WriteLine($"\tSkipping {fileName} because it was excluded");
continue;
}
using (var stream = new FileStream(filePath, FileMode.Open))
{
try
{
Console.WriteLine($"\tDeserializing {fileName}");
var deserializedType = serializer.Deserialize(stream).First();
testCase.CheckIfAreEqual(expectedValues, deserializedType);
}
catch (Exception e) when (e is not AssertionException)
{
Console.WriteLine("\tError: " + e.Message);
Assert.Fail($"Failed deserializing {testCase.GetType().Name} - {fileName}: {e}");
}
}
}
}
static string GetTestCaseFolder(TestCase testCase, SerializationFormat serializationFormat)
{
var testCaseFolder = Path.Combine(Settings.TestDirectory.FullName, serializationFormat.ToString("G"), testCase.GetType().Name);
if (!Directory.Exists(testCaseFolder))
{
Directory.CreateDirectory(testCaseFolder);
}
return testCaseFolder;
}
static void Serialize(ISerializerFacade serializer, TestCase testCase)
{
var testInstance = testCase.CreateInstance(serializer);
var testCaseFolder = GetTestCaseFolder(testCase, serializer.SerializationFormat);
var fileName = GetFileName(testCaseFolder, serializer.SerializationFormat.ToString("G").ToLower());
using (var stream = new FileStream(fileName, FileMode.Create))
{
serializer.Serialize(stream, testInstance);
stream.Flush(true);
}
}
static string GetFileName(string testCaseFolder, string fileExtension) => Path.Combine(testCaseFolder, $"{Assembly.GetExecutingAssembly().GetName().Name} {TargetFrameworkAttribute.FrameworkDisplayName}.{fileExtension}");
static TestCase[] DiscoverTestCases()
{
var testCaseType = typeof(TestCase);
var testTypes = testCaseType.Assembly.GetTypes()
.Where(p => p.IsSubclassOf(testCaseType))
.Select(p => (TestCase)Activator.CreateInstance(p));
return testTypes.ToArray();
}
}