Skip to content

Commit bc49f10

Browse files
authored
Bring over changes done in xamarin/xamarin-macios since April (#332)
This PR forward integrates all changes done to the Shared library in the Xamarin repo since April (when the Shared library was copied here)
1 parent 653143a commit bc49f10

File tree

70 files changed

+6315
-1462
lines changed

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

70 files changed

+6315
-1462
lines changed

src/Microsoft.DotNet.XHarness.CLI/Commands/iOS/iOSGetStateCommand.cs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -13,7 +13,7 @@
1313
using Microsoft.DotNet.XHarness.Common.Execution;
1414
using Microsoft.DotNet.XHarness.Common.Logging;
1515
using Microsoft.DotNet.XHarness.iOS;
16-
using Microsoft.DotNet.XHarness.iOS.Shared.Execution.Mlaunch;
16+
using Microsoft.DotNet.XHarness.iOS.Shared.Execution;
1717
using Microsoft.DotNet.XHarness.iOS.Shared.Hardware;
1818
using Microsoft.Extensions.Logging;
1919

@@ -137,7 +137,7 @@ private void AsText(SystemInfo info)
137137

138138
protected override async Task<ExitCode> InvokeInternal(ILogger logger)
139139
{
140-
var processManager = new MLaunchProcessManager(mlaunchPath: _arguments.MlaunchPath);
140+
var processManager = new MlaunchProcessManager(mlaunchPath: _arguments.MlaunchPath);
141141
var deviceLoader = new HardwareDeviceLoader(processManager);
142142
var simulatorLoader = new SimulatorLoader(processManager);
143143
var log = new MemoryLog(); // do we really want to log this?

src/Microsoft.DotNet.XHarness.CLI/Commands/iOS/iOSPackageCommand.cs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -13,7 +13,7 @@
1313
using Microsoft.DotNet.XHarness.Common.CLI.Commands;
1414
using Microsoft.DotNet.XHarness.Common.Logging;
1515
using Microsoft.DotNet.XHarness.Common.Utilities;
16-
using Microsoft.DotNet.XHarness.iOS.Shared.Execution.Mlaunch;
16+
using Microsoft.DotNet.XHarness.iOS.Shared.Execution;
1717
using Microsoft.DotNet.XHarness.iOS.Shared.Logging;
1818
using Microsoft.DotNet.XHarness.iOS.Shared.TestImporter.Templates;
1919
using Microsoft.DotNet.XHarness.iOS.Shared.TestImporter.Templates.Managed;
@@ -47,7 +47,7 @@ public iOSPackageCommand() : base("package", allowsExtraArgs: false, CommandHelp
4747

4848
protected override async Task<ExitCode> InvokeInternal(ILogger logger)
4949
{
50-
var processManager = new MLaunchProcessManager();
50+
var processManager = new MlaunchProcessManager();
5151

5252
// Validate the presence of Xamarin.iOS
5353
var missingXamariniOS = false;

src/Microsoft.DotNet.XHarness.CLI/Commands/iOS/iOSTestCommand.cs

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -15,11 +15,12 @@
1515
using Microsoft.DotNet.XHarness.Common.Logging;
1616
using Microsoft.DotNet.XHarness.iOS;
1717
using Microsoft.DotNet.XHarness.iOS.Shared;
18-
using Microsoft.DotNet.XHarness.iOS.Shared.Execution.Mlaunch;
18+
using Microsoft.DotNet.XHarness.iOS.Shared.Execution;
1919
using Microsoft.DotNet.XHarness.iOS.Shared.Hardware;
2020
using Microsoft.DotNet.XHarness.iOS.Shared.Listeners;
2121
using Microsoft.DotNet.XHarness.iOS.Shared.Logging;
2222
using Microsoft.DotNet.XHarness.iOS.Shared.Utilities;
23+
using Microsoft.DotNet.XHarness.iOS.Shared.XmlResults;
2324
using Microsoft.Extensions.Logging;
2425

2526
namespace Microsoft.DotNet.XHarness.CLI.Commands.iOS
@@ -47,7 +48,7 @@ public iOSTestCommand() : base(CommandHelp)
4748

4849
protected override async Task<ExitCode> InvokeInternal(ILogger logger)
4950
{
50-
var processManager = new MLaunchProcessManager(_arguments.XcodeRoot, _arguments.MlaunchPath);
51+
var processManager = new MlaunchProcessManager(_arguments.XcodeRoot, _arguments.MlaunchPath);
5152
var deviceLoader = new HardwareDeviceLoader(processManager);
5253
var simulatorLoader = new SimulatorLoader(processManager);
5354

@@ -97,7 +98,7 @@ private async Task<ExitCode> RunTest(
9798
ILogger logger,
9899
TestTargetOs target,
99100
Logs logs,
100-
MLaunchProcessManager processManager,
101+
MlaunchProcessManager processManager,
101102
IHardwareDeviceLoader deviceLoader,
102103
ISimulatorLoader simulatorLoader,
103104
ITunnelBore? tunnelBore,

src/Microsoft.DotNet.XHarness.Common/Logging/CallbackLog.cs

Lines changed: 14 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -3,13 +3,17 @@
33
// See the LICENSE file in the project root for more information.
44

55
using System;
6+
using System.Text;
67

78
namespace Microsoft.DotNet.XHarness.Common.Logging
89
{
9-
// A log that forwards all written data to a callback
10+
/// <summary>
11+
/// A log that forwards all written data to a callback
12+
/// </summary>
1013
public class CallbackLog : Log
1114
{
1215
private readonly Action<string> _onWrite;
16+
private readonly StringBuilder _captured = new StringBuilder();
1317

1418
public CallbackLog(Action<string> onWrite)
1519
: base("Callback log")
@@ -25,6 +29,14 @@ public override void Flush()
2529
{
2630
}
2731

28-
protected override void WriteImpl(string value) => _onWrite(value);
32+
protected override void WriteImpl(string value)
33+
{
34+
lock (_captured)
35+
{
36+
_captured.Append(value);
37+
}
38+
39+
_onWrite(value);
40+
}
2941
}
3042
}

src/Microsoft.DotNet.XHarness.Common/Utilities/Extensions.cs

Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -28,5 +28,23 @@ public static async Task<bool> TimeoutAfter(this Task task, TimeSpan timeout)
2828
return false;
2929
}
3030
}
31+
32+
// Returns false if timed out
33+
public static async Task<bool> TimeoutAfter<T>(this Task<T> task, TimeSpan timeout)
34+
{
35+
if (timeout.Ticks < -1)
36+
{
37+
return false;
38+
}
39+
40+
if (task == await Task.WhenAny(task, Task.Delay(timeout)))
41+
{
42+
return true;
43+
}
44+
else
45+
{
46+
return false;
47+
}
48+
}
3149
}
3250
}

src/Microsoft.DotNet.XHarness.Common/XmlResultJargon.cs

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,7 @@ public enum XmlResultJargon
99
NUnitV2,
1010
NUnitV3,
1111
xUnit,
12+
Trx,
1213
Missing,
1314
}
1415
}

src/Microsoft.DotNet.XHarness.TestRunners.Common/ApplicationOptions.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,7 @@
55
using System;
66
using System.Collections.Generic;
77
using Microsoft.DotNet.XHarness.Common;
8-
using Microsoft.DotNet.XHarness.iOS.Shared.Execution.Mlaunch;
8+
using Microsoft.DotNet.XHarness.iOS.Shared.Execution;
99
using Mono.Options;
1010

1111
namespace Microsoft.DotNet.XHarness.TestRunners.Common

src/Microsoft.DotNet.XHarness.TestRunners.Common/Microsoft.DotNet.XHarness.TestRunners.Common.csproj

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -16,7 +16,7 @@
1616
<Compile Include="..\Microsoft.DotNet.XHarness.Common\XmlResultJargon.cs">
1717
<Link>XmlResultJargon.cs</Link>
1818
</Compile>
19-
<Compile Include="..\Microsoft.DotNet.XHarness.iOS.Shared\Execution\Mlaunch\EnviromentVariables.cs">
19+
<Compile Include="..\Microsoft.DotNet.XHarness.iOS.Shared\Execution\EnviromentVariables.cs">
2020
<Link>EnviromentVariables.cs</Link>
2121
</Compile>
2222
</ItemGroup>

src/Microsoft.DotNet.XHarness.iOS.Shared/AppBundleInformationParser.cs

Lines changed: 26 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -11,28 +11,36 @@
1111
using Microsoft.DotNet.XHarness.Common.Logging;
1212
using Microsoft.DotNet.XHarness.iOS.Shared.Utilities;
1313

14+
#nullable enable
1415
namespace Microsoft.DotNet.XHarness.iOS.Shared
1516
{
1617
public interface IAppBundleInformationParser
1718
{
18-
AppBundleInformation ParseFromProject(string projectFilePath, TestTarget target, string buildConfiguration);
19+
Task<AppBundleInformation> ParseFromProject(string projectFilePath, TestTarget target, string buildConfiguration);
1920

2021
Task<AppBundleInformation> ParseFromAppBundle(string appPackagePath, TestTarget target, ILog log, CancellationToken cancellationToken = default);
2122
}
2223

24+
public interface IAppBundleLocator
25+
{
26+
Task<string> LocateAppBundle(XmlDocument projectFile, string projectFilePath);
27+
}
28+
2329
public class AppBundleInformationParser : IAppBundleInformationParser
2430
{
2531
private const string PlistBuddyPath = "/usr/libexec/PlistBuddy";
2632
private const string Armv7 = "armv7";
2733

2834
private readonly IProcessManager _processManager;
35+
private readonly IAppBundleLocator? _appBundleLocator;
2936

30-
public AppBundleInformationParser(IProcessManager processManager)
37+
public AppBundleInformationParser(IProcessManager processManager, IAppBundleLocator? appBundleLocator = null)
3138
{
32-
_processManager = processManager ?? throw new System.ArgumentNullException(nameof(processManager));
39+
_processManager = processManager ?? throw new ArgumentNullException(nameof(processManager));
40+
_appBundleLocator = appBundleLocator;
3341
}
3442

35-
public AppBundleInformation ParseFromProject(string projectFilePath, TestTarget target, string buildConfiguration)
43+
public async Task<AppBundleInformation> ParseFromProject(string projectFilePath, TestTarget target, string buildConfiguration)
3644
{
3745
var csproj = new XmlDocument();
3846
csproj.LoadWithoutNetworkAccess(projectFilePath);
@@ -41,7 +49,7 @@ public AppBundleInformation ParseFromProject(string projectFilePath, TestTarget
4149
string info_plist_path = csproj.GetInfoPListInclude();
4250

4351
var info_plist = new XmlDocument();
44-
string plistPath = Path.Combine(Path.GetDirectoryName(projectFilePath), info_plist_path.Replace('\\', Path.DirectorySeparatorChar));
52+
string plistPath = Path.Combine(Path.GetDirectoryName(projectFilePath)!, info_plist_path.Replace('\\', Path.DirectorySeparatorChar));
4553
info_plist.LoadWithoutNetworkAccess(plistPath);
4654

4755
string bundleIdentifier = info_plist.GetCFBundleIdentifier();
@@ -55,9 +63,19 @@ public AppBundleInformation ParseFromProject(string projectFilePath, TestTarget
5563

5664
var platform = target.IsSimulator() ? "iPhoneSimulator" : "iPhone";
5765

58-
string appPath = Path.Combine(Path.GetDirectoryName(projectFilePath),
59-
csproj.GetOutputPath(platform, buildConfiguration).Replace('\\', Path.DirectorySeparatorChar),
60-
appName + (extension != null ? ".appex" : ".app"));
66+
string appPath;
67+
68+
if (_appBundleLocator != null)
69+
{
70+
appPath = await _appBundleLocator.LocateAppBundle(csproj, projectFilePath);
71+
}
72+
else
73+
{
74+
appPath = Path.Combine(
75+
Path.GetDirectoryName(projectFilePath)!,
76+
csproj.GetOutputPath(platform, buildConfiguration).Replace('\\', Path.DirectorySeparatorChar),
77+
appName + (extension != null ? ".appex" : ".app"));
78+
}
6179

6280
string arch = csproj.GetMtouchArch(platform, buildConfiguration);
6381

src/Microsoft.DotNet.XHarness.iOS.Shared/CrashSnapshotReporter.cs

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,7 @@
1010
using System.Threading;
1111
using System.Threading.Tasks;
1212
using Microsoft.DotNet.XHarness.Common.Logging;
13-
using Microsoft.DotNet.XHarness.iOS.Shared.Execution.Mlaunch;
13+
using Microsoft.DotNet.XHarness.iOS.Shared.Execution;
1414
using Microsoft.DotNet.XHarness.iOS.Shared.Logging;
1515

1616
namespace Microsoft.DotNet.XHarness.iOS.Shared
@@ -23,7 +23,7 @@ public interface ICrashSnapshotReporter
2323

2424
public class CrashSnapshotReporter : ICrashSnapshotReporter
2525
{
26-
private readonly IMLaunchProcessManager _processManager;
26+
private readonly IMlaunchProcessManager _processManager;
2727
private readonly ILog _log;
2828
private readonly ILogs _logs;
2929
private readonly bool _isDevice;
@@ -32,7 +32,7 @@ public class CrashSnapshotReporter : ICrashSnapshotReporter
3232
private readonly string _symbolicateCrashPath;
3333
private HashSet<string> _initialCrashes;
3434

35-
public CrashSnapshotReporter(IMLaunchProcessManager processManager,
35+
public CrashSnapshotReporter(IMlaunchProcessManager processManager,
3636
ILog log,
3737
ILogs logs,
3838
bool isDevice,

src/Microsoft.DotNet.XHarness.iOS.Shared/Execution/Mlaunch/Arguments.cs renamed to src/Microsoft.DotNet.XHarness.iOS.Shared/Execution/Arguments.cs

Lines changed: 7 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,7 @@
44

55
using System;
66

7-
namespace Microsoft.DotNet.XHarness.iOS.Shared.Execution.Mlaunch
7+
namespace Microsoft.DotNet.XHarness.iOS.Shared.Execution
88
{
99

1010
/// <summary>
@@ -207,11 +207,14 @@ public sealed class SetEnvVariableArgument : MlaunchArgument
207207
public SetEnvVariableArgument(string variableName, object variableValue)
208208
{
209209
_variableName = variableName ?? throw new ArgumentNullException(nameof(variableName));
210-
_variableValue = variableValue?.ToString() ?? throw new ArgumentNullException(nameof(variableValue));
211210

212-
if (variableValue is bool)
211+
if (variableValue is bool b)
213212
{
214-
_variableValue = _variableValue.ToLower();
213+
_variableValue = b.ToString().ToLowerInvariant();
214+
}
215+
else
216+
{
217+
_variableValue = variableValue?.ToString() ?? throw new ArgumentNullException(nameof(variableValue));
215218
}
216219
}
217220

src/Microsoft.DotNet.XHarness.iOS.Shared/Execution/Mlaunch/EnviromentVariables.cs renamed to src/Microsoft.DotNet.XHarness.iOS.Shared/Execution/EnviromentVariables.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
namespace Microsoft.DotNet.XHarness.iOS.Shared.Execution.Mlaunch
1+
namespace Microsoft.DotNet.XHarness.iOS.Shared.Execution
22
{
33
public static class EnviromentVariables
44
{

src/Microsoft.DotNet.XHarness.iOS.Shared/Execution/Mlaunch/IMLaunchProcessManager.cs renamed to src/Microsoft.DotNet.XHarness.iOS.Shared/Execution/IMlaunchProcessManager.cs

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -9,11 +9,12 @@
99
using System.Threading.Tasks;
1010
using Microsoft.DotNet.XHarness.Common.Execution;
1111
using Microsoft.DotNet.XHarness.Common.Logging;
12+
using Microsoft.DotNet.XHarness.iOS.Shared.Execution;
1213

1314
#nullable enable
14-
namespace Microsoft.DotNet.XHarness.iOS.Shared.Execution.Mlaunch
15+
namespace Microsoft.DotNet.XHarness.iOS.Shared.Execution
1516
{
16-
public interface IMLaunchProcessManager : IMacOSProcessManager, IProcessManager
17+
public interface IMlaunchProcessManager : IMacOSProcessManager, IProcessManager
1718
{
1819
string MlaunchPath { get; }
1920

src/Microsoft.DotNet.XHarness.iOS.Shared/Execution/Mlaunch/MLaunchArguments.cs renamed to src/Microsoft.DotNet.XHarness.iOS.Shared/Execution/MLaunchArguments.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,7 @@
88
using System.Linq;
99
using Microsoft.DotNet.XHarness.Common.Utilities;
1010

11-
namespace Microsoft.DotNet.XHarness.iOS.Shared.Execution.Mlaunch
11+
namespace Microsoft.DotNet.XHarness.iOS.Shared.Execution
1212
{
1313
// mlaunch is really important and has a lot of arguments that are known but
1414
// used to be passed as strings. This class allows to add arguments without

src/Microsoft.DotNet.XHarness.iOS.Shared/Execution/Mlaunch/MLaunchProcessManager.cs renamed to src/Microsoft.DotNet.XHarness.iOS.Shared/Execution/MlaunchProcessManager.cs

Lines changed: 5 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -10,16 +10,17 @@
1010
using System.Threading.Tasks;
1111
using Microsoft.DotNet.XHarness.Common.Execution;
1212
using Microsoft.DotNet.XHarness.Common.Logging;
13+
using Microsoft.DotNet.XHarness.iOS.Shared.Execution;
1314

1415
#nullable enable
15-
namespace Microsoft.DotNet.XHarness.iOS.Shared.Execution.Mlaunch
16+
namespace Microsoft.DotNet.XHarness.iOS.Shared.Execution
1617
{
17-
public class MLaunchProcessManager : MacOSProcessManager, IMLaunchProcessManager
18+
public class MlaunchProcessManager : MacOSProcessManager, IMlaunchProcessManager
1819
{
19-
#region IMLaunchProcessManager implementation
20+
#region IMlaunchProcessManager implementation
2021
public string MlaunchPath { get; }
2122

22-
public MLaunchProcessManager(string? xcodeRoot = null, string mlaunchPath = "/Library/Frameworks/Xamarin.iOS.framework/Versions/Current/bin/mlaunch") : base(xcodeRoot)
23+
public MlaunchProcessManager(string? xcodeRoot = null, string mlaunchPath = "/Library/Frameworks/Xamarin.iOS.framework/Versions/Current/bin/mlaunch") : base(xcodeRoot)
2324
{
2425
MlaunchPath = mlaunchPath;
2526
}

src/Microsoft.DotNet.XHarness.iOS.Shared/Hardware/HardwareDeviceLoader.cs

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,7 @@
1212
using System.Xml;
1313
using Microsoft.DotNet.XHarness.Common.Logging;
1414
using Microsoft.DotNet.XHarness.iOS.Shared.Collections;
15-
using Microsoft.DotNet.XHarness.iOS.Shared.Execution.Mlaunch;
15+
using Microsoft.DotNet.XHarness.iOS.Shared.Execution;
1616
using Microsoft.DotNet.XHarness.iOS.Shared.Utilities;
1717

1818
namespace Microsoft.DotNet.XHarness.iOS.Shared.Hardware
@@ -33,7 +33,7 @@ public interface IHardwareDeviceLoader : IDeviceLoader
3333

3434
public class HardwareDeviceLoader : IHardwareDeviceLoader
3535
{
36-
private readonly IMLaunchProcessManager _processManager;
36+
private readonly IMlaunchProcessManager _processManager;
3737
private bool _loaded;
3838
private readonly BlockingEnumerableCollection<IHardwareDevice> _connectedDevices = new BlockingEnumerableCollection<IHardwareDevice>();
3939
private readonly SemaphoreSlim _semaphore = new SemaphoreSlim(1);
@@ -45,7 +45,7 @@ public class HardwareDeviceLoader : IHardwareDeviceLoader
4545
public IEnumerable<IHardwareDevice> ConnectedWatch => _connectedDevices.Where(x => x.DevicePlatform == DevicePlatform.watchOS && x.Architecture == Architecture.ARMv7k);
4646
public IEnumerable<IHardwareDevice> ConnectedWatch32_64 => _connectedDevices.Where(x => x.DevicePlatform == DevicePlatform.watchOS && x.Architecture == Architecture.ARM64_32);
4747

48-
public HardwareDeviceLoader(IMLaunchProcessManager processManager)
48+
public HardwareDeviceLoader(IMlaunchProcessManager processManager)
4949
{
5050
_processManager = processManager ?? throw new ArgumentNullException(nameof(processManager));
5151
}

src/Microsoft.DotNet.XHarness.iOS.Shared/Hardware/IDevice.cs

Lines changed: 14 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,9 +2,10 @@
22
// The .NET Foundation licenses this file to you under the MIT license.
33
// See the LICENSE file in the project root for more information.
44

5+
using System;
6+
57
namespace Microsoft.DotNet.XHarness.iOS.Shared.Hardware
68
{
7-
89
public enum Architecture
910
{
1011
ARMv6,
@@ -32,4 +33,16 @@ public interface IDevice
3233
string UDID { get; }
3334
string OSVersion { get; }
3435
}
36+
37+
public static class DevicePlatformExtensions
38+
{
39+
public static string AsString(this DevicePlatform value) => value switch
40+
{
41+
DevicePlatform.iOS => "iOS",
42+
DevicePlatform.tvOS => "tvOS",
43+
DevicePlatform.watchOS => "watchOS",
44+
DevicePlatform.macOS => "macOS",
45+
_ => throw new Exception($"Unknown platform: {value}"),
46+
};
47+
}
3548
}

src/Microsoft.DotNet.XHarness.iOS.Shared/Hardware/ISimulatorDevice.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -79,7 +79,7 @@ public interface ISimulatorDevice : IDevice
7979
bool IsWatchSimulator { get; }
8080
Task Erase(ILog log);
8181
Task Shutdown(ILog log);
82-
Task PrepareSimulator(ILog log, params string[] bundle_identifiers);
82+
Task<bool> PrepareSimulator(ILog log, params string[] bundleIdentifiers);
8383
Task KillEverything(ILog log);
8484
}
8585

0 commit comments

Comments
 (0)