diff --git a/.ably/capabilities.yaml b/.ably/capabilities.yaml index a1ab64a36..a38444fc1 100644 --- a/.ably/capabilities.yaml +++ b/.ably/capabilities.yaml @@ -4,6 +4,7 @@ common-version: 1.2.0 compliance: Agent Identifier: Agents: + Operating System: Runtime: Authentication: API Key: diff --git a/.config/dotnet-tools.json b/.config/dotnet-tools.json index 3dc104b04..b9fc50005 100644 --- a/.config/dotnet-tools.json +++ b/.config/dotnet-tools.json @@ -2,11 +2,33 @@ "version": 1, "isRoot": true, "tools": { + "paket": { + "version": "7.2.0", + "commands": [ + "paket" + ], + "_link": "https://github.com/fsprojects/Paket" + }, "fake-cli": { - "version": "5.20.3", + "version": "5.23.1", "commands": [ "fake" - ] + ], + "_link": "https://github.com/fsprojects/FAKE" + }, + "fsdocs-tool": { + "version": "17.2.0", + "commands": [ + "fsdocs" + ], + "_link": "https://github.com/fsprojects/FSharp.Formatting" + }, + "fantomas": { + "version": "5.1.5", + "commands": [ + "fantomas" + ], + "_link": "https://github.com/fsprojects/fantomas" } } } \ No newline at end of file diff --git a/.github/workflows/integration-test-linux.yml b/.github/workflows/integration-test-linux.yml deleted file mode 100644 index 1dcebfaee..000000000 --- a/.github/workflows/integration-test-linux.yml +++ /dev/null @@ -1,27 +0,0 @@ -name: "Integration Test: Linux" -on: - pull_request: - push: - branches: - - main - -jobs: - check: - runs-on: ubuntu-latest - env: - DOTNET_NOLOGO: true - - steps: - - uses: actions/checkout@v2 - with: - submodules: 'recursive' - - name: Download dotnet framework - uses: actions/setup-dotnet@v1 - with: - dotnet-version: '3.1.x' - - name: Download fake-cli - run: dotnet tool install fake-cli --version 5.20.4 --tool-path . - - name: Unit tests - run: ./build.sh Test.NetStandard.Unit.WithRetry - - name: Integration tests - run: ./build.sh Test.NetStandard.Integration diff --git a/.github/workflows/integration-test-macos.yml b/.github/workflows/integration-test-macos.yml deleted file mode 100644 index f68dc0211..000000000 --- a/.github/workflows/integration-test-macos.yml +++ /dev/null @@ -1,32 +0,0 @@ -name: "Integration Test: macOS" -on: - pull_request: - push: - branches: - - main - -jobs: - check: - runs-on: macos-latest - env: - DOTNET_NOLOGO: true - - steps: - - uses: actions/checkout@v2 - with: - submodules: 'recursive' - - name: Download dotnet framework - uses: actions/setup-dotnet@v1 - with: - dotnet-version: '3.1.x' - - name: Download fake-cli - run: dotnet tool install fake-cli --version 5.20.4 --tool-path . - - name: Restore packages - run: | - nuget restore ./src/IO.Ably.Xamarin.sln - - name: Build Xamarin projects - run: ./build.sh Build.Xamarin - - name: Unit tests - run: ./build.sh Test.NetStandard.Unit.WithRetry - - name: Integration tests - run: ./build.sh Test.NetStandard.Integration diff --git a/.github/workflows/integration-test-windows.yml b/.github/workflows/integration-test-windows.yml deleted file mode 100644 index 4e88c8140..000000000 --- a/.github/workflows/integration-test-windows.yml +++ /dev/null @@ -1,31 +0,0 @@ -name: "Integration Test: Windows" -on: - pull_request: - push: - branches: - - main - -jobs: - check: - runs-on: windows-latest - env: - DOTNET_NOLOGO: true - - strategy: - matrix: - target: [ "Test.NetStandard", "Test.NetFramework" ] - - steps: - - uses: actions/checkout@v2 - with: - submodules: 'recursive' - - name: Download framework - uses: actions/setup-dotnet@v1 - with: - dotnet-version: '3.1.x' - - name: Download fake-cli - run: dotnet tool install fake-cli --version 5.20.4 --tool-path . - - name: Unit tests - run: ./build.cmd ${{ matrix.target }}.Unit - - name: Integration tests - run: ./build.cmd ${{ matrix.target }}.Integration diff --git a/.github/workflows/package.yml b/.github/workflows/package.yml index 6086fa3cc..5c3a69e06 100644 --- a/.github/workflows/package.yml +++ b/.github/workflows/package.yml @@ -14,11 +14,14 @@ jobs: with: submodules: 'recursive' - name: Download dotnet framework - uses: actions/setup-dotnet@v1 + uses: actions/setup-dotnet@v3 with: - dotnet-version: '3.1.x' + dotnet-version: | + 3.1.x + 6.0.x + 7.0.x - name: Download fake-cli - run: dotnet tool install fake-cli --version 5.20.4 --tool-path . + run: dotnet tool restore - name: Package run: ./package.cmd ${{ github.event.inputs.version }} - name: Archive package @@ -38,9 +41,12 @@ jobs: with: submodules: 'recursive' - name: Download dotnet framework - uses: actions/setup-dotnet@v1 + uses: actions/setup-dotnet@v3 with: - dotnet-version: '3.1.x' + dotnet-version: | + 3.1.x + 6.0.x + 7.0.x - name: Download fake-cli run: dotnet tool install fake-cli --version 5.20.4 --tool-path . - name: Restore packages diff --git a/.github/workflows/run-tests-linux.yml b/.github/workflows/run-tests-linux.yml new file mode 100644 index 000000000..2c26b9003 --- /dev/null +++ b/.github/workflows/run-tests-linux.yml @@ -0,0 +1,37 @@ +name: "Unit and Integration Test: Linux" +on: + pull_request: + push: + branches: + - main + +jobs: + check: + runs-on: ubuntu-latest + env: + DOTNET_NOLOGO: true + + strategy: + matrix: + targetframework: [ "net6.0", "net7.0" ] + + steps: + - uses: actions/checkout@v2 + with: + submodules: 'recursive' + + - name: Download dotnet framework + uses: actions/setup-dotnet@v3 + with: + dotnet-version: | + 6.0.x + 7.0.x + + - name: Download dotnet build-script tools + run: dotnet tool restore + + - name: Unit tests + run: ./build.sh Test.NetStandard.Unit.WithRetry -f ${{ matrix.targetframework }} + + - name: Integration tests + run: ./build.sh Test.NetStandard.Integration.WithRetry -f ${{ matrix.targetframework }} diff --git a/.github/workflows/run-tests-macos-xamarin.yml b/.github/workflows/run-tests-macos-xamarin.yml new file mode 100644 index 000000000..0d2666546 --- /dev/null +++ b/.github/workflows/run-tests-macos-xamarin.yml @@ -0,0 +1,39 @@ +name: "Unit and Integration Test: macOS (Xamarin)" +on: + pull_request: + push: + branches: + - main + +jobs: + check: + runs-on: macos-latest + env: + DOTNET_NOLOGO: true + + steps: + - uses: actions/checkout@v2 + with: + submodules: 'recursive' + + - name: Download dotnet framework + uses: actions/setup-dotnet@v3 + with: + dotnet-version: | + 3.1.x + + - name: Download dotnet build-script tools + run: dotnet tool restore + + - name: Install mono + run: | + ./tools/mono-install.sh + + - name: Build Xamarin projects + run: ./build.sh Build.Xamarin + + - name: Run Unit tests using mono + run: ./build.sh Test.NetFramework.Unit.WithRetry + + - name: Run Integration tests using mono + run: ./build.sh Test.NetFramework.Integration.WithRetry diff --git a/.github/workflows/run-tests-macos.yml b/.github/workflows/run-tests-macos.yml new file mode 100644 index 000000000..2c9ac1edd --- /dev/null +++ b/.github/workflows/run-tests-macos.yml @@ -0,0 +1,37 @@ +name: "Unit and Integration Test: macOS" +on: + pull_request: + push: + branches: + - main + +jobs: + check: + runs-on: macos-latest + env: + DOTNET_NOLOGO: true + + strategy: + matrix: + targetframework: [ "net6.0", "net7.0" ] + + steps: + - uses: actions/checkout@v2 + with: + submodules: 'recursive' + + - name: Download dotnet framework + uses: actions/setup-dotnet@v3 + with: + dotnet-version: | + 6.0.x + 7.0.x + + - name: Download dotnet build-script tools + run: dotnet tool restore + + - name: Unit tests + run: ./build.sh Test.NetStandard.Unit.WithRetry -f ${{ matrix.targetframework }} + + - name: Integration tests + run: ./build.sh Test.NetStandard.Integration.WithRetry -f ${{ matrix.targetframework }} diff --git a/.github/workflows/run-tests-windows-netframework.yml b/.github/workflows/run-tests-windows-netframework.yml new file mode 100644 index 000000000..f2ce7acba --- /dev/null +++ b/.github/workflows/run-tests-windows-netframework.yml @@ -0,0 +1,26 @@ +name: "Unit and Integration Test: Windows (NetFramework)" +on: + pull_request: + push: + branches: + - main + +jobs: + check: + runs-on: windows-latest + env: + DOTNET_NOLOGO: true + + steps: + - uses: actions/checkout@v2 + with: + submodules: 'recursive' + + - name: Download dotnet build-script tools + run: dotnet tool restore + + - name: Unit tests + run: ./build.cmd Test.NetFramework.Unit.WithRetry + + - name: Integration tests + run: ./build.cmd Test.NetFramework.Integration.WithRetry diff --git a/.github/workflows/run-tests-windows.yml b/.github/workflows/run-tests-windows.yml new file mode 100644 index 000000000..d40cf1501 --- /dev/null +++ b/.github/workflows/run-tests-windows.yml @@ -0,0 +1,37 @@ +name: "Unit and Integration Test: Windows" +on: + pull_request: + push: + branches: + - main + +jobs: + check: + runs-on: windows-latest + env: + DOTNET_NOLOGO: true + + strategy: + matrix: + targetframework: [ "net6.0", "net7.0" ] + + steps: + - uses: actions/checkout@v2 + with: + submodules: 'recursive' + + - name: Download framework + uses: actions/setup-dotnet@v3 + with: + dotnet-version: | + 6.0.x + 7.0.x + + - name: Download dotnet build-script tools + run: dotnet tool restore + + - name: Unit tests + run: ./build.cmd Test.NetStandard.Unit.WithRetry -f ${{ matrix.targetframework }} + + - name: Integration tests + run: ./build.cmd Test.NetStandard.Integration.WithRetry -f ${{ matrix.targetframework }} diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md index ea3c57238..b7d5073c5 100644 --- a/CONTRIBUTING.md +++ b/CONTRIBUTING.md @@ -11,15 +11,8 @@ ## Building and Packaging -The build scripts are written using ```fake``` and need to be run on Windows with Visual Studio 2019 installed. Fake and nuget.exe can be installed via [chocolatey](https://chocolatey.org) - -```shell -choco install fake -choco install nuget.commandline -``` - -Running `.\build.cmd` will start the build process and run the tests. By default it runs the NetFramework tests. -To run the Netcore build and tests you can run `.\build.cmd Test.NetStandard` +- The build scripts are written using [fake build project](https://fake.build/guide/getting-started.html#Run-FAKE-using-a-dedicated-build-project). +- For more information on building, testing and packaging, take a look at [FAKE build scripts](./build-script/README.md). ## Working from source diff --git a/README.md b/README.md index 84b3121a2..5f50705ca 100644 --- a/README.md +++ b/README.md @@ -12,12 +12,14 @@ This is a .NET client library for Ably. The library currently targets the [Ably ## Supported platforms -* .NET (Core) 3.1+ -* .NET Framework 4.8 -* .NET Standard 2.0+ +* [.NET Standard 2.0+](https://learn.microsoft.com/en-us/dotnet/standard/net-standard?tabs=net-standard-2-0) +* .NET 6.x, 7.x (MAUI supported) +* .NET Framework 4.6+ +* .NET (Core) 2.0+ * Mono 5.4+ * [Xamarin.Android 8.0+](https://developer.xamarin.com/releases/android/xamarin.android_8/xamarin.android_8.0/) -* [Xamarin.iOS 11.4+](https://developer.xamarin.com/releases/ios/xamarin.ios_11/xamarin.ios_11.4/) +* [Xamarin.iOS 10.14+](https://developer.xamarin.com/releases/ios/xamarin.ios_10/xamarin.ios_10.14/) +* Xamarin.Mac 3.8+ ## Push notification @@ -49,7 +51,6 @@ The [Push Notifications Readme](PushNotifications.md) describes: ## Known Limitations * Browser push notifications in [Blazor](https://dotnet.microsoft.com/en-us/apps/aspnet/web-apps/blazor) are not supported. -* [MAUI framework](https://dotnet.microsoft.com/en-us/apps/maui) is under testing and not yet fully supported, see [MAUI issue](https://github.com/ably/ably-dotnet/issues/1205). ## Documentation diff --git a/build-script/.paket/Paket.Restore.targets b/build-script/.paket/Paket.Restore.targets new file mode 100644 index 000000000..4deb15bcd --- /dev/null +++ b/build-script/.paket/Paket.Restore.targets @@ -0,0 +1,557 @@ + + + + + + + $(MSBuildAllProjects);$(MSBuildThisFileFullPath) + + $(MSBuildVersion) + 15.0.0 + false + true + + true + $(MSBuildThisFileDirectory) + $(MSBuildThisFileDirectory)..\ + $(PaketRootPath)paket-files\paket.restore.cached + $(PaketRootPath)paket.lock + classic + proj + assembly + native + /Library/Frameworks/Mono.framework/Commands/mono + mono + + + $(PaketRootPath)paket.bootstrapper.exe + $(PaketToolsPath)paket.bootstrapper.exe + $([System.IO.Path]::GetDirectoryName("$(PaketBootStrapperExePath)"))\ + + "$(PaketBootStrapperExePath)" + $(MonoPath) --runtime=v4.0.30319 "$(PaketBootStrapperExePath)" + + + + + true + true + + + True + + + False + + $(BaseIntermediateOutputPath.TrimEnd('\').TrimEnd('\/')) + + + + + + + + + $(PaketRootPath)paket + $(PaketToolsPath)paket + + + + + + $(PaketRootPath)paket.exe + $(PaketToolsPath)paket.exe + + + + + + <_DotnetToolsJson Condition="Exists('$(PaketRootPath)/.config/dotnet-tools.json')">$([System.IO.File]::ReadAllText("$(PaketRootPath)/.config/dotnet-tools.json")) + <_ConfigContainsPaket Condition=" '$(_DotnetToolsJson)' != ''">$(_DotnetToolsJson.Contains('"paket"')) + <_ConfigContainsPaket Condition=" '$(_ConfigContainsPaket)' == ''">false + + + + + + + + + + + <_PaketCommand>dotnet paket + + + + + + $(PaketToolsPath)paket + $(PaketBootStrapperExeDir)paket + + + paket + + + + + <_PaketExeExtension>$([System.IO.Path]::GetExtension("$(PaketExePath)")) + <_PaketCommand Condition=" '$(_PaketCommand)' == '' AND '$(_PaketExeExtension)' == '.dll' ">dotnet "$(PaketExePath)" + <_PaketCommand Condition=" '$(_PaketCommand)' == '' AND '$(OS)' != 'Windows_NT' AND '$(_PaketExeExtension)' == '.exe' ">$(MonoPath) --runtime=v4.0.30319 "$(PaketExePath)" + <_PaketCommand Condition=" '$(_PaketCommand)' == '' ">"$(PaketExePath)" + + + + + + + + + + + + + + + + + + + + + true + $(NoWarn);NU1603;NU1604;NU1605;NU1608 + false + true + + + + + + + + + $([System.IO.File]::ReadAllText('$(PaketRestoreCacheFile)')) + + + + + + + $([System.Text.RegularExpressions.Regex]::Split(`%(Identity)`, `": "`)[0].Replace(`"`, ``).Replace(` `, ``)) + $([System.Text.RegularExpressions.Regex]::Split(`%(Identity)`, `": "`)[1].Replace(`"`, ``).Replace(` `, ``)) + + + + + %(PaketRestoreCachedKeyValue.Value) + %(PaketRestoreCachedKeyValue.Value) + + + + + true + false + true + + + + + true + + + + + + + + + + + + + + + + + + + $(PaketIntermediateOutputPath)\$(MSBuildProjectFile).paket.references.cached + + $(MSBuildProjectFullPath).paket.references + + $(MSBuildProjectDirectory)\$(MSBuildProjectName).paket.references + + $(MSBuildProjectDirectory)\paket.references + + false + true + true + references-file-or-cache-not-found + + + + + $([System.IO.File]::ReadAllText('$(PaketReferencesCachedFilePath)')) + $([System.IO.File]::ReadAllText('$(PaketOriginalReferencesFilePath)')) + references-file + false + + + + + false + + + + + true + target-framework '$(TargetFramework)' or '$(TargetFrameworks)' files @(PaketResolvedFilePaths) + + + + + + + + + + + false + true + + + + + + + + + + + $([System.String]::Copy('%(PaketReferencesFileLines.Identity)').Split(',').Length) + $([System.String]::Copy('%(PaketReferencesFileLines.Identity)').Split(',')[0]) + $([System.String]::Copy('%(PaketReferencesFileLines.Identity)').Split(',')[1]) + $([System.String]::Copy('%(PaketReferencesFileLines.Identity)').Split(',')[4]) + $([System.String]::Copy('%(PaketReferencesFileLines.Identity)').Split(',')[5]) + $([System.String]::Copy('%(PaketReferencesFileLines.Identity)').Split(',')[6]) + $([System.String]::Copy('%(PaketReferencesFileLines.Identity)').Split(',')[7]) + + + %(PaketReferencesFileLinesInfo.PackageVersion) + All + runtime + $(ExcludeAssets);contentFiles + $(ExcludeAssets);build;buildMultitargeting;buildTransitive + true + true + + + + + $(PaketIntermediateOutputPath)/$(MSBuildProjectFile).paket.clitools + + + + + + + + + $([System.String]::Copy('%(PaketCliToolFileLines.Identity)').Split(',')[0]) + $([System.String]::Copy('%(PaketCliToolFileLines.Identity)').Split(',')[1]) + + + %(PaketCliToolFileLinesInfo.PackageVersion) + + + + + + + + + + false + + + + + + <_NuspecFilesNewLocation Include="$(PaketIntermediateOutputPath)\$(Configuration)\*.nuspec"/> + + + + + + $(MSBuildProjectDirectory)/$(MSBuildProjectFile) + true + false + true + false + true + false + true + false + true + false + true + $(PaketIntermediateOutputPath)\$(Configuration) + $(PaketIntermediateOutputPath) + + + + <_NuspecFiles Include="$(AdjustedNuspecOutputPath)\*.$(PackageVersion.Split(`+`)[0]).nuspec"/> + + + + + + + + + + + + + + + + + + + + + + + diff --git a/build-script/README.md b/build-script/README.md new file mode 100644 index 000000000..6350b6a8d --- /dev/null +++ b/build-script/README.md @@ -0,0 +1,86 @@ +### F# project for building, testing and packaging ably-dotnet SDK + +- This is a F# project created as per [Run-FAKE-using-a-dedicated-build-project](https://fake.build/guide/getting-started.html#Run-FAKE-using-a-dedicated-build-project). +- This contains scripts to build, test and package projects targetting multiple platforms. +- Clone the project and download fake tools by running following command at root. +``` +dotnet tool restore +``` +- Running `.\build.cmd` will start the build process. By default it builds NetStandard project. + +### Build Netframework +- We have a dedicated netframework project targeting .NetFramework 4.6+. +- Build NetFramework project +``` +./build.cmd Build.NetFramework +``` + +### Build NetStandard +- Netstandard currently supports explicit targets for netstandard2.0, net6.0 and net7.0. +- Build NetStandard project +``` +./build.sh Build.NetStandard +``` + +### Build Xamarin +- We have a xamarin solution targetting android and iOS. +- Build Xamarin project +``` +./build.sh Build.Xamarin +``` +### Test Netframework +Run unit tests +``` +./build.cmd Test.NetFramework.Unit +./build.cmd Test.NetFramework.Unit.WithRetry // Retry failed tests +``` +Run integration tests +``` +./build.cmd Test.NetFramework.Integration +./build.cmd Test.NetFramework.Integration.WithRetry // Retry failed tests +``` + + +### Test NetStandard +Run unit tests +``` +./build.sh Test.NetStandard.Unit +./build.sh Test.NetStandard.Unit.WithRetry // Retry failed tests +``` +Run integration tests +``` +./build.sh Test.NetStandard.Integration +./build.sh Test.NetStandard.Integration.WithRetry // Retry failed tests +``` +- Additional `-f` flag can be supplied to test for target framework `net6.0` or `net7.0` +``` +./build.sh Test.NetStandard.Unit -f net6.0 // run tests for .Net6.0 runtime +./build.sh Test.NetStandard.Unit -f net7.0 // run tests for .Net7.0 runtime +``` + +### Create Nuget packages +- Currently, we have two scripts to generate nuget packages +1. package.sh => +- Responsible for creating core `ably.io` nuget package. +``` +./package.sh 1.2.3 +``` +- Above command creates `ably.io.1.2.3.nupkg` package at root. +- During release process, this package is hosted on [nuget-ably.io](https://www.nuget.org/packages/ably.io). + +2. package-push.sh => +- Responsible for creating push packages for android and iOS. +- Please take a look at [Push Notif Doc](../PushNotifications.md) for usage. +``` +./package-push.sh 1.2.3 +``` +- Above command creates `ably.io.push.android.1.2.3.nupkg` and `ably.io.push.ios.1.2.3` package at root. +- During release process, this package is hosted on [nuget-ably.io.push.android](https://www.nuget.org/packages/ably.io.push.android) and [nuget-ably.io.push.ios](https://www.nuget.org/packages/ably.io.push.ios). + +### Development +- Please refer to [Getting Started](https://fake.build/guide/what-is-fake.html) for detailed documentation. +- Format `build.fs` by running following command at root. + +``` +dotnet fantomas .\build-script\build.fs +``` diff --git a/build-script/build-script.fsproj b/build-script/build-script.fsproj new file mode 100644 index 000000000..1eb82ea29 --- /dev/null +++ b/build-script/build-script.fsproj @@ -0,0 +1,15 @@ + + + + Exe + net6.0 + build_script + 3390;$(WarnOn) + 0020 + false + + + + + + \ No newline at end of file diff --git a/build-script/build.fs b/build-script/build.fs new file mode 100644 index 000000000..793a12339 --- /dev/null +++ b/build-script/build.fs @@ -0,0 +1,548 @@ +open Fake.Core.TargetOperators +open Fake.Core +open Fake.IO.Globbing.Operators +open Fake.DotNet +open Fake.IO +open Fake +open System +open Fake.DotNet.Testing +open Fake.DotNet.Testing.XUnit2 +open System.Xml.Linq +open System.Xml.XPath +open FSharp.Core +open Fake.Testing.Common +open System.IO +open System.Text.RegularExpressions + +let currentDir = DirectoryInfo(__SOURCE_DIRECTORY__).Parent.FullName + +let netstandardTestDir = "src/IO.Ably.Tests.DotNET" +let xUnit2 = XUnit2.run + +let NetStandardSolution = "src/IO.Ably.NetStandard.sln" +let NetFrameworkSolution = "src/IO.Ably.NetFramework.sln" +let XamarinSolution = "src/IO.Ably.Xamarin.sln" +let buildDir = Path.combine currentDir "build" +let srcDir = Path.combine currentDir "src" +let testResultsDir = Path.combine buildDir "tests" +let packageDir = Path.combine buildDir "package" +let configuration = DotNet.Release +let packageSolution = "src/IO.Ably.Package.sln" +let pushPackageSolution = "src/IO.Ably.PackagePush.sln" +let buildMode = Environment.environVarOrDefault "buildMode" "Release" + +type TestRun = + | Method of string + | UnitTests + | IntegrationTests + +let cli = + """ +Usage: + prog [options] + +Options: + -t Target + -v Version + -f Target Framework Moniker (TFM) +""" + +let initTargets (argv) = + + + // retrieve the fake 5 context information + // let ctx = Context.forceFakeContext () + // get the arguments + // let args = ctx.Arguments + let parser = Docopt(cli) + //let parsedArguments = parser.Parse(args |> List.toArray) + + let parsedArguments = parser.Parse(argv) + + let version = + match DocoptResult.tryGetArgument "-v" parsedArguments with + | None -> "" + | Some version -> version + + let framework: string option = + match DocoptResult.tryGetArgument "-f" parsedArguments with + | None -> None + | Some framework -> Some framework + + let mergeJsonNet path outputPath = + let target = Path.combine path "IO.Ably.dll" + let docsFile = Path.combine path "IO.Ably.xml" + let out = Path.combine outputPath "IO.Ably.dll" + + Directory.ensure outputPath + + CreateProcess.fromRawCommand + "./tools/ilrepack.exe" + [ "/lib:" + path + "/targetplatform:v4" + "/internalize" + "/attr:" + target + "/keyfile:IO.Ably.snk" + "/parallel" + "/out:" + out + target + Path.combine path "Newtonsoft.Json.dll" ] + |> Proc.run // start with the above configuration + |> ignore + + // Copy the xml docs + if File.exists docsFile then + Shell.copy outputPath [ docsFile ] + + + // *** Define Targets *** + Target.create "Clean" (fun _ -> + Trace.log (sprintf "Current dir: %s" currentDir) + Trace.log " --- Removing build folder ---" + Directory.delete (buildDir) + Directory.delete (packageDir) + + Directory.ensure testResultsDir + Directory.ensure packageDir) + + Target.create "Version" (fun _ -> + AssemblyInfoFile.createCSharp + "./src/CommonAssemblyInfo.cs" + [ AssemblyInfo.Company "Ably" + AssemblyInfo.Product "Ably .NET Library" + AssemblyInfo.Version version + AssemblyInfo.FileVersion version ]) + + + let nugetRestoreUsingLocalTool solutionFile = + CreateProcess.fromRawCommand "./tools/nuget.exe" [ "restore"; solutionFile ] + |> Proc.run + + let nugetRestoreUsingCLI solutionFile = + CreateProcess.fromRawCommand "nuget" [ "restore"; solutionFile ] |> Proc.run + + Target.create "Restore" (fun _ -> + if Environment.isWindows then + nugetRestoreUsingLocalTool "src/IO.Ably.sln" |> ignore + + CreateProcess.fromRawCommand "dotnet" [ "restore"; "src/IO.Ably.sln" ] + |> Proc.run + |> ignore) + + Target.create "NetFramework - Build" (fun _ -> + let setParams (defaults: MSBuildParams) = + { defaults with + Verbosity = Some(Quiet) + Targets = [ "Build" ] + Properties = + [ "Optimize", "True" + "DebugSymbols", "True" + "Configuration", buildMode + "dummy", "property" ] } // workaround added as per https://github.com/fsprojects/FAKE/issues/2738 + + MSBuild.build setParams NetFrameworkSolution) + + + Target.create "Restore Xamarin" (fun _ -> nugetRestoreUsingCLI XamarinSolution |> ignore) + + Target.create "Xamarin - Build" (fun _ -> + let setParams (defaults: MSBuildParams) = + { defaults with + Verbosity = Some(Quiet) + Targets = [ "Build" ] + Properties = + [ "Optimize", "True" + "DebugSymbols", "True" + "Configuration", buildMode + "dummy", "property" ] } // workaround added as per https://github.com/fsprojects/FAKE/issues/2738 + + MSBuild.build setParams XamarinSolution) + + let findNextTrxTestPath (resultsPath: string) = + [ 1..100 ] + |> Seq.map (fun i -> resultsPath.Replace(".trx", sprintf "-%d.trx" i)) + |> Seq.find (File.exists >> not) + + let findNextTestPath (resultsPath: string) = + [ 1..100 ] + |> Seq.map (fun i -> resultsPath.Replace(".xml", sprintf "-%d.xml" i)) + |> Seq.find (File.exists >> not) + + let trimTestMethod (testMethod: string) = + match testMethod.Contains("(") with + | true -> testMethod.Substring(0, testMethod.IndexOf("(")) + | false -> testMethod + + let findFailedXUnitTests (resultsPath: string) = + let doc = XDocument.Load(resultsPath) + let nodes = doc.XPathSelectElements("//test-case[@success='False']") + + nodes + |> Seq.map (fun node -> (node.Attribute(XName.Get("name"))).Value) + |> Seq.map trimTestMethod + + let findFailedDotnetTestTests (resultsPath: string) = + let xml = File.readAsString resultsPath + let tidyXml = Regex.Replace(xml, @"xmlns=\""[^\""]+\""", "") // Remove the namespace to make xpath queries easier + let doc = XDocument.Parse(tidyXml) + let nodes = doc.XPathSelectElements("//UnitTestResult[@outcome='Failed']") + printfn "Nodes found: %d" (nodes |> Seq.length) + + nodes + |> Seq.map (fun node -> (node.Attribute(XName.Get("testName"))).Value) + |> Seq.map trimTestMethod + |> Seq.toList + + let runStandardTestsWithOptions testToRun (failOnError: bool) = + Directory.ensure testResultsDir + Trace.log " --- Testing net core version --- " + + let project = + Path.combine currentDir "src/IO.Ably.Tests.DotNET/IO.Ably.Tests.DotNET.csproj" + + match testToRun with + | Method testMethodName -> + let logsPath = + findNextTrxTestPath (Path.combine testResultsDir "tests-netstandard.trx") + + DotNet.test + (fun opts -> + { opts with + Configuration = configuration + Filter = Some testMethodName + Framework = framework + Logger = Some("trx;logfilename=" + logsPath) }) + project + + logsPath + | UnitTests -> + let logsPath = Path.combine testResultsDir "tests-netstandard-unit.trx" + let mutable filters = [ "type!=integration" ] + + if Environment.isLinux then + filters <- filters @ [ "linux!=skip" ] + + try + DotNet.test + (fun opts -> + { opts with + Configuration = configuration + Filter = Some(filters |> String.concat "&") + Framework = framework + Logger = Some("trx;logfilename=" + logsPath) }) + project + with :? Fake.DotNet.MSBuildException -> + printfn "Not all unit tests passed. FailOnError is %b" failOnError |> ignore + + if failOnError then + reraise () + + logsPath + | IntegrationTests -> + let logsPath = Path.combine testResultsDir "tests-netstandard-integration.trx" + + try + DotNet.test + (fun opts -> + { opts with + Configuration = configuration + Filter = Some("type=integration") + Logger = Some("trx;logfilename=" + logsPath) }) + project + with :? Fake.DotNet.MSBuildException -> + printfn "Not all integration tests passed the first time" + + if failOnError then + reraise () + + + logsPath + + let runStandardTests testToRun = + runStandardTestsWithOptions testToRun true + + let runStandardTestsAllowRetry testToRun = + runStandardTestsWithOptions testToRun false + + let runFrameworkTests testToRun errorLevel = + Directory.ensure testResultsDir + let testDir = Path.combine currentDir "src/IO.Ably.Tests.NETFramework/bin/Release" + let testDll = !!(Path.combine testDir "*.Tests.*.dll") + + match testToRun with + | Method testMethodName -> + let logsPath = + findNextTestPath (Path.combine testResultsDir "xunit-netframework.xml") + + testDll + |> xUnit2 (fun p -> + { p with + NUnitXmlOutputPath = Some(logsPath) + Method = Some(trimTestMethod testMethodName) + ErrorLevel = errorLevel }) + + logsPath + | UnitTests -> + let logsPath = Path.combine testResultsDir "xunit-netframework-unit.xml" + + testDll + |> xUnit2 (fun p -> + { p with + NUnitXmlOutputPath = Some logsPath + ExcludeTraits = [ ("type", "integration") ] + ErrorLevel = errorLevel }) + + logsPath + | IntegrationTests -> + let logsPath = Path.combine testResultsDir "xunit-netframework-integration.xml" + + testDll + |> xUnit2 (fun p -> + { p with + NUnitXmlOutputPath = Some logsPath + IncludeTraits = [ ("type", "integration") ] + TimeOut = TimeSpan.FromMinutes(20.) + Parallel = ParallelMode.Collections + ErrorLevel = errorLevel }) + + logsPath + + Target.create "NetFramework.Integration.Rerun" (fun _ -> + + let setParams (defaults: MSBuildParams) = + { defaults with + Verbosity = Some(Quiet) + Targets = [ "Build" ] + Properties = + [ "Optimize", "True" + "DebugSymbols", "True" + "Configuration", buildMode + "dummy", "property" ] } // workaround added as per https://github.com/fsprojects/FAKE/issues/2738 + + MSBuild.build setParams NetFrameworkSolution + + + let logsPath = Path.combine testResultsDir "xunit-netframework-integration.xml" + + let failedTestNames = findFailedXUnitTests logsPath + + for test in failedTestNames do + runFrameworkTests (Method test) TestRunnerErrorLevel.Error |> ignore) + + Target.create "NetFramework - Unit Tests" (fun _ -> + + runFrameworkTests UnitTests TestRunnerErrorLevel.Error |> ignore) + + Target.create "NetFramework - Unit Tests with retry" (fun _ -> + + let logs = runFrameworkTests UnitTests TestRunnerErrorLevel.DontFailBuild + + let failedTestNames = findFailedXUnitTests logs + + for test in failedTestNames do + runFrameworkTests (Method test) TestRunnerErrorLevel.Error |> ignore) + + Target.create "NetFramework - Integration Tests" (fun _ -> + + runFrameworkTests IntegrationTests TestRunnerErrorLevel.Error |> ignore) + + Target.create "NetFramework - Integration Tests with retry" (fun _ -> + + let logs = runFrameworkTests IntegrationTests TestRunnerErrorLevel.DontFailBuild + + let failedTestNames = findFailedXUnitTests logs + + for test in failedTestNames do + runFrameworkTests (Method test) TestRunnerErrorLevel.Error |> ignore) + + Target.create "NetStandard - Build" (fun _ -> + DotNet.build (fun opts -> { opts with Configuration = configuration }) NetStandardSolution) + + Target.create "NetStandard - Unit Tests" (fun _ -> runStandardTests UnitTests |> ignore) + + Target.create "NetStandard - Unit Tests with retry" (fun _ -> + let logs = runStandardTestsAllowRetry UnitTests + + let failedTestNames = findFailedDotnetTestTests logs + + for test in failedTestNames do + runStandardTests (Method test) |> ignore) + + Target.create "NetStandard - Integration Tests" (fun _ -> runStandardTests IntegrationTests |> ignore) + + Target.create "NetStandard - Integration Tests with retry" (fun _ -> + + let logs = runStandardTestsAllowRetry IntegrationTests + + let failedTestNames = findFailedDotnetTestTests logs + + for test in failedTestNames do + runStandardTests (Method test) |> ignore) + + Target.create "Package - Build All" (fun _ -> + let setParams (defaults: MSBuildParams) = + { defaults with + Verbosity = Some(Quiet) + Targets = [ "Build" ] + Properties = + [ "Optimize", "True" + "DebugSymbols", "True" + "Configuration", buildMode + "StyleCopEnabled", "True" + "Package", "True" + "DefineConstants", "PACKAGE" + "dummy", "property" ] } // workaround added as per https://github.com/fsprojects/FAKE/issues/2738 + + MSBuild.build setParams packageSolution) + + Target.create "Push Package - Build All" (fun _ -> + let setParams (defaults: MSBuildParams) = + { defaults with + Verbosity = Some(Quiet) + Targets = [ "Build" ] + Properties = + [ "Optimize", "True" + "DebugSymbols", "True" + "Configuration", "Package" + "StyleCopEnabled", "True" + "Package", "True" + "DefineConstants", "PACKAGE" + "dummy", "property" ] } // workaround added as per https://github.com/fsprojects/FAKE/issues/2738 + + MSBuild.build setParams pushPackageSolution) + + Target.create "Package - Merge json.net" (fun _ -> + let projectsToMerge = [ "IO.Ably.Android"; "IO.Ably.iOS"; "IO.Ably.NETFramework" ] + + let binFolderPaths = + projectsToMerge + |> Seq.map (Path.combine "src") + |> Seq.map (fun path -> sprintf "%s/bin/%s" path buildMode) + + // Copy all IO.Ably* files to the `packaged folder` + binFolderPaths + |> Seq.iter (fun path -> !!(Path.combine path "IO.Ably*") |> Shell.copy (Path.combine path "packaged")) + + // Merge newtonsoft json into ably.dll and overwrite IO.Ably.dll in the packaged folder with the merged one + binFolderPaths + |> Seq.iter (fun path -> mergeJsonNet path (Path.combine path "packaged")) + + ) + + Target.create "Package - Create nuget" (fun _ -> + CreateProcess.fromRawCommand + "./tools/nuget.exe" + [ "pack" + "./nuget/io.ably.nuspec" + "-properties" + sprintf "version=%s;configuration=Release" version ] + |> Proc.run // start with the above configuration + |> ignore) + + Target.create "Package - Push" (fun _ -> + CreateProcess.fromRawCommand + "nuget" + [ "pack" + "./nuget/io.ably.push.android.nuspec" + "-properties" + sprintf "version=%s;configuration=Release" version ] + |> Proc.run // start with the above configuration + |> ignore + + CreateProcess.fromRawCommand + "nuget" + [ "pack" + "./nuget/io.ably.push.ios.nuspec" + "-properties" + sprintf "version=%s;configuration=Release" version ] + |> Proc.run // start with the above configuration + |> ignore) + + Target.create "Prepare" ignore + Target.create "Build.NetFramework" ignore + Target.create "Build.NetStandard" ignore + Target.create "Build.Xamarin" ignore + + Target.create "Test.NetFramework.Unit" ignore + Target.create "Test.NetFramework.Unit.WithRetry" ignore + Target.create "Test.NetFramework.Integration" ignore + Target.create "Test.NetFramework.Integration.WithRetry" ignore + + Target.create "Test.NetStandard.Unit" ignore + Target.create "Test.NetStandard.Unit.WithRetry" ignore + Target.create "Test.NetStandard.Integration" ignore + Target.create "Test.NetStandard.Integration.WithRetry" ignore + + Target.create "Package" ignore + Target.create "PushPackage" ignore + + + + "Clean" ==> "Restore" ==> "Prepare" + + "Prepare" ==> "NetFramework - Build" ==> "Build.NetFramework" + + "Prepare" ==> "Restore Xamarin" ==> "Xamarin - Build" ==> "Build.Xamarin" + + "Prepare" ==> "NetStandard - Build" ==> "Build.NetStandard" + + "Prepare" + ==> "Version" + ==> "Package - Build All" + ==> "Package - Merge json.net" + ==> "Package - Create nuget" + ==> "Package" + + "Prepare" + ==> "Version" + ==> "Push Package - Build All" + ==> "Package - Push" + ==> "PushPackage" + + "Build.NetFramework" + ==> "NetFramework - Unit Tests" + ==> "Test.NetFramework.Unit" + + "Build.NetFramework" + ==> "NetFramework - Unit Tests with retry" + ==> "Test.NetFramework.Unit.WithRetry" + + "Build.NetFramework" + ==> "NetFramework - Integration Tests" + ==> "Test.NetFramework.Integration" + + "Build.NetFramework" + ==> "NetFramework - Integration Tests with retry" + ==> "Test.NetFramework.Integration.WithRetry" + + + "Build.NetStandard" ==> "NetStandard - Unit Tests" ==> "Test.NetStandard.Unit" + + "Build.NetStandard" + ==> "NetStandard - Unit Tests with retry" + ==> "Test.NetStandard.Unit.WithRetry" + + "Build.NetStandard" + ==> "NetStandard - Integration Tests" + ==> "Test.NetStandard.Integration" + + "Build.NetStandard" + ==> "NetStandard - Integration Tests with retry" + ==> "Test.NetStandard.Integration.WithRetry" + +//----------------------------------------------------------------------------- +// Target Start +//----------------------------------------------------------------------------- + +[] +let main argv = + argv + |> Array.toList + |> Context.FakeExecutionContext.Create false "build.fsx" + |> Context.RuntimeContext.Fake + |> Context.setExecutionContext + + initTargets (argv) + Target.runOrDefaultWithArguments "Build.NetStandard" + + 0 // return an integer exit code diff --git a/build-script/paket.dependencies b/build-script/paket.dependencies new file mode 100644 index 000000000..d5e4f68cd --- /dev/null +++ b/build-script/paket.dependencies @@ -0,0 +1,10 @@ +source https://api.nuget.org/v3/index.json + +storage: none +framework: netstandard2.0, net462, net6.0, net7.0 +nuget Fake.Core.Target +nuget Fake.DotNet.AssemblyInfoFile +nuget Fake.DotNet.Cli +nuget Fake.DotNet.Testing.XUnit2 +nuget Microsoft.Build 17.3.2 +nuget Microsoft.Build.Tasks.Core 17.3.2 diff --git a/build-script/paket.lock b/build-script/paket.lock new file mode 100644 index 000000000..6d00ab95d --- /dev/null +++ b/build-script/paket.lock @@ -0,0 +1,236 @@ +STORAGE: NONE +RESTRICTION: || (== net462) (== net6.0) (== net7.0) (== netstandard2.0) +NUGET + remote: https://api.nuget.org/v3/index.json + BlackFox.VsWhere (1.1) - restriction: || (&& (== net462) (>= netstandard2.0)) (== net6.0) (== net7.0) (== netstandard2.0) + FSharp.Core (>= 4.2.3) - restriction: || (&& (== net462) (< net45) (>= netstandard2.0)) (== net6.0) (== net7.0) (== netstandard2.0) + Microsoft.Win32.Registry (>= 4.7) - restriction: || (&& (== net462) (< net45) (>= netstandard2.0)) (== net6.0) (== net7.0) (== netstandard2.0) + Fake.Core.CommandLineParsing (6.0) - restriction: || (&& (== net462) (>= netstandard2.0)) (== net6.0) (== net7.0) (== netstandard2.0) + FParsec (>= 1.1.1) - restriction: || (&& (== net462) (>= netstandard2.0)) (== net6.0) (== net7.0) (== netstandard2.0) + FSharp.Core (>= 6.0.3) - restriction: || (&& (== net462) (>= netstandard2.0)) (== net6.0) (== net7.0) (== netstandard2.0) + Fake.Core.Context (6.0) - restriction: || (&& (== net462) (>= netstandard2.0)) (== net6.0) (== net7.0) (== netstandard2.0) + FSharp.Core (>= 6.0.3) - restriction: || (&& (== net462) (>= netstandard2.0)) (== net6.0) (== net7.0) (== netstandard2.0) + Fake.Core.Environment (6.0) - restriction: || (&& (== net462) (>= netstandard2.0)) (== net6.0) (== net7.0) (== netstandard2.0) + FSharp.Core (>= 6.0.3) - restriction: || (&& (== net462) (>= netstandard2.0)) (== net6.0) (== net7.0) (== netstandard2.0) + Fake.Core.FakeVar (6.0) - restriction: || (&& (== net462) (>= netstandard2.0)) (== net6.0) (== net7.0) (== netstandard2.0) + Fake.Core.Context (>= 6.0) - restriction: || (&& (== net462) (>= netstandard2.0)) (== net6.0) (== net7.0) (== netstandard2.0) + FSharp.Core (>= 6.0.3) - restriction: || (&& (== net462) (>= netstandard2.0)) (== net6.0) (== net7.0) (== netstandard2.0) + Fake.Core.Process (6.0) - restriction: || (&& (== net462) (>= netstandard2.0)) (== net6.0) (== net7.0) (== netstandard2.0) + Fake.Core.Environment (>= 6.0) - restriction: || (&& (== net462) (>= netstandard2.0)) (== net6.0) (== net7.0) (== netstandard2.0) + Fake.Core.FakeVar (>= 6.0) - restriction: || (&& (== net462) (>= netstandard2.0)) (== net6.0) (== net7.0) (== netstandard2.0) + Fake.Core.String (>= 6.0) - restriction: || (&& (== net462) (>= netstandard2.0)) (== net6.0) (== net7.0) (== netstandard2.0) + Fake.Core.Trace (>= 6.0) - restriction: || (&& (== net462) (>= netstandard2.0)) (== net6.0) (== net7.0) (== netstandard2.0) + Fake.IO.FileSystem (>= 6.0) - restriction: || (&& (== net462) (>= netstandard2.0)) (== net6.0) (== net7.0) (== netstandard2.0) + FSharp.Core (>= 6.0.3) - restriction: || (&& (== net462) (>= netstandard2.0)) (== net6.0) (== net7.0) (== netstandard2.0) + System.Collections.Immutable (>= 6.0) - restriction: || (&& (== net462) (>= netstandard2.0)) (== net6.0) (== net7.0) (== netstandard2.0) + Fake.Core.SemVer (6.0) - restriction: || (&& (== net462) (>= netstandard2.0)) (== net6.0) (== net7.0) (== netstandard2.0) + FSharp.Core (>= 6.0.3) - restriction: || (&& (== net462) (>= netstandard2.0)) (== net6.0) (== net7.0) (== netstandard2.0) + Fake.Core.String (6.0) - restriction: || (&& (== net462) (>= netstandard2.0)) (== net6.0) (== net7.0) (== netstandard2.0) + FSharp.Core (>= 6.0.3) - restriction: || (&& (== net462) (>= netstandard2.0)) (== net6.0) (== net7.0) (== netstandard2.0) + Fake.Core.Target (6.0) + Fake.Core.CommandLineParsing (>= 6.0) - restriction: || (&& (== net462) (>= netstandard2.0)) (== net6.0) (== net7.0) (== netstandard2.0) + Fake.Core.Context (>= 6.0) - restriction: || (&& (== net462) (>= netstandard2.0)) (== net6.0) (== net7.0) (== netstandard2.0) + Fake.Core.Environment (>= 6.0) - restriction: || (&& (== net462) (>= netstandard2.0)) (== net6.0) (== net7.0) (== netstandard2.0) + Fake.Core.FakeVar (>= 6.0) - restriction: || (&& (== net462) (>= netstandard2.0)) (== net6.0) (== net7.0) (== netstandard2.0) + Fake.Core.Process (>= 6.0) - restriction: || (&& (== net462) (>= netstandard2.0)) (== net6.0) (== net7.0) (== netstandard2.0) + Fake.Core.String (>= 6.0) - restriction: || (&& (== net462) (>= netstandard2.0)) (== net6.0) (== net7.0) (== netstandard2.0) + Fake.Core.Trace (>= 6.0) - restriction: || (&& (== net462) (>= netstandard2.0)) (== net6.0) (== net7.0) (== netstandard2.0) + FSharp.Control.Reactive (>= 5.0.2) - restriction: || (&& (== net462) (>= netstandard2.0)) (== net6.0) (== net7.0) (== netstandard2.0) + FSharp.Core (>= 6.0.3) - restriction: || (&& (== net462) (>= netstandard2.0)) (== net6.0) (== net7.0) (== netstandard2.0) + Fake.Core.Tasks (6.0) - restriction: || (&& (== net462) (>= netstandard2.0)) (== net6.0) (== net7.0) (== netstandard2.0) + Fake.Core.Trace (>= 6.0) - restriction: || (&& (== net462) (>= netstandard2.0)) (== net6.0) (== net7.0) (== netstandard2.0) + FSharp.Core (>= 6.0.3) - restriction: || (&& (== net462) (>= netstandard2.0)) (== net6.0) (== net7.0) (== netstandard2.0) + Fake.Core.Trace (6.0) - restriction: || (&& (== net462) (>= netstandard2.0)) (== net6.0) (== net7.0) (== netstandard2.0) + Fake.Core.Environment (>= 6.0) - restriction: || (&& (== net462) (>= netstandard2.0)) (== net6.0) (== net7.0) (== netstandard2.0) + Fake.Core.FakeVar (>= 6.0) - restriction: || (&& (== net462) (>= netstandard2.0)) (== net6.0) (== net7.0) (== netstandard2.0) + FSharp.Core (>= 6.0.3) - restriction: || (&& (== net462) (>= netstandard2.0)) (== net6.0) (== net7.0) (== netstandard2.0) + Fake.Core.Xml (6.0) - restriction: || (&& (== net462) (>= netstandard2.0)) (== net6.0) (== net7.0) (== netstandard2.0) + Fake.Core.String (>= 6.0) - restriction: || (&& (== net462) (>= netstandard2.0)) (== net6.0) (== net7.0) (== netstandard2.0) + FSharp.Core (>= 6.0.3) - restriction: || (&& (== net462) (>= netstandard2.0)) (== net6.0) (== net7.0) (== netstandard2.0) + Fake.DotNet.AssemblyInfoFile (6.0) + Fake.Core.Environment (>= 6.0) - restriction: || (&& (== net462) (>= netstandard2.0)) (== net6.0) (== net7.0) (== netstandard2.0) + Fake.Core.String (>= 6.0) - restriction: || (&& (== net462) (>= netstandard2.0)) (== net6.0) (== net7.0) (== netstandard2.0) + Fake.Core.Trace (>= 6.0) - restriction: || (&& (== net462) (>= netstandard2.0)) (== net6.0) (== net7.0) (== netstandard2.0) + Fake.IO.FileSystem (>= 6.0) - restriction: || (&& (== net462) (>= netstandard2.0)) (== net6.0) (== net7.0) (== netstandard2.0) + FSharp.Core (>= 6.0.3) - restriction: || (&& (== net462) (>= netstandard2.0)) (== net6.0) (== net7.0) (== netstandard2.0) + Fake.DotNet.Cli (6.0) + Fake.Core.Environment (>= 6.0) - restriction: || (&& (== net462) (>= netstandard2.0)) (== net6.0) (== net7.0) (== netstandard2.0) + Fake.Core.Process (>= 6.0) - restriction: || (&& (== net462) (>= netstandard2.0)) (== net6.0) (== net7.0) (== netstandard2.0) + Fake.Core.String (>= 6.0) - restriction: || (&& (== net462) (>= netstandard2.0)) (== net6.0) (== net7.0) (== netstandard2.0) + Fake.Core.Trace (>= 6.0) - restriction: || (&& (== net462) (>= netstandard2.0)) (== net6.0) (== net7.0) (== netstandard2.0) + Fake.DotNet.MSBuild (>= 6.0) - restriction: || (&& (== net462) (>= netstandard2.0)) (== net6.0) (== net7.0) (== netstandard2.0) + Fake.DotNet.NuGet (>= 6.0) - restriction: || (&& (== net462) (>= netstandard2.0)) (== net6.0) (== net7.0) (== netstandard2.0) + Fake.IO.FileSystem (>= 6.0) - restriction: || (&& (== net462) (>= netstandard2.0)) (== net6.0) (== net7.0) (== netstandard2.0) + FSharp.Core (>= 6.0.3) - restriction: || (&& (== net462) (>= netstandard2.0)) (== net6.0) (== net7.0) (== netstandard2.0) + Mono.Posix.NETStandard (>= 1.0) - restriction: || (&& (== net462) (>= netstandard2.0)) (== net6.0) (== net7.0) (== netstandard2.0) + Newtonsoft.Json (>= 13.0.1) - restriction: || (&& (== net462) (>= netstandard2.0)) (== net6.0) (== net7.0) (== netstandard2.0) + Fake.DotNet.MSBuild (6.0) - restriction: || (&& (== net462) (>= netstandard2.0)) (== net6.0) (== net7.0) (== netstandard2.0) + BlackFox.VsWhere (>= 1.1) - restriction: || (&& (== net462) (>= netstandard2.0)) (== net6.0) (== net7.0) (== netstandard2.0) + Fake.Core.Environment (>= 6.0) - restriction: || (&& (== net462) (>= netstandard2.0)) (== net6.0) (== net7.0) (== netstandard2.0) + Fake.Core.Process (>= 6.0) - restriction: || (&& (== net462) (>= netstandard2.0)) (== net6.0) (== net7.0) (== netstandard2.0) + Fake.Core.String (>= 6.0) - restriction: || (&& (== net462) (>= netstandard2.0)) (== net6.0) (== net7.0) (== netstandard2.0) + Fake.Core.Trace (>= 6.0) - restriction: || (&& (== net462) (>= netstandard2.0)) (== net6.0) (== net7.0) (== netstandard2.0) + Fake.IO.FileSystem (>= 6.0) - restriction: || (&& (== net462) (>= netstandard2.0)) (== net6.0) (== net7.0) (== netstandard2.0) + FSharp.Core (>= 6.0.3) - restriction: || (&& (== net462) (>= netstandard2.0)) (== net6.0) (== net7.0) (== netstandard2.0) + MSBuild.StructuredLogger (>= 2.1.545) - restriction: || (&& (== net462) (>= netstandard2.0)) (== net6.0) (== net7.0) (== netstandard2.0) + Fake.DotNet.NuGet (6.0) - restriction: || (&& (== net462) (>= netstandard2.0)) (== net6.0) (== net7.0) (== netstandard2.0) + Fake.Core.Environment (>= 6.0) - restriction: || (&& (== net462) (>= netstandard2.0)) (== net6.0) (== net7.0) (== netstandard2.0) + Fake.Core.Process (>= 6.0) - restriction: || (&& (== net462) (>= netstandard2.0)) (== net6.0) (== net7.0) (== netstandard2.0) + Fake.Core.SemVer (>= 6.0) - restriction: || (&& (== net462) (>= netstandard2.0)) (== net6.0) (== net7.0) (== netstandard2.0) + Fake.Core.String (>= 6.0) - restriction: || (&& (== net462) (>= netstandard2.0)) (== net6.0) (== net7.0) (== netstandard2.0) + Fake.Core.Tasks (>= 6.0) - restriction: || (&& (== net462) (>= netstandard2.0)) (== net6.0) (== net7.0) (== netstandard2.0) + Fake.Core.Trace (>= 6.0) - restriction: || (&& (== net462) (>= netstandard2.0)) (== net6.0) (== net7.0) (== netstandard2.0) + Fake.Core.Xml (>= 6.0) - restriction: || (&& (== net462) (>= netstandard2.0)) (== net6.0) (== net7.0) (== netstandard2.0) + Fake.IO.FileSystem (>= 6.0) - restriction: || (&& (== net462) (>= netstandard2.0)) (== net6.0) (== net7.0) (== netstandard2.0) + Fake.Net.Http (>= 6.0) - restriction: || (&& (== net462) (>= netstandard2.0)) (== net6.0) (== net7.0) (== netstandard2.0) + FSharp.Core (>= 6.0.3) - restriction: || (&& (== net462) (>= netstandard2.0)) (== net6.0) (== net7.0) (== netstandard2.0) + Newtonsoft.Json (>= 13.0.1) - restriction: || (&& (== net462) (>= netstandard2.0)) (== net6.0) (== net7.0) (== netstandard2.0) + NuGet.Protocol (>= 6.0) - restriction: || (&& (== net462) (>= netstandard2.0)) (== net6.0) (== net7.0) (== netstandard2.0) + Fake.DotNet.Testing.XUnit2 (6.0) + Fake.Core.Process (>= 6.0) - restriction: || (&& (== net462) (>= netstandard2.0)) (== net6.0) (== net7.0) (== netstandard2.0) + Fake.Core.String (>= 6.0) - restriction: || (&& (== net462) (>= netstandard2.0)) (== net6.0) (== net7.0) (== netstandard2.0) + Fake.Core.Trace (>= 6.0) - restriction: || (&& (== net462) (>= netstandard2.0)) (== net6.0) (== net7.0) (== netstandard2.0) + Fake.IO.FileSystem (>= 6.0) - restriction: || (&& (== net462) (>= netstandard2.0)) (== net6.0) (== net7.0) (== netstandard2.0) + Fake.Testing.Common (>= 6.0) - restriction: || (&& (== net462) (>= netstandard2.0)) (== net6.0) (== net7.0) (== netstandard2.0) + FSharp.Core (>= 6.0.3) - restriction: || (&& (== net462) (>= netstandard2.0)) (== net6.0) (== net7.0) (== netstandard2.0) + Fake.IO.FileSystem (6.0) - restriction: || (&& (== net462) (>= netstandard2.0)) (== net6.0) (== net7.0) (== netstandard2.0) + Fake.Core.String (>= 6.0) - restriction: || (&& (== net462) (>= netstandard2.0)) (== net6.0) (== net7.0) (== netstandard2.0) + Fake.Core.Trace (>= 6.0) - restriction: || (&& (== net462) (>= netstandard2.0)) (== net6.0) (== net7.0) (== netstandard2.0) + FSharp.Core (>= 6.0.3) - restriction: || (&& (== net462) (>= netstandard2.0)) (== net6.0) (== net7.0) (== netstandard2.0) + Fake.Net.Http (6.0) - restriction: || (&& (== net462) (>= netstandard2.0)) (== net6.0) (== net7.0) (== netstandard2.0) + Fake.Core.Trace (>= 6.0) - restriction: || (&& (== net462) (>= netstandard2.0)) (== net6.0) (== net7.0) (== netstandard2.0) + FSharp.Core (>= 6.0.3) - restriction: || (&& (== net462) (>= netstandard2.0)) (== net6.0) (== net7.0) (== netstandard2.0) + Fake.Testing.Common (6.0) - restriction: || (&& (== net462) (>= netstandard2.0)) (== net6.0) (== net7.0) (== netstandard2.0) + Fake.Core.Trace (>= 6.0) - restriction: || (&& (== net462) (>= netstandard2.0)) (== net6.0) (== net7.0) (== netstandard2.0) + FSharp.Core (>= 6.0.3) - restriction: || (&& (== net462) (>= netstandard2.0)) (== net6.0) (== net7.0) (== netstandard2.0) + FParsec (1.1.1) - restriction: || (&& (== net462) (>= netstandard2.0)) (== net6.0) (== net7.0) (== netstandard2.0) + FSharp.Core (>= 4.3.4) + FSharp.Control.Reactive (5.0.5) - restriction: || (&& (== net462) (>= netstandard2.0)) (== net6.0) (== net7.0) (== netstandard2.0) + FSharp.Core (>= 4.7.2) - restriction: || (&& (== net462) (>= netstandard2.0)) (== net6.0) (== net7.0) (== netstandard2.0) + System.Reactive (>= 5.0 < 6.0) - restriction: || (&& (== net462) (>= netstandard2.0)) (== net6.0) (== net7.0) (== netstandard2.0) + FSharp.Core (7.0.200) - restriction: || (&& (== net462) (>= netstandard2.0)) (== net6.0) (== net7.0) (== netstandard2.0) + Microsoft.Build (17.3.2) + Microsoft.Build.Framework (>= 17.3.2) - restriction: || (&& (== net462) (>= net472)) (&& (== net462) (>= net6.0)) (== net6.0) (== net7.0) (&& (== netstandard2.0) (>= net472)) (&& (== netstandard2.0) (>= net6.0)) + Microsoft.NET.StringTools (>= 17.3.2) - restriction: || (&& (== net462) (>= net472)) (&& (== net462) (>= net6.0)) (== net6.0) (== net7.0) (&& (== netstandard2.0) (>= net472)) (&& (== netstandard2.0) (>= net6.0)) + System.Collections.Immutable (>= 6.0) - restriction: || (&& (== net462) (>= net472)) (&& (== net462) (>= net6.0)) (== net6.0) (== net7.0) (&& (== netstandard2.0) (>= net472)) (&& (== netstandard2.0) (>= net6.0)) + System.Configuration.ConfigurationManager (>= 6.0) - restriction: || (&& (== net462) (>= net472)) (&& (== net462) (>= net6.0)) (== net6.0) (== net7.0) (&& (== netstandard2.0) (>= net472)) (&& (== netstandard2.0) (>= net6.0)) + System.Reflection.Metadata (>= 6.0) - restriction: || (&& (== net462) (>= net6.0)) (== net6.0) (== net7.0) (&& (== netstandard2.0) (>= net6.0)) + System.Reflection.MetadataLoadContext (>= 6.0) - restriction: || (&& (== net462) (>= net472)) (&& (== net462) (>= net6.0)) (== net6.0) (== net7.0) (&& (== netstandard2.0) (>= net472)) (&& (== netstandard2.0) (>= net6.0)) + System.Security.Principal.Windows (>= 5.0) - restriction: || (&& (== net462) (>= net6.0)) (== net6.0) (== net7.0) (&& (== netstandard2.0) (>= net6.0)) + System.Text.Encoding.CodePages (>= 6.0) - restriction: || (&& (== net462) (>= net6.0)) (== net6.0) (== net7.0) (&& (== netstandard2.0) (>= net6.0)) + System.Text.Json (>= 6.0) - restriction: || (&& (== net462) (>= net472)) (&& (== net462) (>= net6.0)) (== net6.0) (== net7.0) (&& (== netstandard2.0) (>= net472)) (&& (== netstandard2.0) (>= net6.0)) + System.Threading.Tasks.Dataflow (>= 6.0) - restriction: || (&& (== net462) (>= net472)) (&& (== net462) (>= net6.0)) (== net6.0) (== net7.0) (&& (== netstandard2.0) (>= net472)) (&& (== netstandard2.0) (>= net6.0)) + Microsoft.Build.Framework (17.3.2) - restriction: || (&& (== net462) (>= net472)) (&& (== net462) (>= net6.0)) (&& (== net462) (>= netstandard2.0)) (== net6.0) (== net7.0) (== netstandard2.0) + System.Security.Permissions (>= 6.0) - restriction: || (&& (== net462) (>= net6.0)) (&& (== net462) (>= netstandard2.0)) (== net6.0) (== net7.0) (== netstandard2.0) + Microsoft.Build.Tasks.Core (17.3.2) + Microsoft.Build.Framework (>= 17.3.2) - restriction: || (&& (== net462) (>= netstandard2.0)) (== net6.0) (== net7.0) (== netstandard2.0) + Microsoft.Build.Utilities.Core (>= 17.3.2) - restriction: || (&& (== net462) (>= netstandard2.0)) (== net6.0) (== net7.0) (== netstandard2.0) + Microsoft.NET.StringTools (>= 17.3.2) - restriction: || (&& (== net462) (>= netstandard2.0)) (== net6.0) (== net7.0) (== netstandard2.0) + Microsoft.Win32.Registry (>= 5.0) - restriction: || (&& (== net462) (== net6.0)) (&& (== net462) (== net7.0)) (&& (== net462) (>= netstandard2.0)) (&& (== net7.0) (< net6.0)) (== netstandard2.0) + System.CodeDom (>= 6.0) - restriction: || (&& (== net462) (>= net6.0)) (&& (== net462) (>= netstandard2.0)) (== net6.0) (== net7.0) (== netstandard2.0) + System.Collections.Immutable (>= 6.0) - restriction: || (&& (== net462) (>= netstandard2.0)) (== net6.0) (== net7.0) (== netstandard2.0) + System.Reflection.Metadata (>= 6.0) - restriction: || (&& (== net462) (>= net6.0)) (&& (== net462) (>= netstandard2.0)) (== net6.0) (== net7.0) (== netstandard2.0) + System.Resources.Extensions (>= 6.0) - restriction: || (&& (== net462) (>= netstandard2.0)) (== net6.0) (== net7.0) (== netstandard2.0) + System.Security.Cryptography.Pkcs (>= 6.0.1) - restriction: || (&& (== net462) (>= net6.0)) (&& (== net462) (>= netstandard2.0)) (== net6.0) (== net7.0) (== netstandard2.0) + System.Security.Cryptography.Xml (>= 6.0) - restriction: || (&& (== net462) (>= net6.0)) (&& (== net462) (>= netstandard2.0)) (== net6.0) (== net7.0) (== netstandard2.0) + System.Security.Permissions (>= 6.0) - restriction: || (&& (== net462) (>= net6.0)) (&& (== net462) (>= netstandard2.0)) (== net6.0) (== net7.0) (== netstandard2.0) + System.Threading.Tasks.Dataflow (>= 6.0) - restriction: || (&& (== net462) (>= netstandard2.0)) (== net6.0) (== net7.0) (== netstandard2.0) + Microsoft.Build.Utilities.Core (17.3.2) - restriction: || (&& (== net462) (>= netstandard2.0)) (== net6.0) (== net7.0) (== netstandard2.0) + Microsoft.Build.Framework (>= 17.3.2) - restriction: || (&& (== net462) (>= netstandard2.0)) (== net6.0) (== net7.0) (== netstandard2.0) + Microsoft.NET.StringTools (>= 17.3.2) - restriction: || (&& (== net462) (>= netstandard2.0)) (== net6.0) (== net7.0) (== netstandard2.0) + Microsoft.Win32.Registry (>= 5.0) - restriction: || (&& (== net462) (== net6.0)) (&& (== net462) (== net7.0)) (&& (== net462) (>= netstandard2.0)) (&& (== net7.0) (< net6.0)) (== netstandard2.0) + System.Collections.Immutable (>= 6.0) - restriction: || (&& (== net462) (>= netstandard2.0)) (== net6.0) (== net7.0) (== netstandard2.0) + System.Configuration.ConfigurationManager (>= 6.0) - restriction: || (&& (== net462) (>= netstandard2.0)) (== net6.0) (== net7.0) (== netstandard2.0) + System.Security.Permissions (>= 6.0) - restriction: || (&& (== net462) (== net6.0)) (&& (== net462) (== net7.0)) (&& (== net462) (>= netstandard2.0)) (&& (== net7.0) (< net6.0)) (== netstandard2.0) + System.Text.Encoding.CodePages (>= 6.0) - restriction: || (&& (== net462) (== net6.0)) (&& (== net462) (== net7.0)) (&& (== net462) (>= netstandard2.0)) (&& (== net7.0) (< net6.0)) (== netstandard2.0) + Microsoft.NET.StringTools (17.5) - restriction: || (&& (== net462) (>= net472)) (&& (== net462) (>= net6.0)) (&& (== net462) (>= netstandard2.0)) (== net6.0) (== net7.0) (== netstandard2.0) + System.Memory (>= 4.5.5) - restriction: || (&& (== net462) (== net7.0)) (&& (== net462) (>= net472)) (&& (== net462) (>= netstandard2.0)) (== net6.0) (&& (== net7.0) (>= net472)) (== netstandard2.0) + System.Runtime.CompilerServices.Unsafe (>= 6.0) - restriction: || (&& (== net462) (== net7.0)) (&& (== net462) (>= net472)) (&& (== net462) (>= netstandard2.0)) (== net6.0) (&& (== net7.0) (>= net472)) (== netstandard2.0) + Microsoft.NETCore.Platforms (7.0.1) - restriction: || (&& (== net462) (== net6.0)) (&& (== net462) (== net7.0)) (&& (== net462) (< net45) (>= netstandard2.0)) (&& (== net6.0) (< netcoreapp3.1)) (&& (== net6.0) (< netstandard1.2)) (&& (== net6.0) (< netstandard1.3)) (&& (== net6.0) (< netstandard1.5)) (&& (== net7.0) (< netcoreapp3.1)) (&& (== net7.0) (< netstandard1.2)) (&& (== net7.0) (< netstandard1.3)) (&& (== net7.0) (< netstandard1.5)) (== netstandard2.0) + Microsoft.NETCore.Targets (5.0) - restriction: || (&& (== net462) (== net6.0)) (&& (== net462) (== net7.0)) (&& (== net462) (< net45) (>= netstandard2.0)) (&& (== net6.0) (< netcoreapp3.1)) (&& (== net6.0) (< netstandard1.2)) (&& (== net6.0) (< netstandard1.3)) (&& (== net6.0) (< netstandard1.5)) (&& (== net7.0) (< netcoreapp3.1)) (&& (== net7.0) (< netstandard1.2)) (&& (== net7.0) (< netstandard1.3)) (&& (== net7.0) (< netstandard1.5)) (== netstandard2.0) + Microsoft.Win32.Registry (5.0) - restriction: || (&& (== net462) (>= netstandard2.0)) (== net6.0) (== net7.0) (== netstandard2.0) + System.Buffers (>= 4.5.1) - restriction: || (&& (== net462) (== net6.0)) (&& (== net462) (== net7.0)) (&& (== net462) (>= monoandroid) (< netstandard1.3)) (&& (== net462) (>= monotouch)) (&& (== net462) (< net46) (>= netstandard2.0)) (&& (== net462) (>= xamarinios)) (&& (== net462) (>= xamarinmac)) (&& (== net462) (>= xamarintvos)) (&& (== net462) (>= xamarinwatchos)) (&& (== net6.0) (>= monoandroid) (< netstandard1.3)) (&& (== net6.0) (>= monotouch)) (&& (== net6.0) (< netcoreapp2.0)) (&& (== net6.0) (>= xamarinios)) (&& (== net6.0) (>= xamarinmac)) (&& (== net6.0) (>= xamarintvos)) (&& (== net6.0) (>= xamarinwatchos)) (&& (== net7.0) (>= monoandroid) (< netstandard1.3)) (&& (== net7.0) (>= monotouch)) (&& (== net7.0) (< netcoreapp2.0)) (&& (== net7.0) (>= xamarinios)) (&& (== net7.0) (>= xamarinmac)) (&& (== net7.0) (>= xamarintvos)) (&& (== net7.0) (>= xamarinwatchos)) (== netstandard2.0) + System.Memory (>= 4.5.4) - restriction: || (&& (== net462) (== net6.0)) (&& (== net462) (== net7.0)) (&& (== net462) (< net46) (>= netstandard2.0)) (&& (== net462) (>= netcoreapp2.0)) (&& (== net462) (>= uap10.1)) (&& (== net6.0) (< netcoreapp2.0)) (&& (== net6.0) (< netcoreapp2.1)) (&& (== net6.0) (>= uap10.1)) (&& (== net7.0) (< netcoreapp2.0)) (&& (== net7.0) (< netcoreapp2.1)) (&& (== net7.0) (>= uap10.1)) (== netstandard2.0) + System.Security.AccessControl (>= 5.0) + System.Security.Principal.Windows (>= 5.0) + Microsoft.Win32.SystemEvents (7.0) - restriction: || (&& (== net462) (>= net6.0)) (== net6.0) (== net7.0) (&& (== netstandard2.0) (>= net6.0)) + Mono.Posix.NETStandard (1.0) - restriction: || (&& (== net462) (>= netstandard2.0)) (== net6.0) (== net7.0) (== netstandard2.0) + MSBuild.StructuredLogger (2.1.790) - restriction: || (&& (== net462) (>= netstandard2.0)) (== net6.0) (== net7.0) (== netstandard2.0) + Microsoft.Build.Framework (>= 16.10) - restriction: || (&& (== net462) (>= netstandard2.0)) (== net6.0) (== net7.0) (== netstandard2.0) + Microsoft.Build.Utilities.Core (>= 16.10) - restriction: || (&& (== net462) (>= netstandard2.0)) (== net6.0) (== net7.0) (== netstandard2.0) + Newtonsoft.Json (13.0.3) - restriction: || (&& (== net462) (>= netstandard2.0)) (== net6.0) (== net7.0) (== netstandard2.0) + NuGet.Common (6.5) - restriction: || (&& (== net462) (>= netstandard2.0)) (== net6.0) (== net7.0) (== netstandard2.0) + NuGet.Frameworks (>= 6.5) - restriction: || (&& (== net462) (>= netstandard2.0)) (== net6.0) (== net7.0) (== netstandard2.0) + NuGet.Configuration (6.5) - restriction: || (&& (== net462) (>= netstandard2.0)) (== net6.0) (== net7.0) (== netstandard2.0) + NuGet.Common (>= 6.5) - restriction: || (&& (== net462) (>= netstandard2.0)) (== net6.0) (== net7.0) (== netstandard2.0) + System.Security.Cryptography.ProtectedData (>= 4.4) - restriction: || (&& (== net462) (>= netstandard2.0)) (== net6.0) (== net7.0) (== netstandard2.0) + NuGet.Frameworks (6.5) - restriction: || (&& (== net462) (>= netstandard2.0)) (== net6.0) (== net7.0) (== netstandard2.0) + NuGet.Packaging (6.5) - restriction: || (&& (== net462) (>= netstandard2.0)) (== net6.0) (== net7.0) (== netstandard2.0) + Newtonsoft.Json (>= 13.0.1) - restriction: || (&& (== net462) (>= netstandard2.0)) (== net6.0) (== net7.0) (== netstandard2.0) + NuGet.Configuration (>= 6.5) - restriction: || (&& (== net462) (>= netstandard2.0)) (== net6.0) (== net7.0) (== netstandard2.0) + NuGet.Versioning (>= 6.5) - restriction: || (&& (== net462) (>= netstandard2.0)) (== net6.0) (== net7.0) (== netstandard2.0) + System.Security.Cryptography.Cng (>= 5.0) - restriction: || (&& (== net462) (>= net5.0)) (&& (== net462) (>= netstandard2.0)) (== net6.0) (== net7.0) (== netstandard2.0) + System.Security.Cryptography.Pkcs (>= 5.0) - restriction: || (&& (== net462) (>= net5.0)) (&& (== net462) (>= netstandard2.0)) (== net6.0) (== net7.0) (== netstandard2.0) + NuGet.Protocol (6.5) - restriction: || (&& (== net462) (>= netstandard2.0)) (== net6.0) (== net7.0) (== netstandard2.0) + NuGet.Packaging (>= 6.5) - restriction: || (&& (== net462) (>= netstandard2.0)) (== net6.0) (== net7.0) (== netstandard2.0) + NuGet.Versioning (6.5) - restriction: || (&& (== net462) (>= netstandard2.0)) (== net6.0) (== net7.0) (== netstandard2.0) + System.Buffers (4.5.1) - restriction: || (&& (== net462) (== net6.0)) (&& (== net462) (== net7.0)) (&& (== net462) (>= net6.0)) (&& (== net6.0) (< netstandard2.1)) (&& (== net7.0) (< netstandard2.1)) (== netstandard2.0) + System.CodeDom (7.0) - restriction: || (&& (== net462) (>= net6.0)) (&& (== net462) (>= netstandard2.0)) (== net6.0) (== net7.0) (== netstandard2.0) + System.Collections.Immutable (7.0) - restriction: || (&& (== net462) (>= net472)) (&& (== net462) (>= net6.0)) (&& (== net462) (>= netstandard2.0)) (== net6.0) (== net7.0) (== netstandard2.0) + System.Runtime.CompilerServices.Unsafe (>= 6.0) - restriction: || (== net462) (== net6.0) (&& (== net7.0) (>= net462)) (&& (== net7.0) (< net6.0)) (== netstandard2.0) + System.Configuration.ConfigurationManager (7.0) - restriction: || (&& (== net462) (>= net472)) (&& (== net462) (>= net6.0)) (&& (== net462) (>= netstandard2.0)) (== net6.0) (== net7.0) (== netstandard2.0) + System.Diagnostics.EventLog (>= 7.0) - restriction: || (&& (== net462) (>= net7.0)) (&& (== net6.0) (>= net7.0)) (== net7.0) (&& (== netstandard2.0) (>= net7.0)) + System.Security.Cryptography.ProtectedData (>= 7.0) - restriction: || (&& (== net462) (>= net6.0)) (== net6.0) (== net7.0) (== netstandard2.0) + System.Security.Permissions (>= 7.0) + System.Diagnostics.EventLog (7.0) - restriction: || (&& (== net462) (>= net7.0)) (&& (== net6.0) (>= net7.0)) (== net7.0) (&& (== netstandard2.0) (>= net7.0)) + System.Drawing.Common (7.0) - restriction: || (&& (== net462) (>= net6.0)) (== net6.0) (== net7.0) (&& (== netstandard2.0) (>= net6.0)) + Microsoft.Win32.SystemEvents (>= 7.0) - restriction: || (&& (== net462) (>= net6.0)) (== net6.0) (== net7.0) (&& (== netstandard2.0) (>= net6.0)) + System.Formats.Asn1 (7.0) - restriction: || (&& (== net462) (>= net6.0)) (&& (== net462) (>= netstandard2.1)) (== net6.0) (== net7.0) (== netstandard2.0) + System.Buffers (>= 4.5.1) - restriction: || (== net462) (&& (== net6.0) (>= net462)) (&& (== net7.0) (>= net462)) (&& (== net7.0) (< net6.0)) (== netstandard2.0) + System.Memory (>= 4.5.5) - restriction: || (== net462) (&& (== net6.0) (>= net462)) (&& (== net7.0) (>= net462)) (&& (== net7.0) (< net6.0)) (== netstandard2.0) + System.Memory (4.5.5) - restriction: || (&& (== net462) (== net7.0)) (&& (== net462) (>= net472)) (&& (== net462) (>= net6.0)) (== net6.0) (&& (== net7.0) (>= net472)) (&& (== net7.0) (< netstandard2.1)) (== netstandard2.0) + System.Reactive (5.0) - restriction: || (&& (== net462) (>= netstandard2.0)) (== net6.0) (== net7.0) (== netstandard2.0) + System.Runtime.InteropServices.WindowsRuntime (>= 4.3) - restriction: || (&& (== net462) (== net6.0)) (&& (== net462) (== net7.0)) (&& (== net462) (>= netstandard2.0)) (&& (== net6.0) (< netcoreapp3.1)) (&& (== net7.0) (< netcoreapp3.1)) (== netstandard2.0) + System.Threading.Tasks.Extensions (>= 4.5.4) - restriction: || (&& (== net462) (== net6.0)) (&& (== net462) (== net7.0)) (&& (== net462) (>= net472)) (&& (== net462) (>= netstandard2.0)) (&& (== net462) (>= uap10.1)) (&& (== net6.0) (>= net472)) (&& (== net6.0) (< netcoreapp3.1)) (&& (== net6.0) (>= uap10.1)) (&& (== net7.0) (>= net472)) (&& (== net7.0) (< netcoreapp3.1)) (&& (== net7.0) (>= uap10.1)) (== netstandard2.0) + System.Reflection.Metadata (7.0.1) - restriction: || (&& (== net462) (>= net472)) (&& (== net462) (>= net6.0)) (&& (== net462) (>= netstandard2.0)) (== net6.0) (== net7.0) (== netstandard2.0) + System.Collections.Immutable (>= 7.0) + System.Reflection.MetadataLoadContext (7.0) - restriction: || (&& (== net462) (>= net472)) (&& (== net462) (>= net6.0)) (== net6.0) (== net7.0) (&& (== netstandard2.0) (>= net472)) (&& (== netstandard2.0) (>= net6.0)) + System.Collections.Immutable (>= 7.0) + System.Reflection.Metadata (>= 7.0) + System.Resources.Extensions (7.0) - restriction: || (&& (== net462) (>= netstandard2.0)) (== net6.0) (== net7.0) (== netstandard2.0) + System.Memory (>= 4.5.5) - restriction: || (== net462) (&& (== net6.0) (>= net462)) (&& (== net7.0) (>= net462)) (&& (== net7.0) (< net6.0)) (== netstandard2.0) + System.Runtime (4.3.1) - restriction: || (&& (== net462) (== net6.0)) (&& (== net462) (== net7.0)) (&& (== net462) (< net45) (>= netstandard2.0)) (&& (== net6.0) (< netcoreapp3.1)) (&& (== net7.0) (< netcoreapp3.1)) (== netstandard2.0) + Microsoft.NETCore.Platforms (>= 1.1.1) - restriction: || (&& (== net462) (< net45)) (== net6.0) (== net7.0) (== netstandard2.0) + Microsoft.NETCore.Targets (>= 1.1.3) - restriction: || (&& (== net462) (< net45)) (== net6.0) (== net7.0) (== netstandard2.0) + System.Runtime.CompilerServices.Unsafe (6.0) - restriction: || (&& (== net462) (== net7.0)) (&& (== net462) (>= net472)) (&& (== net462) (>= net6.0)) (&& (== net462) (>= netstandard2.0)) (== net6.0) (&& (== net7.0) (>= net461)) (&& (== net7.0) (>= net472)) (&& (== net7.0) (< netcoreapp2.1)) (&& (== net7.0) (< netstandard1.0)) (&& (== net7.0) (< netstandard2.0)) (&& (== net7.0) (>= uap10.1)) (&& (== net7.0) (>= wp8)) (== netstandard2.0) + System.Runtime.InteropServices.WindowsRuntime (4.3) - restriction: || (&& (== net462) (== net6.0)) (&& (== net462) (== net7.0)) (&& (== net462) (>= netstandard2.0)) (&& (== net6.0) (< netcoreapp3.1)) (&& (== net7.0) (< netcoreapp3.1)) (== netstandard2.0) + System.Runtime (>= 4.3) - restriction: || (&& (== net462) (< net45)) (== net6.0) (== net7.0) (== netstandard2.0) + System.Security.AccessControl (6.0) - restriction: || (&& (== net462) (== net6.0)) (&& (== net462) (== net7.0)) (&& (== net462) (>= net6.0)) (&& (== net7.0) (< net6.0)) (== netstandard2.0) + System.Security.Principal.Windows (>= 5.0) - restriction: || (== net462) (&& (== net6.0) (>= net461)) (&& (== net7.0) (>= net461)) (&& (== net7.0) (< net6.0)) (== netstandard2.0) + System.Security.Cryptography.Cng (5.0) - restriction: || (&& (== net462) (>= net5.0)) (&& (== net462) (>= net6.0)) (&& (== net462) (>= netstandard2.0)) (&& (== net462) (>= netstandard2.1)) (== net6.0) (== net7.0) (== netstandard2.0) + System.Security.Cryptography.Pkcs (7.0.1) - restriction: || (&& (== net462) (>= net6.0)) (&& (== net462) (>= netstandard2.0)) (== net6.0) (== net7.0) (== netstandard2.0) + System.Buffers (>= 4.5.1) - restriction: || (&& (== net462) (== net6.0)) (&& (== net462) (== net7.0)) (&& (== net6.0) (< netstandard2.1)) (&& (== net7.0) (< netstandard2.1)) (== netstandard2.0) + System.Formats.Asn1 (>= 7.0) - restriction: || (&& (== net462) (>= netstandard2.1)) (== net6.0) (== net7.0) (== netstandard2.0) + System.Memory (>= 4.5.5) - restriction: || (&& (== net462) (== net6.0)) (&& (== net462) (== net7.0)) (&& (== net6.0) (< netstandard2.1)) (&& (== net7.0) (< netstandard2.1)) (== netstandard2.0) + System.Security.Cryptography.Cng (>= 5.0) - restriction: || (&& (== net462) (== net6.0)) (&& (== net462) (== net7.0)) (&& (== net462) (>= netstandard2.1)) (&& (== net6.0) (< netstandard2.1)) (&& (== net7.0) (< net6.0)) (&& (== net7.0) (< netstandard2.1)) (== netstandard2.0) + System.Security.Cryptography.ProtectedData (7.0.1) - restriction: || (&& (== net462) (>= net6.0)) (&& (== net462) (>= netstandard2.0)) (== net6.0) (== net7.0) (== netstandard2.0) + System.Security.Cryptography.Xml (7.0.1) - restriction: || (&& (== net462) (>= net6.0)) (&& (== net462) (>= netstandard2.0)) (== net6.0) (== net7.0) (== netstandard2.0) + System.Memory (>= 4.5.5) - restriction: || (&& (== net462) (== net7.0)) (&& (== net7.0) (< net6.0)) (== netstandard2.0) + System.Security.AccessControl (>= 6.0) - restriction: || (&& (== net462) (== net7.0)) (&& (== net7.0) (< net6.0)) (== netstandard2.0) + System.Security.Cryptography.Pkcs (>= 7.0) - restriction: || (&& (== net462) (>= net6.0)) (== net6.0) (== net7.0) (== netstandard2.0) + System.Security.Permissions (7.0) - restriction: || (&& (== net462) (>= net472)) (&& (== net462) (>= net6.0)) (&& (== net462) (>= netstandard2.0)) (== net6.0) (== net7.0) (== netstandard2.0) + System.Security.AccessControl (>= 6.0) - restriction: || (== net462) (&& (== net6.0) (>= net462)) (&& (== net7.0) (>= net462)) (&& (== net7.0) (< net6.0)) (== netstandard2.0) + System.Windows.Extensions (>= 7.0) - restriction: || (&& (== net462) (>= net6.0)) (== net6.0) (== net7.0) (&& (== netstandard2.0) (>= net6.0)) + System.Security.Principal.Windows (5.0) - restriction: || (&& (== net462) (>= net6.0)) (&& (== net462) (>= netcoreapp2.0)) (&& (== net462) (>= netcoreapp2.1)) (&& (== net462) (>= netstandard2.0)) (&& (== net462) (>= xamarinios)) (&& (== net462) (>= xamarinmac)) (== net6.0) (== net7.0) (== netstandard2.0) + System.Text.Encoding.CodePages (7.0) - restriction: || (&& (== net462) (>= net6.0)) (&& (== net462) (>= netstandard2.0)) (== net6.0) (== net7.0) (== netstandard2.0) + System.Runtime.CompilerServices.Unsafe (>= 6.0) - restriction: || (== net462) (== net6.0) (&& (== net7.0) (>= net462)) (&& (== net7.0) (< net6.0)) (== netstandard2.0) + System.Text.Encodings.Web (7.0) - restriction: || (&& (== net462) (>= net472)) (&& (== net462) (>= net6.0)) (== net6.0) (== net7.0) (&& (== netstandard2.0) (>= net472)) (&& (== netstandard2.0) (>= net6.0)) + System.Runtime.CompilerServices.Unsafe (>= 6.0) - restriction: || (== net462) (== net6.0) (&& (== net7.0) (>= net462)) (&& (== net7.0) (< net6.0)) (== netstandard2.0) + System.Text.Json (7.0.2) - restriction: || (&& (== net462) (>= net472)) (&& (== net462) (>= net6.0)) (== net6.0) (== net7.0) (&& (== netstandard2.0) (>= net472)) (&& (== netstandard2.0) (>= net6.0)) + System.Runtime.CompilerServices.Unsafe (>= 6.0) - restriction: || (== net462) (== net6.0) (&& (== net7.0) (>= net462)) (&& (== net7.0) (< net6.0)) (== netstandard2.0) + System.Text.Encodings.Web (>= 7.0) + System.Threading.Tasks.Dataflow (7.0) - restriction: || (&& (== net462) (>= net472)) (&& (== net462) (>= net6.0)) (&& (== net462) (>= netstandard2.0)) (== net6.0) (== net7.0) (== netstandard2.0) + System.Threading.Tasks.Extensions (4.5.4) - restriction: || (&& (== net462) (== net6.0)) (&& (== net462) (== net7.0)) (&& (== net462) (>= net472)) (&& (== net462) (>= netstandard2.0)) (&& (== net6.0) (>= net472)) (&& (== net6.0) (< netcoreapp3.1)) (&& (== net6.0) (>= uap10.1)) (&& (== net7.0) (>= net472)) (&& (== net7.0) (< netcoreapp3.1)) (&& (== net7.0) (>= uap10.1)) (== netstandard2.0) + System.Runtime.CompilerServices.Unsafe (>= 4.5.3) - restriction: || (== net462) (&& (== net6.0) (>= net461)) (&& (== net6.0) (< netcoreapp2.1)) (&& (== net6.0) (< netstandard1.0)) (&& (== net6.0) (< netstandard2.0)) (&& (== net6.0) (>= wp8)) (&& (== net7.0) (>= net461)) (&& (== net7.0) (< netcoreapp2.1)) (&& (== net7.0) (< netstandard1.0)) (&& (== net7.0) (< netstandard2.0)) (&& (== net7.0) (>= wp8)) (== netstandard2.0) + System.Windows.Extensions (7.0) - restriction: || (&& (== net462) (>= net6.0)) (== net6.0) (== net7.0) (&& (== netstandard2.0) (>= net6.0)) + System.Drawing.Common (>= 7.0) - restriction: || (&& (== net462) (>= net6.0)) (== net6.0) (== net7.0) (&& (== netstandard2.0) (>= net6.0)) diff --git a/build-script/paket.references b/build-script/paket.references new file mode 100644 index 000000000..539702f5e --- /dev/null +++ b/build-script/paket.references @@ -0,0 +1,6 @@ +Microsoft.Build +Microsoft.Build.Tasks.Core +Fake.Core.Target +Fake.DotNet.AssemblyInfoFile +Fake.DotNet.Cli +Fake.DotNet.Testing.XUnit2 \ No newline at end of file diff --git a/build.cmd b/build.cmd index 4ef039cb0..63f20c506 100644 --- a/build.cmd +++ b/build.cmd @@ -1,4 +1,4 @@ @echo off cls dotnet tool restore -if "%~1"=="" (dotnet fake run build.fsx) else (dotnet fake run build.fsx -t %*) +if "%~1"=="" (dotnet run --project ./build-script/build-script.fsproj) else (dotnet run --project ./build-script/build-script.fsproj -- -t %*) diff --git a/build.fsx b/build.fsx deleted file mode 100644 index 906b045c4..000000000 --- a/build.fsx +++ /dev/null @@ -1,538 +0,0 @@ -#r "paket: -nuget Fake.Core.Target -nuget Fake.Core.CommandLineParsing -nuget Fake.DotNet.AssemblyInfoFile -nuget Fake.IO.FileSystem -nuget Fake.DotNet.Cli -nuget Fake.DotNet.MSBuild -nuget Fake.DotNet.Testing.XUnit2 -nuget Fake.DotNet.NuGet -//" - -#r "System.Core.dll" -#r "System.Xml.Linq.dll" -// include Fake modules, see Fake modules section - -open Fake.Core.TargetOperators -open Fake.Core.Operators -open Fake.Core -open Fake.IO.Globbing.Operators -open Fake.DotNet -open Fake.IO -open Fake -open System -open Fake.DotNet.Testing -open Fake.DotNet.Testing.XUnit2 -open System.Xml.Linq -open System.Xml.XPath -open FSharp.Core -open Fake.Testing.Common -open Fake.DotNet.NuGet -open System.Text.RegularExpressions - -let currentDir = __SOURCE_DIRECTORY__ -let netstandardTestDir = "src/IO.Ably.Tests.DotNetCore20" -let xUnit2 = XUnit2.run - -let NetStandardSolution = "src/IO.Ably.NetStandard.sln" -let NetFrameworkSolution = "src/IO.Ably.NetFramework.sln" -let XamarinSolution = "src/IO.Ably.Xamarin.sln" -let buildDir = Path.combine currentDir "build" -let srcDir = Path.combine currentDir "src" -let testResultsDir = Path.combine buildDir "tests" -let packageDir = Path.combine buildDir "package" -let configuration = DotNet.Release -let packageSolution = "src/IO.Ably.Package.sln" -let pushPackageSolution = "src/IO.Ably.PackagePush.sln" -let buildMode = Environment.environVarOrDefault "buildMode" "Release" - -let cli = """ -usage: prog [options] - -options: - -t Target - -v Version -""" - -// retrieve the fake 5 context information -let ctx = Context.forceFakeContext () -// get the arguments -let args = ctx.Arguments -let parser = Docopt(cli) -let parsedArguments = parser.Parse(args |> List.toArray) - -let version = match DocoptResult.tryGetArgument "-v" parsedArguments with - | None -> "" - | Some version -> version - -let mergeJsonNet path outputPath = - let target = Path.combine path "IO.Ably.dll" - let docsFile = Path.combine path "IO.Ably.xml" - let out = Path.combine outputPath "IO.Ably.dll" - - Directory.ensure outputPath - - CreateProcess.fromRawCommand "./tools/ilrepack.exe" - [ - "/lib:" + path - "/targetplatform:v4" - "/internalize" - "/attr:" + target - "/keyfile:IO.Ably.snk" - "/parallel" - "/out:" + out - target - Path.combine path "Newtonsoft.Json.dll" - ] - |> Proc.run // start with the above configuration - |> ignore - - // Copy the xml docs - if File.exists docsFile then Shell.copy outputPath [ docsFile ] - - -// *** Define Targets *** -Target.create "Clean" (fun _ -> - Trace.log (sprintf "Current dir: %s" currentDir) - Trace.log " --- Removing build folder ---" - Directory.delete(buildDir) - Directory.delete(packageDir) - - Directory.ensure testResultsDir - Directory.ensure packageDir -) - -Target.create "Version" (fun _ -> - AssemblyInfoFile.createCSharp "./src/CommonAssemblyInfo.cs" - [ - AssemblyInfo.Company "Ably" - AssemblyInfo.Product "Ably .NET Library" - AssemblyInfo.Version version - AssemblyInfo.FileVersion version - ] -) - - -let nugetRestore solutionFile = - CreateProcess.fromRawCommand "./tools/nuget.exe" ["restore"; solutionFile] - |> Proc.run // start with the above configuration - -Target.create "Restore" (fun _ -> - if Environment.isWindows then - nugetRestore "src/IO.Ably.sln" |> ignore - - CreateProcess.fromRawCommand "dotnet" ["restore"; "src/IO.Ably.sln"] - |> Proc.run |> ignore -) - -Target.create "Restore Xamarin" (fun _ -> - - if not Environment.isWindows then - CreateProcess.fromRawCommand "ls" ["../packages"] |> Proc.run |> ignore - - let setParams (defaults:MSBuildParams) = - { defaults with - Verbosity = Some(Quiet) - Targets = ["Restore"] - Properties = - [ - "Configuration", buildMode - "RestorePackages", "True" - ] - } - MSBuild.build setParams NetFrameworkSolution - - -) - -Target.create "NetFramework - Build" (fun _ -> - let setParams (defaults:MSBuildParams) = - { defaults with - Verbosity = Some(Quiet) - Targets = ["Build"] - Properties = - [ - "Optimize", "True" - "DebugSymbols", "True" - "Configuration", buildMode - ] - } - MSBuild.build setParams NetFrameworkSolution -) - -Target.create "Xamarin - Build" (fun _ -> - let setParams (defaults:MSBuildParams) = - { defaults with - Verbosity = Some(Quiet) - Targets = ["Build"] - Properties = - [ - "Optimize", "True" - "DebugSymbols", "True" - "Configuration", buildMode - ] - } - MSBuild.build setParams XamarinSolution -) - -type TestRun = - | Method of string - | UnitTests - | IntegrationTests - -let findNextTrxTestPath (resultsPath:string) = - [ 1 .. 100 ] - |> Seq.map ( fun i -> resultsPath.Replace(".trx", sprintf "-%d.trx" i)) - |> Seq.find (File.exists >> not) - -let findNextTestPath (resultsPath:string) = - [ 1 .. 100 ] - |> Seq.map ( fun i -> resultsPath.Replace(".xml", sprintf "-%d.xml" i)) - |> Seq.find (File.exists >> not) - -let trimTestMethod (testMethod:string) = - match testMethod.Contains("(") with - | true -> testMethod.Substring(0, testMethod.IndexOf("(")) - | false -> testMethod - -let findFailedXUnitTests (resultsPath:string) = - let doc = XDocument.Load(resultsPath) - let nodes = doc.XPathSelectElements("//test-case[@success='False']") - - nodes - |> Seq.map (fun node -> (node.Attribute(XName.Get("name"))).Value) - |> Seq.map trimTestMethod - -let findFailedDotnetTestTests (resultsPath:string) = - let xml = File.readAsString resultsPath - let tidyXml = Regex.Replace(xml, @"xmlns=\""[^\""]+\""", "") // Remove the namespace to make xpath queries easier - let doc = XDocument.Parse(tidyXml); - let nodes = doc.XPathSelectElements("//UnitTestResult[@outcome='Failed']") - printfn "Nodes found: %d" (nodes |> Seq.length) - - nodes - |> Seq.map (fun node -> (node.Attribute(XName.Get("testName"))).Value) - |> Seq.map trimTestMethod - |> Seq.toList - -let runStandardTestsWithOptions testToRun (failOnError:bool) = - Directory.ensure testResultsDir - Trace.log " --- Testing net core version --- " - let project = Path.combine currentDir "src/IO.Ably.Tests.DotNetCore20/IO.Ably.Tests.DotNetCore20.csproj" - - match testToRun with - | Method testMethodName -> - let logsPath = findNextTrxTestPath(Path.combine testResultsDir "tests-netstandard.trx") - DotNet.test (fun opts -> { opts with Configuration = configuration - Filter = Some testMethodName - Logger = Some( "trx;logfilename=" + logsPath) - }) - project - logsPath - | UnitTests -> - let logsPath = Path.combine testResultsDir "tests-netstandard-unit.trx" - let mutable filters = [ "type!=integration" ] - if Environment.isLinux then filters <- filters @ ["linux!=skip"] - - try - DotNet.test (fun opts -> { opts with Configuration = configuration - Filter = Some (filters |> String.concat "&") - Logger = Some( "trx;logfilename=" + logsPath) - }) - project - with - | :? Fake.DotNet.MSBuildException -> - printfn "Not all unit tests passed. FailOnError is %b" failOnError |> ignore - if failOnError then reraise() - - logsPath - | IntegrationTests -> - let logsPath = Path.combine testResultsDir "tests-netstandard-integration.trx" - try - DotNet.test (fun opts -> { opts with Configuration = configuration - Filter = Some ("type=integration") - Logger = Some( "trx;logfilename=" + logsPath) - }) - project - with - | :? Fake.DotNet.MSBuildException -> - printfn "Not all integration tests passed the first time" - if failOnError then reraise() - - - logsPath - -let runStandardTests testToRun = - runStandardTestsWithOptions testToRun true - -let runStandardTestsAllowRetry testToRun = - runStandardTestsWithOptions testToRun false - -let runFrameworkTests testToRun errorLevel = - Directory.ensure testResultsDir - let testDir = Path.combine currentDir "src/IO.Ably.Tests.NETFramework/bin/Release" - let testDll = !! (Path.combine testDir "*.Tests.*.dll") - - match testToRun with - | Method testMethodName -> - let logsPath = findNextTestPath(Path.combine testResultsDir "xunit-netframework.xml") - testDll - |> xUnit2 (fun p -> { p with NUnitXmlOutputPath = Some ( logsPath) - Method = Some (trimTestMethod testMethodName) - ErrorLevel = errorLevel - }) - logsPath - | UnitTests -> - let logsPath = Path.combine testResultsDir "xunit-netframework-unit.xml" - testDll - |> xUnit2 (fun p -> { p with NUnitXmlOutputPath = Some logsPath - ExcludeTraits = [ ("type", "integration")] - ErrorLevel = errorLevel - }) - logsPath - | IntegrationTests -> - let logsPath = Path.combine testResultsDir "xunit-netframework-integration.xml" - testDll - |> xUnit2 (fun p -> { p with NUnitXmlOutputPath = Some logsPath - IncludeTraits = [ ("type", "integration")] - TimeOut = TimeSpan.FromMinutes(20.) - Parallel = ParallelMode.Collections - ErrorLevel = errorLevel - }) - logsPath - -Target.create "NetFramework.Integration.Rerun" (fun _ -> - - let setParams (defaults:MSBuildParams) = - { defaults with - Verbosity = Some(Quiet) - Targets = ["Build"] - Properties = - [ - "Optimize", "True" - "DebugSymbols", "True" - "Configuration", buildMode - ] - } - MSBuild.build setParams NetFrameworkSolution - - - let logsPath = Path.combine testResultsDir "xunit-netframework-integration.xml" - - let failedTestNames = findFailedXUnitTests logsPath - - for test in failedTestNames do - runFrameworkTests (Method test) TestRunnerErrorLevel.Error |> ignore -) - -Target.create "NetFramework - Unit Tests" (fun _ -> - - runFrameworkTests UnitTests TestRunnerErrorLevel.Error |> ignore -) - -Target.create "NetFramework - Integration Tests" ( fun _ -> - - let logs = runFrameworkTests IntegrationTests TestRunnerErrorLevel.DontFailBuild - - let failedTestNames = findFailedXUnitTests logs - - for test in failedTestNames do - runFrameworkTests (Method test) TestRunnerErrorLevel.Error |> ignore -) - -Target.create "NetStandard - Build" (fun _ -> - DotNet.build (fun opts -> { - opts with Configuration = configuration - }) NetStandardSolution -) - -Target.create "NetStandard - Unit Tests" (fun _ -> - runStandardTests UnitTests |> ignore -) - -Target.create "NetStandard - Unit Tests with retry" (fun _ -> - let logs = runStandardTestsAllowRetry UnitTests - - let failedTestNames = findFailedDotnetTestTests logs - - for test in failedTestNames do - runStandardTests (Method test) |> ignore -) - -Target.create "NetStandard - Integration Tests" (fun _ -> - - let logs = runStandardTestsAllowRetry IntegrationTests - - let failedTestNames = findFailedDotnetTestTests logs - - for test in failedTestNames do - runStandardTests (Method test) |> ignore -) - -// This is duplicated before of Fake's build dependency doesn't allow -// This this target to be run independent of the unit tests -Target.create "NetStandard - Integration Tests with retry" (fun _ -> - - let logs = runStandardTestsAllowRetry IntegrationTests - - let failedTestNames = findFailedDotnetTestTests logs - - for test in failedTestNames do - runStandardTests (Method test) |> ignore -) - -Target.create "Package - Build All" (fun _ -> - let setParams (defaults:MSBuildParams) = - { defaults with - Verbosity = Some(Quiet) - Targets = ["Build"] - Properties = - [ - "Optimize", "True" - "DebugSymbols", "True" - "Configuration", buildMode - "StyleCopEnabled", "True" - "Package", "True" - "DefineConstants", "PACKAGE" - ] - } - MSBuild.build setParams packageSolution -) - -Target.create "Push Package - Build All" (fun _ -> - let setParams (defaults:MSBuildParams) = - { defaults with - Verbosity = Some(Quiet) - Targets = ["Build"] - Properties = - [ - "Optimize", "True" - "DebugSymbols", "True" - "Configuration", "Package" - "StyleCopEnabled", "True" - "Package", "True" - "DefineConstants", "PACKAGE" - ] - } - MSBuild.build setParams pushPackageSolution -) - -Target.create "Package - Merge json.net" (fun _ -> - let projectsToMerge = [ "IO.Ably.Android"; "IO.Ably.iOS"; "IO.Ably.NETFramework" ] - let binFolderPaths = projectsToMerge - |> Seq.map (Path.combine "src") - |> Seq.map (fun path -> sprintf "%s/bin/%s" path buildMode) - - // Copy all IO.Ably* files to the `packaged folder` - binFolderPaths - |> Seq.iter ( fun path -> !! (Path.combine path "IO.Ably*") |> Shell.copy (Path.combine path "packaged")) - - // Merge newtonsoft json into ably.dll and overwrite IO.Ably.dll in the packaged folder with the merged one - binFolderPaths - |> Seq.iter ( fun path -> mergeJsonNet path (Path.combine path "packaged")) - -) - -Target.create "Package - Create nuget" (fun _ -> - CreateProcess.fromRawCommand "./tools/nuget.exe" - [ - "pack" - "./nuget/io.ably.nuspec" - "-properties" - sprintf "version=%s;configuration=Release" version - ] - |> Proc.run // start with the above configuration - |> ignore -) - -Target.create "Package - Push" (fun _ -> - CreateProcess.fromRawCommand "nuget" - [ - "pack" - "./nuget/io.ably.push.android.nuspec" - "-properties" - sprintf "version=%s;configuration=Release" version - ] - |> Proc.run // start with the above configuration - |> ignore - - CreateProcess.fromRawCommand "nuget" - [ - "pack" - "./nuget/io.ably.push.ios.nuspec" - "-properties" - sprintf "version=%s;configuration=Release" version - ] - |> Proc.run // start with the above configuration - |> ignore -) - -Target.create "Prepare" ignore -Target.create "Build.NetFramework" ignore -Target.create "Build.NetStandard" ignore -Target.create "Build.Xamarin" ignore - -Target.create "Test.NetFramework.Unit" ignore -Target.create "Test.NetFramework.Integration" ignore - -Target.create "Test.NetStandard.Unit" ignore -Target.create "Test.NetStandard.Unit.WithRetry" ignore -Target.create "Test.NetStandard.Integration.WithRetry" ignore -Target.create "Test.NetStandard.Integration" ignore - -Target.create "Package" ignore -Target.create "PushPackage" ignore - - - -"Clean" - ==> "Restore" - ==> "Prepare" - -"Prepare" - ==> "NetFramework - Build" - ==> "Build.NetFramework" - -"Prepare" - ==> "Restore Xamarin" - ==> "Xamarin - Build" - ==> "Build.Xamarin" - -"Prepare" - ==> "NetStandard - Build" - ==> "Build.NetStandard" - -"Prepare" - ==> "Version" - ==> "Package - Build All" - ==> "Package - Merge json.net" - ==> "Package - Create nuget" - ==> "Package" - -"Prepare" - ==> "Version" - ==> "Push Package - Build All" - ==> "Package - Push" - ==> "PushPackage" - -"Build.NetFramework" - ==> "NetFramework - Unit Tests" - ==> "Test.NetFramework.Unit" - -"Build.NetFramework" - ==> "NetFramework - Integration Tests" - ==> "Test.NetFramework.Integration" - -"Build.NetStandard" - ==> "NetStandard - Unit Tests" - ==> "Test.NetStandard.Unit" - -"Build.NetStandard" - ==> "NetStandard - Integration Tests" - ==> "Test.NetStandard.Integration" - -"Build.NetStandard" - ==> "NetStandard - Unit Tests with retry" - ==> "Test.NetStandard.Unit.WithRetry" - -Target.runOrDefaultWithArguments "Build.NetFramework" diff --git a/build.fsx.lock b/build.fsx.lock deleted file mode 100644 index 39acd3cf2..000000000 --- a/build.fsx.lock +++ /dev/null @@ -1,239 +0,0 @@ -STORAGE: NONE -RESTRICTION: == netstandard2.0 -NUGET - remote: https://api.nuget.org/v3/index.json - BlackFox.VsWhere (1.1) - FSharp.Core (>= 4.2.3) - Microsoft.Win32.Registry (>= 4.7) - Fake.Core.CommandLineParsing (5.20.4) - FParsec (>= 1.1.1) - FSharp.Core (>= 4.7.2) - Fake.Core.Context (5.20.4) - FSharp.Core (>= 4.7.2) - Fake.Core.Environment (5.20.4) - FSharp.Core (>= 4.7.2) - Fake.Core.FakeVar (5.20.4) - Fake.Core.Context (>= 5.20.4) - FSharp.Core (>= 4.7.2) - Fake.Core.Process (5.20.4) - Fake.Core.Environment (>= 5.20.4) - Fake.Core.FakeVar (>= 5.20.4) - Fake.Core.String (>= 5.20.4) - Fake.Core.Trace (>= 5.20.4) - Fake.IO.FileSystem (>= 5.20.4) - FSharp.Core (>= 4.7.2) - System.Collections.Immutable (>= 1.7.1) - Fake.Core.SemVer (5.20.4) - FSharp.Core (>= 4.7.2) - Fake.Core.String (5.20.4) - FSharp.Core (>= 4.7.2) - Fake.Core.Target (5.20.4) - Fake.Core.CommandLineParsing (>= 5.20.4) - Fake.Core.Context (>= 5.20.4) - Fake.Core.Environment (>= 5.20.4) - Fake.Core.FakeVar (>= 5.20.4) - Fake.Core.Process (>= 5.20.4) - Fake.Core.String (>= 5.20.4) - Fake.Core.Trace (>= 5.20.4) - FSharp.Control.Reactive (>= 4.4.2) - FSharp.Core (>= 4.7.2) - Fake.Core.Tasks (5.20.4) - Fake.Core.Trace (>= 5.20.4) - FSharp.Core (>= 4.7.2) - Fake.Core.Trace (5.20.4) - Fake.Core.Environment (>= 5.20.4) - Fake.Core.FakeVar (>= 5.20.4) - FSharp.Core (>= 4.7.2) - Fake.Core.Xml (5.20.4) - Fake.Core.String (>= 5.20.4) - FSharp.Core (>= 4.7.2) - Fake.DotNet.AssemblyInfoFile (5.20.4) - Fake.Core.Environment (>= 5.20.4) - Fake.Core.String (>= 5.20.4) - Fake.Core.Trace (>= 5.20.4) - Fake.IO.FileSystem (>= 5.20.4) - FSharp.Core (>= 4.7.2) - Fake.DotNet.Cli (5.20.4) - Fake.Core.Environment (>= 5.20.4) - Fake.Core.Process (>= 5.20.4) - Fake.Core.String (>= 5.20.4) - Fake.Core.Trace (>= 5.20.4) - Fake.DotNet.MSBuild (>= 5.20.4) - Fake.DotNet.NuGet (>= 5.20.4) - Fake.IO.FileSystem (>= 5.20.4) - FSharp.Core (>= 4.7.2) - Mono.Posix.NETStandard (>= 1.0) - Newtonsoft.Json (>= 12.0.3) - Fake.DotNet.MSBuild (5.20.4) - BlackFox.VsWhere (>= 1.1) - Fake.Core.Environment (>= 5.20.4) - Fake.Core.Process (>= 5.20.4) - Fake.Core.String (>= 5.20.4) - Fake.Core.Trace (>= 5.20.4) - Fake.IO.FileSystem (>= 5.20.4) - FSharp.Core (>= 4.7.2) - MSBuild.StructuredLogger (>= 2.1.176) - Fake.DotNet.NuGet (5.20.4) - Fake.Core.Environment (>= 5.20.4) - Fake.Core.Process (>= 5.20.4) - Fake.Core.SemVer (>= 5.20.4) - Fake.Core.String (>= 5.20.4) - Fake.Core.Tasks (>= 5.20.4) - Fake.Core.Trace (>= 5.20.4) - Fake.Core.Xml (>= 5.20.4) - Fake.IO.FileSystem (>= 5.20.4) - Fake.Net.Http (>= 5.20.4) - FSharp.Core (>= 4.7.2) - Newtonsoft.Json (>= 12.0.3) - NuGet.Protocol (>= 5.6) - Fake.DotNet.Testing.XUnit2 (5.20.4) - Fake.Core.Process (>= 5.20.4) - Fake.Core.String (>= 5.20.4) - Fake.Core.Trace (>= 5.20.4) - Fake.IO.FileSystem (>= 5.20.4) - Fake.Testing.Common (>= 5.20.4) - FSharp.Core (>= 4.7.2) - Fake.IO.FileSystem (5.20.4) - Fake.Core.String (>= 5.20.4) - FSharp.Core (>= 4.7.2) - Fake.Net.Http (5.20.4) - Fake.Core.Trace (>= 5.20.4) - FSharp.Core (>= 4.7.2) - Fake.Testing.Common (5.20.4) - Fake.Core.Trace (>= 5.20.4) - FSharp.Core (>= 4.7.2) - FParsec (1.1.1) - FSharp.Core (>= 4.3.4) - FSharp.Control.Reactive (5.0.2) - FSharp.Core (>= 4.7.2) - System.Reactive (>= 5.0) - FSharp.Core (5.0.1) - Microsoft.Bcl.AsyncInterfaces (5.0) - System.Threading.Tasks.Extensions (>= 4.5.4) - Microsoft.Build (16.10) - Microsoft.Build.Framework (>= 16.10) - Microsoft.NET.StringTools (>= 1.0) - Microsoft.Win32.Registry (>= 4.3) - System.Collections.Immutable (>= 5.0) - System.Configuration.ConfigurationManager (>= 4.7) - System.Reflection.Metadata (>= 1.6) - System.Security.Principal.Windows (>= 4.7) - System.Text.Encoding.CodePages (>= 4.0.1) - System.Text.Json (>= 4.7) - System.Threading.Tasks.Dataflow (>= 4.9) - Microsoft.Build.Framework (16.10) - System.Security.Permissions (>= 4.7) - Microsoft.Build.Tasks.Core (16.10) - Microsoft.Build.Framework (>= 16.10) - Microsoft.Build.Utilities.Core (>= 16.10) - Microsoft.NET.StringTools (>= 1.0) - Microsoft.Win32.Registry (>= 4.3) - System.CodeDom (>= 4.4) - System.Collections.Immutable (>= 5.0) - System.Reflection.Metadata (>= 1.6) - System.Resources.Extensions (>= 4.6) - System.Security.Cryptography.Pkcs (>= 4.7) - System.Security.Cryptography.Xml (>= 4.7) - System.Security.Permissions (>= 4.7) - System.Threading.Tasks.Dataflow (>= 4.9) - Microsoft.Build.Utilities.Core (16.10) - Microsoft.Build.Framework (>= 16.10) - Microsoft.NET.StringTools (>= 1.0) - Microsoft.Win32.Registry (>= 4.3) - System.Collections.Immutable (>= 5.0) - System.Configuration.ConfigurationManager (>= 4.7) - System.Security.Permissions (>= 4.7) - System.Text.Encoding.CodePages (>= 4.0.1) - Microsoft.NET.StringTools (1.0) - System.Memory (>= 4.5.4) - System.Runtime.CompilerServices.Unsafe (>= 5.0) - Microsoft.NETCore.Platforms (5.0.2) - Microsoft.NETCore.Targets (5.0) - Microsoft.Win32.Registry (5.0) - System.Buffers (>= 4.5.1) - System.Memory (>= 4.5.4) - System.Security.AccessControl (>= 5.0) - System.Security.Principal.Windows (>= 5.0) - Mono.Posix.NETStandard (1.0) - MSBuild.StructuredLogger (2.1.507) - Microsoft.Build (>= 16.4) - Microsoft.Build.Framework (>= 16.4) - Microsoft.Build.Tasks.Core (>= 16.4) - Microsoft.Build.Utilities.Core (>= 16.4) - Newtonsoft.Json (13.0.1) - NuGet.Common (5.9.1) - NuGet.Frameworks (>= 5.9.1) - NuGet.Configuration (5.9.1) - NuGet.Common (>= 5.9.1) - System.Security.Cryptography.ProtectedData (>= 4.4) - NuGet.Frameworks (5.9.1) - NuGet.Packaging (5.9.1) - Newtonsoft.Json (>= 9.0.1) - NuGet.Configuration (>= 5.9.1) - NuGet.Versioning (>= 5.9.1) - System.Security.Cryptography.Cng (>= 5.0) - System.Security.Cryptography.Pkcs (>= 5.0) - NuGet.Protocol (5.9.1) - NuGet.Packaging (>= 5.9.1) - NuGet.Versioning (5.9.1) - System.Buffers (4.5.1) - System.CodeDom (5.0) - System.Collections.Immutable (5.0) - System.Memory (>= 4.5.4) - System.Configuration.ConfigurationManager (5.0) - System.Security.Cryptography.ProtectedData (>= 5.0) - System.Security.Permissions (>= 5.0) - System.Formats.Asn1 (5.0) - System.Buffers (>= 4.5.1) - System.Memory (>= 4.5.4) - System.Memory (4.5.4) - System.Buffers (>= 4.5.1) - System.Numerics.Vectors (>= 4.4) - System.Runtime.CompilerServices.Unsafe (>= 4.5.3) - System.Numerics.Vectors (4.5) - System.Reactive (5.0) - System.Runtime.InteropServices.WindowsRuntime (>= 4.3) - System.Threading.Tasks.Extensions (>= 4.5.4) - System.Reflection.Metadata (5.0) - System.Collections.Immutable (>= 5.0) - System.Resources.Extensions (5.0) - System.Memory (>= 4.5.4) - System.Runtime (4.3.1) - Microsoft.NETCore.Platforms (>= 1.1.1) - Microsoft.NETCore.Targets (>= 1.1.3) - System.Runtime.CompilerServices.Unsafe (5.0) - System.Runtime.InteropServices.WindowsRuntime (4.3) - System.Runtime (>= 4.3) - System.Security.AccessControl (5.0) - System.Security.Principal.Windows (>= 5.0) - System.Security.Cryptography.Cng (5.0) - System.Security.Cryptography.Pkcs (5.0.1) - System.Buffers (>= 4.5.1) - System.Formats.Asn1 (>= 5.0) - System.Memory (>= 4.5.4) - System.Security.Cryptography.Cng (>= 5.0) - System.Security.Cryptography.ProtectedData (5.0) - System.Memory (>= 4.5.4) - System.Security.Cryptography.Xml (5.0) - System.Memory (>= 4.5.4) - System.Security.Cryptography.Pkcs (>= 5.0) - System.Security.Permissions (>= 5.0) - System.Security.Permissions (5.0) - System.Security.AccessControl (>= 5.0) - System.Security.Principal.Windows (5.0) - System.Text.Encoding.CodePages (5.0) - System.Runtime.CompilerServices.Unsafe (>= 5.0) - System.Text.Encodings.Web (5.0.1) - System.Buffers (>= 4.5.1) - System.Memory (>= 4.5.4) - System.Text.Json (5.0.2) - Microsoft.Bcl.AsyncInterfaces (>= 5.0) - System.Buffers (>= 4.5.1) - System.Memory (>= 4.5.4) - System.Numerics.Vectors (>= 4.5) - System.Runtime.CompilerServices.Unsafe (>= 5.0) - System.Text.Encodings.Web (>= 5.0.1) - System.Threading.Tasks.Extensions (>= 4.5.4) - System.Threading.Tasks.Dataflow (5.0) - System.Threading.Tasks.Extensions (4.5.4) - System.Runtime.CompilerServices.Unsafe (>= 4.5.3) diff --git a/build.sh b/build.sh index 8dfa78f56..6abf20884 100755 --- a/build.sh +++ b/build.sh @@ -3,7 +3,7 @@ dotnet tool restore if [ $# -eq 0 ] then - dotnet fake run build.fsx + dotnet run --project ./build-script/build-script.fsproj else - dotnet fake run build.fsx -t $@ + dotnet run --project ./build-script/build-script.fsproj -- -t $@ fi diff --git a/examples/NotificationsPublisher/NotificationsPublisher.csproj b/examples/NotificationsPublisher/NotificationsPublisher.csproj index 752296cf2..189ae6a6f 100644 --- a/examples/NotificationsPublisher/NotificationsPublisher.csproj +++ b/examples/NotificationsPublisher/NotificationsPublisher.csproj @@ -2,8 +2,9 @@ Exe - net5.0 + netcoreapp3.1 ..\..\src\IO.Ably.ruleset + 9 diff --git a/examples/NotificationsPublisher/Program.cs b/examples/NotificationsPublisher/Program.cs index 1202806ca..981fae502 100644 --- a/examples/NotificationsPublisher/Program.cs +++ b/examples/NotificationsPublisher/Program.cs @@ -281,7 +281,7 @@ void InitialiseAbly(string key) var options = new ClientOptions(key) { LogHandler = Logger, - LogLevel = LogLevel.Debug, + LogLevel = LogLevel.Warning, AutoConnect = false }; Ably = new AblyRealtime(options); diff --git a/global.json b/global.json new file mode 100644 index 000000000..0f050ba53 --- /dev/null +++ b/global.json @@ -0,0 +1,6 @@ +{ + "sdk": { + "version": "6.0.300", + "rollForward": "latestMajor" + } +} diff --git a/nuget/io.ably.nuspec b/nuget/io.ably.nuspec index 69cfc1b2e..b46a4782f 100644 --- a/nuget/io.ably.nuspec +++ b/nuget/io.ably.nuspec @@ -28,5 +28,7 @@ + + diff --git a/package-push.sh b/package-push.sh index e98abbec5..db8f626f2 100755 --- a/package-push.sh +++ b/package-push.sh @@ -9,6 +9,5 @@ if [ $# -eq 0 ] then echo "Provide latest version number like package-push.sh 1.2.8" else - dotnet tool restore - dotnet fake run build.fsx -t PushPackage -v $1 + ./build.sh PushPackage -v $1 fi diff --git a/src/IO.Ably.Android/Platform.cs b/src/IO.Ably.Android/Platform.cs index 3d55346b4..73ff9f369 100644 --- a/src/IO.Ably.Android/Platform.cs +++ b/src/IO.Ably.Android/Platform.cs @@ -10,7 +10,7 @@ internal class Platform : IPlatform private static readonly object _lock = new object(); internal static bool HookedUpToNetworkEvents { get; private set; } - public string PlatformId => "xamarin-android"; + public Agent.PlatformRuntime PlatformId => Agent.PlatformRuntime.XamarinAndroid; public bool SyncContextDefault => true; public ITransportFactory TransportFactory => null; diff --git a/src/IO.Ably.NETFramework/Platform.cs b/src/IO.Ably.NETFramework/Platform.cs index ba1a82241..f6765f3e6 100644 --- a/src/IO.Ably.NETFramework/Platform.cs +++ b/src/IO.Ably.NETFramework/Platform.cs @@ -16,7 +16,7 @@ static Platform() internal static bool HookedUpToNetworkEvents { get; private set; } - public string PlatformId => "framework"; + public Agent.PlatformRuntime PlatformId => Agent.PlatformRuntime.Framework; public ITransportFactory TransportFactory => null; diff --git a/src/IO.Ably.NETStandard20/IO.Ably.NETStandard20.csproj b/src/IO.Ably.NETStandard20/IO.Ably.NETStandard20.csproj index f08e87b84..47c26c065 100644 --- a/src/IO.Ably.NETStandard20/IO.Ably.NETStandard20.csproj +++ b/src/IO.Ably.NETStandard20/IO.Ably.NETStandard20.csproj @@ -1,13 +1,17 @@  - netstandard2.0 + netstandard2.0;net6.0;net7.0 ..\IO.Ably.ruleset Debug;Release;package false IO.Ably IO.Ably + + + netstandard2.0 + true diff --git a/src/IO.Ably.NETStandard20/Platform.cs b/src/IO.Ably.NETStandard20/Platform.cs index 18d21a176..72eeaa9b5 100644 --- a/src/IO.Ably.NETStandard20/Platform.cs +++ b/src/IO.Ably.NETStandard20/Platform.cs @@ -16,7 +16,14 @@ static Platform() internal static bool HookedUpToNetworkEvents { get; private set; } - public string PlatformId => "netstandard20"; + // Defined as per https://learn.microsoft.com/en-us/dotnet/standard/frameworks#preprocessor-symbols +#if NET6_0 + public Agent.PlatformRuntime PlatformId => Agent.PlatformRuntime.Net6; +#elif NET7_0 + public Agent.PlatformRuntime PlatformId => Agent.PlatformRuntime.Net7; +#else + public Agent.PlatformRuntime PlatformId => Agent.PlatformRuntime.Netstandard20; +#endif public ITransportFactory TransportFactory => null; diff --git a/src/IO.Ably.NETStandard20/Properties/AssemblyInfo.cs b/src/IO.Ably.NETStandard20/Properties/AssemblyInfo.cs index f2dc5452f..4b459f0d7 100644 --- a/src/IO.Ably.NETStandard20/Properties/AssemblyInfo.cs +++ b/src/IO.Ably.NETStandard20/Properties/AssemblyInfo.cs @@ -12,7 +12,7 @@ [assembly: InternalsVisibleTo("IO.Ably.Push.Android, PublicKey=002400000480000094000000060200000024000052534131000400000100010001394bb0af9eb8e04f43676c91691de20f2137847e153e27bb96cf2dedf43bce3073f699ca136fb7f9eea0d9b9c6748e9c0be5543761945e101062f8770129512c4c397a08c1b459357e7a49a4dfd7e16ac9c84d1ab3fe1177b3e7741ea10eba746433691bbf1ad643bdf25bcf397a384f96e8d138b129bdb663189200d33dcf")] [assembly: InternalsVisibleTo("IO.Ably.Push.iOS, PublicKey=002400000480000094000000060200000024000052534131000400000100010001394bb0af9eb8e04f43676c91691de20f2137847e153e27bb96cf2dedf43bce3073f699ca136fb7f9eea0d9b9c6748e9c0be5543761945e101062f8770129512c4c397a08c1b459357e7a49a4dfd7e16ac9c84d1ab3fe1177b3e7741ea10eba746433691bbf1ad643bdf25bcf397a384f96e8d138b129bdb663189200d33dcf")] #if !PACKAGE -[assembly: InternalsVisibleTo("IO.Ably.Tests.DotNetCore20")] +[assembly: InternalsVisibleTo("IO.Ably.Tests.DotNET")] [assembly: InternalsVisibleTo("Unity.Assets.Tests.AblySandbox")] [assembly: InternalsVisibleTo("Unity.Assets.Tests.EditMode")] [assembly: InternalsVisibleTo("Unity.Assets.Tests.PlayMode")] diff --git a/src/IO.Ably.NetStandard.sln b/src/IO.Ably.NetStandard.sln index a47f1b9b5..9ceaf9a9a 100644 --- a/src/IO.Ably.NetStandard.sln +++ b/src/IO.Ably.NetStandard.sln @@ -29,7 +29,7 @@ Project("{D954291E-2A0B-460D-934E-DC6B0785DB48}") = "IO.Ably.Shared", "IO.Ably.S EndProject Project("{D954291E-2A0B-460D-934E-DC6B0785DB48}") = "IO.Ably.Shared.MsgPack", "IO.Ably.Shared.MsgPack\IO.Ably.Shared.MsgPack.shproj", "{EEBF3249-3CA3-4078-A188-F8B916C3F4C2}" EndProject -Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "IO.Ably.Tests.DotNetCore20", "IO.Ably.Tests.DotNetCore20\IO.Ably.Tests.DotNetCore20.csproj", "{4805A9DA-3412-4BE8-8B95-5A0EFDA1AC01}" +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "IO.Ably.Tests.DotNET", "IO.Ably.Tests.DotNET\IO.Ably.Tests.DotNET.csproj", "{4805A9DA-3412-4BE8-8B95-5A0EFDA1AC01}" EndProject Project("{D954291E-2A0B-460D-934E-DC6B0785DB48}") = "IO.Ably.Tests.Shared", "IO.Ably.Tests.Shared\IO.Ably.Tests.Shared.shproj", "{1609F12C-8216-4E7C-ADE0-240BFE160242}" EndProject diff --git a/src/IO.Ably.Shared/Agent.cs b/src/IO.Ably.Shared/Agent.cs new file mode 100644 index 000000000..536b51370 --- /dev/null +++ b/src/IO.Ably.Shared/Agent.cs @@ -0,0 +1,217 @@ +using System; +using System.Collections.Generic; +using System.Runtime.InteropServices; + +namespace IO.Ably +{ + internal static class Agent + { + public enum PlatformRuntime + { + Framework, + Netstandard20, + Net6, + Net7, + XamarinAndroid, + XamarinIos, + Other, + } + + public static class OS + { + public const string Windows = "dotnet-windows"; + public const string MacOS = "dotnet-macOS"; + public const string Linux = "dotnet-linux"; + public const string Android = "dotnet-android"; + public const string IOS = "dotnet-iOS"; + public const string TvOS = "dotnet-tvOS"; + public const string WatchOS = "dotnet-watchOS"; + public const string Browser = "dotnet-browser"; + } + + internal const string AblyAgentHeader = "Ably-Agent"; + private static readonly string AblySdkIdentifier = $"ably-dotnet/{Defaults.LibraryVersion}"; // RSC7d1 + + /// + /// This returns dotnet platform as per ably-lib mappings defined in agents.json. + /// https://github.com/ably/ably-common/blob/main/protocol/agents.json. + /// This is required since we are migrating from 'X-Ably-Lib' header (RSC7b) to agent headers (RSC7d). + /// Please note that uwp platform is Deprecated and removed as a part of https://github.com/ably/ably-dotnet/pull/1101. + /// + /// Clean Platform Identifier. + internal static string DotnetRuntimeIdentifier() + { + string DotnetRuntimeName() + { + switch (IoC.PlatformId) + { + case PlatformRuntime.Framework: + return "dotnet-framework"; + case PlatformRuntime.Netstandard20: + return "dotnet-standard"; + case PlatformRuntime.Net6: + return "dotnet6"; + case PlatformRuntime.Net7: + return "dotnet7"; + case PlatformRuntime.XamarinAndroid: + return "xamarin"; + case PlatformRuntime.XamarinIos: + return "xamarin"; + } + + return string.Empty; + } + + var dotnetRuntimeName = DotnetRuntimeName(); + + string DotnetRuntimeVersion() + { + try + { + return Environment.Version.ToString(); + } + catch + { + return string.Empty; + } + } + + var dotnetRuntimeVersion = DotnetRuntimeVersion(); + + return dotnetRuntimeVersion.IsEmpty() ? + dotnetRuntimeName : $"{dotnetRuntimeName}/{dotnetRuntimeVersion}"; + } + + // Note - MAUI OS detection requires maui specific dependencies, https://learn.microsoft.com/en-us/dotnet/maui/platform-integration/device/information?view=net-maui-7.0&tabs=windows + internal static string OsIdentifier() + { + switch (IoC.PlatformId) + { + // For windows only dotnet-framework, return windows OS => https://dotnet.microsoft.com/en-us/download/dotnet-framework + case PlatformRuntime.Framework: + return OS.Windows; + case PlatformRuntime.XamarinAndroid: + return OS.Android; + case PlatformRuntime.XamarinIos: + return OS.IOS; + } + + // Preprocessors defined as per https://learn.microsoft.com/en-us/dotnet/standard/frameworks#preprocessor-symbols + // Get operating system as per https://stackoverflow.com/a/66618677 for .NET5 and greater +#if NET5_0_OR_GREATER + if (OperatingSystem.IsWindows()) + { + return OS.Windows; + } + + if (OperatingSystem.IsLinux()) + { + return OS.Linux; + } + + if (OperatingSystem.IsMacOS()) + { + return OS.MacOS; + } + + if (OperatingSystem.IsAndroid()) + { + return OS.Android; + } + + if (OperatingSystem.IsIOS()) + { + return OS.IOS; + } + + if (OperatingSystem.IsTvOS()) + { + return OS.TvOS; + } + + if (OperatingSystem.IsWatchOS()) + { + return OS.WatchOS; + } + + if (OperatingSystem.IsBrowser()) + { + return OS.Browser; + } +#endif + + // If netstandard target is used by .Net Core App, https://mariusschulz.com/blog/detecting-the-operating-system-in-net-core + try + { + if (RuntimeInformation.IsOSPlatform(OSPlatform.Linux)) + { + return OS.Linux; + } + + if (RuntimeInformation.IsOSPlatform(OSPlatform.OSX)) + { + return OS.MacOS; + } + + if (RuntimeInformation.IsOSPlatform(OSPlatform.Windows)) + { + return OS.Windows; + } + } + catch + { + // ignored + } + + // If netstandard target is used by .Net Mono App, http://docs.go-mono.com/?link=P%3aSystem.Environment.OSVersion + // https://stackoverflow.com/questions/9129491/c-sharp-compiled-in-mono-detect-os + switch (Environment.OSVersion.Platform) + { + case PlatformID.Win32NT: + case PlatformID.Win32S: + case PlatformID.Win32Windows: + case PlatformID.WinCE: + return OS.Windows; + case PlatformID.Unix: + return OS.Linux; + case PlatformID.MacOSX: + return OS.MacOS; + } + + return string.Empty; + } + + internal static string AblyAgentIdentifier(Dictionary additionalAgents) + { + string GetAgentComponentString(string product, string version) + { + return string.IsNullOrEmpty(version) ? product : $"{product}/{version}"; + } + + void AddAgentIdentifier(ICollection currentAgentComponents, string product, string version = null) + { + if (!string.IsNullOrEmpty(product)) + { + currentAgentComponents.Add(GetAgentComponentString(product, version)); + } + } + + var agentComponents = new List(); + AddAgentIdentifier(agentComponents, AblySdkIdentifier); + AddAgentIdentifier(agentComponents, DotnetRuntimeIdentifier()); + AddAgentIdentifier(agentComponents, OsIdentifier()); + + if (additionalAgents == null) + { + return string.Join(" ", agentComponents); + } + + foreach (var agent in additionalAgents) + { + AddAgentIdentifier(agentComponents, agent.Key, agent.Value); + } + + return string.Join(" ", agentComponents); + } + } +} diff --git a/src/IO.Ably.Shared/Defaults.cs b/src/IO.Ably.Shared/Defaults.cs index b53474aef..cba580f26 100644 --- a/src/IO.Ably.Shared/Defaults.cs +++ b/src/IO.Ably.Shared/Defaults.cs @@ -3,6 +3,8 @@ using System.Globalization; using System.Linq; using System.Reflection; +using System.Runtime.InteropServices; +using System.Security.Cryptography; using System.Text; using IO.Ably.Transport; @@ -98,64 +100,5 @@ internal static string[] GetEnvironmentFallbackHosts(string environment) $"{environment}-e-fallback.ably-realtime.com", }; } - - internal const string AblyAgentHeader = "Ably-Agent"; - private static readonly string AblySdkIdentifier = $"ably-dotnet/{LibraryVersion}"; // RSC7d1 - - /// - /// This returns dotnet platform as per ably-lib mappings defined in agents.json. - /// https://github.com/ably/ably-common/blob/main/protocol/agents.json. - /// This is required since we are migrating from 'X-Ably-Lib' header (RSC7b) to agent headers (RSC7d). - /// Please note that uwp platform is Deprecated and removed as a part of https://github.com/ably/ably-dotnet/pull/1101. - /// - /// Clean Platform Identifier. - internal static string DotnetRuntimeIdentifier() - { - switch (IoC.PlatformId) - { - case "framework": - return "dotnet-framework"; - case "netstandard20": - return "dotnet-standard"; - case "xamarin-android": - return "xamarin-android"; - case "xamarin-ios": - return "xamarin-iOS"; - } - - return string.Empty; - } - - internal static string AblyAgentIdentifier(Dictionary additionalAgents) - { - string GetAgentComponentString(string product, string version) - { - return string.IsNullOrEmpty(version) ? product : $"{product}/{version}"; - } - - void AddAgentIdentifier(ICollection currentAgentComponents, string product, string version = null) - { - if (!string.IsNullOrEmpty(product)) - { - currentAgentComponents.Add(GetAgentComponentString(product, version)); - } - } - - var agentComponents = new List(); - AddAgentIdentifier(agentComponents, AblySdkIdentifier); - AddAgentIdentifier(agentComponents, DotnetRuntimeIdentifier()); - - if (additionalAgents == null) - { - return string.Join(" ", agentComponents); - } - - foreach (var agent in additionalAgents) - { - AddAgentIdentifier(agentComponents, agent.Key, agent.Value); - } - - return string.Join(" ", agentComponents); - } } } diff --git a/src/IO.Ably.Shared/Http/AblyHttpClient.cs b/src/IO.Ably.Shared/Http/AblyHttpClient.cs index 287107f7f..05a33337c 100644 --- a/src/IO.Ably.Shared/Http/AblyHttpClient.cs +++ b/src/IO.Ably.Shared/Http/AblyHttpClient.cs @@ -74,7 +74,7 @@ internal void CreateInternalHttpClient(TimeSpan timeout, HttpMessageHandler mess { Client = messageHandler != null ? new HttpClient(messageHandler) : new HttpClient(); Client.DefaultRequestHeaders.Add("X-Ably-Version", Defaults.ProtocolVersion); - Client.DefaultRequestHeaders.Add(Defaults.AblyAgentHeader, Defaults.AblyAgentIdentifier(Options.Agents)); // RSC7d + Client.DefaultRequestHeaders.Add(Agent.AblyAgentHeader, Agent.AblyAgentIdentifier(Options.Agents)); // RSC7d Client.Timeout = timeout; } diff --git a/src/IO.Ably.Shared/HttpUtility.cs b/src/IO.Ably.Shared/HttpUtility.cs index 87bbd0ea0..fff57d766 100644 --- a/src/IO.Ably.Shared/HttpUtility.cs +++ b/src/IO.Ably.Shared/HttpUtility.cs @@ -2,7 +2,7 @@ using System.Collections.Generic; using System.Linq; using System.Text; -using kvp = System.Collections.Generic.KeyValuePair; +using Kvp = System.Collections.Generic.KeyValuePair; namespace IO.Ably { @@ -34,7 +34,7 @@ public static HttpValueCollection ParseQueryString(string query) /// public class HttpValueCollection { - private readonly List _data = new List(); + private readonly List _data = new List(); /// /// All the keys. @@ -66,7 +66,7 @@ public string this[string name] { // If the specified key already exists in the collection, setting this property overwrites the existing list of values with the specified value. _data.RemoveAll(i => i.Key == name); - _data.Add(new kvp(name, value)); + _data.Add(new Kvp(name, value)); } } @@ -93,7 +93,7 @@ public string[] GetValues(string name) /// value. public void Add(string name, string value) { - _data.Add(new kvp(name, value)); + _data.Add(new Kvp(name, value)); } /// diff --git a/src/IO.Ably.Shared/IO.Ably.Shared.projitems b/src/IO.Ably.Shared/IO.Ably.Shared.projitems index d22b5969d..3d5c5227c 100644 --- a/src/IO.Ably.Shared/IO.Ably.Shared.projitems +++ b/src/IO.Ably.Shared/IO.Ably.Shared.projitems @@ -14,6 +14,7 @@ + diff --git a/src/IO.Ably.Shared/IPlatform.cs b/src/IO.Ably.Shared/IPlatform.cs index 37d788bc5..d90983244 100644 --- a/src/IO.Ably.Shared/IPlatform.cs +++ b/src/IO.Ably.Shared/IPlatform.cs @@ -3,19 +3,18 @@ namespace IO.Ably { - [System.Diagnostics.CodeAnalysis.SuppressMessage( - "StyleCop.CSharp.DocumentationRules", - "SA1600:Elements should be documented", - Justification = "Internal interface")] - /// /// This interface is implemented for each platform .NETFramework, NetStandard, /// iOS and Android. The library dynamically creates an instance of Platform in /// IoC.cs. It lets us deal with the differences in the various platforms. /// + [System.Diagnostics.CodeAnalysis.SuppressMessage( + "StyleCop.CSharp.DocumentationRules", + "SA1600:Elements should be documented", + Justification = "Internal interface")] internal interface IPlatform { - string PlatformId { get; } + Agent.PlatformRuntime PlatformId { get; } ITransportFactory TransportFactory { get; } diff --git a/src/IO.Ably.Shared/IoC.cs b/src/IO.Ably.Shared/IoC.cs index c1c1159b1..a16fe0f25 100644 --- a/src/IO.Ably.Shared/IoC.cs +++ b/src/IO.Ably.Shared/IoC.cs @@ -39,7 +39,7 @@ static IoC() public static void RegisterOsNetworkStateChanged() => Platform.RegisterOsNetworkStateChanged(); - public static string PlatformId => Platform?.PlatformId ?? string.Empty; + public static Agent.PlatformRuntime PlatformId => Platform?.PlatformId ?? Agent.PlatformRuntime.Other; public static IMobileDevice MobileDevice { diff --git a/src/IO.Ably.Shared/Realtime/RealtimeChannel.cs b/src/IO.Ably.Shared/Realtime/RealtimeChannel.cs index f7055babf..9e3395b27 100644 --- a/src/IO.Ably.Shared/Realtime/RealtimeChannel.cs +++ b/src/IO.Ably.Shared/Realtime/RealtimeChannel.cs @@ -18,7 +18,10 @@ namespace IO.Ably.Realtime [DebuggerDisplay("{Name}. State = {_state}. Error = {ErrorReason} ")] internal class RealtimeChannel : EventEmitter, IRealtimeChannel { +#pragma warning disable CA2213 private readonly Handlers _handlers = new Handlers(); +#pragma warning restore CA2213 + private ChannelOptions _options; private ChannelState _state; private readonly PushChannel _pushChannel; diff --git a/src/IO.Ably.Shared/Transport/TransportParams.cs b/src/IO.Ably.Shared/Transport/TransportParams.cs index 3877ac1eb..e43eecf1a 100644 --- a/src/IO.Ably.Shared/Transport/TransportParams.cs +++ b/src/IO.Ably.Shared/Transport/TransportParams.cs @@ -189,7 +189,7 @@ public Dictionary GetParams() } result["v"] = Defaults.ProtocolVersion; - result[Defaults.AblyAgentHeader] = Defaults.AblyAgentIdentifier(Agents); + result[Agent.AblyAgentHeader] = Agent.AblyAgentIdentifier(Agents); // Url encode all the params at the time of creating the query string result["format"] = UseBinaryProtocol ? "msgpack" : "json"; diff --git a/src/IO.Ably.Tests.DotNetCore20/IO.Ably.Tests.DotNetCore20.csproj b/src/IO.Ably.Tests.DotNET/IO.Ably.Tests.DotNET.csproj similarity index 96% rename from src/IO.Ably.Tests.DotNetCore20/IO.Ably.Tests.DotNetCore20.csproj rename to src/IO.Ably.Tests.DotNET/IO.Ably.Tests.DotNET.csproj index af142de46..4c5436e5b 100644 --- a/src/IO.Ably.Tests.DotNetCore20/IO.Ably.Tests.DotNetCore20.csproj +++ b/src/IO.Ably.Tests.DotNET/IO.Ably.Tests.DotNET.csproj @@ -1,12 +1,12 @@  - netcoreapp3.1 + net6.0;net7.0 ..\IO.Ably.Tests.ruleset 8 - + 1701;1702;SA0001;NU1701 diff --git a/src/IO.Ably.Tests.DotNetCore20/MsgPackStatsTest.json b/src/IO.Ably.Tests.DotNET/MsgPackStatsTest.json similarity index 100% rename from src/IO.Ably.Tests.DotNetCore20/MsgPackStatsTest.json rename to src/IO.Ably.Tests.DotNET/MsgPackStatsTest.json diff --git a/src/IO.Ably.Tests.DotNetCore20/StatsFixture.json b/src/IO.Ably.Tests.DotNET/StatsFixture.json similarity index 100% rename from src/IO.Ably.Tests.DotNetCore20/StatsFixture.json rename to src/IO.Ably.Tests.DotNET/StatsFixture.json diff --git a/src/IO.Ably.Tests.DotNetCore20/StatsInterval.json b/src/IO.Ably.Tests.DotNET/StatsInterval.json similarity index 100% rename from src/IO.Ably.Tests.DotNetCore20/StatsInterval.json rename to src/IO.Ably.Tests.DotNET/StatsInterval.json diff --git a/src/IO.Ably.Tests.DotNetCore20/xunit.runner.json b/src/IO.Ably.Tests.DotNET/xunit.runner.json similarity index 100% rename from src/IO.Ably.Tests.DotNetCore20/xunit.runner.json rename to src/IO.Ably.Tests.DotNET/xunit.runner.json diff --git a/src/IO.Ably.Tests.NETFramework/IO.Ably.Tests.NETFramework.csproj b/src/IO.Ably.Tests.NETFramework/IO.Ably.Tests.NETFramework.csproj index 86d9ca85a..fa35e1740 100644 --- a/src/IO.Ably.Tests.NETFramework/IO.Ably.Tests.NETFramework.csproj +++ b/src/IO.Ably.Tests.NETFramework/IO.Ably.Tests.NETFramework.csproj @@ -142,15 +142,15 @@ all + + + {2d265650-b1ec-4f8d-b043-a2e3dcc23fd8} IO.Ably.NETFramework - - - \ No newline at end of file diff --git a/src/IO.Ably.Tests.Shared/ChannelOptionsExtensions.cs b/src/IO.Ably.Tests.Shared/Extensions/ChannelOptionsExtensions.cs similarity index 98% rename from src/IO.Ably.Tests.Shared/ChannelOptionsExtensions.cs rename to src/IO.Ably.Tests.Shared/Extensions/ChannelOptionsExtensions.cs index df98a7aa7..615e5f0d5 100644 --- a/src/IO.Ably.Tests.Shared/ChannelOptionsExtensions.cs +++ b/src/IO.Ably.Tests.Shared/Extensions/ChannelOptionsExtensions.cs @@ -1,6 +1,6 @@ using System; -namespace IO.Ably.Tests.DotNetCore20 +namespace IO.Ably.Tests.Extensions { /// /// Helper methods to make adding channel options easier. diff --git a/src/IO.Ably.Tests.Shared/IO.Ably.Tests.Shared.projitems b/src/IO.Ably.Tests.Shared/IO.Ably.Tests.Shared.projitems index f47b7c171..3883abbfd 100644 --- a/src/IO.Ably.Tests.Shared/IO.Ably.Tests.Shared.projitems +++ b/src/IO.Ably.Tests.Shared/IO.Ably.Tests.Shared.projitems @@ -20,7 +20,6 @@ - @@ -31,6 +30,7 @@ + diff --git a/src/IO.Ably.Tests.Shared/Realtime/ChannelSandboxSpecs.cs b/src/IO.Ably.Tests.Shared/Realtime/ChannelSandboxSpecs.cs index 1074733ee..4ffa72aed 100644 --- a/src/IO.Ably.Tests.Shared/Realtime/ChannelSandboxSpecs.cs +++ b/src/IO.Ably.Tests.Shared/Realtime/ChannelSandboxSpecs.cs @@ -8,7 +8,7 @@ using FluentAssertions; using IO.Ably.Encryption; using IO.Ably.Realtime; -using IO.Ably.Tests.DotNetCore20; +using IO.Ably.Tests.Extensions; using IO.Ably.Tests.Infrastructure; using IO.Ably.Types; using Newtonsoft.Json.Linq; diff --git a/src/IO.Ably.Tests.Shared/Realtime/ConnectionSpecs/ConnectionParameterSpecs.cs b/src/IO.Ably.Tests.Shared/Realtime/ConnectionSpecs/ConnectionParameterSpecs.cs index 140ada310..20955e4d7 100644 --- a/src/IO.Ably.Tests.Shared/Realtime/ConnectionSpecs/ConnectionParameterSpecs.cs +++ b/src/IO.Ably.Tests.Shared/Realtime/ConnectionSpecs/ConnectionParameterSpecs.cs @@ -125,16 +125,19 @@ public async Task ShouldSetTransportAblyAgentHeader() { _ = await GetConnectedClient(); - LastCreatedTransport.Parameters.GetParams().Should().ContainKey(Defaults.AblyAgentHeader); - var agentValues = LastCreatedTransport.Parameters.GetParams()[Defaults.AblyAgentHeader].Split(' '); - string[] keys = + LastCreatedTransport.Parameters.GetParams().Should().ContainKey(Agent.AblyAgentHeader); + var agentValues = LastCreatedTransport.Parameters.GetParams()[Agent.AblyAgentHeader].Split(' '); + var keys = new List() { "ably-dotnet/", - Defaults.DotnetRuntimeIdentifier() + Agent.DotnetRuntimeIdentifier(), + Agent.OsIdentifier() }; - agentValues.Should().HaveCount(keys.Length); - for (int i = 0; i < keys.Length; ++i) + keys.RemoveAll(s => s == string.Empty); + + agentValues.Should().HaveCount(keys.Count); + for (var i = 0; i < keys.Count; ++i) { agentValues[i].StartsWith(keys[i]).Should().BeTrue($"'{agentValues[i]}' should start with '{keys[i]}'"); } @@ -153,18 +156,21 @@ public async Task ShouldSetTransportCustomAblyAgentHeader() }; }); - LastCreatedTransport.Parameters.GetParams().Should().ContainKey(Defaults.AblyAgentHeader); - var agentValues = LastCreatedTransport.Parameters.GetParams()[Defaults.AblyAgentHeader].Split(' '); - string[] keys = + LastCreatedTransport.Parameters.GetParams().Should().ContainKey(Agent.AblyAgentHeader); + var agentValues = LastCreatedTransport.Parameters.GetParams()[Agent.AblyAgentHeader].Split(' '); + var keys = new List() { "ably-dotnet/", - Defaults.DotnetRuntimeIdentifier(), + Agent.DotnetRuntimeIdentifier(), + Agent.OsIdentifier(), "agent1", "agent2", }; - agentValues.Should().HaveCount(keys.Length); - for (var i = 0; i < keys.Length; ++i) + keys.RemoveAll(s => s == string.Empty); + + agentValues.Should().HaveCount(keys.Count); + for (var i = 0; i < keys.Count; ++i) { agentValues[i].StartsWith(keys[i]).Should().BeTrue($"'{agentValues[i]}' should start with '{keys[i]}'"); } diff --git a/src/IO.Ably.Tests.Shared/Rest/AblyHttpClientSpecs.cs b/src/IO.Ably.Tests.Shared/Rest/AblyHttpClientSpecs.cs index 278733114..762ef8aca 100644 --- a/src/IO.Ably.Tests.Shared/Rest/AblyHttpClientSpecs.cs +++ b/src/IO.Ably.Tests.Shared/Rest/AblyHttpClientSpecs.cs @@ -95,14 +95,19 @@ public async Task WhenCallingUrl_AddsDefaultAblyAgentHeader() values.Should().HaveCount(1); string[] agentValues = values[0].Split(' '); - string[] keys = + var keys = new List() { "ably-dotnet/", - Defaults.DotnetRuntimeIdentifier() + Agent.DotnetRuntimeIdentifier(), + Agent.OsIdentifier() }; - agentValues.Should().HaveCount(keys.Length); - for (int i = 0; i < keys.Length; ++i) + Agent.DotnetRuntimeIdentifier().Split('/').Length.Should().Be(2); + + keys.RemoveAll(s => s.IsEmpty()); + + agentValues.Should().HaveCount(keys.Count); + for (var i = 0; i < keys.Count; ++i) { agentValues[i].StartsWith(keys[i]).Should().BeTrue($"'{agentValues[i]}' should start with '{keys[i]}'"); } @@ -131,16 +136,19 @@ public async Task WhenCallingUrl_AddsCustomizedAblyAgentHeader() values.Should().HaveCount(1); string[] agentValues = values[0].Split(' '); - string[] keys = + var keys = new List() { "ably-dotnet/", - Defaults.DotnetRuntimeIdentifier(), + Agent.DotnetRuntimeIdentifier(), + Agent.OsIdentifier(), "agent1", "agent2", }; - agentValues.Should().HaveCount(keys.Length); - for (var i = 0; i < keys.Length; ++i) + keys.RemoveAll(s => s.IsEmpty()); + + agentValues.Should().HaveCount(keys.Count); + for (var i = 0; i < keys.Count; ++i) { agentValues[i].StartsWith(keys[i]).Should().BeTrue($"'{agentValues[i]}' should start with '{keys[i]}'"); } diff --git a/src/IO.Ably.Tests.Shared/Rest/JwtSandboxSpec.cs b/src/IO.Ably.Tests.Shared/Rest/JwtSandboxSpec.cs index e8e4aedbc..2cb96e581 100644 --- a/src/IO.Ably.Tests.Shared/Rest/JwtSandboxSpec.cs +++ b/src/IO.Ably.Tests.Shared/Rest/JwtSandboxSpec.cs @@ -215,5 +215,11 @@ private async Task GetJwtStringAsync( var jwtStr = await _httpClient.GetStringAsync(builder.Uri); return jwtStr; } + + protected override void Dispose(bool disposing) + { + _httpClient.Dispose(); + base.Dispose(disposing); + } } } diff --git a/src/IO.Ably.Xamarin.sln b/src/IO.Ably.Xamarin.sln index b2be955a2..30c44b4d4 100644 --- a/src/IO.Ably.Xamarin.sln +++ b/src/IO.Ably.Xamarin.sln @@ -1,7 +1,7 @@  Microsoft Visual Studio Solution File, Format Version 12.00 -# Visual Studio Version 16 -VisualStudioVersion = 16.0.28729.10 +# Visual Studio Version 17 +VisualStudioVersion = 17.4.33213.308 MinimumVisualStudioVersion = 15.0.26730.10 Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = ".nuget", ".nuget", "{1EA29F05-BF68-4BA8-A58F-C7C131E3FC62}" ProjectSection(SolutionItems) = preProject @@ -14,9 +14,9 @@ Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = ".Solution Items", ".Solutio CommonAssemblyInfo.cs = CommonAssemblyInfo.cs ..\nuget\io.ably.nuspec = ..\nuget\io.ably.nuspec IO.Ably.ruleset = IO.Ably.ruleset + ..\PushNotifications.md = ..\PushNotifications.md ..\README.md = ..\README.md stylecop.json = stylecop.json - ..\PushNotifications.md = ..\PushNotifications.md EndProjectSection EndProject Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Ably", "Ably", "{8A0F718E-2168-4CC7-8F7B-A65508B52B0F}" @@ -35,33 +35,27 @@ Project("{D954291E-2A0B-460D-934E-DC6B0785DB48}") = "IO.Ably.Shared.MsgPack", "I EndProject Project("{D954291E-2A0B-460D-934E-DC6B0785DB48}") = "IO.Ably.Tests.Shared", "IO.Ably.Tests.Shared\IO.Ably.Tests.Shared.shproj", "{1609F12C-8216-4E7C-ADE0-240BFE160242}" EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "IO.Ably.DeltaCodec", "..\lib\delta-codec\IO.Ably.DeltaCodec\IO.Ably.DeltaCodec.csproj", "{53CA3FD4-E11A-4368-A7A5-BCAB40D08BED}" +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "IO.Ably.DeltaCodec", "..\lib\delta-codec\IO.Ably.DeltaCodec\IO.Ably.DeltaCodec.csproj", "{53CA3FD4-E11A-4368-A7A5-BCAB40D08BED}" EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "IO.Ably.NETStandard20", "IO.Ably.NETStandard20\IO.Ably.NETStandard20.csproj", "{97ED15E5-6546-4437-BF4F-B929700CE922}" +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "IO.Ably.NETStandard20", "IO.Ably.NETStandard20\IO.Ably.NETStandard20.csproj", "{97ED15E5-6546-4437-BF4F-B929700CE922}" EndProject Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "IO.Ably.Push.Android", "IO.Ably.Push.Android\IO.Ably.Push.Android.csproj", "{F0010AA8-63C3-47D7-95E9-A5D1D04DA325}" EndProject Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "IO.Ably.Push.iOS", "IO.Ably.Push.iOS\IO.Ably.Push.iOS.csproj", "{E1A8FDE2-FEFC-403E-99A0-F13847B1495E}" EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "IO.Ably.Tests.DotNetCore20", "IO.Ably.Tests.DotNetCore20\IO.Ably.Tests.DotNetCore20.csproj", "{9922FA1F-F9E8-44FD-8B51-39E7C7D7737C}" -EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "DotnetPush", "..\examples\DotnetPush\DotnetPush\DotnetPush.csproj", "{E04ACB26-B65F-43CB-AC30-B6523A7B93C4}" +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "DotnetPush", "..\examples\DotnetPush\DotnetPush\DotnetPush.csproj", "{E04ACB26-B65F-43CB-AC30-B6523A7B93C4}" EndProject Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "DotnetPush.Android", "..\examples\DotnetPush\DotnetPush.Android\DotnetPush.Android.csproj", "{7050F177-1D55-4562-937C-56D117198BFB}" EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "NotificationsPublisher", "..\examples\NotificationsPublisher\NotificationsPublisher.csproj", "{D150CE86-80D9-4709-B0BC-5E1A3AA457A9}" +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "NotificationsPublisher", "..\examples\NotificationsPublisher\NotificationsPublisher.csproj", "{D150CE86-80D9-4709-B0BC-5E1A3AA457A9}" EndProject Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "DotnetPush.iOS", "..\examples\DotnetPush\DotnetPush.iOS\DotnetPush.iOS.csproj", "{75256FFE-5F9A-4F4F-BD78-37F6489488FD}" EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "IO.Ably.Tests.NETFramework", "IO.Ably.Tests.NETFramework\IO.Ably.Tests.NETFramework.csproj", "{567FEEF7-41AF-42F2-AD34-546A278355B1}" +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "IO.Ably.NETFramework", "IO.Ably.NETFramework\IO.Ably.NETFramework.csproj", "{2D265650-B1EC-4F8D-B043-A2E3DCC23FD8}" +EndProject Global - GlobalSection(SharedMSBuildProjectFiles) = preSolution - IO.Ably.Tests.Shared\IO.Ably.Tests.Shared.projitems*{1609f12c-8216-4e7c-ade0-240bfe160242}*SharedItemsImports = 13 - IO.Ably.Shared\IO.Ably.Shared.projitems*{24b6fc97-9d3d-46ae-b5cb-47458354bee1}*SharedItemsImports = 4 - IO.Ably.Shared\IO.Ably.Shared.projitems*{3553e1b2-8f1f-4e83-9524-08e702c14fcf}*SharedItemsImports = 13 - IO.Ably.Tests.Shared\IO.Ably.Tests.Shared.projitems*{567feef7-41af-42f2-ad34-546a278355b1}*SharedItemsImports = 4 - IO.Ably.Shared\IO.Ably.Shared.projitems*{8bb7b13c-e9f4-4d1b-bccc-af890a23ece6}*SharedItemsImports = 4 - IO.Ably.Shared.MsgPack\IO.Ably.Shared.MsgPack.projitems*{eebf3249-3ca3-4078-a188-f8b916c3f4c2}*SharedItemsImports = 13 - EndGlobalSection GlobalSection(SolutionConfigurationPlatforms) = preSolution AppStore|Any CPU = AppStore|Any CPU AppStore|ARM = AppStore|ARM @@ -481,70 +475,6 @@ Global {E1A8FDE2-FEFC-403E-99A0-F13847B1495E}.Release|x64.Build.0 = Release|Any CPU {E1A8FDE2-FEFC-403E-99A0-F13847B1495E}.Release|x86.ActiveCfg = Release|Any CPU {E1A8FDE2-FEFC-403E-99A0-F13847B1495E}.Release|x86.Build.0 = Release|Any CPU - {9922FA1F-F9E8-44FD-8B51-39E7C7D7737C}.AppStore|Any CPU.ActiveCfg = Debug|Any CPU - {9922FA1F-F9E8-44FD-8B51-39E7C7D7737C}.AppStore|Any CPU.Build.0 = Debug|Any CPU - {9922FA1F-F9E8-44FD-8B51-39E7C7D7737C}.AppStore|ARM.ActiveCfg = Debug|Any CPU - {9922FA1F-F9E8-44FD-8B51-39E7C7D7737C}.AppStore|ARM.Build.0 = Debug|Any CPU - {9922FA1F-F9E8-44FD-8B51-39E7C7D7737C}.AppStore|x64.ActiveCfg = Debug|Any CPU - {9922FA1F-F9E8-44FD-8B51-39E7C7D7737C}.AppStore|x64.Build.0 = Debug|Any CPU - {9922FA1F-F9E8-44FD-8B51-39E7C7D7737C}.AppStore|x86.ActiveCfg = Debug|Any CPU - {9922FA1F-F9E8-44FD-8B51-39E7C7D7737C}.AppStore|x86.Build.0 = Debug|Any CPU - {9922FA1F-F9E8-44FD-8B51-39E7C7D7737C}.CI_Release|Any CPU.ActiveCfg = Debug|Any CPU - {9922FA1F-F9E8-44FD-8B51-39E7C7D7737C}.CI_Release|Any CPU.Build.0 = Debug|Any CPU - {9922FA1F-F9E8-44FD-8B51-39E7C7D7737C}.CI_Release|ARM.ActiveCfg = Debug|Any CPU - {9922FA1F-F9E8-44FD-8B51-39E7C7D7737C}.CI_Release|ARM.Build.0 = Debug|Any CPU - {9922FA1F-F9E8-44FD-8B51-39E7C7D7737C}.CI_Release|x64.ActiveCfg = Debug|Any CPU - {9922FA1F-F9E8-44FD-8B51-39E7C7D7737C}.CI_Release|x64.Build.0 = Debug|Any CPU - {9922FA1F-F9E8-44FD-8B51-39E7C7D7737C}.CI_Release|x86.ActiveCfg = Debug|Any CPU - {9922FA1F-F9E8-44FD-8B51-39E7C7D7737C}.CI_Release|x86.Build.0 = Debug|Any CPU - {9922FA1F-F9E8-44FD-8B51-39E7C7D7737C}.Debug 4.0|Any CPU.ActiveCfg = Debug|Any CPU - {9922FA1F-F9E8-44FD-8B51-39E7C7D7737C}.Debug 4.0|Any CPU.Build.0 = Debug|Any CPU - {9922FA1F-F9E8-44FD-8B51-39E7C7D7737C}.Debug 4.0|ARM.ActiveCfg = Debug|Any CPU - {9922FA1F-F9E8-44FD-8B51-39E7C7D7737C}.Debug 4.0|ARM.Build.0 = Debug|Any CPU - {9922FA1F-F9E8-44FD-8B51-39E7C7D7737C}.Debug 4.0|x64.ActiveCfg = Debug|Any CPU - {9922FA1F-F9E8-44FD-8B51-39E7C7D7737C}.Debug 4.0|x64.Build.0 = Debug|Any CPU - {9922FA1F-F9E8-44FD-8B51-39E7C7D7737C}.Debug 4.0|x86.ActiveCfg = Debug|Any CPU - {9922FA1F-F9E8-44FD-8B51-39E7C7D7737C}.Debug 4.0|x86.Build.0 = Debug|Any CPU - {9922FA1F-F9E8-44FD-8B51-39E7C7D7737C}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {9922FA1F-F9E8-44FD-8B51-39E7C7D7737C}.Debug|Any CPU.Build.0 = Debug|Any CPU - {9922FA1F-F9E8-44FD-8B51-39E7C7D7737C}.Debug|ARM.ActiveCfg = Debug|Any CPU - {9922FA1F-F9E8-44FD-8B51-39E7C7D7737C}.Debug|ARM.Build.0 = Debug|Any CPU - {9922FA1F-F9E8-44FD-8B51-39E7C7D7737C}.Debug|x64.ActiveCfg = Debug|Any CPU - {9922FA1F-F9E8-44FD-8B51-39E7C7D7737C}.Debug|x64.Build.0 = Debug|Any CPU - {9922FA1F-F9E8-44FD-8B51-39E7C7D7737C}.Debug|x86.ActiveCfg = Debug|Any CPU - {9922FA1F-F9E8-44FD-8B51-39E7C7D7737C}.Debug|x86.Build.0 = Debug|Any CPU - {9922FA1F-F9E8-44FD-8B51-39E7C7D7737C}.package_netstandard|Any CPU.ActiveCfg = Debug|Any CPU - {9922FA1F-F9E8-44FD-8B51-39E7C7D7737C}.package_netstandard|Any CPU.Build.0 = Debug|Any CPU - {9922FA1F-F9E8-44FD-8B51-39E7C7D7737C}.package_netstandard|ARM.ActiveCfg = Debug|Any CPU - {9922FA1F-F9E8-44FD-8B51-39E7C7D7737C}.package_netstandard|ARM.Build.0 = Debug|Any CPU - {9922FA1F-F9E8-44FD-8B51-39E7C7D7737C}.package_netstandard|x64.ActiveCfg = Debug|Any CPU - {9922FA1F-F9E8-44FD-8B51-39E7C7D7737C}.package_netstandard|x64.Build.0 = Debug|Any CPU - {9922FA1F-F9E8-44FD-8B51-39E7C7D7737C}.package_netstandard|x86.ActiveCfg = Debug|Any CPU - {9922FA1F-F9E8-44FD-8B51-39E7C7D7737C}.package_netstandard|x86.Build.0 = Debug|Any CPU - {9922FA1F-F9E8-44FD-8B51-39E7C7D7737C}.package|Any CPU.ActiveCfg = Debug|Any CPU - {9922FA1F-F9E8-44FD-8B51-39E7C7D7737C}.package|Any CPU.Build.0 = Debug|Any CPU - {9922FA1F-F9E8-44FD-8B51-39E7C7D7737C}.package|ARM.ActiveCfg = Debug|Any CPU - {9922FA1F-F9E8-44FD-8B51-39E7C7D7737C}.package|ARM.Build.0 = Debug|Any CPU - {9922FA1F-F9E8-44FD-8B51-39E7C7D7737C}.package|x64.ActiveCfg = Debug|Any CPU - {9922FA1F-F9E8-44FD-8B51-39E7C7D7737C}.package|x64.Build.0 = Debug|Any CPU - {9922FA1F-F9E8-44FD-8B51-39E7C7D7737C}.package|x86.ActiveCfg = Debug|Any CPU - {9922FA1F-F9E8-44FD-8B51-39E7C7D7737C}.package|x86.Build.0 = Debug|Any CPU - {9922FA1F-F9E8-44FD-8B51-39E7C7D7737C}.Release 4.0|Any CPU.ActiveCfg = Debug|Any CPU - {9922FA1F-F9E8-44FD-8B51-39E7C7D7737C}.Release 4.0|Any CPU.Build.0 = Debug|Any CPU - {9922FA1F-F9E8-44FD-8B51-39E7C7D7737C}.Release 4.0|ARM.ActiveCfg = Debug|Any CPU - {9922FA1F-F9E8-44FD-8B51-39E7C7D7737C}.Release 4.0|ARM.Build.0 = Debug|Any CPU - {9922FA1F-F9E8-44FD-8B51-39E7C7D7737C}.Release 4.0|x64.ActiveCfg = Debug|Any CPU - {9922FA1F-F9E8-44FD-8B51-39E7C7D7737C}.Release 4.0|x64.Build.0 = Debug|Any CPU - {9922FA1F-F9E8-44FD-8B51-39E7C7D7737C}.Release 4.0|x86.ActiveCfg = Debug|Any CPU - {9922FA1F-F9E8-44FD-8B51-39E7C7D7737C}.Release 4.0|x86.Build.0 = Debug|Any CPU - {9922FA1F-F9E8-44FD-8B51-39E7C7D7737C}.Release|Any CPU.ActiveCfg = Release|Any CPU - {9922FA1F-F9E8-44FD-8B51-39E7C7D7737C}.Release|Any CPU.Build.0 = Release|Any CPU - {9922FA1F-F9E8-44FD-8B51-39E7C7D7737C}.Release|ARM.ActiveCfg = Release|Any CPU - {9922FA1F-F9E8-44FD-8B51-39E7C7D7737C}.Release|ARM.Build.0 = Release|Any CPU - {9922FA1F-F9E8-44FD-8B51-39E7C7D7737C}.Release|x64.ActiveCfg = Release|Any CPU - {9922FA1F-F9E8-44FD-8B51-39E7C7D7737C}.Release|x64.Build.0 = Release|Any CPU - {9922FA1F-F9E8-44FD-8B51-39E7C7D7737C}.Release|x86.ActiveCfg = Release|Any CPU - {9922FA1F-F9E8-44FD-8B51-39E7C7D7737C}.Release|x86.Build.0 = Release|Any CPU {E04ACB26-B65F-43CB-AC30-B6523A7B93C4}.AppStore|Any CPU.ActiveCfg = Debug|Any CPU {E04ACB26-B65F-43CB-AC30-B6523A7B93C4}.AppStore|Any CPU.Build.0 = Debug|Any CPU {E04ACB26-B65F-43CB-AC30-B6523A7B93C4}.AppStore|ARM.ActiveCfg = Debug|Any CPU @@ -761,6 +691,8 @@ Global {75256FFE-5F9A-4F4F-BD78-37F6489488FD}.Debug 4.0|x64.Build.0 = Debug|iPhoneSimulator {75256FFE-5F9A-4F4F-BD78-37F6489488FD}.Debug 4.0|x86.ActiveCfg = Debug|iPhoneSimulator {75256FFE-5F9A-4F4F-BD78-37F6489488FD}.Debug 4.0|x86.Build.0 = Debug|iPhoneSimulator + {75256FFE-5F9A-4F4F-BD78-37F6489488FD}.Debug|Any CPU.ActiveCfg = Debug|iPhone + {75256FFE-5F9A-4F4F-BD78-37F6489488FD}.Debug|Any CPU.Build.0 = Debug|iPhone {75256FFE-5F9A-4F4F-BD78-37F6489488FD}.Debug|ARM.ActiveCfg = Debug|iPhoneSimulator {75256FFE-5F9A-4F4F-BD78-37F6489488FD}.Debug|ARM.Build.0 = Debug|iPhoneSimulator {75256FFE-5F9A-4F4F-BD78-37F6489488FD}.Debug|x64.ActiveCfg = Debug|iPhoneSimulator @@ -799,8 +731,134 @@ Global {75256FFE-5F9A-4F4F-BD78-37F6489488FD}.Release|x64.Build.0 = Release|iPhoneSimulator {75256FFE-5F9A-4F4F-BD78-37F6489488FD}.Release|x86.ActiveCfg = Release|iPhoneSimulator {75256FFE-5F9A-4F4F-BD78-37F6489488FD}.Release|x86.Build.0 = Release|iPhoneSimulator - {75256FFE-5F9A-4F4F-BD78-37F6489488FD}.Debug|Any CPU.ActiveCfg = Debug|iPhone - {75256FFE-5F9A-4F4F-BD78-37F6489488FD}.Debug|Any CPU.Build.0 = Debug|iPhone + {567FEEF7-41AF-42F2-AD34-546A278355B1}.AppStore|Any CPU.ActiveCfg = Debug|Any CPU + {567FEEF7-41AF-42F2-AD34-546A278355B1}.AppStore|Any CPU.Build.0 = Debug|Any CPU + {567FEEF7-41AF-42F2-AD34-546A278355B1}.AppStore|ARM.ActiveCfg = Debug|Any CPU + {567FEEF7-41AF-42F2-AD34-546A278355B1}.AppStore|ARM.Build.0 = Debug|Any CPU + {567FEEF7-41AF-42F2-AD34-546A278355B1}.AppStore|x64.ActiveCfg = Debug|Any CPU + {567FEEF7-41AF-42F2-AD34-546A278355B1}.AppStore|x64.Build.0 = Debug|Any CPU + {567FEEF7-41AF-42F2-AD34-546A278355B1}.AppStore|x86.ActiveCfg = Debug|Any CPU + {567FEEF7-41AF-42F2-AD34-546A278355B1}.AppStore|x86.Build.0 = Debug|Any CPU + {567FEEF7-41AF-42F2-AD34-546A278355B1}.CI_Release|Any CPU.ActiveCfg = Release|Any CPU + {567FEEF7-41AF-42F2-AD34-546A278355B1}.CI_Release|Any CPU.Build.0 = Release|Any CPU + {567FEEF7-41AF-42F2-AD34-546A278355B1}.CI_Release|ARM.ActiveCfg = Release|Any CPU + {567FEEF7-41AF-42F2-AD34-546A278355B1}.CI_Release|ARM.Build.0 = Release|Any CPU + {567FEEF7-41AF-42F2-AD34-546A278355B1}.CI_Release|x64.ActiveCfg = Release|Any CPU + {567FEEF7-41AF-42F2-AD34-546A278355B1}.CI_Release|x64.Build.0 = Release|Any CPU + {567FEEF7-41AF-42F2-AD34-546A278355B1}.CI_Release|x86.ActiveCfg = Release|Any CPU + {567FEEF7-41AF-42F2-AD34-546A278355B1}.CI_Release|x86.Build.0 = Release|Any CPU + {567FEEF7-41AF-42F2-AD34-546A278355B1}.Debug 4.0|Any CPU.ActiveCfg = Debug|Any CPU + {567FEEF7-41AF-42F2-AD34-546A278355B1}.Debug 4.0|Any CPU.Build.0 = Debug|Any CPU + {567FEEF7-41AF-42F2-AD34-546A278355B1}.Debug 4.0|ARM.ActiveCfg = Debug|Any CPU + {567FEEF7-41AF-42F2-AD34-546A278355B1}.Debug 4.0|ARM.Build.0 = Debug|Any CPU + {567FEEF7-41AF-42F2-AD34-546A278355B1}.Debug 4.0|x64.ActiveCfg = Debug|Any CPU + {567FEEF7-41AF-42F2-AD34-546A278355B1}.Debug 4.0|x64.Build.0 = Debug|Any CPU + {567FEEF7-41AF-42F2-AD34-546A278355B1}.Debug 4.0|x86.ActiveCfg = Debug|Any CPU + {567FEEF7-41AF-42F2-AD34-546A278355B1}.Debug 4.0|x86.Build.0 = Debug|Any CPU + {567FEEF7-41AF-42F2-AD34-546A278355B1}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {567FEEF7-41AF-42F2-AD34-546A278355B1}.Debug|Any CPU.Build.0 = Debug|Any CPU + {567FEEF7-41AF-42F2-AD34-546A278355B1}.Debug|ARM.ActiveCfg = Debug|Any CPU + {567FEEF7-41AF-42F2-AD34-546A278355B1}.Debug|ARM.Build.0 = Debug|Any CPU + {567FEEF7-41AF-42F2-AD34-546A278355B1}.Debug|x64.ActiveCfg = Debug|Any CPU + {567FEEF7-41AF-42F2-AD34-546A278355B1}.Debug|x64.Build.0 = Debug|Any CPU + {567FEEF7-41AF-42F2-AD34-546A278355B1}.Debug|x86.ActiveCfg = Debug|Any CPU + {567FEEF7-41AF-42F2-AD34-546A278355B1}.Debug|x86.Build.0 = Debug|Any CPU + {567FEEF7-41AF-42F2-AD34-546A278355B1}.package_netstandard|Any CPU.ActiveCfg = Debug|Any CPU + {567FEEF7-41AF-42F2-AD34-546A278355B1}.package_netstandard|Any CPU.Build.0 = Debug|Any CPU + {567FEEF7-41AF-42F2-AD34-546A278355B1}.package_netstandard|ARM.ActiveCfg = Debug|Any CPU + {567FEEF7-41AF-42F2-AD34-546A278355B1}.package_netstandard|ARM.Build.0 = Debug|Any CPU + {567FEEF7-41AF-42F2-AD34-546A278355B1}.package_netstandard|x64.ActiveCfg = Debug|Any CPU + {567FEEF7-41AF-42F2-AD34-546A278355B1}.package_netstandard|x64.Build.0 = Debug|Any CPU + {567FEEF7-41AF-42F2-AD34-546A278355B1}.package_netstandard|x86.ActiveCfg = Debug|Any CPU + {567FEEF7-41AF-42F2-AD34-546A278355B1}.package_netstandard|x86.Build.0 = Debug|Any CPU + {567FEEF7-41AF-42F2-AD34-546A278355B1}.package|Any CPU.ActiveCfg = Debug|Any CPU + {567FEEF7-41AF-42F2-AD34-546A278355B1}.package|Any CPU.Build.0 = Debug|Any CPU + {567FEEF7-41AF-42F2-AD34-546A278355B1}.package|ARM.ActiveCfg = Debug|Any CPU + {567FEEF7-41AF-42F2-AD34-546A278355B1}.package|ARM.Build.0 = Debug|Any CPU + {567FEEF7-41AF-42F2-AD34-546A278355B1}.package|x64.ActiveCfg = Debug|Any CPU + {567FEEF7-41AF-42F2-AD34-546A278355B1}.package|x64.Build.0 = Debug|Any CPU + {567FEEF7-41AF-42F2-AD34-546A278355B1}.package|x86.ActiveCfg = Debug|Any CPU + {567FEEF7-41AF-42F2-AD34-546A278355B1}.package|x86.Build.0 = Debug|Any CPU + {567FEEF7-41AF-42F2-AD34-546A278355B1}.Release 4.0|Any CPU.ActiveCfg = Release|Any CPU + {567FEEF7-41AF-42F2-AD34-546A278355B1}.Release 4.0|Any CPU.Build.0 = Release|Any CPU + {567FEEF7-41AF-42F2-AD34-546A278355B1}.Release 4.0|ARM.ActiveCfg = Release|Any CPU + {567FEEF7-41AF-42F2-AD34-546A278355B1}.Release 4.0|ARM.Build.0 = Release|Any CPU + {567FEEF7-41AF-42F2-AD34-546A278355B1}.Release 4.0|x64.ActiveCfg = Release|Any CPU + {567FEEF7-41AF-42F2-AD34-546A278355B1}.Release 4.0|x64.Build.0 = Release|Any CPU + {567FEEF7-41AF-42F2-AD34-546A278355B1}.Release 4.0|x86.ActiveCfg = Release|Any CPU + {567FEEF7-41AF-42F2-AD34-546A278355B1}.Release 4.0|x86.Build.0 = Release|Any CPU + {567FEEF7-41AF-42F2-AD34-546A278355B1}.Release|Any CPU.ActiveCfg = Release|Any CPU + {567FEEF7-41AF-42F2-AD34-546A278355B1}.Release|Any CPU.Build.0 = Release|Any CPU + {567FEEF7-41AF-42F2-AD34-546A278355B1}.Release|ARM.ActiveCfg = Release|Any CPU + {567FEEF7-41AF-42F2-AD34-546A278355B1}.Release|ARM.Build.0 = Release|Any CPU + {567FEEF7-41AF-42F2-AD34-546A278355B1}.Release|x64.ActiveCfg = Release|Any CPU + {567FEEF7-41AF-42F2-AD34-546A278355B1}.Release|x64.Build.0 = Release|Any CPU + {567FEEF7-41AF-42F2-AD34-546A278355B1}.Release|x86.ActiveCfg = Release|Any CPU + {567FEEF7-41AF-42F2-AD34-546A278355B1}.Release|x86.Build.0 = Release|Any CPU + {2D265650-B1EC-4F8D-B043-A2E3DCC23FD8}.AppStore|Any CPU.ActiveCfg = Debug|Any CPU + {2D265650-B1EC-4F8D-B043-A2E3DCC23FD8}.AppStore|Any CPU.Build.0 = Debug|Any CPU + {2D265650-B1EC-4F8D-B043-A2E3DCC23FD8}.AppStore|ARM.ActiveCfg = Debug|Any CPU + {2D265650-B1EC-4F8D-B043-A2E3DCC23FD8}.AppStore|ARM.Build.0 = Debug|Any CPU + {2D265650-B1EC-4F8D-B043-A2E3DCC23FD8}.AppStore|x64.ActiveCfg = Debug|Any CPU + {2D265650-B1EC-4F8D-B043-A2E3DCC23FD8}.AppStore|x64.Build.0 = Debug|Any CPU + {2D265650-B1EC-4F8D-B043-A2E3DCC23FD8}.AppStore|x86.ActiveCfg = Debug|Any CPU + {2D265650-B1EC-4F8D-B043-A2E3DCC23FD8}.AppStore|x86.Build.0 = Debug|Any CPU + {2D265650-B1EC-4F8D-B043-A2E3DCC23FD8}.CI_Release|Any CPU.ActiveCfg = Release|Any CPU + {2D265650-B1EC-4F8D-B043-A2E3DCC23FD8}.CI_Release|Any CPU.Build.0 = Release|Any CPU + {2D265650-B1EC-4F8D-B043-A2E3DCC23FD8}.CI_Release|ARM.ActiveCfg = Release|Any CPU + {2D265650-B1EC-4F8D-B043-A2E3DCC23FD8}.CI_Release|ARM.Build.0 = Release|Any CPU + {2D265650-B1EC-4F8D-B043-A2E3DCC23FD8}.CI_Release|x64.ActiveCfg = Release|Any CPU + {2D265650-B1EC-4F8D-B043-A2E3DCC23FD8}.CI_Release|x64.Build.0 = Release|Any CPU + {2D265650-B1EC-4F8D-B043-A2E3DCC23FD8}.CI_Release|x86.ActiveCfg = Release|Any CPU + {2D265650-B1EC-4F8D-B043-A2E3DCC23FD8}.CI_Release|x86.Build.0 = Release|Any CPU + {2D265650-B1EC-4F8D-B043-A2E3DCC23FD8}.Debug 4.0|Any CPU.ActiveCfg = Debug|Any CPU + {2D265650-B1EC-4F8D-B043-A2E3DCC23FD8}.Debug 4.0|Any CPU.Build.0 = Debug|Any CPU + {2D265650-B1EC-4F8D-B043-A2E3DCC23FD8}.Debug 4.0|ARM.ActiveCfg = Debug|Any CPU + {2D265650-B1EC-4F8D-B043-A2E3DCC23FD8}.Debug 4.0|ARM.Build.0 = Debug|Any CPU + {2D265650-B1EC-4F8D-B043-A2E3DCC23FD8}.Debug 4.0|x64.ActiveCfg = Debug|Any CPU + {2D265650-B1EC-4F8D-B043-A2E3DCC23FD8}.Debug 4.0|x64.Build.0 = Debug|Any CPU + {2D265650-B1EC-4F8D-B043-A2E3DCC23FD8}.Debug 4.0|x86.ActiveCfg = Debug|Any CPU + {2D265650-B1EC-4F8D-B043-A2E3DCC23FD8}.Debug 4.0|x86.Build.0 = Debug|Any CPU + {2D265650-B1EC-4F8D-B043-A2E3DCC23FD8}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {2D265650-B1EC-4F8D-B043-A2E3DCC23FD8}.Debug|Any CPU.Build.0 = Debug|Any CPU + {2D265650-B1EC-4F8D-B043-A2E3DCC23FD8}.Debug|ARM.ActiveCfg = Debug|Any CPU + {2D265650-B1EC-4F8D-B043-A2E3DCC23FD8}.Debug|ARM.Build.0 = Debug|Any CPU + {2D265650-B1EC-4F8D-B043-A2E3DCC23FD8}.Debug|x64.ActiveCfg = Debug|Any CPU + {2D265650-B1EC-4F8D-B043-A2E3DCC23FD8}.Debug|x64.Build.0 = Debug|Any CPU + {2D265650-B1EC-4F8D-B043-A2E3DCC23FD8}.Debug|x86.ActiveCfg = Debug|Any CPU + {2D265650-B1EC-4F8D-B043-A2E3DCC23FD8}.Debug|x86.Build.0 = Debug|Any CPU + {2D265650-B1EC-4F8D-B043-A2E3DCC23FD8}.package_netstandard|Any CPU.ActiveCfg = package|Any CPU + {2D265650-B1EC-4F8D-B043-A2E3DCC23FD8}.package_netstandard|Any CPU.Build.0 = package|Any CPU + {2D265650-B1EC-4F8D-B043-A2E3DCC23FD8}.package_netstandard|ARM.ActiveCfg = package|Any CPU + {2D265650-B1EC-4F8D-B043-A2E3DCC23FD8}.package_netstandard|ARM.Build.0 = package|Any CPU + {2D265650-B1EC-4F8D-B043-A2E3DCC23FD8}.package_netstandard|x64.ActiveCfg = package|Any CPU + {2D265650-B1EC-4F8D-B043-A2E3DCC23FD8}.package_netstandard|x64.Build.0 = package|Any CPU + {2D265650-B1EC-4F8D-B043-A2E3DCC23FD8}.package_netstandard|x86.ActiveCfg = package|Any CPU + {2D265650-B1EC-4F8D-B043-A2E3DCC23FD8}.package_netstandard|x86.Build.0 = package|Any CPU + {2D265650-B1EC-4F8D-B043-A2E3DCC23FD8}.package|Any CPU.ActiveCfg = package|Any CPU + {2D265650-B1EC-4F8D-B043-A2E3DCC23FD8}.package|Any CPU.Build.0 = package|Any CPU + {2D265650-B1EC-4F8D-B043-A2E3DCC23FD8}.package|ARM.ActiveCfg = package|Any CPU + {2D265650-B1EC-4F8D-B043-A2E3DCC23FD8}.package|ARM.Build.0 = package|Any CPU + {2D265650-B1EC-4F8D-B043-A2E3DCC23FD8}.package|x64.ActiveCfg = package|Any CPU + {2D265650-B1EC-4F8D-B043-A2E3DCC23FD8}.package|x64.Build.0 = package|Any CPU + {2D265650-B1EC-4F8D-B043-A2E3DCC23FD8}.package|x86.ActiveCfg = package|Any CPU + {2D265650-B1EC-4F8D-B043-A2E3DCC23FD8}.package|x86.Build.0 = package|Any CPU + {2D265650-B1EC-4F8D-B043-A2E3DCC23FD8}.Release 4.0|Any CPU.ActiveCfg = Release|Any CPU + {2D265650-B1EC-4F8D-B043-A2E3DCC23FD8}.Release 4.0|Any CPU.Build.0 = Release|Any CPU + {2D265650-B1EC-4F8D-B043-A2E3DCC23FD8}.Release 4.0|ARM.ActiveCfg = Release|Any CPU + {2D265650-B1EC-4F8D-B043-A2E3DCC23FD8}.Release 4.0|ARM.Build.0 = Release|Any CPU + {2D265650-B1EC-4F8D-B043-A2E3DCC23FD8}.Release 4.0|x64.ActiveCfg = Release|Any CPU + {2D265650-B1EC-4F8D-B043-A2E3DCC23FD8}.Release 4.0|x64.Build.0 = Release|Any CPU + {2D265650-B1EC-4F8D-B043-A2E3DCC23FD8}.Release 4.0|x86.ActiveCfg = Release|Any CPU + {2D265650-B1EC-4F8D-B043-A2E3DCC23FD8}.Release 4.0|x86.Build.0 = Release|Any CPU + {2D265650-B1EC-4F8D-B043-A2E3DCC23FD8}.Release|Any CPU.ActiveCfg = Release|Any CPU + {2D265650-B1EC-4F8D-B043-A2E3DCC23FD8}.Release|Any CPU.Build.0 = Release|Any CPU + {2D265650-B1EC-4F8D-B043-A2E3DCC23FD8}.Release|ARM.ActiveCfg = Release|Any CPU + {2D265650-B1EC-4F8D-B043-A2E3DCC23FD8}.Release|ARM.Build.0 = Release|Any CPU + {2D265650-B1EC-4F8D-B043-A2E3DCC23FD8}.Release|x64.ActiveCfg = Release|Any CPU + {2D265650-B1EC-4F8D-B043-A2E3DCC23FD8}.Release|x64.Build.0 = Release|Any CPU + {2D265650-B1EC-4F8D-B043-A2E3DCC23FD8}.Release|x86.ActiveCfg = Release|Any CPU + {2D265650-B1EC-4F8D-B043-A2E3DCC23FD8}.Release|x86.Build.0 = Release|Any CPU EndGlobalSection GlobalSection(SolutionProperties) = preSolution HideSolutionNode = FALSE @@ -815,13 +873,24 @@ Global {97ED15E5-6546-4437-BF4F-B929700CE922} = {8A0F718E-2168-4CC7-8F7B-A65508B52B0F} {F0010AA8-63C3-47D7-95E9-A5D1D04DA325} = {8A0F718E-2168-4CC7-8F7B-A65508B52B0F} {E1A8FDE2-FEFC-403E-99A0-F13847B1495E} = {8A0F718E-2168-4CC7-8F7B-A65508B52B0F} - {9922FA1F-F9E8-44FD-8B51-39E7C7D7737C} = {C2F43DB7-AAA0-4687-9897-5D686EC91245} {E04ACB26-B65F-43CB-AC30-B6523A7B93C4} = {390019FF-0139-4EB0-90FF-9BF6E68BEB42} {7050F177-1D55-4562-937C-56D117198BFB} = {390019FF-0139-4EB0-90FF-9BF6E68BEB42} {D150CE86-80D9-4709-B0BC-5E1A3AA457A9} = {390019FF-0139-4EB0-90FF-9BF6E68BEB42} {75256FFE-5F9A-4F4F-BD78-37F6489488FD} = {390019FF-0139-4EB0-90FF-9BF6E68BEB42} + {567FEEF7-41AF-42F2-AD34-546A278355B1} = {C2F43DB7-AAA0-4687-9897-5D686EC91245} + {2D265650-B1EC-4F8D-B043-A2E3DCC23FD8} = {8A0F718E-2168-4CC7-8F7B-A65508B52B0F} EndGlobalSection GlobalSection(ExtensibilityGlobals) = postSolution SolutionGuid = {F69D4156-FC22-4B8E-AD72-2A7323D42CC4} EndGlobalSection + GlobalSection(SharedMSBuildProjectFiles) = preSolution + IO.Ably.Tests.Shared\IO.Ably.Tests.Shared.projitems*{1609f12c-8216-4e7c-ade0-240bfe160242}*SharedItemsImports = 13 + IO.Ably.Shared\IO.Ably.Shared.projitems*{24b6fc97-9d3d-46ae-b5cb-47458354bee1}*SharedItemsImports = 4 + IO.Ably.Shared\IO.Ably.Shared.projitems*{2d265650-b1ec-4f8d-b043-a2e3dcc23fd8}*SharedItemsImports = 4 + IO.Ably.Shared\IO.Ably.Shared.projitems*{3553e1b2-8f1f-4e83-9524-08e702c14fcf}*SharedItemsImports = 13 + IO.Ably.Tests.Shared\IO.Ably.Tests.Shared.projitems*{567feef7-41af-42f2-ad34-546a278355b1}*SharedItemsImports = 4 + IO.Ably.Shared\IO.Ably.Shared.projitems*{8bb7b13c-e9f4-4d1b-bccc-af890a23ece6}*SharedItemsImports = 4 + IO.Ably.Shared\IO.Ably.Shared.projitems*{97ed15e5-6546-4437-bf4f-b929700ce922}*SharedItemsImports = 5 + IO.Ably.Shared.MsgPack\IO.Ably.Shared.MsgPack.projitems*{eebf3249-3ca3-4078-a188-f8b916c3f4c2}*SharedItemsImports = 13 + EndGlobalSection EndGlobal diff --git a/src/IO.Ably.iOS/Platform.cs b/src/IO.Ably.iOS/Platform.cs index 4382b0c5f..6c65efa27 100644 --- a/src/IO.Ably.iOS/Platform.cs +++ b/src/IO.Ably.iOS/Platform.cs @@ -10,7 +10,7 @@ internal class Platform : IPlatform private static readonly object _lock = new object(); internal static bool HookedUpToNetworkEvents { get; private set; } - public string PlatformId => "xamarin-ios"; + public Agent.PlatformRuntime PlatformId => Agent.PlatformRuntime.XamarinIos; public ITransportFactory TransportFactory => null; public IMobileDevice MobileDevice { get; set; } diff --git a/src/IO.Ably.sln b/src/IO.Ably.sln index 9234b9465..05d848f0f 100644 --- a/src/IO.Ably.sln +++ b/src/IO.Ably.sln @@ -1,7 +1,7 @@  Microsoft Visual Studio Solution File, Format Version 12.00 -# Visual Studio Version 16 -VisualStudioVersion = 16.0.28729.10 +# Visual Studio Version 17 +VisualStudioVersion = 17.0.31919.166 MinimumVisualStudioVersion = 15.0.26730.10 Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = ".nuget", ".nuget", "{1EA29F05-BF68-4BA8-A58F-C7C131E3FC62}" ProjectSection(SolutionItems) = preProject @@ -40,22 +40,13 @@ Project("{D954291E-2A0B-460D-934E-DC6B0785DB48}") = "IO.Ably.Shared.MsgPack", "I EndProject Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "AndroidSample", "..\examples\AndroidSample\AndroidSample.csproj", "{4F519937-3F75-49D7-A71E-79A6C798C5B8}" EndProject -Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "IO.Ably.Tests.DotNetCore20", "IO.Ably.Tests.DotNetCore20\IO.Ably.Tests.DotNetCore20.csproj", "{4805A9DA-3412-4BE8-8B95-5A0EFDA1AC01}" +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "IO.Ably.Tests.DotNET", "IO.Ably.Tests.DotNET\IO.Ably.Tests.DotNET.csproj", "{4805A9DA-3412-4BE8-8B95-5A0EFDA1AC01}" EndProject Project("{D954291E-2A0B-460D-934E-DC6B0785DB48}") = "IO.Ably.Tests.Shared", "IO.Ably.Tests.Shared\IO.Ably.Tests.Shared.shproj", "{1609F12C-8216-4E7C-ADE0-240BFE160242}" EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "IO.Ably.DeltaCodec", "..\lib\delta-codec\IO.Ably.DeltaCodec\IO.Ably.DeltaCodec.csproj", "{412DEB5F-7936-4027-8BF8-977F23D465ED}" +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "IO.Ably.DeltaCodec", "..\lib\delta-codec\IO.Ably.DeltaCodec\IO.Ably.DeltaCodec.csproj", "{412DEB5F-7936-4027-8BF8-977F23D465ED}" EndProject Global - GlobalSection(SharedMSBuildProjectFiles) = preSolution - IO.Ably.Tests.Shared\IO.Ably.Tests.Shared.projitems*{1609f12c-8216-4e7c-ade0-240bfe160242}*SharedItemsImports = 13 - IO.Ably.Shared\IO.Ably.Shared.projitems*{24b6fc97-9d3d-46ae-b5cb-47458354bee1}*SharedItemsImports = 4 - IO.Ably.Shared\IO.Ably.Shared.projitems*{2d265650-b1ec-4f8d-b043-a2e3dcc23fd8}*SharedItemsImports = 4 - IO.Ably.Shared\IO.Ably.Shared.projitems*{3553e1b2-8f1f-4e83-9524-08e702c14fcf}*SharedItemsImports = 13 - IO.Ably.Tests.Shared\IO.Ably.Tests.Shared.projitems*{567feef7-41af-42f2-ad34-546a278355b1}*SharedItemsImports = 4 - IO.Ably.Shared\IO.Ably.Shared.projitems*{8bb7b13c-e9f4-4d1b-bccc-af890a23ece6}*SharedItemsImports = 4 - IO.Ably.Shared.MsgPack\IO.Ably.Shared.MsgPack.projitems*{eebf3249-3ca3-4078-a188-f8b916c3f4c2}*SharedItemsImports = 13 - EndGlobalSection GlobalSection(SolutionConfigurationPlatforms) = preSolution Debug|Any CPU = Debug|Any CPU Debug|ARM = Debug|ARM @@ -223,4 +214,15 @@ Global GlobalSection(ExtensibilityGlobals) = postSolution SolutionGuid = {F69D4156-FC22-4B8E-AD72-2A7323D42CC4} EndGlobalSection + GlobalSection(SharedMSBuildProjectFiles) = preSolution + IO.Ably.Tests.Shared\IO.Ably.Tests.Shared.projitems*{1609f12c-8216-4e7c-ade0-240bfe160242}*SharedItemsImports = 13 + IO.Ably.Shared\IO.Ably.Shared.projitems*{24b6fc97-9d3d-46ae-b5cb-47458354bee1}*SharedItemsImports = 4 + IO.Ably.Shared\IO.Ably.Shared.projitems*{2d265650-b1ec-4f8d-b043-a2e3dcc23fd8}*SharedItemsImports = 4 + IO.Ably.Shared\IO.Ably.Shared.projitems*{3553e1b2-8f1f-4e83-9524-08e702c14fcf}*SharedItemsImports = 13 + IO.Ably.Tests.Shared\IO.Ably.Tests.Shared.projitems*{4805a9da-3412-4be8-8b95-5a0efda1ac01}*SharedItemsImports = 5 + IO.Ably.Shared\IO.Ably.Shared.projitems*{48ea337f-ae7b-4001-bd8c-da1668fc6cbd}*SharedItemsImports = 5 + IO.Ably.Tests.Shared\IO.Ably.Tests.Shared.projitems*{567feef7-41af-42f2-ad34-546a278355b1}*SharedItemsImports = 4 + IO.Ably.Shared\IO.Ably.Shared.projitems*{8bb7b13c-e9f4-4d1b-bccc-af890a23ece6}*SharedItemsImports = 4 + IO.Ably.Shared.MsgPack\IO.Ably.Shared.MsgPack.projitems*{eebf3249-3ca3-4078-a188-f8b916c3f4c2}*SharedItemsImports = 13 + EndGlobalSection EndGlobal diff --git a/tools/mono-install.sh b/tools/mono-install.sh new file mode 100755 index 000000000..03b018c49 --- /dev/null +++ b/tools/mono-install.sh @@ -0,0 +1,26 @@ +#!/bin/bash +set -ex + +# Get the macos universal pkg installer download url +# for the version you want to install from: https://download.mono-project.com/archive/ +# and set it here as the value of this variable: +MONO_MACOS_PKG_DOWNLOAD_URL='https://download.mono-project.com/archive/6.12.0/macos-10-universal/MonoFramework-MDK-6.12.0.190.macos10.xamarin.universal.pkg' + +# create a temp dir and cd into it +mkdir -p /tmp/mono-install +cd /tmp/mono-install + +# debug: mono version before the install +mono --version + +# download mono mac installer (pkg) +wget -q -O ./mono-installer.pkg "$MONO_MACOS_PKG_DOWNLOAD_URL" + +# install it +sudo installer -pkg ./mono-installer.pkg -target / + +# debug: mono version after install, just to confirm it did overwrite the original version +mono --version + +# just for fun print this symlink too, which should point to the version we just installed +ls -alh /Library/Frameworks/Mono.framework/Versions/Current