-
Notifications
You must be signed in to change notification settings - Fork 2
Expand file tree
/
Copy pathJsonNodeBenchmark.cs
More file actions
153 lines (132 loc) · 5 KB
/
JsonNodeBenchmark.cs
File metadata and controls
153 lines (132 loc) · 5 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
using System.Text.Json;
using System.Text.Json.Nodes;
using JsonBenchmark;
namespace JsonNodeBenchmark;
public static class JsonNodeBenchmark
{
private static readonly JsonSerializerOptions _options = new() { WriteIndented = false };
// Benchmark for JSON via Web URL
public static async Task<int> MakeReportAsync(string url)
{
// Make network call
var httpClient = new HttpClient();
using var responseMessage = await httpClient.GetAsync(url, HttpCompletionOption.ResponseHeadersRead);
var stream = await responseMessage.Content.ReadAsStreamAsync();
// Parse Json from stream
var doc = await JsonNode.ParseAsync(stream) ?? throw new Exception(Error.BADJSON);
var version = doc["channel-version"]?.ToString() ?? "";
var supported = doc["support-phase"]?.ToString() is "active" or "maintenance";
var eolDate = doc["eol-date"]?.ToString() ?? "";
var releases = doc["releases"]?.AsArray() ?? [];
// Generate report
var report = new JsonObject()
{
["report-date"] = DateTime.Now.ToShortDateString(),
["versions"] = new JsonArray()
{
new JsonObject()
{
["version"] = version,
["supported"] = supported,
["eol-date"] = eolDate,
["support-ends-in-days"] = eolDate is null ? null : GetDaysAgo(eolDate, true),
["releases"] = GetReportForReleases(releases),
}
}
};
// Generate report
string reportJson = report.ToJsonString(_options);
WriteJsonToConsole(reportJson);
return reportJson.Length;
}
// Benchmark for JSON via file
public static async Task<int> MakeReportFileAsync(string path)
{
// Local local file
using Stream stream = File.Open(path, FileMode.Open);
// Parse Json from stream
var doc = await JsonNode.ParseAsync(stream) ?? throw new Exception(Error.BADJSON);
var version = doc["channel-version"]?.ToString() ?? "";
var supported = doc["support-phase"]?.ToString() is "active" or "maintenance";
var eolDate = doc["eol-date"]?.ToString() ?? "";
var releases = doc["releases"]?.AsArray() ?? [];
// Generate report
var report = new JsonObject()
{
["report-date"] = DateTime.Now.ToShortDateString(),
["versions"] = new JsonArray()
{
new JsonObject()
{
["version"] = version,
["supported"] = supported,
["eol-date"] = eolDate,
["support-ends-in-days"] = eolDate is null ? null : GetDaysAgo(eolDate, true),
["releases"] = GetReportForReleases(releases),
}
}
};
// Generate JSON
string reportJson = report.ToJsonString(_options);
WriteJsonToConsole(reportJson);
return reportJson.Length;
}
// Get first and first security release
static JsonArray GetReportForReleases(JsonArray releases)
{
var securityOnly = false;
JsonArray reportReleases = [];
foreach (var release in releases)
{
if (release is null)
{
continue;
}
var releaseDate = release["release-date"]?.ToString() ?? "";
var releaseVersion = release["release-version"]?.ToString() ?? "";
var securityNode = release["security"] ?? new JsonObject();
var security = securityNode.GetValueKind() switch
{
JsonValueKind.True => true,
JsonValueKind.False => false,
_ => throw new Exception(Error.BADJSON)
};
if (securityOnly && !security)
{
continue;
}
else if (!securityOnly)
{
securityOnly = true;
}
var cves = release["cve-list"] ?? throw new Exception(Error.BADJSON);
var releaseObject = new JsonObject()
{
["release-version"] = releaseVersion,
["security"] = security,
["release-date"] = releaseDate,
["released-days-ago"] = GetDaysAgo(releaseDate, true),
["cve-list"] = cves.DeepClone()
};
reportReleases.Add(releaseObject);
if (security)
{
break;
}
}
return reportReleases;
}
static int GetDaysAgo(string date, bool positiveNumber = false)
{
bool success = DateTime.TryParse(date, out var day);
var daysAgo = success ? (int)(day - DateTime.Now).TotalDays : 0;
return positiveNumber ? Math.Abs(daysAgo) : daysAgo;
}
static void WriteJsonToConsole(string json)
{
#if DEBUG
Console.WriteLine(json);
Console.WriteLine();
#endif
}
}