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
38 changes: 11 additions & 27 deletions src/Appium.Net/Appium/Service/Options/OptionCollector.cs
Original file line number Diff line number Diff line change
Expand Up @@ -49,25 +49,9 @@ public OptionCollector AddCapabilities(AppiumOptions options)
}
else
{
IDictionary<string, object> originalDictionary = this.options.ToDictionary();
IDictionary<string, object> givenDictionary = options.ToDictionary();
IDictionary<string, object> result = new Dictionary<string, object>(originalDictionary);

foreach (var item in givenDictionary)
{
if (originalDictionary.ContainsKey(item.Key))
{
result[item.Key] = item.Value;
}
else
{
result.Add(item.Key, item.Value);
}
}

this.options = new AppiumOptions();

foreach (var item in result)
{
this.options.AddAdditionalAppiumOption(item.Key, item.Value);
}
Expand All @@ -76,14 +60,12 @@ public OptionCollector AddCapabilities(AppiumOptions options)
return this;
}

private string ParseCapabilitiesIfWindows()
private string ParseCapabilitiesIfWindows(IDictionary<string, object> capabilitiesDictionary)
{
string result = string.Empty;

if (options != null)
if (capabilitiesDictionary != null)
{
IDictionary<string, object> capabilitiesDictionary = options.ToDictionary();

foreach (var item in capabilitiesDictionary)
{
object value = item.Value;
Expand Down Expand Up @@ -127,15 +109,15 @@ private string ParseCapabilitiesIfWindows()
return "\"{" + result + "}\"";
}

private string ParseCapabilitiesIfUNIX()
private string ParseCapabilitiesIfUNIX(IDictionary<string, object> capabilitiesDictionary)
{
if (options == null)
if (capabilitiesDictionary == null)
{
return string.Empty;
}

// Serialize to JSON and escape double quotes so they survive argument parsing
var json = JsonSerializer.Serialize(options.ToDictionary());
var json = JsonSerializer.Serialize(capabilitiesDictionary);
// Escape double quotes with backslash for shell argument
var escaped = json.Replace("\"", "\\\"");
return $"\"{escaped}\"";
Expand All @@ -148,7 +130,7 @@ internal IList<string> Arguments
{
get
{
List<string> result = new List<string>();
List<string> result = [];
var keys = CollectedArgs.Keys;
foreach (var key in keys)
{
Expand All @@ -164,16 +146,18 @@ internal IList<string> Arguments
}
}

if (options != null && options.ToDictionary().Count > 0)
var optionsDictionary = options?.ToDictionary();

if (optionsDictionary != null && optionsDictionary.Count > 0)
{
result.Add(CapabilitiesFlag);
if (Platform.CurrentPlatform.IsPlatformType(PlatformType.Windows))
{
result.Add(ParseCapabilitiesIfWindows());
result.Add(ParseCapabilitiesIfWindows(optionsDictionary));
}
else
{
result.Add(ParseCapabilitiesIfUNIX());
result.Add(ParseCapabilitiesIfUNIX(optionsDictionary));
}
}

Expand Down
34 changes: 33 additions & 1 deletion test/integration/ServerTests/AppiumLocalServerLaunchingTest.cs
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,7 @@
using System.Collections.Generic;
using System.IO;
using System.Net;
using System.Reflection;
using System.Text;
using System.Threading;
using Appium.Net.Integration.Tests.Helpers;
Expand Down Expand Up @@ -211,6 +212,37 @@ public void CheckAbilityToStartServiceUsingCapabilities()
}
}

[Test]
public void AddCapabilities_MergesCapabilitiesWhenCalledMultipleTimes()
{
var firstCapabilities = new AppiumOptions();
firstCapabilities.AddAdditionalAppiumOption(MobileCapabilityType.PlatformName, "Android");

var secondCapabilities = new AppiumOptions();
secondCapabilities.AddAdditionalAppiumOption(AndroidMobileCapabilityType.AppPackage, "io.appium.android.apis");

var collector = new OptionCollector()
.AddCapabilities(firstCapabilities)
.AddCapabilities(secondCapabilities);

var argumentsProperty = typeof(OptionCollector).GetProperty("Arguments", BindingFlags.Instance | BindingFlags.NonPublic);
Assert.That(argumentsProperty, Is.Not.Null, "Arguments property not found.");

var arguments = argumentsProperty.GetValue(collector) as IList<string>;
Assert.That(arguments, Is.Not.Null, "Arguments should not be null.");

var capabilitiesIndex = arguments.IndexOf("--default-capabilities");
Assert.That(capabilitiesIndex, Is.GreaterThanOrEqualTo(0), "Capabilities flag not found.");
Assert.That(arguments.Count, Is.GreaterThan(capabilitiesIndex + 1), "Capabilities value missing.");

var capabilitiesArgument = arguments[capabilitiesIndex + 1];
Assert.Multiple(() =>
{
Assert.That(capabilitiesArgument, Does.Contain("platformName"));
Assert.That(capabilitiesArgument, Does.Contain("appPackage"));
});
}

[Test]
public void CheckAbilityToStartServiceUsingCapabilitiesAndFlags()
{
Expand Down Expand Up @@ -344,4 +376,4 @@ public void AddingInvalidNodeArgumentThrowsException(string argument)
Assert.Throws<ArgumentException>(() => serviceBuilder.WithNodeArguments(argument));
}
}
}
}
Loading