-
Notifications
You must be signed in to change notification settings - Fork 0
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
feat: Add binary option to support gzipped content
`eavfw binary <content>` can work on binary content: - unzip gzipped content and output to terminal or `-o|--output` path - zip gzip content and output to terminal or `-o|--output` path - pretty format unzipped content, supports json documents.
- Loading branch information
1 parent
7919320
commit 7bce546
Showing
6 changed files
with
156 additions
and
76 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
67 changes: 66 additions & 1 deletion
67
src/EAVFW.Extensions.Manifest.ManifestEnricherTool/Commands/Gzip/GzipLogic.cs
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -1,7 +1,72 @@ | ||
using System; | ||
using System.IO; | ||
using System.IO.Compression; | ||
using System.Text; | ||
using System.Text.Json; | ||
using System.Threading.Tasks; | ||
|
||
namespace EAVFW.Extensions.Manifest.ManifestEnricherTool.Commands.Gzip | ||
{ | ||
public class GzipLogic | ||
{ | ||
|
||
public static async Task<(int, string)> ConstructString( | ||
string input, | ||
bool unzip = false, | ||
bool zip = false, | ||
bool prettyPrint = false) | ||
{ | ||
if (string.IsNullOrWhiteSpace(input)) | ||
{ | ||
throw new Exception("Cannot operate on empty input"); | ||
} | ||
|
||
if (unzip) | ||
{ | ||
var unzipped = await Unzip(input); | ||
|
||
if (!prettyPrint) return (0, unzipped); | ||
|
||
var prettified = await FormatJson(unzipped); | ||
return (0, prettified); | ||
} | ||
|
||
if (zip) | ||
{ | ||
var zipped = await Zip(input); | ||
return (0, zipped); | ||
} | ||
|
||
return (127, "Command not found"); | ||
} | ||
|
||
internal static async Task<string> Unzip(string str) | ||
{ | ||
if (str.StartsWith("0x")) | ||
str = str[2..]; | ||
|
||
var bytes = Convert.FromHexString(str); | ||
using var tinyStream = | ||
new StreamReader(new GZipStream(new MemoryStream(bytes), CompressionMode.Decompress)); | ||
return await tinyStream.ReadToEndAsync(); | ||
} | ||
|
||
internal static async Task<string> Zip(string str) | ||
{ | ||
using var memoryStream = new MemoryStream(); | ||
await using var gZipStream = new GZipStream(memoryStream, CompressionMode.Compress); | ||
await using var writer = new StreamWriter(gZipStream, Encoding.UTF8); | ||
await writer.WriteAsync(str); | ||
await writer.FlushAsync(); | ||
|
||
var compressedBytes = memoryStream.ToArray(); | ||
|
||
return Convert.ToHexString(compressedBytes); | ||
} | ||
|
||
internal static Task<string> FormatJson(string str) | ||
{ | ||
using var jDoc = JsonDocument.Parse(str); | ||
return Task.FromResult(JsonSerializer.Serialize(jDoc, new JsonSerializerOptions { WriteIndented = true })); | ||
} | ||
} | ||
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
73 changes: 72 additions & 1 deletion
73
tests/EAVFW.Extensions.Manifest.Tests/Gzip/GzipLogicTest.cs
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -1,7 +1,78 @@ | ||
using System.Threading.Tasks; | ||
using EAVFW.Extensions.Manifest.ManifestEnricherTool.Commands.Gzip; | ||
using Microsoft.VisualStudio.TestTools.UnitTesting; | ||
|
||
namespace EAVFW.Extensions.Manifest.Tests.Gzip | ||
{ | ||
[TestClass] | ||
public class GzipLogicTest | ||
{ | ||
|
||
[TestMethod] | ||
public async Task NoOptions() | ||
{ | ||
// Arrange | ||
var jsonString = "{ \"value\": 2 }"; | ||
var expectedStatusCode = 127; | ||
|
||
// Act | ||
var (statusCode, output) = await GzipLogic.ConstructString(jsonString); | ||
|
||
// Assert | ||
Assert.AreEqual(expectedStatusCode, statusCode); | ||
} | ||
|
||
|
||
[TestMethod] | ||
public async Task ZipAndUnZipTests() | ||
{ | ||
// Arrange | ||
var jsonString = "{ \"value\": 2 }"; | ||
var expectedStatusCode = 0; | ||
|
||
// Act | ||
var (statusCode, output) = | ||
await GzipLogic.ConstructString((await GzipLogic.ConstructString(jsonString, zip: true)).Item2, | ||
unzip: true); | ||
|
||
// Assert | ||
Assert.AreEqual(expectedStatusCode, statusCode); | ||
Assert.AreEqual(jsonString, output); | ||
} | ||
|
||
[TestMethod] | ||
public async Task ZipAndUnZipWithPrettyPrintTests() | ||
{ | ||
// Arrange | ||
var jsonString = "{ \"value\": 2 }"; | ||
var prettyfied = "{\n \"value\": 2\n}"; | ||
var expectedStatusCode = 0; | ||
|
||
// Act | ||
var (statusCode, output) = await GzipLogic.ConstructString( | ||
(await GzipLogic.ConstructString(jsonString, zip: true)).Item2, unzip: true, prettyPrint: true); | ||
|
||
// Assert | ||
Assert.AreEqual(expectedStatusCode, statusCode); | ||
Assert.AreEqual(prettyfied, output); | ||
} | ||
|
||
[TestMethod] | ||
public async Task UnZipEavfwGeneratedContent() | ||
{ | ||
// Arrange | ||
var zippedString = | ||
"0x1F8B08000000000000139C51414EC33010FC8BAFD4C8719C36C9AD824BA50252E90D71D8D8EBC852EA147B73A8A2FE1D3B05CE153E8DAC99D99DD999812637FAC8DA993D0504C2FDDBEE19080EF83561A4178C117ADC2EAC4C72FE3C5106C3E8C28DC35A06CA182937C0D142C795EE2A5EA2042E6AD369B0AAAA9A82AD5840EDCE0E3DA5791FACA884EAACB45CDB3572D5E8861B5B36BFA235405DB3CFEB8A45029A9284BD4F5AA34193ACBAD15CEE1F6CC10D680E0831A7F0D3305C932F05D7F71896F0C71BCE90DC0993B514B2E485E0853C8A4DAB8A56C9C7B2484B370F42B442FC2D31B394C8D1E51516DD1E89308CD67983279FFE7FAA8CB702C66076E6FECD4DBA451EF1AFEAF2FB060000FFFF"; | ||
var unzippedString = | ||
"{\"actions\":{\"CreateLOIDataRequestMessageAction\":{\"input\":{\"loirequest\":\"a4dd227a-efab-4cb5-3e2a-08dbcaf45591\",\"recipients\":[\"1504bf2f-cf6e-49c9-df39-08dbcaf6aa88\"]},\"status\":\"Succeded\",\"body\":\"a4dd227a-efab-4cb5-3e2a-08dbcaf45591\",\"failedReason\":null}},\"triggers\":{\"Trigger\":{\"time\":\"2023-10-12T07:41:42.311509+00:00\",\"body\":{\"entityName\":\"LetterofindemnityRequests\",\"recordId\":\"a4dd227a-efab-4cb5-3e2a-08dbcaf45591\",\"data\":{\"recipients\":[\"1504bf2f-cf6e-49c9-df39-08dbcaf6aa88\"]}}}}}"; | ||
|
||
var expectedStatusCode = 0; | ||
|
||
// Act | ||
var (statusCode, output) = await GzipLogic.ConstructString(zippedString, unzip: true); | ||
|
||
// Asset | ||
Assert.AreEqual(expectedStatusCode, statusCode); | ||
Assert.AreEqual(unzippedString, output); | ||
} | ||
} | ||
} |