using System; using Amazon.AwsToolkit.Telemetry.Events.Core; using Amazon.AwsToolkit.Telemetry.Events.Generated; using Moq; using Xunit; namespace Amazon.AwsToolkit.Telemetry.Events.Tests { /// /// Test a sampling of the generated code, to see that RecordXxx calls function as expected /// public class GeneratedCodeTests { private readonly Mock _telemetryLogger = new Mock(); private Metrics _recordedMetrics = null; public GeneratedCodeTests() { _telemetryLogger.Setup(mock => mock.Record(It.IsAny())) .Callback(metrics => { _recordedMetrics = metrics; }); } /// /// RecordLambdaInvokeRemote was chosen as a sample call that uses a telemetry "enum" type (Runtime) /// [Fact] public void RecordLambdaInvokeRemote() { var lambdaInvokeRemote = new LambdaInvokeRemote() { AwsAccount = "abcdacbdacbd", AwsRegion = "us-region-1", Result = Result.Succeeded, Runtime = Runtime.Dotnetcore31, }; _telemetryLogger.Object.RecordLambdaInvokeRemote(lambdaInvokeRemote); Assert.NotNull(_recordedMetrics); _telemetryLogger.Verify( mock => mock.Record(_recordedMetrics), Times.Once ); var datum = Assert.Single(_recordedMetrics.Data); Assert.NotNull(datum); Assert.Equal("lambda_invokeRemote", datum.MetricName); Assert.Equal(Unit.None, datum.Unit); Assert.False(datum.Passive); Assert.Equal(lambdaInvokeRemote.AwsAccount, datum.Metadata["awsAccount"]); Assert.Equal(lambdaInvokeRemote.AwsRegion, datum.Metadata["awsRegion"]); Assert.Equal(lambdaInvokeRemote.Runtime.Value.ToString(), datum.Metadata["runtime"]); Assert.Equal(lambdaInvokeRemote.Result.ToString(), datum.Metadata["result"]); } /// /// RecordLambdaInvokeRemote is arbitrary here, we're checking that we can override the /// Passive value. /// [Fact] public void RecordLambdaInvokeRemote_AsPassive() { var lambdaInvokeRemote = new LambdaInvokeRemote() { Passive = true, Result = Result.Succeeded, Runtime = Runtime.Dotnetcore31, }; _telemetryLogger.Object.RecordLambdaInvokeRemote(lambdaInvokeRemote); Assert.NotNull(_recordedMetrics); _telemetryLogger.Verify( mock => mock.Record(_recordedMetrics), Times.Once ); var datum = Assert.Single(_recordedMetrics.Data); Assert.NotNull(datum); Assert.Equal("lambda_invokeRemote", datum.MetricName); Assert.True(datum.Passive); Assert.Equal(lambdaInvokeRemote.Runtime.Value.ToString(), datum.Metadata["runtime"]); Assert.Equal(lambdaInvokeRemote.Result.ToString(), datum.Metadata["result"]); } /// /// RecordSamDeployWithVersion was chosen as a sample call that has an optional field (Version) /// [Fact] public void RecordSamDeployWithVersion() { var samDeploy = new SamDeploy() { Result = Result.Succeeded, Version = "1.2.3", }; _telemetryLogger.Object.RecordSamDeploy(samDeploy); Assert.NotNull(_recordedMetrics); _telemetryLogger.Verify( mock => mock.Record(_recordedMetrics), Times.Once ); var datum = Assert.Single(_recordedMetrics.Data); Assert.NotNull(datum); Assert.Equal("sam_deploy", datum.MetricName); Assert.Equal(Unit.None, datum.Unit); Assert.False(datum.Passive); Assert.Equal(samDeploy.Version, datum.Metadata["version"]); Assert.Equal(samDeploy.Result.ToString(), datum.Metadata["result"]); } /// /// RecordSamDeployWithVersion was chosen as a sample call that has an optional field (Version) /// [Fact] public void RecordSamDeployWithoutVersion() { var samDeploy = new SamDeploy() { Result = Result.Succeeded, }; _telemetryLogger.Object.RecordSamDeploy(samDeploy); Assert.NotNull(_recordedMetrics); _telemetryLogger.Verify( mock => mock.Record(_recordedMetrics), Times.Once ); var datum = Assert.Single(_recordedMetrics.Data); Assert.NotNull(datum); Assert.Equal("sam_deploy", datum.MetricName); Assert.Equal(Unit.None, datum.Unit); Assert.False(datum.Passive); Assert.False(datum.Metadata.ContainsKey("version")); Assert.Equal(samDeploy.Result.ToString(), datum.Metadata["result"]); } [Fact] public void RecordNaturallyPassiveMetric() { var sessionStart = new SessionStart(); _telemetryLogger.Object.RecordSessionStart(sessionStart); Assert.NotNull(_recordedMetrics); _telemetryLogger.Verify( mock => mock.Record(_recordedMetrics), Times.Once ); var datum = Assert.Single(_recordedMetrics.Data); Assert.NotNull(datum); Assert.Equal("session_start", datum.MetricName); Assert.True(datum.Passive); } [Fact] public void RecordMetricWithMutationTransform() { var samInit = new SamInit() { Reason = "hello world", }; _telemetryLogger.Object.RecordSamInit(samInit, TransformDuplicateReason); Assert.NotNull(_recordedMetrics); _telemetryLogger.Verify( mock => mock.Record(_recordedMetrics), Times.Once ); var datum = Assert.Single(_recordedMetrics.Data); Assert.NotNull(datum); Assert.Equal("sam_init", datum.MetricName); Assert.True(datum.Metadata.ContainsKey("reason")); Assert.Equal("hello world", datum.Metadata["reason"]); Assert.True(datum.Metadata.ContainsKey("reason1")); Assert.Equal("hello world", datum.Metadata["reason1"]); Assert.True(datum.Metadata.ContainsKey("reason2")); Assert.Equal("HELLO WORLD", datum.Metadata["reason2"]); } [Fact] public void RecordMetricWithNewTransform() { var samInit = new SamInit() { Reason = "hello world", }; _telemetryLogger.Object.RecordSamInit(samInit, TransformCreateNewDatum); Assert.NotNull(_recordedMetrics); _telemetryLogger.Verify( mock => mock.Record(_recordedMetrics), Times.Once ); var datum = Assert.Single(_recordedMetrics.Data); Assert.NotNull(datum); Assert.Equal("sam_init", datum.MetricName); Assert.False(datum.Metadata.ContainsKey("reason")); Assert.True(datum.Metadata.ContainsKey("currentTime")); Assert.Single(datum.Metadata); } private MetricDatum TransformDuplicateReason(MetricDatum datum) { datum.Metadata["reason1"] = datum.Metadata["reason"]; datum.Metadata["reason2"] = datum.Metadata["reason"].ToUpper(); return datum; } private MetricDatum TransformCreateNewDatum(MetricDatum datum) { MetricDatum newDatum = new MetricDatum(); newDatum.MetricName = datum.MetricName; newDatum.Metadata.Add("currentTime", DateTime.Now.ToShortTimeString()); return newDatum; } } }