From f671ad984ea522f260c7a972bc22fde0c3579729 Mon Sep 17 00:00:00 2001 From: Harish Ved Date: Sat, 16 Jul 2016 00:16:53 +0530 Subject: [PATCH 01/86] package --- BrowserStackLocal.1.2.0.0.nupkg | Bin 7403 -> 7402 bytes 1 file changed, 0 insertions(+), 0 deletions(-) diff --git a/BrowserStackLocal.1.2.0.0.nupkg b/BrowserStackLocal.1.2.0.0.nupkg index 319aa9d5459d01cf213194513528b7cd572d2a5f..8a933ece1a7689117e4d6a349c020c1f1f374f80 100644 GIT binary patch delta 5777 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 Y@1+KRPsjUzeh5B6_x#Cg+W$EJAIpU==>Px# delta 5763 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 Date: Fri, 6 Jan 2017 20:00:31 +0530 Subject: [PATCH 02/86] Edit error message for already running binary which takes lock on the logfile. --- BrowserStackLocal/BrowserStackLocal/BrowserStackTunnel.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/BrowserStackLocal/BrowserStackLocal/BrowserStackTunnel.cs b/BrowserStackLocal/BrowserStackLocal/BrowserStackTunnel.cs index ee308be..4fee3f3 100644 --- a/BrowserStackLocal/BrowserStackLocal/BrowserStackTunnel.cs +++ b/BrowserStackLocal/BrowserStackLocal/BrowserStackTunnel.cs @@ -61,7 +61,7 @@ public virtual void fallbackPaths() { if (basePathsIndex >= basePaths.Length - 1) { - throw new Exception("No More Paths to try. Please specify a binary path in options."); + throw new Exception("Binary not found or failed to launch. Make sure that BrowserStackLocal.exe is not already running."); } basePathsIndex++; binaryAbsolute = Path.Combine(basePaths[basePathsIndex], binaryName); From 1b9ece1bc81adc236d3333872a197ebc7697a82d Mon Sep 17 00:00:00 2001 From: Pulkit Sharma Date: Fri, 6 Jan 2017 20:05:16 +0530 Subject: [PATCH 03/86] Fixing spec for changed error message. --- .../BrowserStackLocal Unit Tests/BrowserStackTunnelTests.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/BrowserStackLocal/BrowserStackLocal Unit Tests/BrowserStackTunnelTests.cs b/BrowserStackLocal/BrowserStackLocal Unit Tests/BrowserStackTunnelTests.cs index 5d1e202..dd88bb6 100644 --- a/BrowserStackLocal/BrowserStackLocal Unit Tests/BrowserStackTunnelTests.cs +++ b/BrowserStackLocal/BrowserStackLocal Unit Tests/BrowserStackTunnelTests.cs @@ -79,7 +79,7 @@ public void TestBinaryPathOnNoMoreFallback() tunnel.fallbackPaths(); Assert.Throws(typeof(Exception), new TestDelegate(testFallbackException), - "No More Paths to try. Please specify a binary path in options." + "Binary not found or failed to launch. Make sure that BrowserStackLocal.exe is not already running." ); } [TestMethod] From 8fa688c9522520835d058e4fdd9a0cd29b8c85e7 Mon Sep 17 00:00:00 2001 From: Ankur Goel Date: Thu, 19 Jan 2017 20:02:41 +0530 Subject: [PATCH 04/86] Bumped version to 1.3.0 fo release --- .../BrowserStackLocal/Properties/AssemblyInfo.cs | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/BrowserStackLocal/BrowserStackLocal/Properties/AssemblyInfo.cs b/BrowserStackLocal/BrowserStackLocal/Properties/AssemblyInfo.cs index 46c5be6..e9df8ed 100644 --- a/BrowserStackLocal/BrowserStackLocal/Properties/AssemblyInfo.cs +++ b/BrowserStackLocal/BrowserStackLocal/Properties/AssemblyInfo.cs @@ -32,5 +32,5 @@ // You can specify all the values or you can default the Build and Revision Numbers // by using the '*' as shown below: // [assembly: AssemblyVersion("1.0.*")] -[assembly: AssemblyVersion("1.2.0.0")] -[assembly: AssemblyFileVersion("1.2.0.0")] +[assembly: AssemblyVersion("1.3.0.0")] +[assembly: AssemblyFileVersion("1.3.0.0")] From 754546c30c5fc200236d50f53d84985b177ac9ac Mon Sep 17 00:00:00 2001 From: Ankur Goel Date: Thu, 19 Jan 2017 20:09:09 +0530 Subject: [PATCH 05/86] nupkg file bump --- BrowserStackLocal.1.2.0.0.nupkg | Bin 7402 -> 0 bytes BrowserStackLocal.1.3.0.0.nupkg | Bin 0 -> 8127 bytes 2 files changed, 0 insertions(+), 0 deletions(-) delete mode 100644 BrowserStackLocal.1.2.0.0.nupkg create mode 100644 BrowserStackLocal.1.3.0.0.nupkg diff --git a/BrowserStackLocal.1.2.0.0.nupkg b/BrowserStackLocal.1.2.0.0.nupkg deleted file mode 100644 index 8a933ece1a7689117e4d6a349c020c1f1f374f80..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 7402 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 M^2M|-k diff --git a/BrowserStackLocal.1.3.0.0.nupkg b/BrowserStackLocal.1.3.0.0.nupkg new file mode 100644 index 0000000000000000000000000000000000000000..e778921faa06b9fe59848c5721578a6c984c264b GIT binary patch literal 8127 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 @FZ+LFEEI)zR&$*4#2 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 Kk%95s)Bga-C|Rxm literal 0 HcmV?d00001 From 552578e8df7961d0b881ec0cbd60bf622eacb6cd Mon Sep 17 00:00:00 2001 From: thebeardedcoderIN <32328894+thebeardedcoderIN@users.noreply.github.com> Date: Tue, 10 Sep 2019 14:41:48 +0530 Subject: [PATCH 06/86] Update README.md Added 'pac-file' flag for PAC (Proxy Auto-Configuration) and Local Proxy details in local testing. --- README.md | 24 ++++++++++++++++++++++++ 1 file changed, 24 insertions(+) diff --git a/README.md b/README.md index d1e7f82..ea5f2a6 100644 --- a/README.md +++ b/README.md @@ -81,6 +81,30 @@ bsLocalArgs.Add(new KeyValuePair("proxyUser", "user")); bsLocalArgs.Add(new KeyValuePair("proxyPass", "password")); ``` +#### Local Proxy +To use local proxy in local testing - + +* localProxyHost: Hostname/IP of proxy, remaining proxy options are ignored if this option is absent +* localProxyPort: Port for the proxy, defaults to 8081 when -localProxyHost is used +* localProxyUser: Username for connecting to proxy (Basic Auth Only) +* localProxyPass: Password for USERNAME, will be ignored if USERNAME is empty or not specified + +``` +bsLocalArgs.Add(new KeyValuePair("localProxyHost", "127.0.0.1")); +bsLocalArgs.Add(new KeyValuePair("localProxyPort", "8000")); +bsLocalArgs.Add(new KeyValuePair("-localProxyUser", "user")); +bsLocalArgs.Add(new KeyValuePair("-localProxyPass", "password")); +``` + +#### PAC (Proxy Auto-Configuration) +To use PAC (Proxy Auto-Configuration) in local testing - + +* pac-file: PAC (Proxy Auto-Configuration) file’s absolute path + +``` +bsLocalArgs.Add(new KeyValuePair("-pac-file", "")); +``` + #### Local Identifier If doing simultaneous multiple local testing connections, set this uniquely for different processes - ``` From d14811c49da533ee2fc977ebf82013274b4edbff Mon Sep 17 00:00:00 2001 From: Aditya Hirapara Date: Thu, 15 Oct 2020 15:53:04 +0530 Subject: [PATCH 07/86] Upgrade project to new VS2017 csproj format and Add support for .NET Standard --- .gitignore | 6 +- .../BrowserStackLocal.csproj | 59 +++++-------------- .../BrowserStackLocal/BrowserStackTunnel.cs | 1 - .../BrowserStackLocal/packages.config | 4 -- .../BrowserStackExample.csproj | 5 +- .../BrowserStackExample/Example.cs | 2 +- 6 files changed, 21 insertions(+), 56 deletions(-) delete mode 100644 BrowserStackLocal/BrowserStackLocal/packages.config diff --git a/.gitignore b/.gitignore index 269fa7e..eb4b6bf 100644 --- a/.gitignore +++ b/.gitignore @@ -3,4 +3,8 @@ BrowserStackLocal/BrowserStackLocal Unit Tests/obj BrowserStackLocal/BrowserStackLocal/bin BrowserStackLocal/BrowserStackLocal/obj BrowserStackLocal/packages -BrowserStackLocal/.vs \ No newline at end of file +BrowserStackLocal/.vs +BrowserStackLocalExample/BrowserStackExample/bin +BrowserStackLocalExample/BrowserStackExample/obj +BrowserStackLocalExample/packages +BrowserStackLocalExample/.vs diff --git a/BrowserStackLocal/BrowserStackLocal/BrowserStackLocal.csproj b/BrowserStackLocal/BrowserStackLocal/BrowserStackLocal.csproj index 944eff6..6a2280f 100644 --- a/BrowserStackLocal/BrowserStackLocal/BrowserStackLocal.csproj +++ b/BrowserStackLocal/BrowserStackLocal/BrowserStackLocal.csproj @@ -1,55 +1,24 @@ - - - + - Debug - AnyCPU - {F58E1C9A-5910-4DA8-B531-9F4A6B0AE8C8} - Library - Properties BrowserStack BrowserStackLocal - v2.0 - 512 - - - - true - full - false - bin\Debug\ - DEBUG;TRACE - prompt - 4 - - - pdbonly - true - bin\Release\ - TRACE - prompt - 4 - AnyCPU + net20;netstandard2.0 + false + BrowserStackLocal + BrowserStackLocal + C# Bindings for BrowserStack Local + 2.0.0.0 + 2.0.0.0 + BrowserStack + BrowserStack + Copyright © 2020 - - ..\packages\Newtonsoft.Json.8.0.3\lib\net20\Newtonsoft.Json.dll - True - - - - + - - - - - - - + + - - - \ No newline at end of file + diff --git a/BrowserStackLocal/BrowserStackLocal/BrowserStackTunnel.cs b/BrowserStackLocal/BrowserStackLocal/BrowserStackTunnel.cs index 9b98e9d..f3cd6bc 100644 --- a/BrowserStackLocal/BrowserStackLocal/BrowserStackTunnel.cs +++ b/BrowserStackLocal/BrowserStackLocal/BrowserStackTunnel.cs @@ -15,12 +15,9 @@ public enum LocalState { Idle, Connecting, Connected, Error, Disconnected }; public class BrowserStackTunnel : IDisposable { - // Need to get rid of this variable, instead use getBinaryName() - static readonly string binaryName = isDarwin() ? "BrowserStackLocal-darwin-x64" : "BrowserStackLocal.exe"; - static readonly string downloadURL = isDarwin() ? - "https://www.browserstack.com/local-testing/downloads/binaries/BrowserStackLocal-darwin-x64" : - "https://www.browserstack.com/local-testing/downloads/binaries/BrowserStackLocal.exe"; - static readonly string homepath = isDarwin() ? + static string binaryName = GetBinaryName(); + static readonly string downloadURL = "https://www.browserstack.com/local-testing/downloads/binaries/" + binaryName; + static readonly string homepath = IsDarwin() || IsLinux() ? Environment.GetFolderPath(Environment.SpecialFolder.Personal) : Environment.ExpandEnvironmentVariables("%HOMEDRIVE%%HOMEPATH%"); public static readonly string[] basePaths = new string[] { @@ -39,79 +36,80 @@ public class BrowserStackTunnel : IDisposable Process process = null; - static Boolean isDarwin() + static bool IsDarwin() { if (RuntimeInformation.IsOSPlatform(OSPlatform.OSX)) { return true; } + return false; } + - static Boolean isWindows() + static bool IsWindows() { if (RuntimeInformation.IsOSPlatform(OSPlatform.Windows)) { return true; } + return false; } - static Boolean isLinux() + static bool IsLinux() { - if (RuntimeInformation.IsOSPlatform(OSPlatform.OSX)) + if (RuntimeInformation.IsOSPlatform(OSPlatform.Linux)) { return true; } + return false; } - static Boolean isAlpine() + static bool IsAlpine() { - const string osReleaseFile = "/etc/os-release"; - - if (File.Exists(osReleaseFile)) + try { - string[] lines = File.ReadAllLines(osReleaseFile); - foreach (string line in lines) + string[] output = Util.RunShellCommand("grep -w 'NAME' /etc/os-release"); + if (string.IsNullOrEmpty(output[0]) && output[0].Contains("Alpine")) { - if (line.StartsWith("ID=")) - { - string id = line.Substring(3).Trim('"'); // Remove 'ID=' and quotes - if (id.Equals("alpine", StringComparison.OrdinalIgnoreCase)) - { - return true; - } - } + return true; } } + catch (System.Exception) + { + return false; + } + return false; } - static staring getBinaryName() + + static string GetBinaryName() { - if isDarwin() + if (IsDarwin()) { - binaryName = "BrowserStackLocal-darwin-x64" + return "BrowserStackLocal-darwin-x64"; } - else if isWindows() + else if (IsWindows()) { - binaryName = "BrowserStackLocal.exe" + return "BrowserStackLocal.exe"; } - else if isLinux() + else if (IsLinux()) { - if (RuntimeInformation.OSArchitecture == Architecture.X64 - || RuntimeInformation.OSArchitecture == Architecture.Arm64) + if (Environment.Is64BitOperatingSystem) { - if isAlpine() + if (IsAlpine()) { - binaryName = "BrowserStackLocal-alpine" + return "BrowserStackLocal-alpine"; } else { - binaryName = "BrowserStackLocal-linux-x64" + return "BrowserStackLocal-linux-x64"; } } else { - binaryName = "BrowserStackLocal-linux-ia32" + return "BrowserStackLocal-linux-ia32"; } } + return "BrowserStackLocal.exe"; } public virtual void addBinaryPath(string binaryAbsolute) @@ -150,7 +148,7 @@ public virtual void fallbackPaths() public void modifyBinaryPermission() { - if (isDarwin()) + if (IsDarwin() || IsLinux()) { try { diff --git a/BrowserStackLocal/BrowserStackLocal/Util.cs b/BrowserStackLocal/BrowserStackLocal/Util.cs new file mode 100644 index 0000000..cbd114a --- /dev/null +++ b/BrowserStackLocal/BrowserStackLocal/Util.cs @@ -0,0 +1,26 @@ +using System.Diagnostics; + +namespace BrowserStack +{ + public class Util { + + // Only Unix Support + public static string[] RunShellCommand(string command) { + ProcessStartInfo psi = new ProcessStartInfo("bash", $"-c \"{command}\"") { + RedirectStandardOutput = true, + RedirectStandardError = true, + UseShellExecute = false, + CreateNoWindow = true + }; + + Process process = new Process { StartInfo = psi }; + process.Start(); + string output = process.StandardOutput.ReadToEnd(); + string error = process.StandardError.ReadToEnd(); + process.WaitForExit(); + return new string[]{output, error}; + } + + } +} + From 2f5a3832ab615e698248d0b6a1bcdac84c492742 Mon Sep 17 00:00:00 2001 From: Kamalpreet Kaur Date: Tue, 24 Dec 2024 17:53:51 +0530 Subject: [PATCH 65/86] update: keep compatibility in mind --- .../BrowserStackLocal.csproj | 2 +- .../BrowserStackLocal/BrowserStackTunnel.cs | 33 ++++++------ BrowserStackLocal/BrowserStackLocal/Util.cs | 52 ++++++++++++++++++- 3 files changed, 68 insertions(+), 19 deletions(-) diff --git a/BrowserStackLocal/BrowserStackLocal/BrowserStackLocal.csproj b/BrowserStackLocal/BrowserStackLocal/BrowserStackLocal.csproj index db178a6..2e3a514 100644 --- a/BrowserStackLocal/BrowserStackLocal/BrowserStackLocal.csproj +++ b/BrowserStackLocal/BrowserStackLocal/BrowserStackLocal.csproj @@ -2,7 +2,7 @@ BrowserStack BrowserStackLocal - net48;netstandard2.0 + net20;netstandard2.0 false BrowserStackLocal BrowserStackLocal diff --git a/BrowserStackLocal/BrowserStackLocal/BrowserStackTunnel.cs b/BrowserStackLocal/BrowserStackLocal/BrowserStackTunnel.cs index f3cd6bc..7b5d461 100644 --- a/BrowserStackLocal/BrowserStackLocal/BrowserStackTunnel.cs +++ b/BrowserStackLocal/BrowserStackLocal/BrowserStackTunnel.cs @@ -7,7 +7,6 @@ using System.Security.AccessControl; using System.Security.Principal; using Newtonsoft.Json.Linq; -using System.Runtime.InteropServices; namespace BrowserStack { @@ -15,9 +14,11 @@ public enum LocalState { Idle, Connecting, Connected, Error, Disconnected }; public class BrowserStackTunnel : IDisposable { - static string binaryName = GetBinaryName(); + static readonly string uname = Util.GetUName(); + static readonly string binaryName = GetBinaryName(); static readonly string downloadURL = "https://www.browserstack.com/local-testing/downloads/binaries/" + binaryName; - static readonly string homepath = IsDarwin() || IsLinux() ? + + static readonly string homepath = !IsWindows() ? Environment.GetFolderPath(Environment.SpecialFolder.Personal) : Environment.ExpandEnvironmentVariables("%HOMEDRIVE%%HOMEPATH%"); public static readonly string[] basePaths = new string[] { @@ -36,9 +37,9 @@ public class BrowserStackTunnel : IDisposable Process process = null; - static bool IsDarwin() + static bool IsDarwin(string osName) { - if (RuntimeInformation.IsOSPlatform(OSPlatform.OSX)) + if(osName.Contains("darwin")) { return true; } @@ -48,16 +49,16 @@ static bool IsDarwin() static bool IsWindows() { - if (RuntimeInformation.IsOSPlatform(OSPlatform.Windows)) + if (Environment.OSVersion.VersionString?.ToLower().Contains("windows") ?? false) { return true; } return false; } - static bool IsLinux() + static bool IsLinux(string osName) { - if (RuntimeInformation.IsOSPlatform(OSPlatform.Linux)) + if(osName.Contains("linux")) { return true; } @@ -69,7 +70,7 @@ static bool IsAlpine() try { string[] output = Util.RunShellCommand("grep -w 'NAME' /etc/os-release"); - if (string.IsNullOrEmpty(output[0]) && output[0].Contains("Alpine")) + if (output[0]?.ToLower()?.Contains("alpine") ?? false) { return true; } @@ -83,17 +84,17 @@ static bool IsAlpine() static string GetBinaryName() { - if (IsDarwin()) + if (IsWindows()) { - return "BrowserStackLocal-darwin-x64"; + return "BrowserStackLocal.exe"; } - else if (IsWindows()) + else if (IsDarwin(uname)) { - return "BrowserStackLocal.exe"; + return "BrowserStackLocal-darwin-x64"; } - else if (IsLinux()) + else if (IsLinux(uname)) { - if (Environment.Is64BitOperatingSystem) + if (Util.Is64BitOS()) { if (IsAlpine()) { @@ -148,7 +149,7 @@ public virtual void fallbackPaths() public void modifyBinaryPermission() { - if (IsDarwin() || IsLinux()) + if (!IsWindows()) { try { diff --git a/BrowserStackLocal/BrowserStackLocal/Util.cs b/BrowserStackLocal/BrowserStackLocal/Util.cs index cbd114a..818b1c1 100644 --- a/BrowserStackLocal/BrowserStackLocal/Util.cs +++ b/BrowserStackLocal/BrowserStackLocal/Util.cs @@ -1,11 +1,21 @@ +using System; using System.Diagnostics; +using System.Runtime.InteropServices; namespace BrowserStack { public class Util { + [DllImport("kernel32.dll", SetLastError = true, CallingConvention = CallingConvention.Winapi)] + [return: MarshalAs(UnmanagedType.Bool)] + private static extern bool IsWow64Process( + [In] IntPtr hProcess, + [Out] out bool wow64Process + ); + // Only Unix Support - public static string[] RunShellCommand(string command) { + public static string[] RunShellCommand(string command) + { ProcessStartInfo psi = new ProcessStartInfo("bash", $"-c \"{command}\"") { RedirectStandardOutput = true, RedirectStandardError = true, @@ -20,7 +30,45 @@ public static string[] RunShellCommand(string command) { process.WaitForExit(); return new string[]{output, error}; } - + + public static string GetUName() + { + string osName = ""; + try + { + string[] output = RunShellCommand("uname"); + osName = output[0]?.ToLower(); + } + catch (System.Exception) {} + return osName; + } + + public static bool Is64BitOS() + { + bool is64BitProcess = IntPtr.Size == 8; + return is64BitProcess || InternalCheckIsWow64(); + } + + public static bool InternalCheckIsWow64() + { + if ((Environment.OSVersion.Version.Major == 5 && Environment.OSVersion.Version.Minor >= 1) || + Environment.OSVersion.Version.Major >= 6) + { + using (Process p = Process.GetCurrentProcess()) + { + bool retVal; + if (!IsWow64Process(p.Handle, out retVal)) + { + return false; + } + return retVal; + } + } + else + { + return false; + } + } } } From faf40d120236002942666c0265eae9348e2c9590 Mon Sep 17 00:00:00 2001 From: Kamalpreet Kaur Date: Thu, 26 Dec 2024 09:40:59 +0530 Subject: [PATCH 66/86] update: use preprocessor derivative to use in-built method for 64bit --- BrowserStackLocal/BrowserStackLocal/Util.cs | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/BrowserStackLocal/BrowserStackLocal/Util.cs b/BrowserStackLocal/BrowserStackLocal/Util.cs index 818b1c1..ac66dc6 100644 --- a/BrowserStackLocal/BrowserStackLocal/Util.cs +++ b/BrowserStackLocal/BrowserStackLocal/Util.cs @@ -6,6 +6,7 @@ namespace BrowserStack { public class Util { + // Ref: https://stackoverflow.com/a/336729 [DllImport("kernel32.dll", SetLastError = true, CallingConvention = CallingConvention.Winapi)] [return: MarshalAs(UnmanagedType.Bool)] private static extern bool IsWow64Process( @@ -45,6 +46,9 @@ public static string GetUName() public static bool Is64BitOS() { + #if NET48_OR_GREATER || NETSTANDARD2_0_OR_GREATER || NETCOREAPP3_0_OR_GREATER + return Environment.Is64BitOperatingSystem; + #endif bool is64BitProcess = IntPtr.Size == 8; return is64BitProcess || InternalCheckIsWow64(); } From 217090262e6520ca8e770b8b3e3f33e3102e02dd Mon Sep 17 00:00:00 2001 From: Kamalpreet Kaur Date: Fri, 27 Dec 2024 14:50:13 +0530 Subject: [PATCH 67/86] chore: refactoring --- .../BrowserStackLocal/BrowserStackTunnel.cs | 24 ++++--------------- 1 file changed, 4 insertions(+), 20 deletions(-) diff --git a/BrowserStackLocal/BrowserStackLocal/BrowserStackTunnel.cs b/BrowserStackLocal/BrowserStackLocal/BrowserStackTunnel.cs index 7b5d461..cb23a43 100644 --- a/BrowserStackLocal/BrowserStackLocal/BrowserStackTunnel.cs +++ b/BrowserStackLocal/BrowserStackLocal/BrowserStackTunnel.cs @@ -39,30 +39,18 @@ public class BrowserStackTunnel : IDisposable static bool IsDarwin(string osName) { - if(osName.Contains("darwin")) - { - return true; - } - return false; + return osName.Contains("darwin"); } static bool IsWindows() { - if (Environment.OSVersion.VersionString?.ToLower().Contains("windows") ?? false) - { - return true; - } - return false; + return Environment.OSVersion.VersionString?.ToLower().Contains("windows") ?? false; } static bool IsLinux(string osName) { - if(osName.Contains("linux")) - { - return true; - } - return false; + return osName.Contains("linux"); } static bool IsAlpine() @@ -70,16 +58,12 @@ static bool IsAlpine() try { string[] output = Util.RunShellCommand("grep -w 'NAME' /etc/os-release"); - if (output[0]?.ToLower()?.Contains("alpine") ?? false) - { - return true; - } + return output[0]?.ToLower()?.Contains("alpine") ?? false; } catch (System.Exception) { return false; } - return false; } static string GetBinaryName() From 9f233813cd29186481e81ab6b25ca36fe35f1757 Mon Sep 17 00:00:00 2001 From: Kamalpreet Kaur Date: Fri, 27 Dec 2024 15:06:26 +0530 Subject: [PATCH 68/86] chore: refactoring --- .../BrowserStackLocal/BrowserStackTunnel.cs | 5 +-- BrowserStackLocal/BrowserStackLocal/Util.cs | 34 ++----------------- 2 files changed, 5 insertions(+), 34 deletions(-) diff --git a/BrowserStackLocal/BrowserStackLocal/BrowserStackTunnel.cs b/BrowserStackLocal/BrowserStackLocal/BrowserStackTunnel.cs index cb23a43..fa1923f 100644 --- a/BrowserStackLocal/BrowserStackLocal/BrowserStackTunnel.cs +++ b/BrowserStackLocal/BrowserStackLocal/BrowserStackTunnel.cs @@ -60,10 +60,11 @@ static bool IsAlpine() string[] output = Util.RunShellCommand("grep -w 'NAME' /etc/os-release"); return output[0]?.ToLower()?.Contains("alpine") ?? false; } - catch (System.Exception) + catch (System.Exception ex) { - return false; + Console.WriteLine("Exception while check isAlpine " + ex); } + return false; } static string GetBinaryName() diff --git a/BrowserStackLocal/BrowserStackLocal/Util.cs b/BrowserStackLocal/BrowserStackLocal/Util.cs index ac66dc6..aefd684 100644 --- a/BrowserStackLocal/BrowserStackLocal/Util.cs +++ b/BrowserStackLocal/BrowserStackLocal/Util.cs @@ -1,19 +1,10 @@ using System; using System.Diagnostics; -using System.Runtime.InteropServices; namespace BrowserStack { public class Util { - // Ref: https://stackoverflow.com/a/336729 - [DllImport("kernel32.dll", SetLastError = true, CallingConvention = CallingConvention.Winapi)] - [return: MarshalAs(UnmanagedType.Bool)] - private static extern bool IsWow64Process( - [In] IntPtr hProcess, - [Out] out bool wow64Process - ); - // Only Unix Support public static string[] RunShellCommand(string command) { @@ -44,34 +35,13 @@ public static string GetUName() return osName; } + // Using for Linux Only public static bool Is64BitOS() { #if NET48_OR_GREATER || NETSTANDARD2_0_OR_GREATER || NETCOREAPP3_0_OR_GREATER return Environment.Is64BitOperatingSystem; #endif - bool is64BitProcess = IntPtr.Size == 8; - return is64BitProcess || InternalCheckIsWow64(); - } - - public static bool InternalCheckIsWow64() - { - if ((Environment.OSVersion.Version.Major == 5 && Environment.OSVersion.Version.Minor >= 1) || - Environment.OSVersion.Version.Major >= 6) - { - using (Process p = Process.GetCurrentProcess()) - { - bool retVal; - if (!IsWow64Process(p.Handle, out retVal)) - { - return false; - } - return retVal; - } - } - else - { - return false; - } + return true; } } } From c3b7b7142e9d11c1f9034cf095735540887f7d17 Mon Sep 17 00:00:00 2001 From: Kamalpreet Kaur Date: Fri, 27 Dec 2024 15:09:33 +0530 Subject: [PATCH 69/86] chore: refactoring if-else --- .../BrowserStackLocal/BrowserStackTunnel.cs | 28 +++++-------------- 1 file changed, 7 insertions(+), 21 deletions(-) diff --git a/BrowserStackLocal/BrowserStackLocal/BrowserStackTunnel.cs b/BrowserStackLocal/BrowserStackLocal/BrowserStackTunnel.cs index fa1923f..3b217d7 100644 --- a/BrowserStackLocal/BrowserStackLocal/BrowserStackTunnel.cs +++ b/BrowserStackLocal/BrowserStackLocal/BrowserStackTunnel.cs @@ -69,32 +69,18 @@ static bool IsAlpine() static string GetBinaryName() { - if (IsWindows()) - { - return "BrowserStackLocal.exe"; - } - else if (IsDarwin(uname)) - { - return "BrowserStackLocal-darwin-x64"; - } - else if (IsLinux(uname)) + if (IsWindows()) return "BrowserStackLocal.exe"; + if (IsDarwin(uname)) return "BrowserStackLocal-darwin-x64"; + + if (IsLinux(uname)) { - if (Util.Is64BitOS()) - { - if (IsAlpine()) + if (Util.Is64BitOS()) { - return "BrowserStackLocal-alpine"; + return IsAlpine() ? "BrowserStackLocal-alpine" : "BrowserStackLocal-linux-x64"; } - else - { - return "BrowserStackLocal-linux-x64"; - } - } - else - { return "BrowserStackLocal-linux-ia32"; - } } + return "BrowserStackLocal.exe"; } From 5bfd59401220d4132fe8f7482a0eb259e0f769c1 Mon Sep 17 00:00:00 2001 From: Kamalpreet Kaur Date: Fri, 27 Dec 2024 15:27:29 +0530 Subject: [PATCH 70/86] chore: added comment --- BrowserStackLocal/BrowserStackLocal/Util.cs | 2 ++ 1 file changed, 2 insertions(+) diff --git a/BrowserStackLocal/BrowserStackLocal/Util.cs b/BrowserStackLocal/BrowserStackLocal/Util.cs index aefd684..f3d5a1e 100644 --- a/BrowserStackLocal/BrowserStackLocal/Util.cs +++ b/BrowserStackLocal/BrowserStackLocal/Util.cs @@ -41,6 +41,8 @@ public static bool Is64BitOS() #if NET48_OR_GREATER || NETSTANDARD2_0_OR_GREATER || NETCOREAPP3_0_OR_GREATER return Environment.Is64BitOperatingSystem; #endif + // https://learn.microsoft.com/en-gb/dotnet/standard/choosing-core-framework-server?WT.mc_id=dotnet-35129-website + // linux won't be supported in .NET Framework and fallback to 64 bit return true; } } From b046baa30692ed79df535d1781546032719dd22b Mon Sep 17 00:00:00 2001 From: Kamalpreet Kaur Date: Fri, 3 Jan 2025 16:12:24 +0530 Subject: [PATCH 71/86] fix: runShellCommand --- BrowserStackLocal/BrowserStackLocal/Util.cs | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/BrowserStackLocal/BrowserStackLocal/Util.cs b/BrowserStackLocal/BrowserStackLocal/Util.cs index f3d5a1e..235d8ea 100644 --- a/BrowserStackLocal/BrowserStackLocal/Util.cs +++ b/BrowserStackLocal/BrowserStackLocal/Util.cs @@ -8,11 +8,12 @@ public class Util { // Only Unix Support public static string[] RunShellCommand(string command) { - ProcessStartInfo psi = new ProcessStartInfo("bash", $"-c \"{command}\"") { + ProcessStartInfo psi = new ProcessStartInfo { RedirectStandardOutput = true, RedirectStandardError = true, UseShellExecute = false, - CreateNoWindow = true + CreateNoWindow = true, + FileName = command }; Process process = new Process { StartInfo = psi }; From 65b3299b39c39ebed69846579612ab7821821a5a Mon Sep 17 00:00:00 2001 From: Kamalpreet Kaur Date: Fri, 3 Jan 2025 16:39:59 +0530 Subject: [PATCH 72/86] fix: runShellCommand --- BrowserStackLocal/BrowserStackLocal/BrowserStackTunnel.cs | 2 +- BrowserStackLocal/BrowserStackLocal/Util.cs | 5 +++-- 2 files changed, 4 insertions(+), 3 deletions(-) diff --git a/BrowserStackLocal/BrowserStackLocal/BrowserStackTunnel.cs b/BrowserStackLocal/BrowserStackLocal/BrowserStackTunnel.cs index 3b217d7..1d694be 100644 --- a/BrowserStackLocal/BrowserStackLocal/BrowserStackTunnel.cs +++ b/BrowserStackLocal/BrowserStackLocal/BrowserStackTunnel.cs @@ -57,7 +57,7 @@ static bool IsAlpine() { try { - string[] output = Util.RunShellCommand("grep -w 'NAME' /etc/os-release"); + string[] output = Util.RunShellCommand("grep", "-w 'NAME' /etc/os-release"); return output[0]?.ToLower()?.Contains("alpine") ?? false; } catch (System.Exception ex) diff --git a/BrowserStackLocal/BrowserStackLocal/Util.cs b/BrowserStackLocal/BrowserStackLocal/Util.cs index 235d8ea..56b2ddd 100644 --- a/BrowserStackLocal/BrowserStackLocal/Util.cs +++ b/BrowserStackLocal/BrowserStackLocal/Util.cs @@ -6,14 +6,15 @@ namespace BrowserStack public class Util { // Only Unix Support - public static string[] RunShellCommand(string command) + public static string[] RunShellCommand(string command, string args = "") { ProcessStartInfo psi = new ProcessStartInfo { RedirectStandardOutput = true, RedirectStandardError = true, UseShellExecute = false, CreateNoWindow = true, - FileName = command + FileName = command, + Arguments = args }; Process process = new Process { StartInfo = psi }; From 06e496a815759c48aea161318ba6947beedaae90 Mon Sep 17 00:00:00 2001 From: Kamalpreet Kaur Date: Fri, 3 Jan 2025 17:03:02 +0530 Subject: [PATCH 73/86] fix: alpine shell command --- BrowserStackLocal/BrowserStackLocal/BrowserStackTunnel.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/BrowserStackLocal/BrowserStackLocal/BrowserStackTunnel.cs b/BrowserStackLocal/BrowserStackLocal/BrowserStackTunnel.cs index 1d694be..40ed6c1 100644 --- a/BrowserStackLocal/BrowserStackLocal/BrowserStackTunnel.cs +++ b/BrowserStackLocal/BrowserStackLocal/BrowserStackTunnel.cs @@ -57,7 +57,7 @@ static bool IsAlpine() { try { - string[] output = Util.RunShellCommand("grep", "-w 'NAME' /etc/os-release"); + string[] output = Util.RunShellCommand("grep", "-w \'NAME\' /etc/os-release"); return output[0]?.ToLower()?.Contains("alpine") ?? false; } catch (System.Exception ex) From a29ce33d19de81845bfcbe8c118be5c6bf4aa8da Mon Sep 17 00:00:00 2001 From: Kamalpreet Kaur Date: Tue, 7 Jan 2025 17:34:23 +0530 Subject: [PATCH 74/86] update: version bump v2.4.0 --- .../BrowserStackLocal/BrowserStackLocal.csproj | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/BrowserStackLocal/BrowserStackLocal/BrowserStackLocal.csproj b/BrowserStackLocal/BrowserStackLocal/BrowserStackLocal.csproj index 2fd4d10..7711dbb 100644 --- a/BrowserStackLocal/BrowserStackLocal/BrowserStackLocal.csproj +++ b/BrowserStackLocal/BrowserStackLocal/BrowserStackLocal.csproj @@ -7,9 +7,9 @@ BrowserStackLocal BrowserStackLocal C# Bindings for BrowserStack Local - 2.3.1 - 2.3.1 - 2.3.1 + 2.4.0 + 2.4.0 + 2.4.0 BrowserStack BrowserStack Copyright © 2016 @@ -31,4 +31,4 @@ --> - \ No newline at end of file + From 305dce42f961768bca0c097aa1b10768ea89dfdf Mon Sep 17 00:00:00 2001 From: Kamalpreet Kaur Date: Tue, 7 Jan 2025 18:13:28 +0530 Subject: [PATCH 75/86] update: ci-cd workflow --- .github/workflows/cd.yml | 2 +- .github/workflows/ci.yml | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/.github/workflows/cd.yml b/.github/workflows/cd.yml index 66036b6..348f841 100644 --- a/.github/workflows/cd.yml +++ b/.github/workflows/cd.yml @@ -51,7 +51,7 @@ jobs: - name: Sign Nuget Package run: nuget sign .\BrowserStackLocal\bin\Release\*.nupkg -certificatePath "${{ steps.createPfx.outputs.PFX_PATH }}" -certificatePassword "${{secrets.CERT_PASSWORD}}" -Timestamper "http://timestamp.comodoca.com" - name: Save artifact - uses: actions/upload-artifact@v2 + uses: actions/upload-artifact@v4 with: name: BrowserStackLocal.nupkg path: .\BrowserStackLocal\BrowserStackLocal\bin\Release\*.nupkg diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 179ce76..8ee677c 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -34,7 +34,7 @@ jobs: - name: Pack NuGet Package run: msbuild BrowserStackLocal -t:pack -p:Configuration=Release - name: Save artifact - uses: actions/upload-artifact@v2 + uses: actions/upload-artifact@v4 with: name: BrowserStackLocal.nupkg path: .\BrowserStackLocal\BrowserStackLocal\bin\Release\*.nupkg From 0e6e34a82e1cc8dfa7a2dda80de1ccae3a8e8d28 Mon Sep 17 00:00:00 2001 From: amaanbs Date: Fri, 13 Jun 2025 11:32:29 +0530 Subject: [PATCH 76/86] Change Binary Download Distribution --- .../BrowserStackLocal/BrowserStackTunnel.cs | 72 ++++++++++++++++--- BrowserStackLocal/BrowserStackLocal/Local.cs | 66 +++++++++++------ 2 files changed, 110 insertions(+), 28 deletions(-) diff --git a/BrowserStackLocal/BrowserStackLocal/BrowserStackTunnel.cs b/BrowserStackLocal/BrowserStackLocal/BrowserStackTunnel.cs index 40ed6c1..c9e5837 100644 --- a/BrowserStackLocal/BrowserStackLocal/BrowserStackTunnel.cs +++ b/BrowserStackLocal/BrowserStackLocal/BrowserStackTunnel.cs @@ -8,6 +8,12 @@ using System.Security.Principal; using Newtonsoft.Json.Linq; + +using System.Collections.Generic; +using System.Net.Http; +using System.Threading.Tasks; +using Newtonsoft.Json; + namespace BrowserStack { public enum LocalState { Idle, Connecting, Connected, Error, Disconnected }; @@ -16,7 +22,11 @@ public class BrowserStackTunnel : IDisposable { static readonly string uname = Util.GetUName(); static readonly string binaryName = GetBinaryName(); - static readonly string downloadURL = "https://www.browserstack.com/local-testing/downloads/binaries/" + binaryName; + + static readonly string userAgent = ""; + static readonly string sourceUrl = null; + private bool isFallbackEnabled = false; + private Exception downloadFailureException = null; static readonly string homepath = !IsWindows() ? Environment.GetFolderPath(Environment.SpecialFolder.Personal) : @@ -41,7 +51,7 @@ static bool IsDarwin(string osName) { return osName.Contains("darwin"); } - + static bool IsWindows() { @@ -102,8 +112,9 @@ public virtual void addBinaryArguments(string binaryArguments) this.binaryArguments = binaryArguments; } - public BrowserStackTunnel() + public BrowserStackTunnel(string userAgent) { + userAgent = userAgent; localState = LocalState.Idle; output = new StringBuilder(); } @@ -121,7 +132,7 @@ public virtual void fallbackPaths() public void modifyBinaryPermission() { if (!IsWindows()) - { + { try { using (Process proc = Process.Start("/bin/bash", $"-c \"chmod 0755 {this.binaryAbsolute}\"")) @@ -143,16 +154,59 @@ public void modifyBinaryPermission() } } - public void downloadBinary() + private string fetchSourceUrl(string accessKey) + { + var url = "https://local.browserstack.com/binary/api/v1/endpoint"; + + using (var client = new HttpClient()) + { + var data = new Dictionary + { + { "auth_token", accessKey } + }; + client.DefaultRequestHeaders.Add("Content-Type", "application/json"); + client.DefaultRequestHeaders.Add("user-agent", userAgent); + + if (isFallbackEnabled) + { + data["error_message"] = downloadFailureException.Message; + client.DefaultRequestHeaders.Add("X-Local-Fallback-Cloudflare", "true"); + } + + string jsonData = JsonConvert.SerializeObject(data); + var content = new StringContent(jsonData, Encoding.UTF8, "application/json"); + + HttpResponseMessage response = await client.PostAsync(url, content); + + response.EnsureSuccessStatusCode(); + + string responseString = await response.Content.ReadAsStringAsync(); + + dynamic jsonResponse = JsonConvert.DeserializeObject(responseString); + + Console.WriteLine("Response JSON:"); + Console.WriteLine(jsonResponse); + + if (jsonResponse.error != null) + { + throw new Exception(jsonResponse.error); + } + return jsonResponse.data.endpoint; + } + } + + public void downloadBinary(string accessKey) { string binaryDirectory = Path.Combine(this.binaryAbsolute, ".."); //string binaryAbsolute = Path.Combine(binaryDirectory, binaryName); + string sourceDownloadUrl = fetchSourceUrl(accessKey); + Directory.CreateDirectory(binaryDirectory); using (var client = new WebClient()) { - client.DownloadFile(downloadURL, this.binaryAbsolute); + client.DownloadFile(sourceDownloadUrl + "/" + binaryName, this.binaryAbsolute); } if (!File.Exists(binaryAbsolute)) @@ -163,7 +217,7 @@ public void downloadBinary() modifyBinaryPermission(); } - public virtual void Run(string accessKey, string folder, string logFilePath, string processType) + public virtual void Run(string accessKey, string folder, string logFilePath, string processType, bool fallbackEnabled, Exception failureException) { string arguments = "-d " + processType + " "; if (folder != null && folder.Trim().Length != 0) @@ -176,7 +230,9 @@ public virtual void Run(string accessKey, string folder, string logFilePath, str } if (!File.Exists(binaryAbsolute)) { - downloadBinary(); + isFallbackEnabled = fallbackEnabled; + downloadFailureException = failureException; + downloadBinary(accessKey); } if (process != null) diff --git a/BrowserStackLocal/BrowserStackLocal/Local.cs b/BrowserStackLocal/BrowserStackLocal/Local.cs index 5398c08..9fa65ff 100644 --- a/BrowserStackLocal/BrowserStackLocal/Local.cs +++ b/BrowserStackLocal/BrowserStackLocal/Local.cs @@ -14,6 +14,9 @@ public class Local private string argumentString = ""; private string customBinaryPath = ""; private string bindingVersion = ""; + private string userAgent = "browserstack-local-csharp"; + private bool isFallbackEnabled = false; + private Exception downloadFailureException = null; protected BrowserStackTunnel tunnel = null; private static KeyValuePair emptyStringPair = new KeyValuePair(); @@ -144,11 +147,11 @@ public static string GetVersionStringFromAssemblyEmbedded(string pAssemblyDispla public Local() { bindingVersion = GetVersionStringFromAssemblyEmbedded("BrowserStackLocal"); - tunnel = new BrowserStackTunnel(); + userAgent = userAgent + "/" + bindingVersion; + tunnel = new BrowserStackTunnel(userAgent); } public void start(List> options) { - tunnel.basePathsIndex = -1; foreach (KeyValuePair pair in options) { string key = pair.Key; @@ -174,38 +177,61 @@ public void start(List> options) argumentString += "-logFile \"" + customLogPath + "\" "; argumentString += "--source \"c-sharp:" + bindingVersion + "\" "; - tunnel.addBinaryPath(customBinaryPath); tunnel.addBinaryArguments(argumentString); - while (true) + + DownloadVerifyAndRunBinary(); + } + + private void DownloadVerifyAndRunBinary() + { + tunnel.basePathsIndex = -1; + tunnel.addBinaryPath(customBinaryPath); + try { - bool except = false; - try - { - tunnel.Run(accessKey, folder, customLogPath, "start"); - } - catch (System.ComponentModel.Win32Exception) - { - except = true; - } - catch (Exception e) + while (true) { - except = true; - Console.WriteLine(e.ToString()); + bool except = false; + try + { + tunnel.Run(accessKey, folder, customLogPath, "start", isFallbackEnabled, downloadFailureException); + } + catch (System.ComponentModel.Win32Exception) + { + except = true; + } + catch (Exception e) + { + except = true; + Console.WriteLine(e.ToString()); + } + if (except) + { + tunnel.fallbackPaths(); + } + else + { + break; + } } - if (except) + } + catch (Exception err) + { + if (!isFallbackEnabled) { - tunnel.fallbackPaths(); + isFallbackEnabled = true; + downloadFailureException = err; + downloadVerifyAndRunBinary(); } else { - break; + throw err; } } } public void stop() { - tunnel.Run(accessKey, folder, customLogPath, "stop"); + tunnel.Run(accessKey, folder, customLogPath, "stop", isFallbackEnabled, downloadFailureException); tunnel.Kill(); } } From c5c24818b1acb3a62b701f0ae47972ab50d75863 Mon Sep 17 00:00:00 2001 From: amaanbs Date: Tue, 17 Jun 2025 12:54:34 +0530 Subject: [PATCH 77/86] Fixes --- .../BrowserStackTunnelTests.cs | 10 +-- .../LocalTests.cs | 12 ++-- .../BrowserStackLocal/BrowserStackTunnel.cs | 58 ++++++++------- BrowserStackLocal/BrowserStackLocal/Local.cs | 71 ++++++++++--------- 4 files changed, 80 insertions(+), 71 deletions(-) diff --git a/BrowserStackLocal/BrowserStackLocal Unit Tests/BrowserStackTunnelTests.cs b/BrowserStackLocal/BrowserStackLocal Unit Tests/BrowserStackTunnelTests.cs index 2a32216..ad13e95 100644 --- a/BrowserStackLocal/BrowserStackLocal Unit Tests/BrowserStackTunnelTests.cs +++ b/BrowserStackLocal/BrowserStackLocal Unit Tests/BrowserStackTunnelTests.cs @@ -30,14 +30,14 @@ public void TestInitialState() public void TestBinaryPathIsSet() { tunnel = new TunnelClass(); - tunnel.addBinaryPath("dummyPath"); + tunnel.addBinaryPath("dummyPath", ""); Assert.AreEqual(tunnel.getBinaryAbsolute(), "dummyPath"); } [TestMethod] public void TestBinaryPathOnNull() { tunnel = new TunnelClass(); - tunnel.addBinaryPath(null); + tunnel.addBinaryPath(null, ""); string expectedPath = Path.Combine(homepath, ".browserstack"); expectedPath = Path.Combine(expectedPath, binaryName); Assert.AreEqual(tunnel.getBinaryAbsolute(), expectedPath); @@ -46,7 +46,7 @@ public void TestBinaryPathOnNull() public void TestBinaryPathOnEmpty() { tunnel = new TunnelClass(); - tunnel.addBinaryPath(""); + tunnel.addBinaryPath("", ""); string expectedPath = Path.Combine(homepath, ".browserstack"); expectedPath = Path.Combine(expectedPath, binaryName); Assert.AreEqual(tunnel.getBinaryAbsolute(), expectedPath); @@ -56,7 +56,7 @@ public void TestBinaryPathOnFallback() { string expectedPath = "dummyPath"; tunnel = new TunnelClass(); - tunnel.addBinaryPath("dummyPath"); + tunnel.addBinaryPath("dummyPath", ""); Assert.AreEqual(tunnel.getBinaryAbsolute(), expectedPath); tunnel.fallbackPaths(); @@ -78,7 +78,7 @@ public void TestBinaryPathOnFallback() public void TestBinaryPathOnNoMoreFallback() { tunnel = new TunnelClass(); - tunnel.addBinaryPath("dummyPath"); + tunnel.addBinaryPath("dummyPath", ""); tunnel.fallbackPaths(); tunnel.fallbackPaths(); tunnel.fallbackPaths(); diff --git a/BrowserStackLocal/BrowserStackLocal Unit Tests/LocalTests.cs b/BrowserStackLocal/BrowserStackLocal Unit Tests/LocalTests.cs index ff03d1e..8be3eb6 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"), Times.Once); + tunnelMock.Verify(mock => mock.addBinaryPath("dummyPath", ""), 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(""), Times.Once); + tunnelMock.Verify(mock => mock.addBinaryPath("", ""), 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(""), Times.Once); + tunnelMock.Verify(mock => mock.addBinaryPath("", ""), 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(""), Times.Once); + tunnelMock.Verify(mock => mock.addBinaryPath("", ""), 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(""), Times.Once); + tunnelMock.Verify(mock => mock.addBinaryPath("", ""), 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(""), Times.Once); + tunnelMock.Verify(mock => mock.addBinaryPath("", ""), 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 c9e5837..e366afb 100644 --- a/BrowserStackLocal/BrowserStackLocal/BrowserStackTunnel.cs +++ b/BrowserStackLocal/BrowserStackLocal/BrowserStackTunnel.cs @@ -23,8 +23,8 @@ public class BrowserStackTunnel : IDisposable static readonly string uname = Util.GetUName(); static readonly string binaryName = GetBinaryName(); - static readonly string userAgent = ""; - static readonly string sourceUrl = null; + private static string userAgent = ""; + private string sourceUrl = null; private bool isFallbackEnabled = false; private Exception downloadFailureException = null; @@ -94,8 +94,15 @@ static string GetBinaryName() return "BrowserStackLocal.exe"; } - public virtual void addBinaryPath(string binaryAbsolute) + public virtual void addBinaryPath(string binaryAbsolute, string accessKey, bool fallbackEnabled = false, Exception failureException = null) { + if (basePathsIndex == -1) + { + /* Called at most twice (primary & a fallback) */ + isFallbackEnabled = fallbackEnabled; + downloadFailureException = failureException; + fetchSourceUrl(accessKey); + } if (binaryAbsolute == null || binaryAbsolute.Trim().Length == 0) { binaryAbsolute = Path.Combine(basePaths[++basePathsIndex], binaryName); @@ -112,15 +119,19 @@ public virtual void addBinaryArguments(string binaryArguments) this.binaryArguments = binaryArguments; } - public BrowserStackTunnel(string userAgent) + public BrowserStackTunnel(string userAgentParam) { - userAgent = userAgent; + userAgent = userAgentParam; localState = LocalState.Idle; output = new StringBuilder(); } public virtual void fallbackPaths() { + if (File.Exists(binaryAbsolute)) + { + File.Delete(binaryAbsolute); + } if (basePathsIndex >= basePaths.Length - 1) { throw new Exception("Binary not found or failed to launch. Make sure that BrowserStackLocal is not already running."); @@ -164,49 +175,48 @@ private string fetchSourceUrl(string accessKey) { { "auth_token", accessKey } }; - client.DefaultRequestHeaders.Add("Content-Type", "application/json"); - client.DefaultRequestHeaders.Add("user-agent", userAgent); if (isFallbackEnabled) { data["error_message"] = downloadFailureException.Message; - client.DefaultRequestHeaders.Add("X-Local-Fallback-Cloudflare", "true"); } - string jsonData = JsonConvert.SerializeObject(data); + var jsonData = JsonConvert.SerializeObject(data); var content = new StringContent(jsonData, Encoding.UTF8, "application/json"); - HttpResponseMessage response = await client.PostAsync(url, content); + client.DefaultRequestHeaders.Add("User-Agent", userAgent); + if (isFallbackEnabled) + { + client.DefaultRequestHeaders.Add("X-Local-Fallback-Cloudflare", "true"); + } + + var response = client.PostAsync(url, content).Result; response.EnsureSuccessStatusCode(); - string responseString = await response.Content.ReadAsStringAsync(); - - dynamic jsonResponse = JsonConvert.DeserializeObject(responseString); + var responseString = response.Content.ReadAsStringAsync().Result; - Console.WriteLine("Response JSON:"); - Console.WriteLine(jsonResponse); + var jsonResponse = JObject.Parse(responseString); - if (jsonResponse.error != null) + if (jsonResponse["error"] != null) { - throw new Exception(jsonResponse.error); + throw new Exception((string)jsonResponse["error"]); } - return jsonResponse.data.endpoint; + + sourceUrl = jsonResponse["data"]?["endpoint"]?.ToString(); + return sourceUrl; } } public void downloadBinary(string accessKey) { string binaryDirectory = Path.Combine(this.binaryAbsolute, ".."); - //string binaryAbsolute = Path.Combine(binaryDirectory, binaryName); - - string sourceDownloadUrl = fetchSourceUrl(accessKey); Directory.CreateDirectory(binaryDirectory); using (var client = new WebClient()) { - client.DownloadFile(sourceDownloadUrl + "/" + binaryName, this.binaryAbsolute); + client.DownloadFile(sourceUrl + "/" + binaryName, this.binaryAbsolute); } if (!File.Exists(binaryAbsolute)) @@ -217,7 +227,7 @@ public void downloadBinary(string accessKey) modifyBinaryPermission(); } - public virtual void Run(string accessKey, string folder, string logFilePath, string processType, bool fallbackEnabled, Exception failureException) + public virtual void Run(string accessKey, string folder, string logFilePath, string processType) { string arguments = "-d " + processType + " "; if (folder != null && folder.Trim().Length != 0) @@ -230,8 +240,6 @@ public virtual void Run(string accessKey, string folder, string logFilePath, str } if (!File.Exists(binaryAbsolute)) { - isFallbackEnabled = fallbackEnabled; - downloadFailureException = failureException; downloadBinary(accessKey); } diff --git a/BrowserStackLocal/BrowserStackLocal/Local.cs b/BrowserStackLocal/BrowserStackLocal/Local.cs index 9fa65ff..6c57251 100644 --- a/BrowserStackLocal/BrowserStackLocal/Local.cs +++ b/BrowserStackLocal/BrowserStackLocal/Local.cs @@ -150,42 +150,11 @@ public Local() userAgent = userAgent + "/" + bindingVersion; tunnel = new BrowserStackTunnel(userAgent); } - public void start(List> options) - { - foreach (KeyValuePair pair in options) - { - string key = pair.Key; - string value = pair.Value; - addArgs(key, value); - } - - if (accessKey == null || accessKey.Trim().Length == 0) - { - accessKey = Environment.GetEnvironmentVariable("BROWSERSTACK_ACCESS_KEY"); - if (accessKey == null || accessKey.Trim().Length == 0) - { - throw new Exception("BROWSERSTACK_ACCESS_KEY cannot be empty. " + - "Specify one by adding key to options or adding to the environment variable BROWSERSTACK_ACCESS_KEY."); - } - Regex.Replace(this.accessKey, @"\s+", ""); - } - - if (customLogPath == null || customLogPath.Trim().Length == 0) - { - customLogPath = Path.Combine(BrowserStackTunnel.basePaths[1], "local.log"); - } - - argumentString += "-logFile \"" + customLogPath + "\" "; - argumentString += "--source \"c-sharp:" + bindingVersion + "\" "; - tunnel.addBinaryArguments(argumentString); - - DownloadVerifyAndRunBinary(); - } private void DownloadVerifyAndRunBinary() { tunnel.basePathsIndex = -1; - tunnel.addBinaryPath(customBinaryPath); + tunnel.addBinaryPath(customBinaryPath, accessKey, isFallbackEnabled, downloadFailureException); try { while (true) @@ -193,7 +162,7 @@ private void DownloadVerifyAndRunBinary() bool except = false; try { - tunnel.Run(accessKey, folder, customLogPath, "start", isFallbackEnabled, downloadFailureException); + tunnel.Run(accessKey, folder, customLogPath, "start"); } catch (System.ComponentModel.Win32Exception) { @@ -220,7 +189,7 @@ private void DownloadVerifyAndRunBinary() { isFallbackEnabled = true; downloadFailureException = err; - downloadVerifyAndRunBinary(); + DownloadVerifyAndRunBinary(); } else { @@ -229,9 +198,41 @@ private void DownloadVerifyAndRunBinary() } } + public void start(List> options) + { + foreach (KeyValuePair pair in options) + { + string key = pair.Key; + string value = pair.Value; + addArgs(key, value); + } + + if (accessKey == null || accessKey.Trim().Length == 0) + { + accessKey = Environment.GetEnvironmentVariable("BROWSERSTACK_ACCESS_KEY"); + if (accessKey == null || accessKey.Trim().Length == 0) + { + throw new Exception("BROWSERSTACK_ACCESS_KEY cannot be empty. " + + "Specify one by adding key to options or adding to the environment variable BROWSERSTACK_ACCESS_KEY."); + } + Regex.Replace(this.accessKey, @"\s+", ""); + } + + if (customLogPath == null || customLogPath.Trim().Length == 0) + { + customLogPath = Path.Combine(BrowserStackTunnel.basePaths[1], "local.log"); + } + + argumentString += "-logFile \"" + customLogPath + "\" "; + argumentString += "--source \"c-sharp:" + bindingVersion + "\" "; + tunnel.addBinaryArguments(argumentString); + + DownloadVerifyAndRunBinary(); + } + public void stop() { - tunnel.Run(accessKey, folder, customLogPath, "stop", isFallbackEnabled, downloadFailureException); + tunnel.Run(accessKey, folder, customLogPath, "stop"); tunnel.Kill(); } } From 01ad6feb52af4270cfcff7a4f61282ae9e1d3d9b Mon Sep 17 00:00:00 2001 From: amaanbs Date: Tue, 17 Jun 2025 13:08:41 +0530 Subject: [PATCH 78/86] Minor change --- BrowserStackLocal/BrowserStackLocal/BrowserStackTunnel.cs | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/BrowserStackLocal/BrowserStackLocal/BrowserStackTunnel.cs b/BrowserStackLocal/BrowserStackLocal/BrowserStackTunnel.cs index e366afb..4134cc2 100644 --- a/BrowserStackLocal/BrowserStackLocal/BrowserStackTunnel.cs +++ b/BrowserStackLocal/BrowserStackLocal/BrowserStackTunnel.cs @@ -208,7 +208,7 @@ private string fetchSourceUrl(string accessKey) } } - public void downloadBinary(string accessKey) + public void downloadBinary() { string binaryDirectory = Path.Combine(this.binaryAbsolute, ".."); @@ -240,7 +240,7 @@ public virtual void Run(string accessKey, string folder, string logFilePath, str } if (!File.Exists(binaryAbsolute)) { - downloadBinary(accessKey); + downloadBinary(); } if (process != null) From 79d48d01c1c0c664b79c3dc75a8901a098d5c4bb Mon Sep 17 00:00:00 2001 From: amaanbs Date: Wed, 18 Jun 2025 18:17:54 +0530 Subject: [PATCH 79/86] Remove dotnet 2 support --- BrowserStackLocal/BrowserStackLocal/BrowserStackLocal.csproj | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/BrowserStackLocal/BrowserStackLocal/BrowserStackLocal.csproj b/BrowserStackLocal/BrowserStackLocal/BrowserStackLocal.csproj index 7711dbb..b0f902f 100644 --- a/BrowserStackLocal/BrowserStackLocal/BrowserStackLocal.csproj +++ b/BrowserStackLocal/BrowserStackLocal/BrowserStackLocal.csproj @@ -2,7 +2,7 @@ BrowserStack BrowserStackLocal - net20;netstandard2.0 + netstandard2.0 false BrowserStackLocal BrowserStackLocal From 227ad4a5b0f507fea7b2ba3f3f9b87d29763f0af Mon Sep 17 00:00:00 2001 From: amaanbs Date: Thu, 19 Jun 2025 13:21:24 +0530 Subject: [PATCH 80/86] Version bump --- .../BrowserStackLocal/BrowserStackLocal.csproj | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/BrowserStackLocal/BrowserStackLocal/BrowserStackLocal.csproj b/BrowserStackLocal/BrowserStackLocal/BrowserStackLocal.csproj index 7711dbb..0e1dab9 100644 --- a/BrowserStackLocal/BrowserStackLocal/BrowserStackLocal.csproj +++ b/BrowserStackLocal/BrowserStackLocal/BrowserStackLocal.csproj @@ -7,9 +7,9 @@ BrowserStackLocal BrowserStackLocal C# Bindings for BrowserStack Local - 2.4.0 - 2.4.0 - 2.4.0 + 3.0.0 + 3.0.0 + 3.0.0 BrowserStack BrowserStack Copyright © 2016 From c3233eb10127d581823d871d68437f017c945157 Mon Sep 17 00:00:00 2001 From: amaanbs Date: Thu, 19 Jun 2025 20:52:16 +0530 Subject: [PATCH 81/86] Targetr dotnet v7 --- BrowserStackLocal/BrowserStackLocal/BrowserStackLocal.csproj | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/BrowserStackLocal/BrowserStackLocal/BrowserStackLocal.csproj b/BrowserStackLocal/BrowserStackLocal/BrowserStackLocal.csproj index 7711dbb..8bcaa42 100644 --- a/BrowserStackLocal/BrowserStackLocal/BrowserStackLocal.csproj +++ b/BrowserStackLocal/BrowserStackLocal/BrowserStackLocal.csproj @@ -2,7 +2,7 @@ BrowserStack BrowserStackLocal - net20;netstandard2.0 + net7.0 false BrowserStackLocal BrowserStackLocal From 8398ea10a351af5ed2702ede2ff56f3f583f5007 Mon Sep 17 00:00:00 2001 From: "Yash D. Saraf" Date: Thu, 19 Jun 2025 21:14:01 +0530 Subject: [PATCH 82/86] Update CI workflow to use dotnet v7 --- .github/workflows/cd.yml | 2 +- .github/workflows/ci.yml | 2 +- .../BrowserStackLocal/BrowserStackLocal.csproj | 3 --- .../BrowserStackLocalIntegrationTests.csproj | 13 ++++--------- 4 files changed, 6 insertions(+), 14 deletions(-) diff --git a/.github/workflows/cd.yml b/.github/workflows/cd.yml index 348f841..d88089e 100644 --- a/.github/workflows/cd.yml +++ b/.github/workflows/cd.yml @@ -25,7 +25,7 @@ jobs: - name: Setup .NET Core uses: actions/setup-dotnet@v1 with: - dotnet-version: 3.1.301 + dotnet-version: 7.0.20 - name: Run Integration Tests env: BROWSERSTACK_USERNAME: ${{ secrets.BROWSERSTACK_USERNAME }} diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 8ee677c..08cbcf8 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -25,7 +25,7 @@ jobs: - name: Setup .NET Core uses: actions/setup-dotnet@v1 with: - dotnet-version: 3.1.301 + dotnet-version: 7.0.20 - name: Run Integration Tests env: BROWSERSTACK_USERNAME: ${{ secrets.BROWSERSTACK_USERNAME }} diff --git a/BrowserStackLocal/BrowserStackLocal/BrowserStackLocal.csproj b/BrowserStackLocal/BrowserStackLocal/BrowserStackLocal.csproj index 71156ce..688943d 100644 --- a/BrowserStackLocal/BrowserStackLocal/BrowserStackLocal.csproj +++ b/BrowserStackLocal/BrowserStackLocal/BrowserStackLocal.csproj @@ -18,9 +18,6 @@ - - - diff --git a/BrowserStackLocal/BrowserStackLocalIntegrationTests/BrowserStackLocalIntegrationTests.csproj b/BrowserStackLocal/BrowserStackLocalIntegrationTests/BrowserStackLocalIntegrationTests.csproj index 1330776..54542d7 100644 --- a/BrowserStackLocal/BrowserStackLocalIntegrationTests/BrowserStackLocalIntegrationTests.csproj +++ b/BrowserStackLocal/BrowserStackLocalIntegrationTests/BrowserStackLocalIntegrationTests.csproj @@ -1,7 +1,7 @@ - net45;netcoreapp3.1 + net7.0 false @@ -12,16 +12,11 @@ - + - ..\BrowserStackLocal\bin\$(Configuration)\net20\BrowserStackLocal.dll - - - - - ..\BrowserStackLocal\bin\$(Configuration)\netstandard2.0\BrowserStackLocal.dll + ..\BrowserStackLocal\bin\$(Configuration)\net7.0\BrowserStackLocal.dll - \ No newline at end of file + From 4bb99811f151e9278a55c9e14e96990ac0a1eb22 Mon Sep 17 00:00:00 2001 From: "Yash D. Saraf" Date: Thu, 19 Jun 2025 21:14:01 +0530 Subject: [PATCH 83/86] Update CI workflow to use dotnet v7 --- .github/workflows/cd.yml | 4 ++-- .github/workflows/ci.yml | 4 ++-- .../BrowserStackLocal Unit Tests.csproj | 13 ++++--------- .../BrowserStackLocal/BrowserStackLocal.csproj | 3 --- .../BrowserStackLocalIntegrationTests.csproj | 13 ++++--------- 5 files changed, 12 insertions(+), 25 deletions(-) diff --git a/.github/workflows/cd.yml b/.github/workflows/cd.yml index 348f841..8486139 100644 --- a/.github/workflows/cd.yml +++ b/.github/workflows/cd.yml @@ -23,9 +23,9 @@ jobs: msbuild BrowserStackLocalIntegrationTests -t:restore -p:Configuration=Release msbuild BrowserStackLocalIntegrationTests -t:build -p:Configuration=Release - name: Setup .NET Core - uses: actions/setup-dotnet@v1 + uses: actions/setup-dotnet@v3 with: - dotnet-version: 3.1.301 + dotnet-version: 7.0.410 - name: Run Integration Tests env: BROWSERSTACK_USERNAME: ${{ secrets.BROWSERSTACK_USERNAME }} diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 8ee677c..c7f79c6 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -23,9 +23,9 @@ jobs: msbuild BrowserStackLocalIntegrationTests -t:restore -p:Configuration=Release msbuild BrowserStackLocalIntegrationTests -t:build -p:Configuration=Release - name: Setup .NET Core - uses: actions/setup-dotnet@v1 + uses: actions/setup-dotnet@v3 with: - dotnet-version: 3.1.301 + dotnet-version: 7.0.410 - name: Run Integration Tests env: BROWSERSTACK_USERNAME: ${{ secrets.BROWSERSTACK_USERNAME }} diff --git a/BrowserStackLocal/BrowserStackLocal Unit Tests/BrowserStackLocal Unit Tests.csproj b/BrowserStackLocal/BrowserStackLocal Unit Tests/BrowserStackLocal Unit Tests.csproj index cdc5f3d..75629c6 100644 --- a/BrowserStackLocal/BrowserStackLocal Unit Tests/BrowserStackLocal Unit Tests.csproj +++ b/BrowserStackLocal/BrowserStackLocal Unit Tests/BrowserStackLocal Unit Tests.csproj @@ -2,7 +2,7 @@ BrowserStackLocal_Unit_Tests BrowserStackLocal Unit Tests - net45;netcoreapp3.1 + net7.0 false BrowserStackLocal Unit Tests BrowserStackLocal Unit Tests @@ -18,15 +18,10 @@ - + - ..\BrowserStackLocal\bin\Debug\net20\BrowserStackLocal.dll - - - - - ..\BrowserStackLocal\bin\Debug\netstandard2.0\BrowserStackLocal.dll + ..\BrowserStackLocal\bin\$(Configuration)\net7.0\BrowserStackLocal.dll - \ No newline at end of file + diff --git a/BrowserStackLocal/BrowserStackLocal/BrowserStackLocal.csproj b/BrowserStackLocal/BrowserStackLocal/BrowserStackLocal.csproj index 71156ce..688943d 100644 --- a/BrowserStackLocal/BrowserStackLocal/BrowserStackLocal.csproj +++ b/BrowserStackLocal/BrowserStackLocal/BrowserStackLocal.csproj @@ -18,9 +18,6 @@ - - - diff --git a/BrowserStackLocal/BrowserStackLocalIntegrationTests/BrowserStackLocalIntegrationTests.csproj b/BrowserStackLocal/BrowserStackLocalIntegrationTests/BrowserStackLocalIntegrationTests.csproj index 1330776..54542d7 100644 --- a/BrowserStackLocal/BrowserStackLocalIntegrationTests/BrowserStackLocalIntegrationTests.csproj +++ b/BrowserStackLocal/BrowserStackLocalIntegrationTests/BrowserStackLocalIntegrationTests.csproj @@ -1,7 +1,7 @@ - net45;netcoreapp3.1 + net7.0 false @@ -12,16 +12,11 @@ - + - ..\BrowserStackLocal\bin\$(Configuration)\net20\BrowserStackLocal.dll - - - - - ..\BrowserStackLocal\bin\$(Configuration)\netstandard2.0\BrowserStackLocal.dll + ..\BrowserStackLocal\bin\$(Configuration)\net7.0\BrowserStackLocal.dll - \ No newline at end of file + From 71c2b5ae7910ba60554157e170943873a7bc43bd Mon Sep 17 00:00:00 2001 From: amaanbs Date: Thu, 19 Jun 2025 22:30:56 +0530 Subject: [PATCH 84/86] Fix example tests --- .../BrowserStackExample.csproj | 85 +++---------------- .../BrowserStackExample/Example.cs | 51 ++++++----- 2 files changed, 44 insertions(+), 92 deletions(-) diff --git a/BrowserStackLocalExample/BrowserStackExample/BrowserStackExample.csproj b/BrowserStackLocalExample/BrowserStackExample/BrowserStackExample.csproj index f4bb522..fc2e2b6 100644 --- a/BrowserStackLocalExample/BrowserStackExample/BrowserStackExample.csproj +++ b/BrowserStackLocalExample/BrowserStackExample/BrowserStackExample.csproj @@ -1,94 +1,37 @@ - - - + + - Debug - AnyCPU {9297DCCC-AE88-4E12-934A-B2BEA4864B49} Exe - Properties + net7.0 BrowserStackExample BrowserStackExample - v4.5 - 512 - publish\ - true - Disk - false - Foreground - 7 - Days - false - false - true - 0 - 1.0.0.%2a - false - false - true + enable + enable + false AnyCPU - true - full - false bin\Debug\ DEBUG;TRACE - prompt 4 AnyCPU - pdbonly - true bin\Release\ TRACE - prompt 4 + + + + + - ..\..\BrowserStackLocal\BrowserStackLocal\bin\Debug\net20\BrowserStackLocal.dll - - - - - - - - - - - - ..\packages\Selenium.WebDriver.2.52.0\lib\net40\WebDriver.dll + ..\..\BrowserStackLocal\BrowserStackLocal\bin\Debug\net7.0\BrowserStackLocal.dll True - - - - - - - False - Microsoft .NET Framework 4.5 %28x86 and x64%29 - true - - - False - .NET Framework 3.5 SP1 - false - - - - - - - - \ No newline at end of file + + diff --git a/BrowserStackLocalExample/BrowserStackExample/Example.cs b/BrowserStackLocalExample/BrowserStackExample/Example.cs index 9eac3e3..d9502e2 100644 --- a/BrowserStackLocalExample/BrowserStackExample/Example.cs +++ b/BrowserStackLocalExample/BrowserStackExample/Example.cs @@ -2,6 +2,7 @@ using BrowserStack; using System.Collections.Generic; using OpenQA.Selenium; +using OpenQA.Selenium.Chrome; using OpenQA.Selenium.Remote; namespace BrowserStackExample @@ -10,36 +11,44 @@ class Example { static void Main(string[] args) { + // Start BrowserStack Local Local local = new Local(); - - List> options = new List>() { + var bsLocalArgs = new List>() + { new KeyValuePair("key", BROWSERSTACK_ACCESS_KEY), - //new KeyValuePair("localIdentifier", "identifier"), - //new KeyValuePair("f", "C:\\Users\\Admin\\Desktop\\"), - new KeyValuePair("onlyAutomate", "true"), - new KeyValuePair("verbose", "true"), new KeyValuePair("forcelocal", "true"), - new KeyValuePair("binarypath", "C:\\Users\\Admin\\Desktop\\BrowserStackLocal.exe"), - new KeyValuePair("logfile", "C:\\Users\\Admin\\Desktop\\local.log"), + new KeyValuePair("verbose", "true"), + // new KeyValuePair("binarypath", "C:\\Users\\Admin\\Desktop\\BrowserStackLocal.exe"), + // new KeyValuePair("logfile", "C:\\Users\\Admin\\Desktop\\local.log"), }; - local.start(options); - - // Run WebDriver Tests - IWebDriver driver; - DesiredCapabilities capability = DesiredCapabilities.Chrome(); - capability.SetCapability("browserstack.user", BROWSERSTACK_USERNAME); - capability.SetCapability("browserstack.key", BROWSERSTACK_ACCESS_KEY); - //capability.SetCapability("browserstack.localIdentifier", "identifier"); - capability.SetCapability("browserstack.local", true); - capability.SetCapability("build", "build"); + local.start(bsLocalArgs); - driver = new RemoteWebDriver( - new Uri("http://hub.browserstack.com/wd/hub/"), capability + // Define BrowserStack capabilities + var browserstackOptions = new Dictionary + { + { "userName", BROWSERSTACK_USERNAME }, + { "accessKey", BROWSERSTACK_ACCESS_KEY }, + { "local", "true" }, + { "build", "build" } + }; + + // Set up ChromeOptions + ChromeOptions chromeOptions = new ChromeOptions(); + chromeOptions.BrowserVersion = "latest"; + chromeOptions.PlatformName = "Windows 10"; + chromeOptions.AddAdditionalOption("bstack:options", browserstackOptions); + + // Launch Remote WebDriver + IWebDriver driver = new RemoteWebDriver( + new Uri("https://hub.browserstack.com/wd/hub"), + chromeOptions ); + + // Run your test driver.Navigate().GoToUrl("http://www.google.com"); Console.WriteLine(driver.Title); - IWebElement query = driver.FindElement(By.Name("q")); + var query = driver.FindElement(By.Name("q")); query.SendKeys("Browserstack"); query.Submit(); Console.WriteLine(driver.Title); From 1e8729bde49537f1383342ea4e741106f13dd53c Mon Sep 17 00:00:00 2001 From: amaanbs Date: Thu, 19 Jun 2025 22:36:31 +0530 Subject: [PATCH 85/86] Minor fix --- BrowserStackLocalExample/BrowserStackExample/Example.cs | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/BrowserStackLocalExample/BrowserStackExample/Example.cs b/BrowserStackLocalExample/BrowserStackExample/Example.cs index d9502e2..28e410f 100644 --- a/BrowserStackLocalExample/BrowserStackExample/Example.cs +++ b/BrowserStackLocalExample/BrowserStackExample/Example.cs @@ -18,8 +18,8 @@ static void Main(string[] args) new KeyValuePair("key", BROWSERSTACK_ACCESS_KEY), new KeyValuePair("forcelocal", "true"), new KeyValuePair("verbose", "true"), - // new KeyValuePair("binarypath", "C:\\Users\\Admin\\Desktop\\BrowserStackLocal.exe"), - // new KeyValuePair("logfile", "C:\\Users\\Admin\\Desktop\\local.log"), + new KeyValuePair("binarypath", "C:\\Users\\Admin\\Desktop\\BrowserStackLocal.exe"), + new KeyValuePair("logfile", "C:\\Users\\Admin\\Desktop\\local.log"), }; local.start(bsLocalArgs); From 46e30df9bdabf968f2f9962c6bbc10cc0c63d4da Mon Sep 17 00:00:00 2001 From: amaanbs Date: Thu, 19 Jun 2025 22:42:42 +0530 Subject: [PATCH 86/86] Bump Selenium pkg --- BrowserStackLocalExample/BrowserStackExample/packages.config | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/BrowserStackLocalExample/BrowserStackExample/packages.config b/BrowserStackLocalExample/BrowserStackExample/packages.config index d4dee4a..d085f87 100644 --- a/BrowserStackLocalExample/BrowserStackExample/packages.config +++ b/BrowserStackLocalExample/BrowserStackExample/packages.config @@ -1,4 +1,4 @@  - - \ No newline at end of file + + pFad - Phonifier reborn

Pfad - The Proxy pFad of © 2024 Garber Painting. All rights reserved.

Note: This service is not intended for secure transactions such as banking, social media, email, or purchasing. Use at your own risk. We assume no liability whatsoever for broken pages.


Alternative Proxies:

Alternative Proxy

pFad Proxy

pFad v3 Proxy

pFad v4 Proxy