Skip to content

Commit

Permalink
[MAN-369] [MAN-370] [MAN-371] : Make the pipelines work as intended
Browse files Browse the repository at this point in the history
[MAN-369] laerdal mcu mgr new releases do not get auto announced as intended when merging to develop master main
[MAN-370] [Laerdal.McuMgr] Test-Suite: Various test cases fail due to racing-conditions between the state-changed-event-firing and the final events for successful completion/exception throwing
[MAN-371] [Laerdal.McuMgr / iOS] GitHub CI: Our pipelines broke on the iOS / MacCatalyst side due to sharpie picking the latest iphoneos SDK in general instead of the latest iphoneos supported by xcode 15.2
ksidirop-laerdal authored Jul 9, 2024
2 parents 56d1295 + 77bec88 commit 8dd3c94
Showing 44 changed files with 226 additions and 224 deletions.
2 changes: 1 addition & 1 deletion .github/workflows/github-actions.yml
Original file line number Diff line number Diff line change
@@ -63,7 +63,7 @@ jobs:
msbuild \
"Laerdal.Builder.targets" \
-m:1 \
-p:ShouldSkipMacCatalyst="false" \
-p:Should_Skip_MacCatalyst="false" \
\
-p:PackageOutputPath="${{env.BUILD_REPOSITORY_FOLDERPATH}}/Artifacts" \
-p:Laerdal_Gradle_Path="/opt/homebrew/opt/gradle@7/bin/gradle" \
Original file line number Diff line number Diff line change
@@ -8,12 +8,20 @@
#
# Note that all parameters passed to xcodebuild must be in the form of -parameter value instead of --parameter

declare SDK_VERSION="" # xcodebuild -showsdks
declare XCODEBUILD_TARGET_SDK="${XCODEBUILD_TARGET_SDK:-iphoneos}"
declare XCODEBUILD_TARGET_SDK_VERSION="${XCODEBUILD_TARGET_SDK_VERSION}" # xcodebuild -showsdks

if [ "$XCODEBUILD_TARGET_SDK" == "iphoneos" ] && [ -z "$XCODEBUILD_TARGET_SDK_VERSION" ]; then # ios
XCODEBUILD_TARGET_SDK_VERSION="17.2"

elif [ "$XCODEBUILD_TARGET_SDK" == "macosx" ] && [ -z "$XCODEBUILD_TARGET_SDK_VERSION" ]; then # maccatalyst
XCODEBUILD_TARGET_SDK_VERSION="14.2"
fi

declare SWIFT_BUILD_CONFIGURATION="${SWIFT_BUILD_CONFIGURATION:-Release}"

declare SUPPORTS_MACCATALYST="${SUPPORTS_MACCATALYST:-NO}"
declare XCODEBUILD_TARGET_SDK_WITH_VERSION_IF_ANY="$XCODEBUILD_TARGET_SDK$SDK_VERSION" # if the version is the empty string then the latest version of the sdk will be used which is fine
declare XCODEBUILD_TARGET_SDK_WITH_VERSION_IF_ANY="$XCODEBUILD_TARGET_SDK$XCODEBUILD_TARGET_SDK_VERSION"

declare SWIFT_OUTPUT_PATH="${SWIFT_OUTPUT_PATH:-./VendorFrameworks/swift-framework-proxy/}"

@@ -38,6 +46,8 @@ function print_macos_sdks() {
echo "** xcode version : '$( "xcodebuild" -version )'"
echo "** xcode sdks :"
xcodebuild -showsdks
echo "** xcode sdks visible to sharpie :"
sharpie xcode -sdks

echo
echo "** SWIFT_BUILD_PATH : '$SWIFT_BUILD_PATH' "
@@ -51,9 +61,9 @@ function print_macos_sdks() {
echo "** OUTPUT_FOLDER_NAME : '$OUTPUT_FOLDER_NAME' "
echo "** OUTPUT_SHARPIE_HEADER_FILES_PATH : '$OUTPUT_SHARPIE_HEADER_FILES_PATH' "
echo
echo "** SDK_VERSION : '${SDK_VERSION:-(No specific version specified so the latest version will be used)}'"
echo "** SUPPORTS_MACCATALYST : '$SUPPORTS_MACCATALYST' "
echo "** XCODEBUILD_TARGET_SDK : '$XCODEBUILD_TARGET_SDK' "
echo "** XCODEBUILD_TARGET_SDK_VERSION : '${XCODEBUILD_TARGET_SDK_VERSION:-(No specific version specified so the latest version will be used)}'"
echo "** XCODEBUILD_TARGET_SDK_WITH_VERSION_IF_ANY : '$XCODEBUILD_TARGET_SDK_WITH_VERSION_IF_ANY' "
echo
}
@@ -168,6 +178,7 @@ function create_fat_binaries() {
fi

echo "**** (FatBinaries 5/8) Generating binding api definition and structs"
set -x
sharpie \
bind \
-sdk "$XCODEBUILD_TARGET_SDK_WITH_VERSION_IF_ANY" \
@@ -177,6 +188,7 @@ function create_fat_binaries() {
"$SWIFT_OUTPUT_PATH/$SWIFT_PROJECT_NAME.framework/Headers/$SWIFT_PROJECT_NAME-Swift.h" \
-clang -arch arm64 # vital needed for mac-catalyst
local exitCode=$?
set +x

if [ $exitCode -ne 0 ]; then
echo "** [FAILED] Failed to generate binding api definitions and structs"
Original file line number Diff line number Diff line change
@@ -159,7 +159,7 @@

<!-- 1. build and generate the fat libs from the proxy swift project -->
<Exec WorkingDirectory="../Laerdal.McuMgr.Bindings.MacCatalystAndIos.Native" Command=" chmod +x ./Laerdal.Mac.CompileAndGenerateFatLibs.sh "/>
<Exec WorkingDirectory="../Laerdal.McuMgr.Bindings.MacCatalystAndIos.Native" Command=" SWIFT_OUTPUT_PATH='$(NativeFrameworkParentFolderpath)' XCODEBUILD_TARGET_SDK='iphoneos' ./Laerdal.Mac.CompileAndGenerateFatLibs.sh "/>
<Exec WorkingDirectory="../Laerdal.McuMgr.Bindings.MacCatalystAndIos.Native" Command=" SWIFT_OUTPUT_PATH='$(NativeFrameworkParentFolderpath)' XCODEBUILD_TARGET_SDK='iphoneos' ./Laerdal.Mac.CompileAndGenerateFatLibs.sh "/>

<!-- warning its absolutely vital to remove any softlink files as they are causing -->
<!-- warning codesign to fail when using the resulting nuget in maui apps go figure ... -->
Original file line number Diff line number Diff line change
@@ -2,7 +2,6 @@
using Laerdal.McuMgr.DeviceResetter.Contracts;
using Laerdal.McuMgr.DeviceResetter.Contracts.Enums;
using Laerdal.McuMgr.DeviceResetter.Contracts.Native;
using GenericNativeDeviceResetterCallbacksProxy_ = Laerdal.McuMgr.DeviceResetter.DeviceResetter.GenericNativeDeviceResetterCallbacksProxy;

namespace Laerdal.McuMgr.Tests.DeviceResetter
{
Original file line number Diff line number Diff line change
@@ -59,9 +59,9 @@ public override EFileDownloaderVerdict BeginDownload(string remoteFilePath)
StateChangedAdvertisement(remoteFilePath, EFileDownloaderState.Idle, EFileDownloaderState.Downloading);

await Task.Delay(20);
DownloadCompletedAdvertisement(remoteFilePath, _mockedFileData);

StateChangedAdvertisement(remoteFilePath, EFileDownloaderState.Downloading, EFileDownloaderState.Complete);
StateChangedAdvertisement(remoteFilePath, EFileDownloaderState.Downloading, EFileDownloaderState.Complete); // order
DownloadCompletedAdvertisement(remoteFilePath, _mockedFileData); // order
});

return verdict;
Original file line number Diff line number Diff line change
@@ -51,8 +51,8 @@ public override EFileDownloaderVerdict BeginDownload(string remoteFilePath)
StateChangedAdvertisement(remoteFilePath, EFileDownloaderState.Idle, EFileDownloaderState.Downloading);

await Task.Delay(20);
DownloadCompletedAdvertisement(remoteFilePath, new byte[] { });
StateChangedAdvertisement(remoteFilePath, EFileDownloaderState.Downloading, EFileDownloaderState.Complete);
StateChangedAdvertisement(remoteFilePath, EFileDownloaderState.Downloading, EFileDownloaderState.Complete); // order
DownloadCompletedAdvertisement(remoteFilePath, new byte[] { }); // order
});

return verdict;
Original file line number Diff line number Diff line change
@@ -96,23 +96,26 @@ public override EFileDownloaderVerdict BeginDownload(string remoteFilePath)
var remoteFilePathUppercase = remoteFilePath.ToUpperInvariant();
if (remoteFilePathUppercase.Contains("some/file/that/exist/but/is/erroring/out/when/we/try/to/download/it.bin".ToUpperInvariant()))
{
StateChangedAdvertisement(remoteFilePath, oldState: EFileDownloaderState.Downloading, newState: EFileDownloaderState.Error);
FatalErrorOccurredAdvertisement(remoteFilePath, "foobar");
}
else if (remoteFilePathUppercase.Contains("some/file/that/doesnt/exist.bin".ToUpperInvariant()))
{
StateChangedAdvertisement(remoteFilePath, oldState: EFileDownloaderState.Downloading, newState: EFileDownloaderState.Error);
FatalErrorOccurredAdvertisement(remoteFilePath, "NO ENTRY (5)");
}
else if (remoteFilePathUppercase.Contains("some/file/that/exist/and/completes/after/a/couple/of/attempts.bin".ToUpperInvariant())
&& _retryCountForProblematicFile++ < 3)
{
StateChangedAdvertisement(remoteFilePath, oldState: EFileDownloaderState.Downloading, newState: EFileDownloaderState.Error);
FatalErrorOccurredAdvertisement(remoteFilePath, "ping pong");
}
else
{
_expectedResults.TryGetValue(remoteFilePath, out var expectedFileContent);

DownloadCompletedAdvertisement(remoteFilePath, expectedFileContent);
StateChangedAdvertisement(remoteFilePath, EFileDownloaderState.Downloading, EFileDownloaderState.Complete);
StateChangedAdvertisement(remoteFilePath, EFileDownloaderState.Downloading, EFileDownloaderState.Complete); // order
DownloadCompletedAdvertisement(remoteFilePath, expectedFileContent); // order
}
});

Original file line number Diff line number Diff line change
@@ -59,8 +59,9 @@ public override EFileDownloaderVerdict BeginDownload(string remoteFilePath)
StateChangedAdvertisement(remoteFilePath, EFileDownloaderState.Idle, EFileDownloaderState.Downloading);

await Task.Delay(20);
DownloadCompletedAdvertisement(remoteFilePath, new byte[] { });
StateChangedAdvertisement(remoteFilePath, EFileDownloaderState.Downloading, EFileDownloaderState.Complete);

StateChangedAdvertisement(remoteFilePath, EFileDownloaderState.Downloading, EFileDownloaderState.Complete); // order
DownloadCompletedAdvertisement(remoteFilePath, new byte[] { }); // order
});

return verdict;
Original file line number Diff line number Diff line change
@@ -50,8 +50,9 @@ public override EFileDownloaderVerdict BeginDownload(string remoteFilePath)
StateChangedAdvertisement(remoteFilePath, EFileDownloaderState.Idle, EFileDownloaderState.Downloading);

await Task.Delay(20);
DownloadCompletedAdvertisement(remoteFilePath, new byte[] { });
StateChangedAdvertisement(remoteFilePath, EFileDownloaderState.Downloading, EFileDownloaderState.Complete);

StateChangedAdvertisement(remoteFilePath, EFileDownloaderState.Downloading, EFileDownloaderState.Complete); // order
DownloadCompletedAdvertisement(remoteFilePath, new byte[] { }); // order
});

return verdict;
Original file line number Diff line number Diff line change
@@ -103,9 +103,8 @@ public override EFileDownloaderVerdict BeginDownload(string remoteFilePath)
return;
}

DownloadCompletedAdvertisement(remoteFilePath, _mockedFileData);

StateChangedAdvertisement(remoteFilePath, EFileDownloaderState.Downloading, EFileDownloaderState.Complete);
StateChangedAdvertisement(remoteFilePath, EFileDownloaderState.Downloading, EFileDownloaderState.Complete); // order
DownloadCompletedAdvertisement(remoteFilePath, _mockedFileData); // order
});

return verdict;
Original file line number Diff line number Diff line change
@@ -83,9 +83,8 @@ public override EFileDownloaderVerdict BeginDownload(string remoteFilePath)

await Task.Delay(2_000);

FatalErrorOccurredAdvertisement(remoteFilePath, "fatal error occurred");

StateChangedAdvertisement(remoteFilePath, EFileDownloaderState.Downloading, EFileDownloaderState.Error);
FatalErrorOccurredAdvertisement(remoteFilePath, "fatal error occurred");
});

return verdict;
Original file line number Diff line number Diff line change
@@ -94,9 +94,8 @@ public override EFileDownloaderVerdict BeginDownload(string remoteFilePath)

await Task.Delay(100);

FatalErrorOccurredAdvertisement(remoteFilePath, _nativeErrorMessageForFileNotFound);

StateChangedAdvertisement(remoteFilePath, EFileDownloaderState.Downloading, EFileDownloaderState.Error);
FatalErrorOccurredAdvertisement(remoteFilePath, _nativeErrorMessageForFileNotFound);
});

return verdict;
Original file line number Diff line number Diff line change
@@ -55,9 +55,9 @@ public override EFileDownloaderVerdict BeginDownload(string remoteFilePath)
StateChangedAdvertisement(remoteFilePath, EFileDownloaderState.Idle, EFileDownloaderState.Downloading);

await Task.Delay(20);
DownloadCompletedAdvertisement(remoteFilePath, _mockedFileData);

StateChangedAdvertisement(remoteFilePath, EFileDownloaderState.Downloading, EFileDownloaderState.Complete);
StateChangedAdvertisement(remoteFilePath, EFileDownloaderState.Downloading, EFileDownloaderState.Complete); // order
DownloadCompletedAdvertisement(remoteFilePath, _mockedFileData); // order
});

return verdict;
Original file line number Diff line number Diff line change
@@ -115,9 +115,8 @@ public override EFileDownloaderVerdict BeginDownload(string remoteFilePath)
if (_cancellationTokenSource.IsCancellationRequested)
return;

DownloadCompletedAdvertisement(remoteFilePath, _mockedFileData);

StateChangedAdvertisement(remoteFilePath, EFileDownloaderState.Downloading, EFileDownloaderState.Complete);
StateChangedAdvertisement(remoteFilePath, EFileDownloaderState.Downloading, EFileDownloaderState.Complete); // order
DownloadCompletedAdvertisement(remoteFilePath, _mockedFileData); // order
}, _cancellationTokenSource.Token);

return verdict;
Original file line number Diff line number Diff line change
@@ -58,10 +58,13 @@ public override EFileDownloaderVerdict BeginDownload(string remoteFilePath)
Task.Run(async () => //00 vital
{
await Task.Delay(10);

StateChangedAdvertisement(resource: remoteFilePath, oldState: EFileDownloaderState.Idle, newState: EFileDownloaderState.Downloading);

await Task.Delay(1_000);
StateChangedAdvertisement(resource: remoteFilePath, oldState: EFileDownloaderState.Downloading, newState: EFileDownloaderState.Complete);

StateChangedAdvertisement(resource: remoteFilePath, oldState: EFileDownloaderState.Downloading, newState: EFileDownloaderState.Complete); // order
DownloadCompletedAdvertisement(remoteFilePath, new byte[]{}); // order
});

return verdict;
Original file line number Diff line number Diff line change
@@ -97,9 +97,8 @@ public override EFileDownloaderVerdict BeginDownload(string remoteFilePath)

await Task.Delay(100);

FatalErrorOccurredAdvertisement(remoteFilePath, _nativeErrorMessageForFileNotFound);

StateChangedAdvertisement(remoteFilePath, EFileDownloaderState.Downloading, EFileDownloaderState.Error);
StateChangedAdvertisement(remoteFilePath, EFileDownloaderState.Downloading, EFileDownloaderState.Error); // order simulates how the native code behaves
FatalErrorOccurredAdvertisement(remoteFilePath, _nativeErrorMessageForFileNotFound); // order simulates how the csharp wrapper behaves
});

return verdict;
Original file line number Diff line number Diff line change
@@ -2,7 +2,6 @@
using Laerdal.McuMgr.FileDownloader.Contracts;
using Laerdal.McuMgr.FileDownloader.Contracts.Enums;
using Laerdal.McuMgr.FileDownloader.Contracts.Native;
using GenericNativeFileDownloaderCallbacksProxy_ = Laerdal.McuMgr.FileDownloader.FileDownloader.GenericNativeFileDownloaderCallbacksProxy;

namespace Laerdal.McuMgr.Tests.FileDownloader
{
Original file line number Diff line number Diff line change
@@ -56,9 +56,8 @@ public override EFileUploaderVerdict BeginUpload(string remoteFilePath, byte[] m
StateChangedAdvertisement(remoteFilePath, EFileUploaderState.Idle, EFileUploaderState.Uploading);

await Task.Delay(20);
FileUploadedAdvertisement(remoteFilePath);

StateChangedAdvertisement(remoteFilePath, EFileUploaderState.Uploading, EFileUploaderState.Complete);
StateChangedAdvertisement(remoteFilePath, EFileUploaderState.Uploading, EFileUploaderState.Complete); // order
FileUploadedAdvertisement(remoteFilePath); // order
});

return verdict;
Original file line number Diff line number Diff line change
@@ -50,8 +50,8 @@ public override EFileUploaderVerdict BeginUpload(string remoteFilePath, byte[] d
StateChangedAdvertisement(remoteFilePath, EFileUploaderState.Idle, EFileUploaderState.Uploading);

await Task.Delay(20);
FileUploadedAdvertisement(remoteFilePath);
StateChangedAdvertisement(remoteFilePath, EFileUploaderState.Uploading, EFileUploaderState.Complete);
FileUploadedAdvertisement(remoteFilePath);
});

return verdict;
Original file line number Diff line number Diff line change
@@ -35,7 +35,7 @@ public async Task MultipleFilesUploadAsync_ShouldCompleteSuccessfully_GivenVario
{ " /Some/File/Path.bin ", new byte[] { 1 } }, //intentionally included multiple times to test that we handle case sensitivity correctly
{ "\t/some/file/that/succeeds/after/a/couple/of/attempts.bin ", new byte[] { 0 } },
{ " /some/file/that/succeeds/after/a/couple/of/attempts.bin ", new byte[] { 1 } }, //intentionally included multiple times to test whether the mechanism will attempt to upload the file only once

{ " /some/file/to/a/folder/that/doesnt/exist.bin ", new byte[] { 0 } },
{ "\n some/file/that/is/erroring/out/when/we/try/to/upload/it.bin ", new byte[] { 0 } },
{ "\r/some/file/that/is/erroring/out/when/we/try/to/upload/it.bin ", new byte[] { 1 } }, //intentionally included multiple times to test whether the mechanism will attempt to upload the file only once
@@ -54,7 +54,7 @@ public async Task MultipleFilesUploadAsync_ShouldCompleteSuccessfully_GivenVario
"/some/file/to/a/folder/that/doesnt/exist.bin",
"/some/file/that/is/erroring/out/when/we/try/to/upload/it.bin"
});

eventsMonitor.OccurredEvents
.Count(args => args.EventName == nameof(fileUploader.FileUploaded))
.Should()
@@ -63,7 +63,7 @@ public async Task MultipleFilesUploadAsync_ShouldCompleteSuccessfully_GivenVario
eventsMonitor.OccurredEvents
.Count(args => args.EventName == nameof(fileUploader.FatalErrorOccurred))
.Should().Be(8);

mockedNativeFileUploaderProxy.CancelCalled.Should().BeFalse();
mockedNativeFileUploaderProxy.DisconnectCalled.Should().BeFalse(); //00
mockedNativeFileUploaderProxy.BeginUploadCalled.Should().BeTrue();
@@ -86,27 +86,30 @@ public override EFileUploaderVerdict BeginUpload(string remoteFilePath, byte[] d
{
await Task.Delay(10);
StateChangedAdvertisement(remoteFilePath, EFileUploaderState.Idle, EFileUploaderState.Uploading);

await Task.Delay(20);

var remoteFilePathUppercase = remoteFilePath.ToUpperInvariant();
if (remoteFilePathUppercase.Contains("some/file/to/a/folder/that/doesnt/exist.bin".ToUpperInvariant()))
{
StateChangedAdvertisement(remoteFilePath, EFileUploaderState.Uploading, EFileUploaderState.Error);
FatalErrorOccurredAdvertisement(remoteFilePath, "UNKNOWN (1)", EMcuMgrErrorCode.Unknown, EFileUploaderGroupReturnCode.Unset);
}
else if (remoteFilePathUppercase.Contains("some/file/that/succeeds/after/a/couple/of/attempts.bin".ToUpperInvariant())
&& _retryCountForProblematicFile++ < 3)
{
StateChangedAdvertisement(remoteFilePath, EFileUploaderState.Uploading, EFileUploaderState.Error);
FatalErrorOccurredAdvertisement(remoteFilePath, "ping pong", EMcuMgrErrorCode.Busy, EFileUploaderGroupReturnCode.Unset);
}
}
else if (remoteFilePathUppercase.Contains("some/file/that/is/erroring/out/when/we/try/to/upload/it.bin".ToUpperInvariant()))
{
StateChangedAdvertisement(remoteFilePath, EFileUploaderState.Uploading, EFileUploaderState.Error);
FatalErrorOccurredAdvertisement(remoteFilePath, "native symbols not loaded blah blah", EMcuMgrErrorCode.NotSupported, EFileUploaderGroupReturnCode.Unset);
}
else
{
FileUploadedAdvertisement(remoteFilePath);
StateChangedAdvertisement(remoteFilePath, EFileUploaderState.Uploading, EFileUploaderState.Complete);
StateChangedAdvertisement(remoteFilePath, EFileUploaderState.Uploading, EFileUploaderState.Complete); //order
FileUploadedAdvertisement(remoteFilePath); //order
}
});

Original file line number Diff line number Diff line change
@@ -59,8 +59,8 @@ public override EFileUploaderVerdict BeginUpload(string remoteFilePath, byte[] d
StateChangedAdvertisement(remoteFilePath, EFileUploaderState.Idle, EFileUploaderState.Uploading);

await Task.Delay(20);
FileUploadedAdvertisement(remoteFilePath);
StateChangedAdvertisement(remoteFilePath, EFileUploaderState.Uploading, EFileUploaderState.Complete);
FileUploadedAdvertisement(remoteFilePath);
});

return verdict;
Original file line number Diff line number Diff line change
@@ -50,8 +50,8 @@ public override EFileUploaderVerdict BeginUpload(string remoteFilePath, byte[] d
StateChangedAdvertisement(remoteFilePath, EFileUploaderState.Idle, EFileUploaderState.Uploading);

await Task.Delay(20);
FileUploadedAdvertisement(remoteFilePath);
StateChangedAdvertisement(remoteFilePath, EFileUploaderState.Uploading, EFileUploaderState.Complete);
FileUploadedAdvertisement(remoteFilePath);
});

return verdict;
Original file line number Diff line number Diff line change
@@ -101,9 +101,8 @@ public override EFileUploaderVerdict BeginUpload(string remoteFilePath, byte[] d
return;
}

FileUploadedAdvertisement(remoteFilePath);

StateChangedAdvertisement(remoteFilePath, EFileUploaderState.Uploading, EFileUploaderState.Complete);
FileUploadedAdvertisement(remoteFilePath);
});

return verdict;
Original file line number Diff line number Diff line change
@@ -84,9 +84,8 @@ public override EFileUploaderVerdict BeginUpload(string remoteFilePath, byte[] d

await Task.Delay(2_000);

FatalErrorOccurredAdvertisement(remoteFilePath, "fatal error occurred", EMcuMgrErrorCode.Corrupt, EFileUploaderGroupReturnCode.Unset);

StateChangedAdvertisement(remoteFilePath, EFileUploaderState.Uploading, EFileUploaderState.Error);
StateChangedAdvertisement(remoteFilePath, EFileUploaderState.Uploading, EFileUploaderState.Error); // order
FatalErrorOccurredAdvertisement(remoteFilePath, "fatal error occurred", EMcuMgrErrorCode.Corrupt, EFileUploaderGroupReturnCode.Unset); // order
});

return verdict;
Original file line number Diff line number Diff line change
@@ -94,9 +94,8 @@ public override EFileUploaderVerdict BeginUpload(string remoteFilePath, byte[] d

await Task.Delay(100);

FatalErrorOccurredAdvertisement(remoteFilePath, _nativeErrorMessageForFileNotFound, EMcuMgrErrorCode.Corrupt, EFileUploaderGroupReturnCode.Unset);

StateChangedAdvertisement(remoteFilePath, EFileUploaderState.Uploading, EFileUploaderState.Error);
StateChangedAdvertisement(remoteFilePath, EFileUploaderState.Uploading, EFileUploaderState.Error); // order
FatalErrorOccurredAdvertisement(remoteFilePath, _nativeErrorMessageForFileNotFound, EMcuMgrErrorCode.Corrupt, EFileUploaderGroupReturnCode.Unset); // order
});

return verdict;
Original file line number Diff line number Diff line change
@@ -52,9 +52,8 @@ public override EFileUploaderVerdict BeginUpload(string remoteFilePath, byte[] d
StateChangedAdvertisement(remoteFilePath, EFileUploaderState.Idle, EFileUploaderState.Uploading);

await Task.Delay(20);
FileUploadedAdvertisement(remoteFilePath);

StateChangedAdvertisement(remoteFilePath, EFileUploaderState.Uploading, EFileUploaderState.Complete);
FileUploadedAdvertisement(remoteFilePath);
});

return verdict;
Original file line number Diff line number Diff line change
@@ -111,9 +111,8 @@ public override EFileUploaderVerdict BeginUpload(string remoteFilePath, byte[] d

await Task.Delay(100);

FatalErrorOccurredAdvertisement(remoteFilePath, _nativeErrorMessageForFileNotFound, _mcuMgrErrorCode, EFileUploaderGroupReturnCode.Unset);

StateChangedAdvertisement(remoteFilePath, EFileUploaderState.Uploading, EFileUploaderState.Error);
StateChangedAdvertisement(remoteFilePath, EFileUploaderState.Uploading, EFileUploaderState.Error); // order
FatalErrorOccurredAdvertisement(remoteFilePath, _nativeErrorMessageForFileNotFound, _mcuMgrErrorCode, EFileUploaderGroupReturnCode.Unset); // order
});

return verdict;
Original file line number Diff line number Diff line change
@@ -1,6 +1,5 @@
using FluentAssertions;
using Laerdal.McuMgr.Common.Enums;
using Laerdal.McuMgr.Common.Exceptions;
using Laerdal.McuMgr.FileUploader.Contracts.Enums;
using Laerdal.McuMgr.FileUploader.Contracts.Exceptions;
using Laerdal.McuMgr.FileUploader.Contracts.Native;
@@ -49,9 +48,8 @@ public override EFileUploaderVerdict BeginUpload(string remoteFilePath, byte[] d

await Task.Delay(100);

FatalErrorOccurredAdvertisement(remoteFilePath, "blah blah", EMcuMgrErrorCode.AccessDenied, EFileUploaderGroupReturnCode.Unset);

StateChangedAdvertisement(remoteFilePath, EFileUploaderState.Uploading, EFileUploaderState.Error);
StateChangedAdvertisement(remoteFilePath, EFileUploaderState.Uploading, EFileUploaderState.Error); // order
FatalErrorOccurredAdvertisement(remoteFilePath, "blah blah", EMcuMgrErrorCode.AccessDenied, EFileUploaderGroupReturnCode.Unset); // order
});

return verdict;
Original file line number Diff line number Diff line change
@@ -112,9 +112,8 @@ public override EFileUploaderVerdict BeginUpload(string remoteFilePath, byte[] d
if (_cancellationTokenSource.IsCancellationRequested)
return;

FileUploadedAdvertisement(remoteFilePath);

StateChangedAdvertisement(remoteFilePath, EFileUploaderState.Uploading, EFileUploaderState.Complete);
FileUploadedAdvertisement(remoteFilePath);
}, _cancellationTokenSource.Token);

return verdict;
Original file line number Diff line number Diff line change
@@ -66,6 +66,7 @@ public override EFileUploaderVerdict BeginUpload(string remoteFilePath, byte[] d

await Task.Delay(1_000);
StateChangedAdvertisement(resource: remoteFilePath, oldState: EFileUploaderState.Uploading, newState: EFileUploaderState.Complete);
FileUploadedAdvertisement(remoteFilePath);
});

return verdict;
Original file line number Diff line number Diff line change
@@ -98,14 +98,13 @@ public override EFileUploaderVerdict BeginUpload(string remoteFilePath, byte[] d
await Task.Delay(20);
if (_tryCount < _maxNumberOfTriesForSuccess)
{
StateChangedAdvertisement(remoteFilePath, EFileUploaderState.Uploading, EFileUploaderState.Error);
FatalErrorOccurredAdvertisement(remoteFilePath, "fatal error occurred", EMcuMgrErrorCode.Corrupt, EFileUploaderGroupReturnCode.Unset);
StateChangedAdvertisement(remoteFilePath, EFileUploaderState.Uploading, EFileUploaderState.Error); // order
FatalErrorOccurredAdvertisement(remoteFilePath, "fatal error occurred", EMcuMgrErrorCode.Corrupt, EFileUploaderGroupReturnCode.Unset); // order
return;
}

FileUploadedAdvertisement(remoteFilePath);

StateChangedAdvertisement(remoteFilePath, EFileUploaderState.Uploading, EFileUploaderState.Complete);
StateChangedAdvertisement(remoteFilePath, EFileUploaderState.Uploading, EFileUploaderState.Complete); // order
FileUploadedAdvertisement(remoteFilePath); // order
});

return verdict;
1 change: 0 additions & 1 deletion Laerdal.McuMgr.Tests/FileUploader/FileUploaderTestbed.cs
Original file line number Diff line number Diff line change
@@ -2,7 +2,6 @@
using Laerdal.McuMgr.FileUploader.Contracts;
using Laerdal.McuMgr.FileUploader.Contracts.Enums;
using Laerdal.McuMgr.FileUploader.Contracts.Native;
using GenericNativeFileUploaderCallbacksProxy_ = Laerdal.McuMgr.FileUploader.FileUploader.GenericNativeFileUploaderCallbacksProxy;

namespace Laerdal.McuMgr.Tests.FileUploader
{
Original file line number Diff line number Diff line change
@@ -2,7 +2,6 @@
using Laerdal.McuMgr.FirmwareEraser.Contracts;
using Laerdal.McuMgr.FirmwareEraser.Contracts.Enums;
using Laerdal.McuMgr.FirmwareEraser.Contracts.Native;
using GenericNativeFirmwareEraserCallbacksProxy_ = Laerdal.McuMgr.FirmwareEraser.FirmwareEraser.GenericNativeFirmwareEraserCallbacksProxy;

namespace Laerdal.McuMgr.Tests.FirmwareEraser
{
Original file line number Diff line number Diff line change
@@ -104,8 +104,8 @@ public override EFirmwareInstallationVerdict BeginInstallation(
StateChangedAdvertisement(EFirmwareInstallationState.Uploading, EFirmwareInstallationState.Testing);
await Task.Delay(100);

FatalErrorOccurredAdvertisement(EFirmwareInstallationState.Uploading, EFirmwareInstallerFatalErrorType.FirmwareUploadingErroredOut, "error while uploading firmware blah blah");
StateChangedAdvertisement(EFirmwareInstallationState.Uploading, EFirmwareInstallationState.Error);
StateChangedAdvertisement(EFirmwareInstallationState.Uploading, EFirmwareInstallationState.Error); // order
FatalErrorOccurredAdvertisement(EFirmwareInstallationState.Uploading, EFirmwareInstallerFatalErrorType.FirmwareUploadingErroredOut, "error while uploading firmware blah blah"); // order
});

return verdict;
Original file line number Diff line number Diff line change
@@ -93,8 +93,8 @@ public override EFirmwareInstallationVerdict BeginInstallation(
StateChangedAdvertisement(EFirmwareInstallationState.Uploading, EFirmwareInstallationState.Testing);
await Task.Delay(100);

FatalErrorOccurredAdvertisement(EFirmwareInstallationState.Confirming, EFirmwareInstallerFatalErrorType.Generic, "fatal error occurred");
StateChangedAdvertisement(EFirmwareInstallationState.Uploading, EFirmwareInstallationState.Error);
StateChangedAdvertisement(EFirmwareInstallationState.Uploading, EFirmwareInstallationState.Error); // order
FatalErrorOccurredAdvertisement(EFirmwareInstallationState.Confirming, EFirmwareInstallerFatalErrorType.Generic, "fatal error occurred"); // order
});

return verdict;
Original file line number Diff line number Diff line change
@@ -91,8 +91,8 @@ public override EFirmwareInstallationVerdict BeginInstallation(
StateChangedAdvertisement(EFirmwareInstallationState.Uploading, EFirmwareInstallationState.Testing);
await Task.Delay(100);

FatalErrorOccurredAdvertisement(EFirmwareInstallationState.Confirming, EFirmwareInstallerFatalErrorType.FirmwareImageSwapTimeout, "image swap timeout");
StateChangedAdvertisement(EFirmwareInstallationState.Uploading, EFirmwareInstallationState.Error);
StateChangedAdvertisement(EFirmwareInstallationState.Uploading, EFirmwareInstallationState.Error); // order
FatalErrorOccurredAdvertisement(EFirmwareInstallationState.Confirming, EFirmwareInstallerFatalErrorType.FirmwareImageSwapTimeout, "image swap timeout"); // order
});

return verdict;
Original file line number Diff line number Diff line change
@@ -2,7 +2,6 @@
using Laerdal.McuMgr.FirmwareInstaller.Contracts;
using Laerdal.McuMgr.FirmwareInstaller.Contracts.Enums;
using Laerdal.McuMgr.FirmwareInstaller.Contracts.Native;
using GenericNativeFirmwareInstallerCallbacksProxy_ = Laerdal.McuMgr.FirmwareInstaller.FirmwareInstaller.GenericNativeFirmwareInstallerCallbacksProxy;

namespace Laerdal.McuMgr.Tests.FirmwareInstaller
{
24 changes: 12 additions & 12 deletions Laerdal.McuMgr/Laerdal.McuMgr.csproj
Original file line number Diff line number Diff line change
@@ -13,8 +13,8 @@

<TargetFrameworks>$(TargetFrameworks)netstandard2.1;</TargetFrameworks>
<TargetFrameworks>$(TargetFrameworks)net8.0-android;</TargetFrameworks>
<TargetFrameworks Condition=" '$(IsOSX)' == 'true' ">$(TargetFrameworks)net8.0-ios11;</TargetFrameworks>
<TargetFrameworks Condition=" '$(IsOSX)' == 'true' and '$(ShouldSkipMacCatalyst)' != 'true' ">$(TargetFrameworks)net8.0-maccatalyst</TargetFrameworks>
<TargetFrameworks Condition=" '$(IsOSX)' == 'true' ">$(TargetFrameworks)net8.0-ios11;</TargetFrameworks>
<TargetFrameworks Condition=" '$(IsOSX)' == 'true' and '$(Should_Skip_MacCatalyst)' != 'true' ">$(TargetFrameworks)net8.0-maccatalyst</TargetFrameworks>

<IsNet8 Condition=" '$(TargetFramework.ToLower().StartsWith(net8))' == 'true' ">true</IsNet8>
<IsNet8IOS Condition=" '$(TargetFramework.ToLower().StartsWith(net8.0-ios))' == 'true' ">true</IsNet8IOS>
@@ -97,15 +97,15 @@
</ItemGroup>

<Target Name="PrintBuildInfo" BeforeTargets="CoreCompile">
<Message Importance="High" Text="OS: '$(OS)' "/>
<Message Importance="High" Text="Platform: '$(Platform)' "/>
<Message Importance="High" Text="PackageId: '$(PackageId)' "/>
<Message Importance="High" Text="Configuration: '$(Configuration)' "/>
<Message Importance="High" Text="PackageVersion: '$(PackageVersion)' "/>
<Message Importance="High" Text="TargetFramework: '$(TargetFramework)' "/>
<Message Importance="High" Text="DefineConstants: '$(DefineConstants)' "/>
<Message Importance="high" Text="MSBuildNodeCount: '$(MSBuildNodeCount)' "/>
<Message Importance="high" Text="ShouldSkipMacCatalyst: '$(ShouldSkipMacCatalyst)' "/>
<Message Importance="High" Text="OS: '$(OS)' "/>
<Message Importance="High" Text="Platform: '$(Platform)' "/>
<Message Importance="High" Text="PackageId: '$(PackageId)' "/>
<Message Importance="High" Text="Configuration: '$(Configuration)' "/>
<Message Importance="High" Text="PackageVersion: '$(PackageVersion)' "/>
<Message Importance="High" Text="TargetFramework: '$(TargetFramework)' "/>
<Message Importance="High" Text="DefineConstants: '$(DefineConstants)' "/>
<Message Importance="high" Text="MSBuildNodeCount: '$(MSBuildNodeCount)' "/>
<Message Importance="high" Text="Should_Skip_MacCatalyst: '$(Should_Skip_MacCatalyst)' "/>

<Message Importance="high" Text="IsNet8: '$(IsNet8)' "/>
<Message Importance="high" Text="IsNetX: '$(IsNetX)' "/>
@@ -157,7 +157,7 @@
<PackageReference Include="Laerdal.McuMgr.Bindings.iOS" Version="1.0.1039.0"/>
</ItemGroup>

<ItemGroup Condition=" '$(IsNetXMacCatalyst)' == 'true' and '$(ShouldSkipMacCatalyst)' != 'true' ">
<ItemGroup Condition=" '$(IsNetXMacCatalyst)' == 'true' and '$(Should_Skip_MacCatalyst)' != 'true' ">
<PackageReference Include="Laerdal.McuMgr.Bindings.MacCatalyst" Version="1.0.1039.0"/>
</ItemGroup>

42 changes: 24 additions & 18 deletions Laerdal.McuMgr/Shared/FileDownloader/FileDownloader.cs
Original file line number Diff line number Diff line change
@@ -193,10 +193,10 @@ public async Task<byte[]> DownloadAsync(

try
{
Cancelled += DownloadAsyncOnCancelled;
StateChanged += DownloadAsyncOnStateChanged;
DownloadCompleted += DownloadAsyncOnDownloadCompleted;
FatalErrorOccurred += DownloadAsyncOnFatalErrorOccurred;
Cancelled += FileDownloader_Cancelled_;
StateChanged += FileDownloader_StateChanged_;
DownloadCompleted += FileDownloader_DownloadCompleted_;
FatalErrorOccurred += FileDownloader_FatalErrorOccurred_;

var verdict = BeginDownload(remoteFilePath); //00 dont use task.run here for now
if (verdict != EFileDownloaderVerdict.Success)
@@ -223,10 +223,16 @@ public async Task<byte[]> DownloadAsync(
catch (DownloadErroredOutException ex)
{
if (ex is DownloadErroredOutRemoteFileNotFoundException) //order no point to retry if the remote file is not there
{
//OnStateChanged(new StateChangedEventArgs(newState: EFileDownloaderState.Error)); //noneed already done in native code
throw;
}

if (++triesCount > maxTriesCount) //order
{
//OnStateChanged(new StateChangedEventArgs(newState: EFileDownloaderState.Error)); //noneed already done in native code
throw new AllDownloadAttemptsFailedException(remoteFilePath, maxTriesCount, innerException: ex);
}

if (sleepTimeBetweenRetriesInMs > 0) //order
{
@@ -253,20 +259,20 @@ ex is not ArgumentException //10 wops probably missing native lib symbols!
}
finally
{
Cancelled -= DownloadAsyncOnCancelled;
StateChanged -= DownloadAsyncOnStateChanged;
DownloadCompleted -= DownloadAsyncOnDownloadCompleted;
FatalErrorOccurred -= DownloadAsyncOnFatalErrorOccurred;
Cancelled -= FileDownloader_Cancelled_;
StateChanged -= FileDownloader_StateChanged_;
DownloadCompleted -= FileDownloader_DownloadCompleted_;
FatalErrorOccurred -= FileDownloader_FatalErrorOccurred_;
}

void DownloadAsyncOnCancelled(object sender, CancelledEventArgs ea)
void FileDownloader_Cancelled_(object sender_, CancelledEventArgs ea_)
{
taskCompletionSource.TrySetException(new DownloadCancelledException());
}

void DownloadAsyncOnStateChanged(object sender, StateChangedEventArgs ea)
void FileDownloader_StateChanged_(object sender_, StateChangedEventArgs ea_)
{
if (ea.NewState != EFileDownloaderState.Cancelling || isCancellationRequested)
if (ea_.NewState != EFileDownloaderState.Cancelling || isCancellationRequested)
return;

isCancellationRequested = true;
@@ -294,24 +300,24 @@ void DownloadAsyncOnStateChanged(object sender, StateChangedEventArgs ea)
// getting called right above but if that takes too long we give the killing blow by calling OnCancelled() manually here
}

void DownloadAsyncOnDownloadCompleted(object sender, DownloadCompletedEventArgs ea)
void FileDownloader_DownloadCompleted_(object sender_, DownloadCompletedEventArgs ea_)
{
taskCompletionSource.TrySetResult(ea.Data);
taskCompletionSource.TrySetResult(ea_.Data);
}

void DownloadAsyncOnFatalErrorOccurred(object sender, FatalErrorOccurredEventArgs ea)
void FileDownloader_FatalErrorOccurred_(object sender_, FatalErrorOccurredEventArgs ea_)
{
var isAboutUnauthorized = ea.ErrorMessage?.ToUpperInvariant().Contains("UNRECOGNIZED (11)") ?? false;
var isAboutUnauthorized = ea_.ErrorMessage?.ToUpperInvariant().Contains("UNRECOGNIZED (11)") ?? false;
if (isAboutUnauthorized)
{
taskCompletionSource.TrySetException(new UnauthorizedException(
resource: remoteFilePath,
nativeErrorMessage: ea.ErrorMessage
nativeErrorMessage: ea_.ErrorMessage
));
return;
}

var isAboutRemoteFileNotFound = ea.ErrorMessage
var isAboutRemoteFileNotFound = ea_.ErrorMessage
?.ToUpperInvariant()
.Replace("NO_ENTRY (5)", "NO ENTRY (5)") //normalize the error for android so that it will be the same as in ios
.Contains("NO ENTRY (5)") ?? false;
@@ -321,7 +327,7 @@ void DownloadAsyncOnFatalErrorOccurred(object sender, FatalErrorOccurredEventArg
return;
}

taskCompletionSource.TrySetException(new DownloadErroredOutException(ea.ErrorMessage)); //generic
taskCompletionSource.TrySetException(new DownloadErroredOutException(ea_.ErrorMessage)); //generic
}
}

29 changes: 18 additions & 11 deletions Laerdal.McuMgr/Shared/FileUploader/FileUploader.cs
Original file line number Diff line number Diff line change
@@ -213,9 +213,10 @@ public async Task UploadAsync<TData>(
var taskCompletionSource = new TaskCompletionSource<bool>(state: false);
try
{
Cancelled += UploadAsyncOnCancelled;
StateChanged += UploadAsyncOnStateChanged;
FatalErrorOccurred += UploadAsyncOnFatalErrorOccurred;
Cancelled += FileUploader_Cancelled_;
FileUploaded += FileUploader_FileUploaded_;
StateChanged += FileUploader_StateChanged_;
FatalErrorOccurred += FileUploader_FatalErrorOccurred_;

var verdict = BeginUpload(remoteFilePath, dataArray); //00 dont use task.run here for now
if (verdict != EFileUploaderVerdict.Success)
@@ -270,25 +271,31 @@ ex is not ArgumentException //10 wops probably missing native lib symbols!
}
finally
{
Cancelled -= UploadAsyncOnCancelled;
StateChanged -= UploadAsyncOnStateChanged;
FatalErrorOccurred -= UploadAsyncOnFatalErrorOccurred;
Cancelled -= FileUploader_Cancelled_;
FileUploaded -= FileUploader_FileUploaded_;
StateChanged -= FileUploader_StateChanged_;
FatalErrorOccurred -= FileUploader_FatalErrorOccurred_;

CleanupResourcesOfLastUpload(); //vital
}

void UploadAsyncOnCancelled(object sender, CancelledEventArgs ea)
void FileUploader_Cancelled_(object _, CancelledEventArgs ea_)
{
taskCompletionSource.TrySetException(new UploadCancelledException());
}

void FileUploader_FileUploaded_(object _, FileUploadedEventArgs ea_)
{
taskCompletionSource.TrySetResult(true);
}

// ReSharper disable AccessToModifiedClosure
void UploadAsyncOnStateChanged(object sender, StateChangedEventArgs ea)
void FileUploader_StateChanged_(object _, StateChangedEventArgs ea_)
{
switch (ea.NewState)
switch (ea_.NewState)
{
case EFileUploaderState.Complete:
taskCompletionSource.TrySetResult(true);
//taskCompletionSource.TrySetResult(true); //dont we want to wait for the FileUploaded event
return;

case EFileUploaderState.Cancelling: //20
@@ -320,7 +327,7 @@ void UploadAsyncOnStateChanged(object sender, StateChangedEventArgs ea)
// getting called right above but if that takes too long we give the killing blow by calling OnCancelled() manually here
}

void UploadAsyncOnFatalErrorOccurred(object sender, FatalErrorOccurredEventArgs ea)
void FileUploader_FatalErrorOccurred_(object sender, FatalErrorOccurredEventArgs ea)
{
var isAboutUnauthorized = ea.ErrorCode == EMcuMgrErrorCode.AccessDenied;
if (isAboutUnauthorized)
40 changes: 19 additions & 21 deletions Laerdal.Scripts/Laerdal.Builder.targets
Original file line number Diff line number Diff line change
@@ -37,7 +37,11 @@

<Laerdal_Test_Results_Folderpath Condition=" '$(Laerdal_Test_Results_Folderpath)' == '' ">$([System.IO.Path]::Combine($(MSBuildThisFileDirectory), `..`, `TestResults`))</Laerdal_Test_Results_Folderpath>

<ShouldSkipMacCatalyst Condition=" '$(ShouldSkipMacCatalyst)' == '' ">false</ShouldSkipMacCatalyst>
<!-- https://docs.gitlab.com/ee/ci/variables/predefined_variables.html -->
<!-- https://help.github.com/en/actions/configuring-and-managing-workflows/using-environment-variables -->
<!-- https://learn.microsoft.com/en-us/azure/devops/pipelines/build/variables?view=azure-devops&tabs=yaml&WT.mc_id=DT-MVP-5003978#system-variables -->
<Is_CI_Build Condition=" '$(Is_CI_Build)' == '' and ( '$(TF_BUILD)' == 'true' or '$(GITHUB_ACTIONS)' == 'true' or '$(GITLAB_CI)' == 'true' ) ">true</Is_CI_Build>
<Should_Skip_MacCatalyst Condition=" '$(Should_Skip_MacCatalyst)' == '' ">false</Should_Skip_MacCatalyst>

<Laerdal_Gradle_Path Condition=" '$(Laerdal_Gradle_Path)' == '' ">gradle</Laerdal_Gradle_Path>
<Laerdal_Source_Branch Condition=" '$(Laerdal_Source_Branch)' == '' ">$(BUILD_SOURCEBRANCH)</Laerdal_Source_Branch>
@@ -185,19 +189,18 @@

<!-- build mcumgr.bindings -->
<PropertyGroup>
<!-- in azure we have to specify the path to gradle explicitly so as to ensure we are using gradle 7.6 for smooth compilation of the android java-libs -->
<!-- in ci we have to specify the path to gradle explicitly so as to ensure we are using gradle 7.6 for smooth compilation of the android java-libs -->
<_Laerdal_Build_Parameters>$(_Laerdal_Build_Parameters)GradlePath=$(Laerdal_Gradle_Path);</_Laerdal_Build_Parameters>
<_Laerdal_Build_Parameters>$(_Laerdal_Build_Parameters)SourceRoot=$(MSBuildThisFileDirectory)/../Laerdal.McuMgr.Bindings/;</_Laerdal_Build_Parameters>
<_Laerdal_Build_Parameters>$(_Laerdal_Build_Parameters)Configuration=$(Configuration);</_Laerdal_Build_Parameters>
<_Laerdal_Build_Parameters>$(_Laerdal_Build_Parameters)PackageOutputPath=$(PackageOutputPath);</_Laerdal_Build_Parameters>
<_Laerdal_Build_Parameters>$(_Laerdal_Build_Parameters)ShouldSkipMacCatalyst=$(ShouldSkipMacCatalyst);</_Laerdal_Build_Parameters>
<_Laerdal_Build_Parameters>$(_Laerdal_Build_Parameters)Should_Skip_MacCatalyst=$(Should_Skip_MacCatalyst);</_Laerdal_Build_Parameters>
<!--<_Laerdal_Build_Parameters>$(_Laerdal_Build_Parameters)DeterministicSourcePaths=False;</_Laerdal_Build_Parameters>-->
</PropertyGroup>

<!-- its absolute vital to call these targets first explicitly and separately from the main build otherwise the -->
<!-- resulting nugets will be poisoned and will not work in maui apps at all due to missing native symbols -->
<MSBuild Projects="$(Laerdal_McuMgrBindings_ProjectFile_iOS)" Targets="EnsureFrameworkFolderIsCreated"/>
<MSBuild Projects="$(Laerdal_McuMgrBindings_ProjectFile_MacCatalyst)" Targets="EnsureFrameworkFolderIsCreated" Condition=" '$(ShouldSkipMacCatalyst)' != 'true' "/>
<MSBuild Projects="$(Laerdal_McuMgrBindings_ProjectFile_MacCatalyst)" Targets="EnsureFrameworkFolderIsCreated" Condition=" '$(Should_Skip_MacCatalyst)' != 'true' "/>

<!-- 1. notice that we are actually rebuilding bindings merely building the project doesnt really cut it -->
<!-- 2. also notice that the ios and android builds are deliberately getting built with parallelization turned -->
@@ -206,20 +209,14 @@
<MSBuild Projects="$(Laerdal_McuMgrBindings_ProjectFile_Android)" Properties="$(_Laerdal_Build_Parameters)" Targets="Clean"/>
<MSBuild Projects="$(Laerdal_McuMgrBindings_ProjectFile_Android)" Properties="$(_Laerdal_Build_Parameters)" Targets="Restore"/>
<MSBuild Projects="$(Laerdal_McuMgrBindings_ProjectFile_Android)" Properties="$(_Laerdal_Build_Parameters);BuildingProject=true;" Targets="TackleJarDependencies"/>
<MSBuild Projects="$(Laerdal_McuMgrBindings_ProjectFile_Android)" Properties="$(_Laerdal_Build_Parameters);BuildingProject=true;" Targets="Build"/>
<MSBuild Projects="$(Laerdal_McuMgrBindings_ProjectFile_Android)" Properties="$(_Laerdal_Build_Parameters);BuildingProject=true;ContinuousIntegrationBuild=$(Is_CI_Build);SourceRoot=$(MSBuildThisFileDirectory)/../Laerdal.McuMgr.Bindings.Android/;" Targets="Build"/>

<MSBuild Projects="$(Laerdal_McuMgrBindings_ProjectFile_iOS)" Properties="$(_Laerdal_Build_Parameters)" Targets="Restore;Rebuild"/>
<MSBuild Projects="$(Laerdal_McuMgrBindings_ProjectFile_NetStandard)" Properties="$(_Laerdal_Build_Parameters)" Targets="Restore;Rebuild"/>

<MSBuild Projects="$(Laerdal_McuMgrBindings_ProjectFile_MacCatalyst)" Properties="$(_Laerdal_Build_Parameters)" Targets="Restore;Rebuild" Condition=" '$(ShouldSkipMacCatalyst)' != 'true' "/>

<PropertyGroup>
<_Laerdal_Build_Parameters>$(_Laerdal_Build_Parameters)SourceRoot=$(MSBuildThisFileDirectory)/../Laerdal.McuMgr/;</_Laerdal_Build_Parameters>
<_Laerdal_Build_Parameters>$(_Laerdal_Build_Parameters)Laerdal_McuMgr_Bindings_Package_Version=$(Laerdal_Version_Assembly);</_Laerdal_Build_Parameters>
</PropertyGroup>
<MSBuild Projects="$(Laerdal_McuMgrBindings_ProjectFile_iOS)" Properties="$(_Laerdal_Build_Parameters);ContinuousIntegrationBuild=$(Is_CI_Build);SourceRoot=$(MSBuildThisFileDirectory)/../Laerdal.McuMgr.Bindings.iOS/;" Targets="Restore;Rebuild"/>
<MSBuild Projects="$(Laerdal_McuMgrBindings_ProjectFile_NetStandard)" Properties="$(_Laerdal_Build_Parameters);ContinuousIntegrationBuild=$(Is_CI_Build);SourceRoot=$(MSBuildThisFileDirectory)/../Laerdal.McuMgr.Bindings.NetStandard/;" Targets="Restore;Rebuild"/>
<MSBuild Projects="$(Laerdal_McuMgrBindings_ProjectFile_MacCatalyst)" Properties="$(_Laerdal_Build_Parameters);ContinuousIntegrationBuild=$(Is_CI_Build);SourceRoot=$(MSBuildThisFileDirectory)/../Laerdal.McuMgr.Bindings.MacCatalyst/;" Targets="Restore;Rebuild" Condition=" '$(Should_Skip_MacCatalyst)' != 'true' "/>

<!-- notice that we are actually rebuilding mcumgr merely building the project doesnt really cut it -->
<MSBuild Projects="$(Laerdal_McuMgr_ProjectFile)" Properties="$(_Laerdal_Build_Parameters)" Targets="Restore;Rebuild" />
<MSBuild Projects="$(Laerdal_McuMgr_ProjectFile)" Properties="$(_Laerdal_Build_Parameters);ContinuousIntegrationBuild=$(Is_CI_Build);SourceRoot=$(MSBuildThisFileDirectory)/../Laerdal.McuMgr/;" Targets="Restore;Rebuild" />
</Target>

<!-- TESTS -->
@@ -229,7 +226,7 @@

<MSBuild Targets="Restore"
Projects="$(Laerdal_McuMgrBindings_ProjectFile_Tests)"
Properties="Configuration=$(Configuration);ShouldSkipMacCatalyst=$(ShouldSkipMacCatalyst);"/>
Properties="Configuration=$(Configuration);Should_Skip_MacCatalyst=$(Should_Skip_MacCatalyst);"/>

<PropertyGroup>
<TestParameters>$(TestParameters) test 'Laerdal.McuMgr.Tests/Laerdal.McuMgr.Tests.csproj'</TestParameters>
@@ -277,10 +274,11 @@
<PropertyGroup>
<Laerdal_Create_Github_Release_Script_Filepath Condition=" '$(Laerdal_Create_Github_Release_Script_Filepath)' == '' ">$([System.IO.Path]::Combine($(MSBuildThisFileDirectory), `Laerdal.CreateNewReleaseInGithub.sh`))</Laerdal_Create_Github_Release_Script_Filepath>

<_Laerdal_Create_Github_Release_Script_Parameters>$(_Laerdal_Create_Github_Release_Script_Parameters) --git-branch '$(Laerdal_Source_Branch)'</_Laerdal_Create_Github_Release_Script_Parameters>
<_Laerdal_Create_Github_Release_Script_Parameters>$(_Laerdal_Create_Github_Release_Script_Parameters) --tag-version '$(Laerdal_Version_Base)'</_Laerdal_Create_Github_Release_Script_Parameters>
<_Laerdal_Create_Github_Release_Script_Parameters>$(_Laerdal_Create_Github_Release_Script_Parameters) --access-token '$(Laerdal_Github_Access_Token)'</_Laerdal_Create_Github_Release_Script_Parameters>
<_Laerdal_Create_Github_Release_Script_Parameters>$(_Laerdal_Create_Github_Release_Script_Parameters) --repository-path '$(Laerdal_Repository_Path)'</_Laerdal_Create_Github_Release_Script_Parameters>
<_Laerdal_Create_Github_Release_Script_Parameters>$(_Laerdal_Create_Github_Release_Script_Parameters) --log </_Laerdal_Create_Github_Release_Script_Parameters>
<_Laerdal_Create_Github_Release_Script_Parameters>$(_Laerdal_Create_Github_Release_Script_Parameters) --git-branch '$(Laerdal_Source_Branch)' </_Laerdal_Create_Github_Release_Script_Parameters>
<_Laerdal_Create_Github_Release_Script_Parameters>$(_Laerdal_Create_Github_Release_Script_Parameters) --tag-version '$(Laerdal_Version_Base)' </_Laerdal_Create_Github_Release_Script_Parameters>
<_Laerdal_Create_Github_Release_Script_Parameters>$(_Laerdal_Create_Github_Release_Script_Parameters) --access-token '$(Laerdal_Github_Access_Token)' </_Laerdal_Create_Github_Release_Script_Parameters>
<_Laerdal_Create_Github_Release_Script_Parameters>$(_Laerdal_Create_Github_Release_Script_Parameters) --repository-path '$(Laerdal_Repository_Path)' </_Laerdal_Create_Github_Release_Script_Parameters>
</PropertyGroup>

<Message Importance="High" Text=" bash '$(Laerdal_Create_Github_Release_Script_Filepath)' $(_Laerdal_Create_Github_Release_Script_Parameters) "/>
126 changes: 47 additions & 79 deletions Laerdal.Scripts/Laerdal.CreateNewReleaseInGithub.sh
Original file line number Diff line number Diff line change
@@ -9,42 +9,41 @@ declare GITHUB_REPOSITORY_PATH=""

function parse_arguments() {
while [[ $# -gt 0 ]]; do
case $1 in

-v | --log)
VERBOSE=1
shift
;;

-r | --repository-path)
GITHUB_REPOSITORY_PATH="$2"
shift
;;

-t | --tag-version)
TAG_VERSION="$2"
shift
;;

-b | --git-branch)
GIT_BRANCH="$2"
case $1 in
-v | --log)
VERBOSE=1
# shift dont shift no need for this one
;;

-r | --repository-path)
GITHUB_REPOSITORY_PATH="$2"
shift
;;

-t | --tag-version)
TAG_VERSION="$2"
shift
;;

-b | --git-branch)
GIT_BRANCH="$2"
shift
;;

-a | --access-token)
GITHUB_ACCESS_TOKEN="$2"
shift
;;

*)
echo "Unknown option: $1"
usage
exit 1
;;
esac

shift
;;

-a | --access-token)
GITHUB_ACCESS_TOKEN="$2"
shift
;;

*)
echo "Unknown option: $1"
usage
exit 1
;;

esac
shift
done
done

if [[ -z $GIT_BRANCH ]]; then
echo "Missing git-branch."
@@ -100,57 +99,26 @@ function create_release_on_github() {
eventual_singleline_summary="Alpha $eventual_tag_name"
fi

local -r payload=$(
cat <<EOF
{
"tag_name": "$eventual_tag_name",
"target_commitish": "$GIT_BRANCH",
"name": "$eventual_singleline_summary",
"generate_release_notes": true,
"draft": false,
"prerelease": false
}
EOF
)

local -r api_url="https://api.github.com/repos/$GITHUB_REPOSITORY_PATH/releases"

echo "** Creating release on GitHub ..."

local -r response=$(
curl \
-i \
-sS \
-X "POST" \
-o /dev/null \
-d "$payload" \
-w "%{http_code}" \
-H "Content-Type:application/json" \
-H "Accept:application/vnd.github+json" \
-H "Authorization: Bearer $GITHUB_ACCESS_TOKEN" \
"$api_url"
)
local -r curl_exit_code=$?

log "** api_url=$api_url"
log "** payload=$payload"
log "** response=$response"
log "** curl_exit_code=$curl_exit_code"
if [[ $curl_exit_code -ne 0 ]]; then
exit_with_error "curl failed with exit code $?"
gh auth login --with-token <<<"$GITHUB_ACCESS_TOKEN"
local -r gh_auth_login_exit_code=$?
if [[ $gh_auth_login_exit_code -ne 0 ]]; then
exit_with_error "GitHub CLI exited with code '$gh_auth_login_exit_code' upon attempting to login using a github access token!"
fi

local -r http_status_code="${response}"
if [[ $http_status_code -ge 300 ]]; then
exit_with_error "API returned HTTP status $http_status_code"
gh release create "$eventual_tag_name" \
--title "$eventual_singleline_summary" \
--target "$GIT_BRANCH" \
--generate-notes
local -r gh_create_release_exit_code=$?
if [[ $gh_create_release_exit_code -ne 0 ]]; then
exit_with_error "GitHub CLI exited with code '$gh_create_release_exit_code' upon attempting to create a new release!"
fi
}


function log() {
if [[ $VERBOSE -ne 0 ]]; then
echo "$@"
echo -e "$*"
fi
}

23 changes: 21 additions & 2 deletions Laerdal.Scripts/Laerdal.SetupBuildEnvironment.sh
Original file line number Diff line number Diff line change
@@ -134,14 +134,33 @@ echo "** XCode Installations:"

ls -ld /Applications/Xcode* || exit 90

sudo xcode-select -s /Applications/Xcode_15.2.app/Contents/Developer # todo experiment with /Applications/Xcode_15.2.app and see if it works
sudo xcode-select -s /Applications/Xcode_15.2.app/Contents/Developer
declare exitCode=$?
if [ $exitCode != 0 ]; then
echo "##vso[task.logissue type=error]Failed to apply 'xcode-select'."
exit 95
exit 90
fi
echo

echo
echo "** XCode SDKs:"
xcodebuild -showsdks
declare exitCode=$?
if [ $exitCode != 0 ]; then
echo "##vso[task.logissue type=error]Failed to list XCode SDKs."
exit 93
fi

echo
echo "** XCode SDKs from Sharpie's point of view:"
sharpie xcode -sdks
declare exitCode=$?
if [ $exitCode != 0 ]; then
echo "##vso[task.logissue type=error]Failed to list XCode SDKs from Sharpie's point of view."
exit 95
fi


echo "** Java Version:"
java -version
declare exitCode=$?
2 changes: 1 addition & 1 deletion azure-pipelines.yml
Original file line number Diff line number Diff line change
@@ -91,7 +91,7 @@ jobs:
inputs:
command: 'custom'
custom: 'msbuild'
arguments: 'Laerdal.Scripts/Laerdal.Builder.targets -m:1 -p:ShouldSkipMacCatalyst="true" -p:Laerdal_Gradle_Path="/usr/local/opt/gradle@7/bin/gradle" -p:Laerdal_Test_Results_Folderpath="$(Laerdal_Test_Results_Folderpath)" -p:Laerdal_Github_Access_Token="$(Github.ComponentsTeam.AccessToken)" -p:Laerdal_Repository_Path="$(Repository.Path)" -p:Laerdal_Source_Branch="$(Build.SourceBranch)" -p:PackageOutputPath="$(Build.ArtifactStagingDirectory)/Artifacts/" '
arguments: 'Laerdal.Scripts/Laerdal.Builder.targets -m:1 -p:Should_Skip_MacCatalyst="true" -p:Laerdal_Gradle_Path="/usr/local/opt/gradle@7/bin/gradle" -p:Laerdal_Test_Results_Folderpath="$(Laerdal_Test_Results_Folderpath)" -p:Laerdal_Github_Access_Token="$(Github.ComponentsTeam.AccessToken)" -p:Laerdal_Repository_Path="$(Repository.Path)" -p:Laerdal_Source_Branch="$(Build.SourceBranch)" -p:PackageOutputPath="$(Build.ArtifactStagingDirectory)/Artifacts/" '

- task: PublishTestResults@2
displayName: '📡 Publish Test Results'

0 comments on commit 8dd3c94

Please sign in to comment.