//-----------------------------------------------------------------------------
//
// Copyright 2020 Amazon.com, Inc. or its affiliates. All Rights Reserved.
//
// Licensed under the Apache License, Version 2.0 (the "License").
// You may not use this file except in compliance with the License.
// A copy of the License is located at
//
// http://aws.amazon.com/apache2.0
//
// or in the "license" file accompanying this file. This file is distributed
// on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either
// express or implied. See the License for the specific language governing
// permissions and limitations under the License.
//
//-----------------------------------------------------------------------------
using Amazon.XRay.Recorder.Core.Sampling.Model;
using Microsoft.VisualStudio.TestTools.UnitTesting;
using System;
using ThirdParty.LitJson;
namespace Amazon.XRay.Recorder.UnitTests
{
[TestClass]
public class JsonMapperTest
{
[TestMethod]
public void TestMarshallSamplingStatisticsDocuments()
{
var samplingStatisticsModel = new SamplingStatisticsModel();
var samplingStatisticsDocumentModel = new SamplingStatisticsDocumentModel
{
ClientID = "07492221d7fd13a86e750de2",
RuleName = "Test",
RequestCount = 108,
SampledCount = 4,
BorrowCount = 6,
Timestamp = 1604297926.362
};
samplingStatisticsModel.SamplingStatisticsDocuments.Add(samplingStatisticsDocumentModel);
var expected = "{\"SamplingStatisticsDocuments\":[{\"ClientID\":\"07492221d7fd13a86e750de2\",\"RuleName\":\"Test\",\"RequestCount\":108,\"SampledCount\":4,\"BorrowCount\":6,\"Timestamp\":1604297926.362}]}";
var actual = JsonMapper.ToJson(samplingStatisticsModel);
Assert.AreEqual(expected, actual);
}
[TestMethod]
public void TestMarshallSamplingStatisticsDocumentsWithEmptyValues()
{
var samplingStatisticsModel = new SamplingStatisticsModel();
var samplingStatisticsDocumentModel = new SamplingStatisticsDocumentModel();
samplingStatisticsModel.SamplingStatisticsDocuments.Add(samplingStatisticsDocumentModel);
var expected = "{\"SamplingStatisticsDocuments\":[{\"ClientID\":null,\"RuleName\":null,\"RequestCount\":null,\"SampledCount\":null,\"BorrowCount\":null,\"Timestamp\":null}]}";
var actual = JsonMapper.ToJson(samplingStatisticsModel);
Assert.AreEqual(expected, actual);
}
[TestMethod]
public void TestMarshallSamplingStatisticsDocumentsWithEmptyItems()
{
var samplingStatisticsModel = new SamplingStatisticsModel();
var expected = "{\"SamplingStatisticsDocuments\":[]}";
var actual = JsonMapper.ToJson(samplingStatisticsModel);
Assert.AreEqual(expected, actual);
}
[TestMethod]
public void TestUnmarshallSamplingRuleResponse()
{
var samplingRuleResponseJson = "{\"NextToken\":null,\"SamplingRuleRecords\":[{\"CreatedAt\":0.0,\"ModifiedAt\":1.602621583E9,\"SamplingRule\":{\"Attributes\":{},\"FixedRate\":0.05,\"HTTPMethod\":\"*\",\"Host\":\"*\",\"Priority\":10000,\"ReservoirSize\":1,\"ResourceARN\":\"*\",\"RuleARN\":\"arn:aws:xray:us-east-1:1234567:sampling-rule/Default\",\"RuleName\":\"Default\",\"ServiceName\":\"*\",\"ServiceType\":\"*\",\"URLPath\":\"*\",\"Version\":1}}]}";
var samplingRuleResponseModel = JsonMapper.ToObject(samplingRuleResponseJson);
Assert.IsNull(samplingRuleResponseModel.NextToken);
Assert.IsTrue(samplingRuleResponseModel.SamplingRuleRecords.Count > 0);
foreach (var samplingRuleRecord in samplingRuleResponseModel.SamplingRuleRecords)
{
Assert.AreEqual(0.0, samplingRuleRecord.CreatedAt.GetValueOrDefault());
Assert.AreEqual(1.602621583E9, samplingRuleRecord.ModifiedAt.GetValueOrDefault());
Assert.IsNotNull(samplingRuleRecord.SamplingRule);
Assert.IsTrue(samplingRuleRecord.SamplingRule.Attributes.Count == 0);
Assert.AreEqual(0.05, samplingRuleRecord.SamplingRule.FixedRate.GetValueOrDefault());
Assert.AreEqual("*", samplingRuleRecord.SamplingRule.HTTPMethod);
Assert.AreEqual("*", samplingRuleRecord.SamplingRule.Host);
Assert.AreEqual(10000, samplingRuleRecord.SamplingRule.Priority.GetValueOrDefault());
Assert.AreEqual(1, samplingRuleRecord.SamplingRule.ReservoirSize.GetValueOrDefault());
Assert.AreEqual("*", samplingRuleRecord.SamplingRule.ResourceARN);
Assert.AreEqual("arn:aws:xray:us-east-1:1234567:sampling-rule/Default", samplingRuleRecord.SamplingRule.RuleARN);
Assert.AreEqual("Default", samplingRuleRecord.SamplingRule.RuleName);
Assert.AreEqual("*", samplingRuleRecord.SamplingRule.ServiceName);
Assert.AreEqual("*", samplingRuleRecord.SamplingRule.ServiceType);
Assert.AreEqual("*", samplingRuleRecord.SamplingRule.URLPath);
Assert.AreEqual(1, samplingRuleRecord.SamplingRule.Version.GetValueOrDefault());
}
}
[TestMethod]
public void TestUnmarshallSamplingRuleResponseWithEmptyValues()
{
var samplingRuleResponseJson = "{\"NextToken\":null,\"SamplingRuleRecords\":[{\"CreatedAt\":null,\"ModifiedAt\":null,\"SamplingRule\":{\"Attributes\":{},\"FixedRate\":null,\"HTTPMethod\":null,\"Host\":null,\"Priority\":null,\"ReservoirSize\":null,\"ResourceARN\":null,\"RuleARN\":null,\"RuleName\":null,\"ServiceName\":null,\"ServiceType\":null,\"URLPath\":null,\"Version\":null}}]}";
var samplingRuleResponseModel = JsonMapper.ToObject(samplingRuleResponseJson);
Assert.IsNull(samplingRuleResponseModel.NextToken);
Assert.IsTrue(samplingRuleResponseModel.SamplingRuleRecords.Count > 0);
foreach (var samplingRuleRecord in samplingRuleResponseModel.SamplingRuleRecords)
{
Assert.AreEqual(0, samplingRuleRecord.CreatedAt.GetValueOrDefault());
Assert.AreEqual(0, samplingRuleRecord.ModifiedAt.GetValueOrDefault());
Assert.IsNotNull(samplingRuleRecord.SamplingRule);
Assert.IsTrue(samplingRuleRecord.SamplingRule.Attributes.Count == 0);
Assert.AreEqual(0, samplingRuleRecord.SamplingRule.FixedRate.GetValueOrDefault());
Assert.AreEqual(null, samplingRuleRecord.SamplingRule.HTTPMethod);
Assert.AreEqual(null, samplingRuleRecord.SamplingRule.Host);
Assert.AreEqual(0, samplingRuleRecord.SamplingRule.Priority.GetValueOrDefault());
Assert.AreEqual(0, samplingRuleRecord.SamplingRule.ReservoirSize.GetValueOrDefault());
Assert.AreEqual(null, samplingRuleRecord.SamplingRule.ResourceARN);
Assert.AreEqual(null, samplingRuleRecord.SamplingRule.RuleARN);
Assert.AreEqual(null, samplingRuleRecord.SamplingRule.RuleName);
Assert.AreEqual(null, samplingRuleRecord.SamplingRule.ServiceName);
Assert.AreEqual(null, samplingRuleRecord.SamplingRule.ServiceType);
Assert.AreEqual(null, samplingRuleRecord.SamplingRule.URLPath);
Assert.AreEqual(0, samplingRuleRecord.SamplingRule.Version.GetValueOrDefault());
}
}
[TestMethod]
public void TestUnmarshallSamplingRuleResponseWithInvalidFormat()
{
var samplingRuleResponseJson = "{\"a\":null,\"b\":[{\"c\":0.0,\"d\":1.602621583E9,\"e\":{\"f\":{},\"g\":0.05,\"h\":\"*\",\"i\":\"*\",\"j\":10000,\"k\":1,\"l\":\"*\",\"m\":\"arn:aws:xray:us-east-1:1234567:sampling-rule/Default\",\"n\":\"Default\",\"o\":\"*\",\"p\":\"*\",\"q\":\"*\",\"r\":1}}]}";
var samplingRuleResponseModel = JsonMapper.ToObject(samplingRuleResponseJson);
Assert.IsNull(samplingRuleResponseModel.NextToken);
Assert.IsTrue(samplingRuleResponseModel.SamplingRuleRecords.Count == 0);
}
[TestMethod]
public void TestUnmarshallSamplingRuleResponseWithNull()
{
string samplingRuleResponseJson = "";
var samplingRuleResponseModel = JsonMapper.ToObject(samplingRuleResponseJson);
Assert.IsNull(samplingRuleResponseModel);
}
[TestMethod]
public void TestUnmarshallSamplingTargetResponse()
{
string samplingTargetResponseJson = "{\"LastRuleModification\":1.603923208E9,\"SamplingTargetDocuments\":[{\"FixedRate\":0.05,\"Interval\":2,\"ReservoirQuota\":1,\"ReservoirQuotaTTL\":1.5,\"RuleName\":\"Test\"}],\"UnprocessedStatistics\":[{\"ErrorCode\":\"400\",\"Message\":\"Unknown rule\",\"RuleName\":\"Fault\"}]}";
var samplingTargetResponseModel = JsonMapper.ToObject(samplingTargetResponseJson);
Assert.AreEqual(1.603923208E9, samplingTargetResponseModel.LastRuleModification);
Assert.IsTrue(samplingTargetResponseModel.SamplingTargetDocuments.Count > 0);
Assert.IsTrue(samplingTargetResponseModel.UnprocessedStatistics.Count > 0);
foreach (var target in samplingTargetResponseModel.SamplingTargetDocuments)
{
Assert.AreEqual(0.05, target.FixedRate.GetValueOrDefault());
Assert.AreEqual(2, target.Interval.GetValueOrDefault());
Assert.AreEqual(1, target.ReservoirQuota.GetValueOrDefault());
Assert.AreEqual(1.5, target.ReservoirQuotaTTL.GetValueOrDefault());
Assert.AreEqual("Test", target.RuleName);
}
foreach (var unprocessed in samplingTargetResponseModel.UnprocessedStatistics)
{
Assert.AreEqual("400", unprocessed.ErrorCode);
Assert.AreEqual("Unknown rule", unprocessed.Message);
Assert.AreEqual("Fault", unprocessed.RuleName);
}
}
[TestMethod]
public void TestUnmarshallSamplingTargetResponseWithoutSamplingTargetDocuments()
{
string samplingTargetResponseJson = "{\"LastRuleModification\":1.603923208E9,\"SamplingTargetDocuments\":[],\"UnprocessedStatistics\":[{\"ErrorCode\":\"400\",\"Message\":\"Unknown rule\",\"RuleName\":\"Fault\"}]}";
var samplingTargetResponseModel = JsonMapper.ToObject(samplingTargetResponseJson);
Assert.AreEqual(1.603923208E9, samplingTargetResponseModel.LastRuleModification);
Assert.IsTrue(samplingTargetResponseModel.SamplingTargetDocuments.Count == 0);
Assert.IsTrue(samplingTargetResponseModel.UnprocessedStatistics.Count > 0);
foreach (var unprocessed in samplingTargetResponseModel.UnprocessedStatistics)
{
Assert.AreEqual("400", unprocessed.ErrorCode);
Assert.AreEqual("Unknown rule", unprocessed.Message);
Assert.AreEqual("Fault", unprocessed.RuleName);
}
}
[TestMethod]
public void TestUnmarshallSamplingTargetResponseWithoutUnprocessedStatistics()
{
string samplingTargetResponseJson = "{\"LastRuleModification\":1.603923208E9,\"SamplingTargetDocuments\":[{\"FixedRate\":0.05,\"Interval\":2,\"ReservoirQuota\":1,\"ReservoirQuotaTTL\":1.5,\"RuleName\":\"Test\"}],\"UnprocessedStatistics\":[]}";
var samplingTargetResponseModel = JsonMapper.ToObject(samplingTargetResponseJson);
Assert.AreEqual(1.603923208E9, samplingTargetResponseModel.LastRuleModification);
Assert.IsTrue(samplingTargetResponseModel.SamplingTargetDocuments.Count > 0);
Assert.IsTrue(samplingTargetResponseModel.UnprocessedStatistics.Count == 0);
foreach (var target in samplingTargetResponseModel.SamplingTargetDocuments)
{
Assert.AreEqual(0.05, target.FixedRate.GetValueOrDefault());
Assert.AreEqual(2, target.Interval.GetValueOrDefault());
Assert.AreEqual(1, target.ReservoirQuota.GetValueOrDefault());
Assert.AreEqual(1.5, target.ReservoirQuotaTTL.GetValueOrDefault());
Assert.AreEqual("Test", target.RuleName);
}
}
[TestMethod]
public void TestUnmarshallSamplingTargetResponseWithEmptyValues()
{
string samplingTargetResponseJson = "{\"LastRuleModification\":null,\"SamplingTargetDocuments\":[{\"FixedRate\":null,\"Interval\":null,\"ReservoirQuota\":null,\"ReservoirQuotaTTL\":null,\"RuleName\":null}],\"UnprocessedStatistics\":[{\"ErrorCode\":null,\"Message\":null,\"RuleName\":null}]}";
var samplingTargetResponseModel = JsonMapper.ToObject(samplingTargetResponseJson);
Assert.AreEqual(0, samplingTargetResponseModel.LastRuleModification.GetValueOrDefault());
Assert.IsTrue(samplingTargetResponseModel.SamplingTargetDocuments.Count > 0);
Assert.IsTrue(samplingTargetResponseModel.UnprocessedStatistics.Count > 0);
foreach (var target in samplingTargetResponseModel.SamplingTargetDocuments)
{
Assert.AreEqual(0, target.FixedRate.GetValueOrDefault());
Assert.AreEqual(0, target.Interval.GetValueOrDefault());
Assert.AreEqual(0, target.ReservoirQuota.GetValueOrDefault());
Assert.AreEqual(0, target.ReservoirQuotaTTL.GetValueOrDefault());
Assert.IsNull(target.RuleName);
}
foreach (var unprocessed in samplingTargetResponseModel.UnprocessedStatistics)
{
Assert.IsNull(unprocessed.ErrorCode);
Assert.IsNull(unprocessed.Message);
Assert.IsNull(unprocessed.RuleName);
}
}
[TestMethod]
public void TestUnmarshallSamplingTargetResponseWithInvalidFormat()
{
string samplingTargetResponseJson = "{\"a\":1.603923208E9,\"b\":[{\"c\":0.05,\"d\":2,\"e\":1,\"f\":1.5,\"g\":\"Test\"}],\"h\":[{\"i\":\"400\",\"j\":\"Unknown rule\",\"k\":\"Fault\"}]}";
var samplingTargetResponseModel = JsonMapper.ToObject(samplingTargetResponseJson);
Assert.IsNull(samplingTargetResponseModel.LastRuleModification);
Assert.IsTrue(samplingTargetResponseModel.SamplingTargetDocuments.Count == 0);
Assert.IsTrue(samplingTargetResponseModel.UnprocessedStatistics.Count == 0);
}
[TestMethod]
public void TestUnmarshallSamplingTargetResponseWithNull()
{
string samplingTargetResponseJson = "";
var samplingTargetResponseModel = JsonMapper.ToObject(samplingTargetResponseJson);
Assert.IsNull(samplingTargetResponseModel);
}
[TestMethod]
public void SerializeObjectContainingEmptyGuid()
{
var obj = new AnythingWithGuid();
var actual = JsonMapper.ToJson(obj);
var expected = "{\"Id\":\"00000000-0000-0000-0000-000000000000\"}";
Assert.AreEqual(expected, actual);
}
[TestMethod]
public void SerializeObjectContainingNonEmptyGuid()
{
var guid = Guid.Parse("b2aee583-770c-42c5-b5d8-d25e0df4d161");
var obj = new AnythingWithGuid { Id = guid };
var actual = JsonMapper.ToJson(obj);
var expected = "{\"Id\":\"b2aee583-770c-42c5-b5d8-d25e0df4d161\"}";
Assert.AreEqual(expected, actual);
}
public class AnythingWithGuid
{
public Guid Id { get; set; }
}
}
}