Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
7 changes: 6 additions & 1 deletion CodingWithCalvin.Otel4Vsix.slnx
Original file line number Diff line number Diff line change
@@ -1,3 +1,8 @@
<Solution>
<Project Path="src/CodingWithCalvin.Otel4Vsix/CodingWithCalvin.Otel4Vsix.csproj" />
<Folder Name="/src/">
<Project Path="src/CodingWithCalvin.Otel4Vsix/CodingWithCalvin.Otel4Vsix.csproj" />
</Folder>
<Folder Name="/tests/">
<Project Path="tests/CodingWithCalvin.Otel4Vsix.Tests/CodingWithCalvin.Otel4Vsix.Tests.csproj" />
</Folder>
</Solution>
3 changes: 3 additions & 0 deletions src/CodingWithCalvin.Otel4Vsix/Properties/AssemblyInfo.cs
Original file line number Diff line number Diff line change
@@ -1,5 +1,6 @@
using System;
using System.Reflection;
using System.Runtime.CompilerServices;
using System.Runtime.InteropServices;

[assembly: AssemblyTitle("Otel4Vsix")]
Expand All @@ -19,3 +20,5 @@
[assembly: AssemblyVersion("1.0.0.0")]
[assembly: AssemblyFileVersion("1.0.0.0")]
[assembly: AssemblyInformationalVersion("1.0.0")]

[assembly: InternalsVisibleTo("CodingWithCalvin.Otel4Vsix.Tests")]
246 changes: 246 additions & 0 deletions tests/CodingWithCalvin.Otel4Vsix.Tests/ActivitySourceProviderTests.cs
Original file line number Diff line number Diff line change
@@ -0,0 +1,246 @@
using System;
using System.Diagnostics;
using FluentAssertions;
using Otel4Vsix.Tracing;
using Xunit;

namespace CodingWithCalvin.Otel4Vsix.Tests
{
public class ActivitySourceProviderTests : IDisposable
{
private ActivitySourceProvider _provider;
private ActivityListener _listener;

public ActivitySourceProviderTests()
{
// Set up an activity listener so activities are actually created
_listener = new ActivityListener
{
ShouldListenTo = _ => true,
Sample = (ref ActivityCreationOptions<ActivityContext> _) => ActivitySamplingResult.AllData
};
ActivitySource.AddActivityListener(_listener);
}

public void Dispose()
{
_provider?.Dispose();
_listener?.Dispose();
}

[Fact]
public void Constructor_WithNullServiceName_ThrowsArgumentNullException()
{
Action act = () => new ActivitySourceProvider(null, "1.0.0");

act.Should().Throw<ArgumentNullException>()
.And.ParamName.Should().Be("serviceName");
}

[Fact]
public void Constructor_WithEmptyServiceName_ThrowsArgumentNullException()
{
Action act = () => new ActivitySourceProvider(string.Empty, "1.0.0");

act.Should().Throw<ArgumentNullException>();
}

[Fact]
public void Constructor_WithWhitespaceServiceName_ThrowsArgumentNullException()
{
Action act = () => new ActivitySourceProvider(" ", "1.0.0");

act.Should().Throw<ArgumentNullException>();
}

[Fact]
public void Constructor_WithValidName_CreatesActivitySource()
{
_provider = new ActivitySourceProvider("TestService", "1.0.0");

_provider.ActivitySource.Should().NotBeNull();
_provider.ActivitySource.Name.Should().Be("TestService");
_provider.ActivitySource.Version.Should().Be("1.0.0");
}

[Fact]
public void Constructor_WithNullVersion_UsesDefaultVersion()
{
_provider = new ActivitySourceProvider("TestService", null);

_provider.ActivitySource.Should().NotBeNull();
_provider.ActivitySource.Version.Should().Be("1.0.0");
}

[Fact]
public void ActivitySource_BeforeDispose_ReturnsActivitySource()
{
_provider = new ActivitySourceProvider("TestService", "1.0.0");

var activitySource = _provider.ActivitySource;

activitySource.Should().NotBeNull();
}

[Fact]
public void ActivitySource_AfterDispose_ThrowsObjectDisposedException()
{
_provider = new ActivitySourceProvider("TestService", "1.0.0");
_provider.Dispose();

Action act = () => { var _ = _provider.ActivitySource; };

act.Should().Throw<ObjectDisposedException>()
.And.ObjectName.Should().Be(nameof(ActivitySourceProvider));
}

[Fact]
public void StartActivity_CreatesActivity()
{
_provider = new ActivitySourceProvider("TestService", "1.0.0");

using var activity = _provider.StartActivity("TestActivity");

activity.Should().NotBeNull();
activity.OperationName.Should().Be("TestActivity");
}

[Fact]
public void StartActivity_WithKind_SetsActivityKind()
{
_provider = new ActivitySourceProvider("TestService", "1.0.0");

using var activity = _provider.StartActivity("TestActivity", ActivityKind.Client);

activity.Should().NotBeNull();
activity.Kind.Should().Be(ActivityKind.Client);
}

[Fact]
public void StartActivity_AfterDispose_ThrowsObjectDisposedException()
{
_provider = new ActivitySourceProvider("TestService", "1.0.0");
_provider.Dispose();

Action act = () => _provider.StartActivity("TestActivity");

act.Should().Throw<ObjectDisposedException>();
}

[Fact]
public void StartCommandActivity_CreatesActivityWithCorrectName()
{
_provider = new ActivitySourceProvider("TestService", "1.0.0");

using var activity = _provider.StartCommandActivity("MyCommand");

activity.Should().NotBeNull();
activity.OperationName.Should().Be("Command: MyCommand");
}

[Fact]
public void StartCommandActivity_SetsCommandNameTag()
{
_provider = new ActivitySourceProvider("TestService", "1.0.0");

using var activity = _provider.StartCommandActivity("MyCommand");

activity.Should().NotBeNull();
activity.GetTagItem("vs.command.name").Should().Be("MyCommand");
}

[Fact]
public void StartCommandActivity_AfterDispose_ThrowsObjectDisposedException()
{
_provider = new ActivitySourceProvider("TestService", "1.0.0");
_provider.Dispose();

Action act = () => _provider.StartCommandActivity("MyCommand");

act.Should().Throw<ObjectDisposedException>();
}

[Fact]
public void StartToolWindowActivity_CreatesActivityWithCorrectName()
{
_provider = new ActivitySourceProvider("TestService", "1.0.0");

using var activity = _provider.StartToolWindowActivity("SolutionExplorer", "Open");

activity.Should().NotBeNull();
activity.OperationName.Should().Be("ToolWindow: SolutionExplorer.Open");
}

[Fact]
public void StartToolWindowActivity_SetsCorrectTags()
{
_provider = new ActivitySourceProvider("TestService", "1.0.0");

using var activity = _provider.StartToolWindowActivity("SolutionExplorer", "Open");

activity.Should().NotBeNull();
activity.GetTagItem("vs.toolwindow.name").Should().Be("SolutionExplorer");
activity.GetTagItem("vs.toolwindow.operation").Should().Be("Open");
}

[Fact]
public void StartToolWindowActivity_AfterDispose_ThrowsObjectDisposedException()
{
_provider = new ActivitySourceProvider("TestService", "1.0.0");
_provider.Dispose();

Action act = () => _provider.StartToolWindowActivity("Window", "Op");

act.Should().Throw<ObjectDisposedException>();
}

[Fact]
public void StartDocumentActivity_CreatesActivityWithCorrectName()
{
_provider = new ActivitySourceProvider("TestService", "1.0.0");

using var activity = _provider.StartDocumentActivity("C:\\file.cs", "Open");

activity.Should().NotBeNull();
activity.OperationName.Should().Be("Document: Open");
}

[Fact]
public void StartDocumentActivity_SetsCorrectTags()
{
_provider = new ActivitySourceProvider("TestService", "1.0.0");

using var activity = _provider.StartDocumentActivity("C:\\file.cs", "Save");

activity.Should().NotBeNull();
activity.GetTagItem("vs.document.path").Should().Be("C:\\file.cs");
activity.GetTagItem("vs.document.operation").Should().Be("Save");
}

[Fact]
public void StartDocumentActivity_AfterDispose_ThrowsObjectDisposedException()
{
_provider = new ActivitySourceProvider("TestService", "1.0.0");
_provider.Dispose();

Action act = () => _provider.StartDocumentActivity("file.cs", "Open");

act.Should().Throw<ObjectDisposedException>();
}

[Fact]
public void Dispose_MultipleTimes_DoesNotThrow()
{
_provider = new ActivitySourceProvider("TestService", "1.0.0");

Action act = () =>
{
_provider.Dispose();
_provider.Dispose();
_provider.Dispose();
};

act.Should().NotThrow();
}
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,28 @@
<?xml version="1.0" encoding="utf-8"?>
<Project Sdk="Microsoft.NET.Sdk">

<PropertyGroup>
<TargetFramework>net48</TargetFramework>
<LangVersion>latest</LangVersion>
<IsPackable>false</IsPackable>
<IsTestProject>true</IsTestProject>
<RootNamespace>CodingWithCalvin.Otel4Vsix.Tests</RootNamespace>
<AssemblyName>CodingWithCalvin.Otel4Vsix.Tests</AssemblyName>
</PropertyGroup>

<ItemGroup>
<PackageReference Include="Microsoft.NET.Test.Sdk" Version="17.8.0" />
<PackageReference Include="xunit" Version="2.6.2" />
<PackageReference Include="xunit.runner.visualstudio" Version="2.5.4">
<PrivateAssets>all</PrivateAssets>
<IncludeAssets>runtime; build; native; contentfiles; analyzers; buildtransitive</IncludeAssets>
</PackageReference>
<PackageReference Include="Moq" Version="4.20.70" />
<PackageReference Include="FluentAssertions" Version="6.12.0" />
</ItemGroup>

<ItemGroup>
<ProjectReference Include="..\..\src\CodingWithCalvin.Otel4Vsix\CodingWithCalvin.Otel4Vsix.csproj" />
</ItemGroup>

</Project>
Loading
Loading