From 78427c3c5c02de952475d9cb40f7217fe2d7ceab Mon Sep 17 00:00:00 2001 From: Andy Staples Date: Tue, 11 Feb 2025 12:22:10 -0700 Subject: [PATCH 1/2] Simple unit tests --- build.ps1 | 6 +- .../FullTraceFlowTests.cs | 32 ++++++ .../Logging/FunctionsLoggerBuilderTests.cs | 20 ++++ .../Logging/FunctionsLoggerTests.cs | 52 ++++++++++ .../OpenTelemetryEngineTests.csproj | 31 ++++++ .../Traces/FunctionsActivityBuilderTests.cs | 97 +++++++++++++++++++ .../Traces/FunctionsTracerBuilderTests.cs | 20 ++++ ...ure-functions-powershell-opentelemetry.sln | 6 ++ 8 files changed, 263 insertions(+), 1 deletion(-) create mode 100644 src/OpenTelemetryEngineTests/FullTraceFlowTests.cs create mode 100644 src/OpenTelemetryEngineTests/Logging/FunctionsLoggerBuilderTests.cs create mode 100644 src/OpenTelemetryEngineTests/Logging/FunctionsLoggerTests.cs create mode 100644 src/OpenTelemetryEngineTests/OpenTelemetryEngineTests.csproj create mode 100644 src/OpenTelemetryEngineTests/Traces/FunctionsActivityBuilderTests.cs create mode 100644 src/OpenTelemetryEngineTests/Traces/FunctionsTracerBuilderTests.cs diff --git a/build.ps1 b/build.ps1 index aa141d6..433a482 100644 --- a/build.ps1 +++ b/build.ps1 @@ -17,6 +17,8 @@ param( Import-Module "$PSScriptRoot\pipelineUtilities.psm1" -Force +$SrcDirectory = "$PSScriptRoot\src" + if (!$NoBuild.IsPresent) { $packageName = "AzureFunctions.PowerShell.OpenTelemetry.SDK" @@ -91,6 +93,8 @@ if (!$NoBuild.IsPresent) { } #region Test ================================================================================== if ($Test.IsPresent) { - Write-Log "There are no tests! Panic!" + Set-Location $SrcDirectory + dotnet test + if ($LASTEXITCODE -ne 0) { throw "xunit tests failed." } } #endregion \ No newline at end of file diff --git a/src/OpenTelemetryEngineTests/FullTraceFlowTests.cs b/src/OpenTelemetryEngineTests/FullTraceFlowTests.cs new file mode 100644 index 0000000..0c99345 --- /dev/null +++ b/src/OpenTelemetryEngineTests/FullTraceFlowTests.cs @@ -0,0 +1,32 @@ +// +// Copyright (c) Microsoft. All rights reserved. +// Licensed under the MIT license. See LICENSE file in the project root for full license information. +// + +using OpenTelemetryEngine.Logging; +using OpenTelemetryEngine.Traces; + +namespace OpenTelemetryEngineTests +{ + public class FullTraceFlowTests + { + [Fact] + public void FullyTracedCode_ExecutesSuccessfully() + { + var _ = FunctionsTracerBuilder.BuildTracer(new List()); + var loggerBuilderResponse = FunctionsLoggerBuilder.GetLogger(); + + string internalActivityId = Guid.NewGuid().ToString(); + + var internalActivity = FunctionsActivityBuilder.StartInternalActivity(internalActivityId, "", ""); + + var userActivity = FunctionsActivityBuilder.StartActivity("MyActivity"); + + loggerBuilderResponse.Log("A log item", "Information"); + + FunctionsActivityBuilder.StopActivity(userActivity); + + FunctionsActivityBuilder.StopInternalActivity(internalActivityId); + } + } +} diff --git a/src/OpenTelemetryEngineTests/Logging/FunctionsLoggerBuilderTests.cs b/src/OpenTelemetryEngineTests/Logging/FunctionsLoggerBuilderTests.cs new file mode 100644 index 0000000..14e895e --- /dev/null +++ b/src/OpenTelemetryEngineTests/Logging/FunctionsLoggerBuilderTests.cs @@ -0,0 +1,20 @@ +// +// Copyright (c) Microsoft. All rights reserved. +// Licensed under the MIT license. See LICENSE file in the project root for full license information. +// + +using OpenTelemetryEngine.Logging; + +namespace OpenTelemetryEngineTests.Logging +{ + public class FunctionsLoggerBuilderTests + { + [Fact] + public void FunctionsLoggerBuilder_ReturnsValidLogger() + { + var logger = FunctionsLoggerBuilder.GetLogger(); + + Assert.NotNull(logger); + } + } +} diff --git a/src/OpenTelemetryEngineTests/Logging/FunctionsLoggerTests.cs b/src/OpenTelemetryEngineTests/Logging/FunctionsLoggerTests.cs new file mode 100644 index 0000000..7c48469 --- /dev/null +++ b/src/OpenTelemetryEngineTests/Logging/FunctionsLoggerTests.cs @@ -0,0 +1,52 @@ +// +// Copyright (c) Microsoft. All rights reserved. +// Licensed under the MIT license. See LICENSE file in the project root for full license information. +// + +using OpenTelemetryEngine.Logging; + +namespace OpenTelemetryEngineTests.Logging +{ + public class FunctionsLoggerTests + { + [Fact] + public void FunctionsLogger_CanLog() + { + var logger = FunctionsLoggerBuilder.GetLogger(); + + logger.Log("This is a debug log", "Debug"); + logger.Log("This is an information log", "Information"); + logger.Log("This is a warning log", "Warning"); + logger.Log("This is an error log", "Error"); + } + + [Fact] + public void FunctionsLogger_CanLogWithWorkerHandler() + { + var logger = FunctionsLoggerBuilder.GetLogger(); + + logger.WorkerLogHandler("Debug", "This is a debug log", null); + logger.WorkerLogHandler("Information", "This is an information log", null); + logger.WorkerLogHandler("Warning", "This is a warning log", null); + logger.WorkerLogHandler("Error", "This is an error log", null); + } + + [Fact] + public void FunctionsLogger_InvalidLogTypesThrow() + { + var logger = FunctionsLoggerBuilder.GetLogger(); + + Assert.Throws(() => logger.WorkerLogHandler("NotALogCategory", "This is an invalid log", null)); + Assert.Throws(() => logger.Log("This is an invalid log", "NotALogCategory")); + } + + [Fact] + public void FunctionsLogger_NullLogMessageThrows() + { + var logger = FunctionsLoggerBuilder.GetLogger(); + + Assert.Throws(() => logger.WorkerLogHandler("Warning", null, null)); + Assert.Throws(() => logger.Log(null, "Warning")); + } + } +} \ No newline at end of file diff --git a/src/OpenTelemetryEngineTests/OpenTelemetryEngineTests.csproj b/src/OpenTelemetryEngineTests/OpenTelemetryEngineTests.csproj new file mode 100644 index 0000000..fe29ae6 --- /dev/null +++ b/src/OpenTelemetryEngineTests/OpenTelemetryEngineTests.csproj @@ -0,0 +1,31 @@ + + + + net8.0 + enable + enable + + false + true + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/OpenTelemetryEngineTests/Traces/FunctionsActivityBuilderTests.cs b/src/OpenTelemetryEngineTests/Traces/FunctionsActivityBuilderTests.cs new file mode 100644 index 0000000..ff10285 --- /dev/null +++ b/src/OpenTelemetryEngineTests/Traces/FunctionsActivityBuilderTests.cs @@ -0,0 +1,97 @@ +// +// Copyright (c) Microsoft. All rights reserved. +// Licensed under the MIT license. See LICENSE file in the project root for full license information. +// + +using OpenTelemetryEngine.Traces; + +namespace OpenTelemetryEngineTests.Traces +{ + public class FunctionsActivityBuilderTests + { + + public FunctionsActivityBuilderTests() + { + var _ = FunctionsTracerBuilder.BuildTracer(new List()); + } + + [Fact] + public void StartInternalActivity_CreatesValidActivity() + { + string invocationId = Guid.NewGuid().ToString(); + + var startActivityResponse = FunctionsActivityBuilder.StartInternalActivity(invocationId, "", ""); + + Assert.NotNull(startActivityResponse); + Assert.NotNull(startActivityResponse.activity); + Assert.Equal(invocationId, startActivityResponse.activity.Tags.Where(x => x.Key == "invocationId").First().Value); + } + + [Fact] + public void StartInternalActivity_DoesNotAllowDuplicates() + { + string invocationId = Guid.NewGuid().ToString(); + + var startActivityResponse = FunctionsActivityBuilder.StartInternalActivity(invocationId, "", ""); + var startActivityResponse2 = FunctionsActivityBuilder.StartInternalActivity(invocationId, "", ""); + + Assert.NotNull(startActivityResponse2); + Assert.Null(startActivityResponse2.activity); + + } + + [Fact] + public void StopInternalActivity_StopsActivity() + { + string invocationId = Guid.NewGuid().ToString(); + + var startActivityResponse = FunctionsActivityBuilder.StartInternalActivity(invocationId, "", ""); + + Assert.NotNull(startActivityResponse); + Assert.NotNull(startActivityResponse.activity); + Assert.False(startActivityResponse.activity.IsStopped); + + FunctionsActivityBuilder.StopInternalActivity(invocationId); + Assert.True(startActivityResponse.activity.IsStopped); + } + + [Fact] + public void StartActivity_CreatesValidActivity() + { + string activityName = Guid.NewGuid().ToString(); + + var startActivityResponse = FunctionsActivityBuilder.StartActivity(activityName); + + Assert.NotNull(startActivityResponse); + Assert.NotNull(startActivityResponse.activity); + Assert.Equal(activityName, startActivityResponse.activity.DisplayName); + } + + [Fact] + public void StartActivity_DoesNotAllowDuplicates() + { + string activityName = Guid.NewGuid().ToString(); + + var startActivityResponse = FunctionsActivityBuilder.StartInternalActivity(activityName, "", ""); + var startActivityResponse2 = FunctionsActivityBuilder.StartInternalActivity(activityName, "", ""); + + Assert.NotNull(startActivityResponse2); + Assert.Null(startActivityResponse2.activity); + } + + [Fact] + public void StopActivity_StopsActivity() + { + string activityName = Guid.NewGuid().ToString(); + + var startActivityResponse = FunctionsActivityBuilder.StartActivity(activityName); + + Assert.NotNull(startActivityResponse); + Assert.NotNull(startActivityResponse.activity); + Assert.False(startActivityResponse.activity.IsStopped); + + FunctionsActivityBuilder.StopActivity(startActivityResponse); + Assert.True(startActivityResponse.activity.IsStopped); + } + } +} diff --git a/src/OpenTelemetryEngineTests/Traces/FunctionsTracerBuilderTests.cs b/src/OpenTelemetryEngineTests/Traces/FunctionsTracerBuilderTests.cs new file mode 100644 index 0000000..dc6a44c --- /dev/null +++ b/src/OpenTelemetryEngineTests/Traces/FunctionsTracerBuilderTests.cs @@ -0,0 +1,20 @@ +// +// Copyright (c) Microsoft. All rights reserved. +// Licensed under the MIT license. See LICENSE file in the project root for full license information. +// + +using OpenTelemetryEngine.Traces; + +namespace OpenTelemetryEngineTests.Traces +{ + public class FunctionsTracerBuilderTests + { + [Fact] + public void TestFunctionsTracerBuilder() + { + var tracerBuilderResponse = FunctionsTracerBuilder.BuildTracer(new List() { "AnActivitySource" }); + + Assert.NotNull(tracerBuilderResponse); + } + } +} diff --git a/src/azure-functions-powershell-opentelemetry.sln b/src/azure-functions-powershell-opentelemetry.sln index b08d113..321a8c1 100644 --- a/src/azure-functions-powershell-opentelemetry.sln +++ b/src/azure-functions-powershell-opentelemetry.sln @@ -7,6 +7,8 @@ Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "AzureFunctions.PowerShell.O EndProject Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "OpenTelemetryEngine", "OpenTelemetryEngine\OpenTelemetryEngine.csproj", "{08741EE8-9B44-4B97-AF58-278027898F64}" EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "OpenTelemetryEngineTests", "OpenTelemetryEngineTests\OpenTelemetryEngineTests.csproj", "{E0545241-C0A9-4572-9B5F-FC8E0A644879}" +EndProject Global GlobalSection(SolutionConfigurationPlatforms) = preSolution Debug|Any CPU = Debug|Any CPU @@ -21,6 +23,10 @@ Global {08741EE8-9B44-4B97-AF58-278027898F64}.Debug|Any CPU.Build.0 = Debug|Any CPU {08741EE8-9B44-4B97-AF58-278027898F64}.Release|Any CPU.ActiveCfg = Release|Any CPU {08741EE8-9B44-4B97-AF58-278027898F64}.Release|Any CPU.Build.0 = Release|Any CPU + {E0545241-C0A9-4572-9B5F-FC8E0A644879}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {E0545241-C0A9-4572-9B5F-FC8E0A644879}.Debug|Any CPU.Build.0 = Debug|Any CPU + {E0545241-C0A9-4572-9B5F-FC8E0A644879}.Release|Any CPU.ActiveCfg = Release|Any CPU + {E0545241-C0A9-4572-9B5F-FC8E0A644879}.Release|Any CPU.Build.0 = Release|Any CPU EndGlobalSection GlobalSection(SolutionProperties) = preSolution HideSolutionNode = FALSE From 3d8f71b50a7254e36f1eeb1324fe0b215680897b Mon Sep 17 00:00:00 2001 From: Andy Staples Date: Tue, 11 Feb 2025 12:29:31 -0700 Subject: [PATCH 2/2] Bump insecure package --- .../AzureFunctions.PowerShell.OpenTelemetry.SDK.csproj | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/AzureFunctions.PowerShell.OpenTelemetry.SDK/AzureFunctions.PowerShell.OpenTelemetry.SDK.csproj b/src/AzureFunctions.PowerShell.OpenTelemetry.SDK/AzureFunctions.PowerShell.OpenTelemetry.SDK.csproj index 8846cad..eddc105 100644 --- a/src/AzureFunctions.PowerShell.OpenTelemetry.SDK/AzureFunctions.PowerShell.OpenTelemetry.SDK.csproj +++ b/src/AzureFunctions.PowerShell.OpenTelemetry.SDK/AzureFunctions.PowerShell.OpenTelemetry.SDK.csproj @@ -8,7 +8,7 @@ - +