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/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 @@
-
+
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