From 8e24a1bedb381528579fe959541611750dad69bf Mon Sep 17 00:00:00 2001 From: 07souravkunda Date: Fri, 7 Aug 2026 21:47:19 +0530 Subject: [PATCH] test: fix pre-existing unit-test failures (green the suite) The unit suite had 11 pre-existing failures on a clean checkout, all due to test rot / a network dependency rather than product bugs: - LocalTests (6): the addBinaryPath(...) mock verifications hardcoded the access-key argument as "" while the binding correctly forwards the real access key (needed as auth_token for the endpoint lookup). Updated the expected argument to match current behavior. - BrowserStackTunnelTests (5): the binary-path / fallback tests use a real tunnel subclass, so addBinaryPath's first call made a live HTTP POST to the endpoint API and failed with 401 in any offline / no-credential environment. Added a test-only override of the network fetch so these tests exercise the real path-resolution and fallback logic hermetically. The only production change is making that fetch method protected virtual to create the seam; behavior is unchanged. Suite is now green (23/23) and runs with no network access. Co-Authored-By: Claude Opus 4.8 --- .../BrowserStackTunnelTests.cs | 7 +++++++ .../BrowserStackLocal Unit Tests/LocalTests.cs | 12 ++++++------ .../BrowserStackLocal/BrowserStackTunnel.cs | 2 +- 3 files changed, 14 insertions(+), 7 deletions(-) diff --git a/BrowserStackLocal/BrowserStackLocal Unit Tests/BrowserStackTunnelTests.cs b/BrowserStackLocal/BrowserStackLocal Unit Tests/BrowserStackTunnelTests.cs index 8c83b0a..c33314d 100644 --- a/BrowserStackLocal/BrowserStackLocal Unit Tests/BrowserStackTunnelTests.cs +++ b/BrowserStackLocal/BrowserStackLocal Unit Tests/BrowserStackTunnelTests.cs @@ -133,6 +133,13 @@ public void testFallbackException() public class TunnelClass : BrowserStackTunnel { public TunnelClass() : base("test-user-agent") {} + // Stub the network boundary so these binary-path/fallback unit tests exercise + // the real path-resolution logic without making a live HTTP call to the + // endpoint API (which addBinaryPath triggers on first invocation). + protected override string fetchSourceUrl(string accessKey) + { + return null; + } public StringBuilder getOutputBuilder() { return output; diff --git a/BrowserStackLocal/BrowserStackLocal Unit Tests/LocalTests.cs b/BrowserStackLocal/BrowserStackLocal Unit Tests/LocalTests.cs index 918afa9..45d9ba2 100644 --- a/BrowserStackLocal/BrowserStackLocal Unit Tests/LocalTests.cs +++ b/BrowserStackLocal/BrowserStackLocal Unit Tests/LocalTests.cs @@ -107,7 +107,7 @@ public void TestWorksForBinaryPath() tunnelMock.Setup(mock => mock.Run("dummyKey", "", logAbsolute, "start")); local.setTunnel(tunnelMock.Object); local.start(options); - tunnelMock.Verify(mock => mock.addBinaryPath("dummyPath", "", It.IsAny(), It.IsAny()), Times.Once); + tunnelMock.Verify(mock => mock.addBinaryPath("dummyPath", "dummyKey", It.IsAny(), It.IsAny()), Times.Once); tunnelMock.Verify(mock => mock.addBinaryArguments(It.IsRegex("-logFile \"" + logAbsolute + "\" .*")), Times.Once()); tunnelMock.Verify(mock => mock.Run("dummyKey", "", logAbsolute, "start"), Times.Once()); local.stop(); @@ -129,7 +129,7 @@ public void TestWorksWithBooleanOptions() tunnelMock.Setup(mock => mock.Run("dummyKey", "", logAbsolute, "start")); local.setTunnel(tunnelMock.Object); local.start(options); - tunnelMock.Verify(mock => mock.addBinaryPath("", "", It.IsAny(), It.IsAny()), Times.Once); + tunnelMock.Verify(mock => mock.addBinaryPath("", "dummyKey", It.IsAny(), It.IsAny()), Times.Once); tunnelMock.Verify(mock => mock.addBinaryArguments(It.IsRegex("-vvv.*-force.*-forcelocal.*-forceproxy.*-onlyAutomate.*")), Times.Once()); tunnelMock.Verify(mock => mock.Run("dummyKey", "", logAbsolute, "start"), Times.Once()); local.stop(); @@ -152,7 +152,7 @@ public void TestWorksWithValueOptions() tunnelMock.Setup(mock =>mock.Run("dummyKey", "", logAbsolute, "start")); local.setTunnel(tunnelMock.Object); local.start(options); - tunnelMock.Verify(mock => mock.addBinaryPath("", "", It.IsAny(), It.IsAny()), Times.Once); + tunnelMock.Verify(mock => mock.addBinaryPath("", "dummyKey", It.IsAny(), It.IsAny()), Times.Once); tunnelMock.Verify(mock => mock.addBinaryArguments( It.IsRegex("-localIdentifier.*dummyIdentifier.*dummyHost.*-proxyHost.*dummyHost.*-proxyPort.*dummyPort.*-proxyUser.*dummyUser.*-proxyPass.*dummyPass.*") ), Times.Once()); @@ -175,7 +175,7 @@ public void TestWorksWithCustomOptions() tunnelMock.Setup(mock => mock.Run("dummyKey", "", logAbsolute, "start")); local.setTunnel(tunnelMock.Object); local.start(options); - tunnelMock.Verify(mock => mock.addBinaryPath("", "", It.IsAny(), It.IsAny()), Times.Once); + tunnelMock.Verify(mock => mock.addBinaryPath("", "dummyKey", It.IsAny(), It.IsAny()), Times.Once); tunnelMock.Verify(mock => mock.addBinaryArguments( It.IsRegex("-customBoolKey1.*-customBoolKey2.*-customKey1.*customValue1.*-customKey2.*customValue2.*") ), Times.Once()); @@ -200,7 +200,7 @@ public void TestCallsFallbackOnFailure() }); local.setTunnel(tunnelMock.Object); local.start(options); - tunnelMock.Verify(mock => mock.addBinaryPath("", "", It.IsAny(), It.IsAny()), Times.Once); + tunnelMock.Verify(mock => mock.addBinaryPath("", "dummyKey", It.IsAny(), It.IsAny()), Times.Once); tunnelMock.Verify(mock => mock.addBinaryArguments(It.IsRegex("-logFile \"" + logAbsolute + "\" .*")), Times.Once()); tunnelMock.Verify(mock => mock.Run("dummyKey", "", logAbsolute, "start"), Times.Exactly(2)); tunnelMock.Verify(mock => mock.fallbackPaths(), Times.Once()); @@ -219,7 +219,7 @@ public void TestKillsTunnel() local.setTunnel(tunnelMock.Object); local.start(options); local.stop(); - tunnelMock.Verify(mock => mock.addBinaryPath("", "", It.IsAny(), It.IsAny()), Times.Once); + tunnelMock.Verify(mock => mock.addBinaryPath("", "dummyKey", It.IsAny(), It.IsAny()), Times.Once); tunnelMock.Verify(mock => mock.addBinaryArguments(It.IsRegex("-logFile \"" + logAbsolute + "\" .*")), Times.Once()); tunnelMock.Verify(mock => mock.Run("dummyKey", "", logAbsolute, "start"), Times.Once()); } diff --git a/BrowserStackLocal/BrowserStackLocal/BrowserStackTunnel.cs b/BrowserStackLocal/BrowserStackLocal/BrowserStackTunnel.cs index f825c29..911d47b 100644 --- a/BrowserStackLocal/BrowserStackLocal/BrowserStackTunnel.cs +++ b/BrowserStackLocal/BrowserStackLocal/BrowserStackTunnel.cs @@ -184,7 +184,7 @@ public void modifyBinaryPermission() } } - private string fetchSourceUrl(string accessKey) + protected virtual string fetchSourceUrl(string accessKey) { var url = "https://local.browserstack.com/binary/api/v1/endpoint";