diff --git a/.github/workflows/continuous-delivery.yml b/.github/workflows/continuous-delivery.yml index ab6c4b7..a1bbc1e 100644 --- a/.github/workflows/continuous-delivery.yml +++ b/.github/workflows/continuous-delivery.yml @@ -22,7 +22,7 @@ jobs: - name: GetSemVer id: get-semver run: | - dotnet tool install --global GitVersion.Tool --version 6.4.0 + dotnet tool install --global GitVersion.Tool --version 6.5.1 output=$(dotnet-gitversion) semver=$(echo $output | grep -oP '"SemVer"\s*:\s*"\K[^"]+') echo $output @@ -61,7 +61,7 @@ jobs: - name: Setup .NET uses: actions/setup-dotnet@v4 with: - dotnet-version: 8.x.x + dotnet-version: 10.x.x - name: Build & Test run: ./Build/build-and-test.ps1 shell: pwsh @@ -100,7 +100,7 @@ jobs: - name: Setup .NET uses: actions/setup-dotnet@v4 with: - dotnet-version: 8.0.x + dotnet-version: 10.x.x - name: Build & Test run: ./Build/build-and-test.ps1 shell: pwsh diff --git a/Build/build-osx-installer.ps1 b/Build/build-osx-installer.ps1 index 93eac22..3fe1202 100644 --- a/Build/build-osx-installer.ps1 +++ b/Build/build-osx-installer.ps1 @@ -2,8 +2,8 @@ $ErrorActionPreference = "Stop" $repoRootPath = (Resolve-Path "$PSScriptRoot/../").Path $releasePath = "$repoRootPath/Installer/Elzik.FmSync.OsxInstaller/x64/Release/" -$consolePublishSourcePath = "$repoRootPath/src/Elzik.FmSync.Console/bin/x64/Release/net8.0/osx-x64/publish" -$workerPublishSourcePath = "$repoRootPath/src/Elzik.FmSync.Worker/bin/x64/Release/net8.0/osx-x64/publish" +$consolePublishSourcePath = "$repoRootPath/src/Elzik.FmSync.Console/bin/x64/Release/net10.0/osx-x64/publish" +$workerPublishSourcePath = "$repoRootPath/src/Elzik.FmSync.Worker/bin/x64/Release/net10.0/osx-x64/publish" If((Test-Path -PathType container "$releasePath")) { @@ -72,7 +72,7 @@ Compress-Archive ` -Force Test-ExitCode -dotnet tool update --global GitVersion.Tool --version 6.1.0 +dotnet tool update --global GitVersion.Tool --version 6.5.1 Test-ExitCode $SemVer = (dotnet-gitversion | ConvertFrom-Json).SemVer diff --git a/Elzik.FmSync.sln b/Elzik.FmSync.sln index 6fa31c3..2b46270 100644 --- a/Elzik.FmSync.sln +++ b/Elzik.FmSync.sln @@ -1,24 +1,10 @@  Microsoft Visual Studio Solution File, Format Version 12.00 -# Visual Studio Version 17 -VisualStudioVersion = 17.4.33205.214 +# Visual Studio Version 18 +VisualStudioVersion = 18.0.11205.157 d18.0 MinimumVisualStudioVersion = 10.0.40219.1 -Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Elzik.FmSync.Worker", "src\Elzik.FmSync.Worker\Elzik.FmSync.Worker.csproj", "{1035A230-3923-494E-A01A-C41670922EE9}" -EndProject -Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Elzik.FmSync.Console", "src\Elzik.FmSync.Console\Elzik.FmSync.Console.csproj", "{8313B3C5-6FF8-449E-B3DE-6304BAACD62C}" -EndProject -Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Elzik.FmSync.Application", "src\Elzik.FmSync.Application\Elzik.FmSync.Application.csproj", "{FF4D804A-C032-4E93-92A0-14580AA7D0CE}" -EndProject Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Tests", "Tests", "{CF17A395-4536-42A5-B10B-D2D8EC602BC3}" EndProject -Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Elzik.FmSync.Infrastructure", "src\Elzik.FmSync.Infrastructure\Elzik.FmSync.Infrastructure.csproj", "{7A787CA3-E960-4FC2-8703-D0E0031EED46}" -EndProject -Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Elzik.FmSync.Domain", "src\Elzik.FmSync.Domain\Elzik.FmSync.Domain.csproj", "{5DB426BF-24B5-4E04-A593-A803FE5DC304}" -EndProject -Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Elzik.FmSync.Infrastructure.Tests.Integration", "tests\Elzik.FmSync.Infrastructure.Tests.Integration\Elzik.FmSync.Infrastructure.Tests.Integration.csproj", "{1367919E-184E-4550-B8BB-ECB37C056594}" -EndProject -Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Elzik.FmSync.Application.Tests.Unit", "tests\Elzik.FmSync.Application.Tests.Unit\Elzik.FmSync.Application.Tests.Unit.csproj", "{A3BB6C79-4D8F-4515-92B5-F169F929AF94}" -EndProject Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Solution Items", "Solution Items", "{6839B032-FEC5-4978-A064-BD18FB683118}" ProjectSection(SolutionItems) = preProject global.json = global.json @@ -39,6 +25,20 @@ Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Build", "Build", "{0FE56BA0 EndProject Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Installer", "Installer", "{069FD2C8-3AFB-4D61-A19A-3257331FC223}" EndProject +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Elzik.FmSync.Worker", "src\Elzik.FmSync.Worker\Elzik.FmSync.Worker.csproj", "{1035A230-3923-494E-A01A-C41670922EE9}" +EndProject +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Elzik.FmSync.Console", "src\Elzik.FmSync.Console\Elzik.FmSync.Console.csproj", "{8313B3C5-6FF8-449E-B3DE-6304BAACD62C}" +EndProject +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Elzik.FmSync.Application", "src\Elzik.FmSync.Application\Elzik.FmSync.Application.csproj", "{FF4D804A-C032-4E93-92A0-14580AA7D0CE}" +EndProject +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Elzik.FmSync.Infrastructure", "src\Elzik.FmSync.Infrastructure\Elzik.FmSync.Infrastructure.csproj", "{7A787CA3-E960-4FC2-8703-D0E0031EED46}" +EndProject +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Elzik.FmSync.Domain", "src\Elzik.FmSync.Domain\Elzik.FmSync.Domain.csproj", "{5DB426BF-24B5-4E04-A593-A803FE5DC304}" +EndProject +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Elzik.FmSync.Infrastructure.Tests.Integration", "tests\Elzik.FmSync.Infrastructure.Tests.Integration\Elzik.FmSync.Infrastructure.Tests.Integration.csproj", "{1367919E-184E-4550-B8BB-ECB37C056594}" +EndProject +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Elzik.FmSync.Application.Tests.Unit", "tests\Elzik.FmSync.Application.Tests.Unit\Elzik.FmSync.Application.Tests.Unit.csproj", "{A3BB6C79-4D8F-4515-92B5-F169F929AF94}" +EndProject Project("{B7DD6F7E-DEF8-4E67-B5B7-07EF123DB6F0}") = "Elzik.FmSync.WindowsInstaller", "Installer\Elzik.FmSync.WindowsInstaller\Elzik.FmSync.WindowsInstaller.wixproj", "{534679A3-D29B-4D63-882B-C09F4D0EA8CB}" EndProject Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Elzik.FmSync.Worker.Tests.Functional", "tests\Elzik.FmSync.Worker.Tests.Functional\Elzik.FmSync.Worker.Tests.Functional.csproj", "{B38B9BF5-29FF-44C2-B243-CC5D548B1C6B}" diff --git a/global.json b/global.json index c19a2e0..1e7fdfa 100644 --- a/global.json +++ b/global.json @@ -1,6 +1,6 @@ { "sdk": { - "version": "8.0.100", + "version": "10.0.100", "rollForward": "latestMinor" } } diff --git a/src/Elzik.FmSync.Application/Elzik.FmSync.Application.csproj b/src/Elzik.FmSync.Application/Elzik.FmSync.Application.csproj index 37ef385..9474893 100644 --- a/src/Elzik.FmSync.Application/Elzik.FmSync.Application.csproj +++ b/src/Elzik.FmSync.Application/Elzik.FmSync.Application.csproj @@ -1,7 +1,7 @@ - net8.0 + net10.0 enable enable all @@ -12,14 +12,14 @@ - + all runtime; build; native; contentfiles; analyzers; buildtransitive - - - - + + + + all runtime; build; native; contentfiles; analyzers; buildtransitive diff --git a/src/Elzik.FmSync.Console/Elzik.FmSync.Console.csproj b/src/Elzik.FmSync.Console/Elzik.FmSync.Console.csproj index 48de20f..e4d98ca 100644 --- a/src/Elzik.FmSync.Console/Elzik.FmSync.Console.csproj +++ b/src/Elzik.FmSync.Console/Elzik.FmSync.Console.csproj @@ -1,8 +1,8 @@ - + Exe - net8.0 + net10.0 enable enable Elzik.FmSync @@ -15,19 +15,19 @@ - + all runtime; build; native; contentfiles; analyzers; buildtransitive - - - + + + - - - + + + - + all runtime; build; native; contentfiles; analyzers; buildtransitive diff --git a/src/Elzik.FmSync.Console/appSettings.json b/src/Elzik.FmSync.Console/appSettings.json index b026dae..f4e7393 100644 --- a/src/Elzik.FmSync.Console/appSettings.json +++ b/src/Elzik.FmSync.Console/appSettings.json @@ -6,18 +6,10 @@ "FilenamePattern": "*.md" }, "Serilog": { - "Using": [ "Serilog.Sinks.Console", "Serilog.Sinks.File" ], + "Using": [ "Serilog.Sinks.Console" ], "MinimumLevel": "Warning", "WriteTo": [ - { "Name": "Console" }, - { - "Name": "File", - "Args": { - "path": "[PLATFORM_SPECIFIC_LOG_PATH]/Elzik.FmSync.Console.log", - "rollingInterval": "Day", - "retainedFileCountLimit": "7" - } - } + { "Name": "Console" } ] } } \ No newline at end of file diff --git a/src/Elzik.FmSync.Domain/Elzik.FmSync.Domain.csproj b/src/Elzik.FmSync.Domain/Elzik.FmSync.Domain.csproj index aa74a48..45ac245 100644 --- a/src/Elzik.FmSync.Domain/Elzik.FmSync.Domain.csproj +++ b/src/Elzik.FmSync.Domain/Elzik.FmSync.Domain.csproj @@ -1,7 +1,7 @@ - net8.0 + net10.0 enable enable all @@ -12,11 +12,11 @@ - + all runtime; build; native; contentfiles; analyzers; buildtransitive - + all runtime; build; native; contentfiles; analyzers; buildtransitive diff --git a/src/Elzik.FmSync.Infrastructure/Elzik.FmSync.Infrastructure.csproj b/src/Elzik.FmSync.Infrastructure/Elzik.FmSync.Infrastructure.csproj index 6f8c728..04874ea 100644 --- a/src/Elzik.FmSync.Infrastructure/Elzik.FmSync.Infrastructure.csproj +++ b/src/Elzik.FmSync.Infrastructure/Elzik.FmSync.Infrastructure.csproj @@ -1,7 +1,7 @@ - net8.0 + net10.0 enable enable all @@ -12,12 +12,12 @@ - + all runtime; build; native; contentfiles; analyzers; buildtransitive - - + + all runtime; build; native; contentfiles; analyzers; buildtransitive diff --git a/src/Elzik.FmSync.Worker/Elzik.FmSync.Worker.csproj b/src/Elzik.FmSync.Worker/Elzik.FmSync.Worker.csproj index 35c7b9f..a0fb49b 100644 --- a/src/Elzik.FmSync.Worker/Elzik.FmSync.Worker.csproj +++ b/src/Elzik.FmSync.Worker/Elzik.FmSync.Worker.csproj @@ -1,7 +1,7 @@ - net8.0 + net10.0 enable enable dotnet-Elzik.FmSync.Worker-4d67e15b-f529-48cc-919a-3c678579aeb2 @@ -13,20 +13,20 @@ - + all runtime; build; native; contentfiles; analyzers; buildtransitive - - - - + + + + - - - + + + - + all runtime; build; native; contentfiles; analyzers; buildtransitive @@ -37,7 +37,7 @@ - + diff --git a/tests/Elzik.FmSync.Application.Tests.Unit/Elzik.FmSync.Application.Tests.Unit.csproj b/tests/Elzik.FmSync.Application.Tests.Unit/Elzik.FmSync.Application.Tests.Unit.csproj index a804c5a..9251325 100644 --- a/tests/Elzik.FmSync.Application.Tests.Unit/Elzik.FmSync.Application.Tests.Unit.csproj +++ b/tests/Elzik.FmSync.Application.Tests.Unit/Elzik.FmSync.Application.Tests.Unit.csproj @@ -1,7 +1,7 @@ - net8.0 + net10.0 enable enable all @@ -27,22 +27,23 @@ all runtime; build; native; contentfiles; analyzers; buildtransitive - + all runtime; build; native; contentfiles; analyzers; buildtransitive - + - + all runtime; build; native; contentfiles; analyzers; buildtransitive - - - + + all + runtime; build; native; contentfiles; analyzers; buildtransitive + all runtime; build; native; contentfiles; analyzers; buildtransitive diff --git a/tests/Elzik.FmSync.Console.Tests.Functional/ConsoleTests.cs b/tests/Elzik.FmSync.Console.Tests.Functional/ConsoleTests.cs index 0773382..bdfa485 100644 --- a/tests/Elzik.FmSync.Console.Tests.Functional/ConsoleTests.cs +++ b/tests/Elzik.FmSync.Console.Tests.Functional/ConsoleTests.cs @@ -13,7 +13,6 @@ public class ConsoleTests private readonly Process _consoleProcess; private const string FunctionalTestFilesPath = "../../../../TestFiles/Functional/Console"; private const string SerlogPathKey = "Serilog:WriteTo:1:Args:path"; - private readonly string _logPath; private readonly string _buildOutputDirectory; public ConsoleTests(ITestOutputHelper testOutputHelper) @@ -52,11 +51,6 @@ public ConsoleTests(ITestOutputHelper testOutputHelper) { throw new InvalidOperationException($"No log file path set in appSettings at {SerlogPathKey}"); } - _logPath = configurationSection.Value; - if (File.Exists(_logPath)) - { - File.Delete(_logPath); - } } [Fact] @@ -84,23 +78,6 @@ public async Task Synchronise_EmptyFolder_LogsToConsole() consoleOutputLines.ShouldContain(line => line.Contains("Synchronised 0 files out of a total 0 in ")); } - [Fact] - public async Task Synchronise_EmptyFolder_LogsToFile() - { - // Act - ValidateConsoleProcessStart(_consoleProcess!.Start()); - _consoleProcess.BeginOutputReadLine(); - await _consoleProcess.WaitForExitAsync(); - - // Assert - var fileLog = await File.ReadAllTextAsync(_logPath); - var fileLogLines = fileLog.Split([Environment.NewLine], StringSplitOptions.None); - var expectedWorkingDirectoryLogText = $"Synchronising *.md files in {_buildOutputDirectory}".TrimEnd('\\', '/'); - _testOutputHelper.WriteLine($"expectedWorkingDirectoryLogText = {expectedWorkingDirectoryLogText}"); - fileLogLines.ShouldContain(line => line.EndsWith(expectedWorkingDirectoryLogText)); - fileLogLines.ShouldContain(line => line.Contains("Synchronised 0 files out of a total 0 in ")); - } - [Fact(Timeout = 5000)] public async Task ConsoleAppIsExecuted_WithMismatchingFrontMatterAndFileCreatedDates_FileCreatedDateIsUpdated() { diff --git a/tests/Elzik.FmSync.Console.Tests.Functional/Elzik.FmSync.Console.Tests.Functional.csproj b/tests/Elzik.FmSync.Console.Tests.Functional/Elzik.FmSync.Console.Tests.Functional.csproj index 87b9965..d2d13da 100644 --- a/tests/Elzik.FmSync.Console.Tests.Functional/Elzik.FmSync.Console.Tests.Functional.csproj +++ b/tests/Elzik.FmSync.Console.Tests.Functional/Elzik.FmSync.Console.Tests.Functional.csproj @@ -1,7 +1,7 @@ - + - net8.0 + net10.0 enable enable all @@ -37,14 +37,17 @@ all runtime; build; native; contentfiles; analyzers; buildtransitive - + - + all runtime; build; native; contentfiles; analyzers; buildtransitive - + + all + runtime; build; native; contentfiles; analyzers; buildtransitive + all runtime; build; native; contentfiles; analyzers; buildtransitive diff --git a/tests/Elzik.FmSync.Infrastructure.Tests.Integration/Elzik.FmSync.Infrastructure.Tests.Integration.csproj b/tests/Elzik.FmSync.Infrastructure.Tests.Integration/Elzik.FmSync.Infrastructure.Tests.Integration.csproj index 9b89d14..e01d156 100644 --- a/tests/Elzik.FmSync.Infrastructure.Tests.Integration/Elzik.FmSync.Infrastructure.Tests.Integration.csproj +++ b/tests/Elzik.FmSync.Infrastructure.Tests.Integration/Elzik.FmSync.Infrastructure.Tests.Integration.csproj @@ -1,7 +1,7 @@ - net8.0 + net10.0 enable enable all @@ -34,14 +34,17 @@ all runtime; build; native; contentfiles; analyzers; buildtransitive - + - + all runtime; build; native; contentfiles; analyzers; buildtransitive - + + all + runtime; build; native; contentfiles; analyzers; buildtransitive + all runtime; build; native; contentfiles; analyzers; buildtransitive diff --git a/tests/Elzik.FmSync.Worker.Tests.Functional/Elzik.FmSync.Worker.Tests.Functional.csproj b/tests/Elzik.FmSync.Worker.Tests.Functional/Elzik.FmSync.Worker.Tests.Functional.csproj index 77e8d2a..d77a6cb 100644 --- a/tests/Elzik.FmSync.Worker.Tests.Functional/Elzik.FmSync.Worker.Tests.Functional.csproj +++ b/tests/Elzik.FmSync.Worker.Tests.Functional/Elzik.FmSync.Worker.Tests.Functional.csproj @@ -1,7 +1,7 @@ - net8.0 + net10.0 enable enable all @@ -37,14 +37,17 @@ all runtime; build; native; contentfiles; analyzers; buildtransitive - + - + all runtime; build; native; contentfiles; analyzers; buildtransitive - + + all + runtime; build; native; contentfiles; analyzers; buildtransitive + all runtime; build; native; contentfiles; analyzers; buildtransitive diff --git a/tests/Elzik.FmSync.Worker.Tests.Functional/WorkerTests.cs b/tests/Elzik.FmSync.Worker.Tests.Functional/WorkerTests.cs index deeae20..b215fd8 100644 --- a/tests/Elzik.FmSync.Worker.Tests.Functional/WorkerTests.cs +++ b/tests/Elzik.FmSync.Worker.Tests.Functional/WorkerTests.cs @@ -4,6 +4,8 @@ using System.Runtime.InteropServices; using Xunit; using Xunit.Abstractions; +using System.ComponentModel; +using Microsoft.VisualStudio.TestPlatform.CommunicationUtilities; namespace Elzik.FmSync.Worker.Tests.Functional { @@ -106,7 +108,7 @@ public async Task WorkerIsStarted_ExpectedFileLogMessagesAreReceived() { // Arrange _workerProcess.OutputDataReceived += OnConsoleDataReceivedKillProcess; - MonitorConsoleForOutput("Hosting started"); + MonitorConsoleForOutput("A total of 1 directory watchers are running."); var logFileEntries = new List(); @@ -334,15 +336,27 @@ private async Task LockFileTemporarily(string path, int lockForMilliseconds) private static void KillExistingWorkerProcesses(string? directoryPath) { - var testWorkers = Process.GetProcessesByName("Elzik.FmSync.Worker") + try + { + var testWorkers = Process.GetProcessesByName("Elzik.FmSync.Worker") .Where(p => p.MainModule != null && p.MainModule.FileName.StartsWith(directoryPath!)); - foreach (var testWorker in testWorkers) + foreach (var testWorker in testWorkers) + { + if (!testWorker.HasExited) + { + testWorker.Kill(); + } + } + } + catch(Win32Exception ex) { - if (!testWorker.HasExited) + if(ex.Message == "Access is denied.") { - testWorker.Kill(); + Assert.Fail("The account running the Worker tests must have permission to kill previous Worker processes."); } + + throw; } } diff --git a/tests/Elzik.FmSync.Worker.Tests.Functional/appSettings.json b/tests/Elzik.FmSync.Worker.Tests.Functional/appSettings.json index 9de267e..7e815b7 100644 --- a/tests/Elzik.FmSync.Worker.Tests.Functional/appSettings.json +++ b/tests/Elzik.FmSync.Worker.Tests.Functional/appSettings.json @@ -18,7 +18,7 @@ { "Name": "File", "Args": { - "path": "[PLATFORM_SPECIFIC_LOG_PATH]/FunctionalTests/Elzik.FmSync.Worker.log" + "path": "logs/Elzik.FmSync.Worker.log" } } ]