diff --git a/.github/workflows/auto-update-swagger-dotnet.yml b/.github/workflows/auto-update-swagger-dotnet.yml index 9a6aabb35a..ff1966b4fb 100644 --- a/.github/workflows/auto-update-swagger-dotnet.yml +++ b/.github/workflows/auto-update-swagger-dotnet.yml @@ -29,7 +29,7 @@ jobs: - name: Setup .NET Core uses: actions/setup-dotnet@v4 with: - dotnet-version: 6.0.417 + dotnet-version: 8.0.101 - name: Cache nuget packages (*nix) uses: actions/cache@v4 @@ -57,15 +57,16 @@ jobs: - name: Copy shell: bash - run: cp starsky/starsky/bin/Debug/net6.0/temp/starsky.json documentation/static/openapi/openapi.json + run: cp starsky/starsky/bin/Debug/net*.0/temp/starsky.json documentation/static/openapi/openapi.json - name: Generate swagger shell: bash working-directory: ./documentation run: node scripts/openapi.js - - - name: Commit changes + + - name: Commit changes openapi.json (if push to branch) uses: EndBug/add-and-commit@v9 + if: github.event_name != 'pull_request' with: author_name: SwaggerUpdateBot author_email: qdraw@users.noreply.github.com @@ -73,8 +74,9 @@ jobs: add: "documentation/static/openapi/openapi.json" github_token: ${{ secrets.GITHUB_TOKEN }} - - name: Commit changes + - name: Commit changes docs/api/readme.md (if push to branch) uses: EndBug/add-and-commit@v9 + if: github.event_name != 'pull_request' with: author_name: SwaggerUpdateBot author_email: qdraw@users.noreply.github.com diff --git a/.github/workflows/release-on-tag-netcore-desktop-electron.yml b/.github/workflows/release-on-tag-netcore-desktop-electron.yml index 82fdb67053..4a3178f0b0 100644 --- a/.github/workflows/release-on-tag-netcore-desktop-electron.yml +++ b/.github/workflows/release-on-tag-netcore-desktop-electron.yml @@ -22,7 +22,7 @@ jobs: - name: Setup .NET Core uses: actions/setup-dotnet@v4 with: - dotnet-version: 6.0.417 + dotnet-version: 8.0.101 - name: Build --no-unit-test linux-arm,linux-arm64,win-x64,osx-x64,linux-x64 shell: bash diff --git a/.github/workflows/starsky-codecov-clientapp-netcore.yml b/.github/workflows/starsky-codecov-clientapp-netcore.yml index bd75b8e6d0..862b44cf78 100644 --- a/.github/workflows/starsky-codecov-clientapp-netcore.yml +++ b/.github/workflows/starsky-codecov-clientapp-netcore.yml @@ -33,7 +33,7 @@ jobs: - name: Setup .NET uses: actions/setup-dotnet@v4 with: - dotnet-version: 6.0.417 + dotnet-version: 8.0.101 - name: Cache node modules clientapp (*nix) uses: actions/cache@v4 diff --git a/.github/workflows/starsky-dotnetcore-ubuntu.yml b/.github/workflows/starsky-dotnetcore-ubuntu.yml index bbaefb64a2..ba034bbd09 100644 --- a/.github/workflows/starsky-dotnetcore-ubuntu.yml +++ b/.github/workflows/starsky-dotnetcore-ubuntu.yml @@ -38,7 +38,7 @@ jobs: - name: Setup .NET Core uses: actions/setup-dotnet@v4 with: - dotnet-version: 6.0.417 + dotnet-version: 8.0.101 - name: Cache nuget packages (*nix) uses: actions/cache@v4 diff --git a/.github/workflows/starsky-dotnetcore-windows.yml b/.github/workflows/starsky-dotnetcore-windows.yml index 1668c0dccd..d588ad5568 100644 --- a/.github/workflows/starsky-dotnetcore-windows.yml +++ b/.github/workflows/starsky-dotnetcore-windows.yml @@ -35,7 +35,7 @@ jobs: - name: Setup .NET Core uses: actions/setup-dotnet@v4 with: - dotnet-version: 6.0.417 + dotnet-version: 8.0.101 - name: Build (Windows) shell: pwsh diff --git a/.github/workflows/starsky-sonarqube-clientapp-netcore.yml b/.github/workflows/starsky-sonarqube-clientapp-netcore.yml index b5e20c2fce..ff1fec888f 100644 --- a/.github/workflows/starsky-sonarqube-clientapp-netcore.yml +++ b/.github/workflows/starsky-sonarqube-clientapp-netcore.yml @@ -43,7 +43,7 @@ jobs: - name: Setup .NET SDK uses: actions/setup-dotnet@v4 with: - dotnet-version: 6.0.417 + dotnet-version: 8.0.101 - name: Use Java 17 uses: actions/setup-java@v4 diff --git a/documentation/documentation.csproj b/documentation/documentation.csproj index 6a5d89cdd9..d97afa9f95 100644 --- a/documentation/documentation.csproj +++ b/documentation/documentation.csproj @@ -2,7 +2,7 @@ Exe - net6.0 + net8.0 enable enable diff --git a/pipelines/azure/steps/use_dotnet_version.yml b/pipelines/azure/steps/use_dotnet_version.yml index 80a58ee5a6..26c0d4f540 100644 --- a/pipelines/azure/steps/use_dotnet_version.yml +++ b/pipelines/azure/steps/use_dotnet_version.yml @@ -1,8 +1,8 @@ steps: - task: UseDotNet@2 - displayName: 'Use .NET Core sdk 6.0.417' + displayName: 'Use .NET Core sdk 8.0.101' enabled: true inputs: packageType: sdk - version: 6.0.417 + version: 8.0.101 installationPath: $(Agent.ToolsDirectory)/dotnet diff --git a/starsky-tools/.gitignore b/starsky-tools/.gitignore new file mode 100644 index 0000000000..2409344858 --- /dev/null +++ b/starsky-tools/.gitignore @@ -0,0 +1,2 @@ +create-docusaurus-tmp-folder/** + diff --git a/starsky-tools/build-tools/dotnet-sdk-version-update.js b/starsky-tools/build-tools/dotnet-sdk-version-update.js index e305179ed8..674c3351c4 100644 --- a/starsky-tools/build-tools/dotnet-sdk-version-update.js +++ b/starsky-tools/build-tools/dotnet-sdk-version-update.js @@ -12,7 +12,7 @@ const { getFiles } = require("./lib/get-files-directory"); const { prefixPath } = require("./lib/prefix-path.const.js"); const { httpsGet } = require("./lib/https-get.js"); -let newRunTimeVersion = "6.0.x"; +let newRunTimeVersion = "8.0.x"; // https://docs.microsoft.com/en-us/dotnet/standard/frameworks @@ -84,7 +84,7 @@ getLatestDotnetRelease().then((newTargetVersion) => { await addReferencedProjectMonikers(frameworkMonikerByPath); const sortedFrameworkMonikerByPath = - await sortNetFrameworkMoniker(refFrameworkMonikerByPath); + await sortNetFrameworkMoniker(refFrameworkMonikerByPath, newTargetVersion); await updateNetFrameworkMoniker(sortedFrameworkMonikerByPath); @@ -561,7 +561,7 @@ async function addReferencedProjectMonikers(frameworkMonikerByPath) { return frameworkMonikerByPath; } -async function sortNetFrameworkMoniker(frameworkMonikerByPath) { +async function sortNetFrameworkMoniker(frameworkMonikerByPath, newTargetVersionAsFallback) { // references for (let [filePath, netMonikers] of Object.entries( frameworkMonikerByPath @@ -572,6 +572,14 @@ async function sortNetFrameworkMoniker(frameworkMonikerByPath) { // console.log(filePath + ' referencedProjectPaths') // console.log(referencedProjectPaths) + if (referencedProjectPaths.length === 0) { + const netMonikerFallback = "net" + newTargetVersionAsFallback.match(/^\d\.\d/ig,"")[0]; + frameworkMonikerByPath[filePath].push(netMonikerFallback); + console.log( + `🎁 ${filePath} - is using default ${netMonikerFallback}` + ); + } + for (const refPath of referencedProjectPaths) { for (const netMoniker of netMonikers) { if (!frameworkMonikerByPath[refPath]) { @@ -702,6 +710,11 @@ async function updateNetFrameworkMoniker(sortedFrameworkMonikerByPath) { } usedTargetFrameworkMonikers[filePath].push(lastNet); } + else { + console.log( + `❌ ✖ ${filePath} - is skipped to ${usedTargetFrameworkMonikers}` + ); + } } } diff --git a/starsky-tools/socket/ChannelWSClient.csproj b/starsky-tools/socket/ChannelWSClient.csproj index d8c041d788..b5040c9dd1 100755 --- a/starsky-tools/socket/ChannelWSClient.csproj +++ b/starsky-tools/socket/ChannelWSClient.csproj @@ -2,7 +2,7 @@ Exe - netcoreapp3.1 + net8.0 diff --git a/starsky/Dockerfile b/starsky/Dockerfile index 9601dcddee..e3c130330e 100644 --- a/starsky/Dockerfile +++ b/starsky/Dockerfile @@ -28,7 +28,7 @@ RUN echo "react done" # no alpine build since there is no support for multi-arch # docker buildx imagetools inspect mcr.microsoft.com/dotnet/sdk:6.0 -FROM --platform=$BUILDPLATFORM mcr.microsoft.com/dotnet/sdk:6.0 AS build-env +FROM --platform=$BUILDPLATFORM mcr.microsoft.com/dotnet/sdk:8.0 AS build-env ARG BUILDPLATFORM ARG TARGETPLATFORM # insert demo user and content @@ -112,7 +112,7 @@ RUN if [ "$TEST" = "true" ]; then \ # build runtime image (multiarch) # docker buildx imagetools inspect mcr.microsoft.com/dotnet/aspnet:6.0 -FROM mcr.microsoft.com/dotnet/aspnet:6.0 AS release +FROM mcr.microsoft.com/dotnet/aspnet:8.0 AS release WORKDIR /app ARG TOOLS=false @@ -126,31 +126,31 @@ else \ fi # Create a group and user -RUN groupadd --gid 1000 app \ - && useradd --uid 1000 --gid app --shell /bin/bash --create-home app +RUN groupadd --gid 1000 starsky \ + && useradd --uid 1000 --gid starsky --shell /bin/bash --create-home starsky # copy dlls -COPY --chown=app:app --from=build-env /app/starsky/out /app +COPY --chown=starsky:starsky --from=build-env /app/starsky/out /app # copy dependencies & demo content -COPY --chown=app:app --from=build-env /app/dependencies /app/dependencies -COPY --chown=app:app --from=build-env /app/temp /app/temp -COPY --chown=app:app --from=build-env /app/data.db /app/app__data.db +COPY --chown=starsky:starsky --from=build-env /app/dependencies /app/dependencies +COPY --chown=starsky:starsky --from=build-env /app/temp /app/temp +COPY --chown=starsky:starsky --from=build-env /app/data.db /app/app__data.db # copy react build -COPY --chown=app:app --from=react-build /app/starsky/clientapp ./clientapp +COPY --chown=starsky:starsky --from=react-build /app/starsky/clientapp ./clientapp # Makes sure the test stage is run when using docker buildkit -COPY --chown=app:app --from=test /testresults /tmp +COPY --chown=starsky:starsky --from=test /testresults /tmp # you could mount this location -RUN mkdir -p /app/photos && chown app:app /app/photos -RUN mkdir -p /app/thumbnailTempFolder && chown app:app /app/thumbnailTempFolder +RUN mkdir -p /app/photos && chown starsky:starsky /app/photos +RUN mkdir -p /app/thumbnailTempFolder && chown starsky:starsky /app/thumbnailTempFolder # and change owner of folder -RUN chown app:app /app +RUN chown starsky:starsky /app -USER app +USER starsky ENV ASPNETCORE_Environment=Production ENTRYPOINT ["dotnet", "starsky.dll"] \ No newline at end of file diff --git a/starsky/build/Build.cs b/starsky/build/Build.cs index a979e02b40..fd0b42c774 100644 --- a/starsky/build/Build.cs +++ b/starsky/build/Build.cs @@ -235,12 +235,14 @@ void ShowSettingsInfo() ShowSettingsInfo(); DotnetRuntimeSpecificHelper.Clean(GetRuntimesWithoutGeneric()); - DotnetRuntimeSpecificHelper.RestoreNetCoreCommand(Solution, - GetRuntimesWithoutGeneric()); - DotnetRuntimeSpecificHelper.BuildNetCoreCommand(Solution, - GetRuntimesWithoutGeneric(),Configuration); - DotnetRuntimeSpecificHelper.PublishNetCoreGenericCommand(Solution, - GetRuntimesWithoutGeneric(),Configuration); + + foreach ( var runtime in GetRuntimesWithoutGeneric() ) + { + DotnetRuntimeSpecificHelper.RestoreNetCoreCommand(Solution, runtime); + DotnetRuntimeSpecificHelper.BuildNetCoreCommand(Solution, Configuration, runtime); + DotnetRuntimeSpecificHelper.PublishNetCoreGenericCommand(Configuration, runtime); + } + DotnetRuntimeSpecificHelper.CopyDependenciesFiles(NoDependencies, "generic-netcore",GetRuntimesWithoutGeneric()); diff --git a/starsky/build/_build.csproj b/starsky/build/_build.csproj index c8d173f0e8..03c5c7511c 100644 --- a/starsky/build/_build.csproj +++ b/starsky/build/_build.csproj @@ -2,18 +2,21 @@ Exe - net6.0 + net8.0 CS0649;CS0169 .. .. 1 + + true - + + - + diff --git a/starsky/build/helpers/DotnetGenericHelper.cs b/starsky/build/helpers/DotnetGenericHelper.cs index 9ccbd12246..34816d2d55 100644 --- a/starsky/build/helpers/DotnetGenericHelper.cs +++ b/starsky/build/helpers/DotnetGenericHelper.cs @@ -2,6 +2,7 @@ using System.IO; using build; using Nuke.Common.ProjectModel; +using Nuke.Common.Tooling; using Nuke.Common.Tools.DotNet; using static Nuke.Common.Tools.DotNet.DotNetTasks; using static build.Build; @@ -12,24 +13,20 @@ public static class DotnetGenericHelper { public static void RestoreNetCoreCommand(Solution solution) { - ProjectAssetsCopier.CopyAssetFileToCurrentRuntime(GenericRuntimeName, solution); - DotNetRestore(_ => _ - .SetProjectFile(solution)); - ProjectAssetsCopier.CopyNewAssetFileByRuntimeId(GenericRuntimeName, solution); + Console.WriteLine("solution: " + solution); + DotNetRestore(p => p + .SetProjectFile(solution.Path) + ); } public static void BuildNetCoreGenericCommand(Solution solution, Configuration configuration) { - ProjectAssetsCopier.CopyAssetFileToCurrentRuntime(GenericRuntimeName, solution); - DotNetBuild(_ => _ .SetConfiguration(configuration) .EnableNoRestore() .EnableNoLogo() .SetProjectFile(solution)); - - ProjectAssetsCopier.CopyNewAssetFileByRuntimeId(GenericRuntimeName, solution); } /// @@ -49,9 +46,7 @@ public static void DownloadDependencies(Solution solution, Console.WriteLine("skip --no-dependencies"); return; } - - ProjectAssetsCopier.CopyAssetFileToCurrentRuntime(GenericRuntimeName, solution); - + var genericDepsFullPath = Path.Combine(BasePath(), genericNetcoreFolder, "dependencies"); Console.WriteLine($"genericDepsFullPath: {genericDepsFullPath}"); @@ -75,7 +70,6 @@ public static void DownloadDependencies(Solution solution, } Environment.SetEnvironmentVariable("app__DependenciesFolder", string.Empty); - ProjectAssetsCopier.CopyNewAssetFileByRuntimeId(GenericRuntimeName, solution); Console.WriteLine($" genericDepsFullPath: {genericDepsFullPath}"); Console.WriteLine("DownloadDependencies done"); @@ -90,8 +84,6 @@ public static void PublishNetCoreGenericCommand(Solution solution, return; } - ProjectAssetsCopier.CopyAssetFileToCurrentRuntime(GenericRuntimeName, solution); - foreach ( var publishProject in PublishProjectsList ) { var publishProjectFullPath = Path.Combine( @@ -107,12 +99,10 @@ public static void PublishNetCoreGenericCommand(Solution solution, .EnableNoRestore() .EnableNoBuild() .EnableNoDependencies() - .EnableSelfContained() .SetOutput(outputFullPath) .SetProject(publishProjectFullPath) .EnableNoLogo()); } - ProjectAssetsCopier.CopyNewAssetFileByRuntimeId(GenericRuntimeName, solution); } static string BasePath() diff --git a/starsky/build/helpers/DotnetRuntimeSpecificHelper.cs b/starsky/build/helpers/DotnetRuntimeSpecificHelper.cs index 231da723a2..1eda1eec5a 100644 --- a/starsky/build/helpers/DotnetRuntimeSpecificHelper.cs +++ b/starsky/build/helpers/DotnetRuntimeSpecificHelper.cs @@ -16,6 +16,12 @@ namespace helpers /// public static class DotnetRuntimeSpecificHelper { + static string BasePath() + { + return Directory.GetParent(AppDomain.CurrentDomain.BaseDirectory) + ?.Parent?.Parent?.Parent?.FullName; + } + public static void Clean(List runtimesWithoutGeneric) { foreach(var runtime in runtimesWithoutGeneric) @@ -43,7 +49,7 @@ public static void Clean(List runtimesWithoutGeneric) .FrameworkDescription; var netMoniker = new Regex(".\\d+$", RegexOptions.None, TimeSpan.FromMilliseconds(100)) .Replace(version, string.Empty).Replace(".NET ","net"); - // e.g net6.0 + // e.g net6.0 or net8.0 if (Directory.Exists($"obj/Release/{netMoniker}/{runtime}")) { @@ -89,92 +95,68 @@ public static void CopyDependenciesFiles(bool noDependencies, } - public static void RestoreNetCoreCommand(Solution solution, - List runtimesWithoutGeneric) + public static void RestoreNetCoreCommand(Solution solution, string runtime) { - foreach ( var runtime in runtimesWithoutGeneric ) - { - ProjectAssetsCopier.CopyAssetFileToCurrentRuntime(runtime, solution); - // OverwriteRuntimeIdentifier is done via Directory.Build.props - DotNetRestore(_ => _ - .SetProjectFile(solution) - .SetProcessArgumentConfigurator(args => args - .Add($"/p:OverwriteRuntimeIdentifier={runtime}") - .Add("/p:noSonar=true"))); - - ProjectAssetsCopier.CopyNewAssetFileByRuntimeId(runtime, solution); - } + Console.WriteLine("> dotnet restore next for: solution: " + solution + " runtime: " + runtime); + // OverwriteRuntimeIdentifier is done via Directory.Build.props + DotNetRestore(p => p + .SetProjectFile(solution) + .SetRuntime(runtime) + .SetProcessArgumentConfigurator(args => args + .Add($"/p:OverwriteRuntimeIdentifier={runtime}") + .Add("/p:noSonar=true"))); } - - public static void PublishNetCoreGenericCommand(Solution solution, - List runtimesWithoutGeneric, Configuration configuration) - { - foreach ( var runtime in runtimesWithoutGeneric ) - { - ProjectAssetsCopier.CopyAssetFileToCurrentRuntime(runtime, solution); - foreach ( var publishProject in Build.PublishProjectsList ) - { - var publishProjectFullPath = Path.Combine( - WorkingDirectory.GetSolutionParentFolder(), - publishProject); - - var outputFullPath = Path.Combine( - WorkingDirectory.GetSolutionParentFolder(), - runtime); - - DotNetPublish(_ => _ - .SetConfiguration(configuration) - .EnableNoRestore() - .EnableNoBuild() - .EnableNoDependencies() - .EnableSelfContained() - .SetOutput(outputFullPath) - .SetProject(publishProjectFullPath) - .SetRuntime(runtime) - .EnableNoLogo() - .SetProcessArgumentConfigurator(args => args.Add("/p:noSonar=true")) - ); - - } - // to check if the right runtime is published - var runtimeDebugFile = Path.Combine(WorkingDirectory.GetSolutionParentFolder(), - runtime, "_runtime_" + runtime + ".debug"); - - if ( !File.Exists(runtimeDebugFile) ) - { - File.Create(runtimeDebugFile).Close(); - } + public static void BuildNetCoreCommand(Solution solution, Configuration configuration, string runtime) + { + Console.WriteLine("> dotnet build next for: solution: " + solution + " runtime: " + runtime); - ProjectAssetsCopier.CopyNewAssetFileByRuntimeId(runtime, solution); - } + // OverwriteRuntimeIdentifier is done via Directory.Build.props + // search for: dotnet build + DotNetBuild(p => p + .SetProjectFile(solution) + .EnableNoRestore() + .EnableNoLogo() + .DisableRunCodeAnalysis() + .SetConfiguration(configuration) + .SetProcessArgumentConfigurator(args => + args + .Add($"/p:OverwriteRuntimeIdentifier={runtime}") + // Warnings are disabled because in Generic build they are already checked + .Add("-v q") + .Add("/p:WarningLevel=0") + .Add("/p:noSonar=true") + )); } - public static void BuildNetCoreCommand(Solution solution, List getRuntimesWithoutGeneric, Configuration configuration) + public static void PublishNetCoreGenericCommand(Configuration configuration, string runtime) { - foreach ( var runtime in getRuntimesWithoutGeneric ) + foreach ( var publishProject in Build.PublishProjectsList ) { - ProjectAssetsCopier.CopyAssetFileToCurrentRuntime(runtime, solution); - // OverwriteRuntimeIdentifier is done via Directory.Build.props - // search for: dotnet build - DotNetBuild(_ => _ - .SetProjectFile(solution) + Console.WriteLine(">> next publishProject: " + publishProject + " runtime: " + runtime); + + var publishProjectFullPath = Path.Combine( + WorkingDirectory.GetSolutionParentFolder(), + publishProject); + + var outputFullPath = Path.Combine( + WorkingDirectory.GetSolutionParentFolder(), + runtime); + + DotNetPublish(p => p + .SetConfiguration(configuration) .EnableNoRestore() + .EnableNoBuild() + .EnableNoDependencies() + .EnableSelfContained() + .SetOutput(outputFullPath) + .SetProject(publishProjectFullPath) + .SetRuntime(runtime) .EnableNoLogo() - .SetConfiguration(configuration) - .SetProcessArgumentConfigurator(args => - args - .Add($"/p:OverwriteRuntimeIdentifier={runtime}") - .Add("/p:noSonar=true") - )); - ProjectAssetsCopier.CopyNewAssetFileByRuntimeId(runtime, solution); + .SetProcessArgumentConfigurator(args => args.Add("/p:noSonar=true")) + ); } } - static string BasePath() - { - return Directory.GetParent(AppDomain.CurrentDomain.BaseDirectory) - ?.Parent?.Parent?.Parent?.FullName; - } } } diff --git a/starsky/build/helpers/GetSolutionAllProjects.cs b/starsky/build/helpers/GetSolutionAllProjects.cs index 5f696e35c7..55ea343bf8 100644 --- a/starsky/build/helpers/GetSolutionAllProjects.cs +++ b/starsky/build/helpers/GetSolutionAllProjects.cs @@ -1,3 +1,4 @@ +using System; using System.Collections.Generic; using System.Diagnostics.CodeAnalysis; using System.IO; @@ -14,6 +15,11 @@ public static class GetSolutionAllProjects { public static List GetSolutionAllProjectsList(Solution solution) { + if ( solution.Directory == null ) + { + throw new ArgumentNullException(nameof(Solution)); + } + var slnListOutput = DotNet($"sln {solution.ToString()} list", null, null, null, false); @@ -27,10 +33,12 @@ public static List GetSolutionAllProjectsList(Solution solution) { continue; } - - if ( File.Exists(slnListOutputItem.Text) ) + + var fullPath = Path.Combine(solution.Directory, slnListOutputItem.Text); + + if ( File.Exists(fullPath) ) { - result.Add(slnListOutputItem.Text); + result.Add(fullPath); } } return result; diff --git a/starsky/build/helpers/ProjectAssetsCopier.cs b/starsky/build/helpers/ProjectAssetsCopier.cs deleted file mode 100644 index 639b7e0914..0000000000 --- a/starsky/build/helpers/ProjectAssetsCopier.cs +++ /dev/null @@ -1,42 +0,0 @@ -using System.IO; -using Nuke.Common.ProjectModel; -using static helpers.GetSolutionAllProjects; - -namespace helpers -{ - public static class ProjectAssetsCopier - { - public static void CopyAssetFileToCurrentRuntime(string runtime, - Solution solution) - { - // Restore Asset runtime file - foreach ( var path in GetSolutionAllProjectsList(solution) ) - { - var parent = Directory.GetParent(path)?.FullName; - var assetFile = $"{parent}/obj/project.assets.json"; - var assetRuntimeFile = $"{parent}/obj/project.assets_{runtime}.json"; - - if ( File.Exists(assetRuntimeFile) ) - { - File.Copy(assetRuntimeFile,assetFile,true); - } - } - } - - public static void CopyNewAssetFileByRuntimeId(string runtime, - Solution solution) - { - // Create a new one - foreach ( var path in GetSolutionAllProjectsList(solution) ) - { - var parent = Directory.GetParent(path)?.FullName; - var assetFile = $"{parent}/obj/project.assets.json"; - var assetRuntimeFile = $"{parent}/obj/project.assets_{runtime}.json"; - if ( File.Exists(assetFile) ) - { - File.Copy(assetFile,assetRuntimeFile,true); - } - } - } - } -} diff --git a/starsky/global.json b/starsky/global.json index d4c5f4ad49..41df4afed0 100644 --- a/starsky/global.json +++ b/starsky/global.json @@ -1,7 +1,7 @@ { "strictVersion": true, "sdk": { - "version": "6.0.417", + "version": "8.0.101", "rollForward": "disable", "allowPrerelease": false } diff --git a/starsky/nuget-packages-list.json b/starsky/nuget-packages-list.json index 1abae6c601..ecf6b768f8 100644 --- a/starsky/nuget-packages-list.json +++ b/starsky/nuget-packages-list.json @@ -1,63 +1,60 @@ [ - "Microsoft.AspNetCore.Mvc.NewtonsoftJson 6.0.25", - "Microsoft.Extensions.Hosting.WindowsServices 6.0.2", + "Microsoft.AspNetCore.Mvc.NewtonsoftJson 8.0.1", + "Microsoft.Extensions.Hosting.WindowsServices 8.0.0", "SQLitePCLRaw.lib.e_sqlite3.linux 1.1.14", "Swashbuckle.AspNetCore 6.5.0", - "Microsoft.Extensions.Caching.Abstractions 6.0.0", - "Microsoft.Extensions.Caching.Memory 6.0.1", - "Microsoft.Extensions.Hosting.Abstractions 6.0.0", + "Microsoft.Extensions.Caching.Abstractions 8.0.0", + "Microsoft.Extensions.Caching.Memory 8.0.0", + "Microsoft.Extensions.Hosting.Abstractions 8.0.0", "NGeoNames 1.5.1", - "Microsoft.Extensions.Diagnostics.HealthChecks 6.0.25", - "Microsoft.Extensions.Diagnostics.HealthChecks.Abstractions 6.0.25", - "AspNetCore.HealthChecks.MySql 6.0.2", - "AspNetCore.HealthChecks.Sqlite 6.0.2", - "Microsoft.Extensions.Diagnostics.HealthChecks.EntityFrameworkCore 6.0.25", + "Microsoft.Extensions.Diagnostics.HealthChecks 8.0.1", + "Microsoft.Extensions.Diagnostics.HealthChecks.Abstractions 8.0.1", + "AspNetCore.HealthChecks.MySql 8.0.0", + "AspNetCore.HealthChecks.Sqlite 8.0.0", + "Microsoft.Extensions.Diagnostics.HealthChecks.EntityFrameworkCore 8.0.1", "MedallionShell 1.6.2", "RazorLight 2.3.1", - "SixLabors.ImageSharp 3.1.1", + "SixLabors.ImageSharp 3.1.2", "SixLabors.ImageSharp.Drawing 2.1.0", - "Microsoft.AspNetCore.Authorization 6.0.25", + "Microsoft.AspNetCore.Authorization 8.0.1", "Microsoft.ApplicationInsights.WorkerService 2.22.0", - "Microsoft.Extensions.DependencyInjection.Abstractions 6.0.0", - "Microsoft.EntityFrameworkCore.Analyzers 6.0.25", - "Microsoft.EntityFrameworkCore.Design 6.0.25", - "Microsoft.EntityFrameworkCore.InMemory 6.0.25", - "Microsoft.EntityFrameworkCore.Sqlite 6.0.25", - "Microsoft.EntityFrameworkCore 6.0.25", - "Microsoft.EntityFrameworkCore.Relational 6.0.25", - "Microsoft.Extensions.Identity.Stores 6.0.25", - "Pomelo.EntityFrameworkCore.MySql 6.0.2", + "Microsoft.Extensions.DependencyInjection.Abstractions 8.0.0", + "Microsoft.Extensions.Logging 8.0.0", + "Microsoft.EntityFrameworkCore.Analyzers 8.0.1", + "Microsoft.EntityFrameworkCore.Design 8.0.1", + "Microsoft.EntityFrameworkCore.InMemory 8.0.1", + "Microsoft.EntityFrameworkCore.Sqlite 8.0.1", + "Microsoft.EntityFrameworkCore 8.0.1", + "Microsoft.EntityFrameworkCore.Relational 8.0.1", + "Microsoft.Extensions.DependencyInjection 8.0.0", + "Microsoft.Extensions.Identity.Stores 8.0.1", + "Pomelo.EntityFrameworkCore.MySql 8.0.0-beta.2", "System.ComponentModel.Annotations 5.0.0", "Microsoft.ApplicationInsights 2.22.0", "Microsoft.ApplicationInsights.DependencyCollector 2.22.0", - "Microsoft.AspNetCore.Http 2.2.2", - "Microsoft.Net.Http.Headers 2.2.8", - "Microsoft.Extensions.DependencyInjection 6.0.1", "Microsoft.CSharp 4.7.0", - "Microsoft.Extensions.Configuration 6.0.1", - "Microsoft.Extensions.Configuration.Binder 6.0.0", - "Microsoft.Extensions.Configuration.EnvironmentVariables 6.0.1", - "Microsoft.Extensions.Configuration.Json 6.0.0", - "Microsoft.Extensions.Logging.Abstractions 6.0.4", + "Microsoft.Extensions.Configuration 8.0.0", + "Microsoft.Extensions.Configuration.Binder 8.0.1", + "Microsoft.Extensions.Configuration.EnvironmentVariables 8.0.0", + "Microsoft.Extensions.Configuration.Json 8.0.0", + "Microsoft.Extensions.Logging.Abstractions 8.0.0", "System.Buffers 4.5.1", - "System.Threading.Tasks.Dataflow 6.0.0", + "System.Threading.Tasks.Dataflow 8.0.0", "TimeZoneConverter 6.1.0", "GeoTimeZone 5.3.0", "XmpCore 6.1.10.1", "MetadataExtractor 2.8.1", "Microsoft.ApplicationInsights.AspNetCore 2.22.0", - "Microsoft.Extensions.Logging.Console 6.0.0", + "Microsoft.Extensions.Logging.Console 8.0.0", "OpenTelemetry 1.7.0", "OpenTelemetry.Api 1.7.0", - "OpenTelemetry.Exporter.Console 1.7.0", "OpenTelemetry.Exporter.OpenTelemetryProtocol 1.7.0", - "OpenTelemetry.Extensions.Hosting 1.6.0", - "OpenTelemetry.Instrumentation.AspNetCore 1.6.0", - "OpenTelemetry.Instrumentation.Http 1.7.0", - "OpenTelemetry.Instrumentation.Runtime 1.5.1", - "System.Text.Json 6.0.7", - "Microsoft.AspNetCore.Identity.EntityFrameworkCore 6.0.25", - "Microsoft.Extensions.Hosting 6.0.1", + "OpenTelemetry.Extensions.Hosting 1.7.0", + "OpenTelemetry.Instrumentation.AspNetCore 1.7.0", + "OpenTelemetry.Instrumentation.Runtime 1.7.0", + "System.Text.Json 8.0.1", + "Microsoft.AspNetCore.Identity.EntityFrameworkCore 8.0.1", + "Microsoft.Extensions.Hosting 8.0.0", "Microsoft.NET.Test.Sdk 17.8.0", "MSTest.TestAdapter 3.1.1", "MSTest.TestFramework 3.1.1", diff --git a/starsky/readme-upgrade-net-core.md b/starsky/readme-upgrade-net-core.md index 48bdc318cd..82149f8b19 100644 --- a/starsky/readme-upgrade-net-core.md +++ b/starsky/readme-upgrade-net-core.md @@ -32,13 +32,6 @@ Check at least those files - [x] `starsky/starskywebftpcli/starskywebftpcli.csproj` - [x] `starsky/starskywebhtmlcli/starskywebhtmlcli.csproj` -## Marked as deprecated -- [x] `starsky/starskysynccli/starskysynccli.csproj` - -## Legacy project - - [x] `starsky.netframework/starskyImporterNetFrameworkCli/starskyImporterNetFrameworkCli.csproj` - - [x] `starsky.netframework/starskySyncNetFrameworkCli/starskySyncNetFrameworkCli.csproj` - Might useful to force evaluate packages ``` dotnet restore --force-evaluate diff --git a/starsky/starsky.feature.demo/Services/CleanDemoDataService.cs b/starsky/starsky.feature.demo/Services/CleanDemoDataService.cs index 74eecbb56e..0e9608688a 100644 --- a/starsky/starsky.feature.demo/Services/CleanDemoDataService.cs +++ b/starsky/starsky.feature.demo/Services/CleanDemoDataService.cs @@ -103,7 +103,7 @@ internal static void CleanData(IStorage subStorage, IWebLogger logger) internal async Task PushToSockets(List updatedList) { var filtered = updatedList.Where(p => p.FilePath != "/").ToList(); - if ( !filtered.Any() ) + if ( filtered.Count == 0 ) { return false; } @@ -143,7 +143,7 @@ internal static async Task DownloadAsync(AppSettings appSettings, IHttpClientHelper httpClientHelper, IStorage hostStorage, IStorage subStorage, IWebLogger webLogger) { - if ( !appSettings.DemoData.Any() ) + if ( appSettings.DemoData.Count == 0 ) { webLogger.LogError("DemoData is empty"); return false; @@ -166,7 +166,7 @@ internal static async Task DownloadAsync(AppSettings appSettings, continue; } - var result = await PlainTextFileHelper.StreamToStringAsync( + var result = await StreamToStringHelper.StreamToStringAsync( hostStorage.ReadStream(settingsJsonFullPath)); var data = Deserialize(result, webLogger, hostStorage, settingsJsonFullPath); diff --git a/starsky/starsky.feature.demo/starsky.feature.demo.csproj b/starsky/starsky.feature.demo/starsky.feature.demo.csproj index e33c4b988c..ab6dcc8214 100644 --- a/starsky/starsky.feature.demo/starsky.feature.demo.csproj +++ b/starsky/starsky.feature.demo/starsky.feature.demo.csproj @@ -1,7 +1,7 @@ - net6.0 + net8.0 {34d46dc0-f965-46bf-9178-b83a9a6627e7} 0.5.14 diff --git a/starsky/starsky.feature.export/Services/ExportService.cs b/starsky/starsky.feature.export/Services/ExportService.cs index 6b1d9c1b7a..a597e1c0b0 100644 --- a/starsky/starsky.feature.export/Services/ExportService.cs +++ b/starsky/starsky.feature.export/Services/ExportService.cs @@ -145,7 +145,7 @@ public async Task CreateZip(List fileIndexResultsList, bool thumb // Write a single file to be sure that writing is ready var doneFileFullPath = Path.Combine(_appSettings.TempFolder,zipOutputFileName) + ".done"; await _hostFileSystemStorage. - WriteStreamAsync(PlainTextFileHelper.StringToStream("OK"), doneFileFullPath); + WriteStreamAsync(StringToStreamHelper.StringToStream("OK"), doneFileFullPath); if(_appSettings.IsVerbose()) _logger.LogInformation("[CreateZip] Zip done: " + doneFileFullPath); } @@ -174,7 +174,7 @@ await _thumbnailService continue; } - var sourceFile = _appSettings.DatabasePathToFilePath(item.FilePath, false); + var sourceFile = _appSettings.DatabasePathToFilePath(item.FilePath!); if ( !_hostFileSystemStorage.ExistFile(sourceFile) ) { @@ -192,7 +192,7 @@ await _thumbnailService var xmpFileFullPath = _appSettings.DatabasePathToFilePath( ExtensionRolesHelper.ReplaceExtensionWithXmp( - item.FilePath), false); + item.FilePath)); if ( !_hostFileSystemStorage.ExistFile(xmpFileFullPath) ) { diff --git a/starsky/starsky.feature.export/starsky.feature.export.csproj b/starsky/starsky.feature.export/starsky.feature.export.csproj index 8eeac65d05..f4492f8685 100644 --- a/starsky/starsky.feature.export/starsky.feature.export.csproj +++ b/starsky/starsky.feature.export/starsky.feature.export.csproj @@ -1,7 +1,7 @@ - net6.0 + net8.0 {09ccbfa9-612f-4d5e-ae27-c0c06e7114c9} 0.5.14 diff --git a/starsky/starsky.feature.geolookup/Interfaces/IGeoIndexGpx.cs b/starsky/starsky.feature.geolookup/Interfaces/IGeoIndexGpx.cs index f830de5c92..21b5791bb2 100644 --- a/starsky/starsky.feature.geolookup/Interfaces/IGeoIndexGpx.cs +++ b/starsky/starsky.feature.geolookup/Interfaces/IGeoIndexGpx.cs @@ -1,11 +1,12 @@ using System.Collections.Generic; +using System.Threading.Tasks; using starsky.foundation.database.Models; namespace starsky.feature.geolookup.Interfaces { public interface IGeoIndexGpx { - List - LoopFolder(List metaFilesInDirectory); + Task> LoopFolderAsync( + List metaFilesInDirectory); } } diff --git a/starsky/starsky.feature.geolookup/Services/GeoBackgroundTask.cs b/starsky/starsky.feature.geolookup/Services/GeoBackgroundTask.cs index d6fca5ce77..93709bbbe0 100644 --- a/starsky/starsky.feature.geolookup/Services/GeoBackgroundTask.cs +++ b/starsky/starsky.feature.geolookup/Services/GeoBackgroundTask.cs @@ -9,7 +9,6 @@ using starsky.foundation.platform.Helpers; using starsky.foundation.platform.Interfaces; using starsky.foundation.platform.Models; -using starsky.foundation.readmeta.Interfaces; using starsky.foundation.readmeta.Services; using starsky.foundation.storage.Interfaces; using starsky.foundation.storage.Services; @@ -22,7 +21,7 @@ namespace starsky.feature.geolookup.Services public class GeoBackgroundTask : IGeoBackgroundTask { private readonly AppSettings _appSettings; - private readonly IReadMeta _readMeta; + private readonly ReadMeta _readMeta; private readonly IStorage _thumbnailStorage; private readonly IStorage _iStorage; private readonly IGeoLocationWrite _geoLocationWrite; @@ -54,15 +53,15 @@ public async Task> GeoBackgroundTaskAsync( var listOfFiles = _iStorage.GetAllFilesInDirectory(f) .Where(ExtensionRolesHelper.IsExtensionSyncSupported).ToList(); - var fileIndexList = _readMeta - .ReadExifAndXmpFromFileAddFilePathHash(listOfFiles); + var fileIndexList = await _readMeta + .ReadExifAndXmpFromFileAddFilePathHashAsync(listOfFiles); var toMetaFilesUpdate = new List(); if ( index ) { toMetaFilesUpdate = - _geoIndexGpx - .LoopFolder(fileIndexList); + await _geoIndexGpx + .LoopFolderAsync(fileIndexList); if ( _appSettings.IsVerbose() ) Console.Write("¬"); diff --git a/starsky/starsky.feature.geolookup/Services/GeoCacheStatusService.cs b/starsky/starsky.feature.geolookup/Services/GeoCacheStatusService.cs index 1c5fb42b35..4d62417cf2 100644 --- a/starsky/starsky.feature.geolookup/Services/GeoCacheStatusService.cs +++ b/starsky/starsky.feature.geolookup/Services/GeoCacheStatusService.cs @@ -22,14 +22,14 @@ public GeoCacheStatus Status(string path) var result = new GeoCacheStatus(); if(_cache.TryGetValue(totalCacheName, out var statusObjectTotal) && - TryParse(statusObjectTotal.ToString(), out var totalStatus)) + TryParse(statusObjectTotal?.ToString(), out var totalStatus)) { result.Total = totalStatus; } var currentCacheName = nameof(GeoCacheStatus) + path + StatusType.Current; if(_cache.TryGetValue(currentCacheName, out var statusObjectCurrent) && - TryParse(statusObjectCurrent.ToString(), out var currentStatus)) + TryParse(statusObjectCurrent?.ToString(), out var currentStatus)) { result.Current = currentStatus; } diff --git a/starsky/starsky.feature.geolookup/Services/GeoCli.cs b/starsky/starsky.feature.geolookup/Services/GeoCli.cs index a8412a5797..af3a030d7d 100644 --- a/starsky/starsky.feature.geolookup/Services/GeoCli.cs +++ b/starsky/starsky.feature.geolookup/Services/GeoCli.cs @@ -8,7 +8,6 @@ using starsky.foundation.platform.Helpers; using starsky.foundation.platform.Interfaces; using starsky.foundation.platform.Models; -using starsky.foundation.readmeta.Interfaces; using starsky.foundation.readmeta.Services; using starsky.foundation.storage.Interfaces; using starsky.foundation.storage.Models; @@ -31,7 +30,7 @@ public sealed class GeoCli private readonly IGeoLocationWrite _geoLocationWrite; private readonly IStorage _iStorage; private readonly IStorage _thumbnailStorage; - private readonly IReadMeta _readMeta; + private readonly ReadMeta _readMeta; private readonly IGeoFileDownload _geoFileDownload; private readonly IExifToolDownload _exifToolDownload; private readonly IWebLogger _logger; @@ -45,7 +44,7 @@ public GeoCli(IGeoReverseLookup geoReverseLookup, _geoLocationWrite = geoLocationWrite; _iStorage = selectorStorage.Get(SelectorStorage.StorageServices.SubPath); _thumbnailStorage = selectorStorage.Get(SelectorStorage.StorageServices.Thumbnail); - _readMeta = new ReadMeta(_iStorage, appSettings, null, logger); + _readMeta = new ReadMeta(_iStorage, appSettings, null!, logger); _appSettings = appSettings; _console = console; _exifToolDownload = exifToolDownload; @@ -87,9 +86,10 @@ public async Task CommandLineAsync(string[] args) // -s = if subPath || -p is path if ( ArgsHelper.IsSubPathOrPath(args) ) { - inputPath = _appSettings.DatabasePathToFilePath( + var path = _appSettings.DatabasePathToFilePath( ArgsHelper.GetSubPathFormArgs(args) ); + inputPath = !string.IsNullOrEmpty(path) ? path : string.Empty; } else { @@ -103,9 +103,10 @@ public async Task CommandLineAsync(string[] args) if (getSubPathRelative != null) { var dateTime = DateTime.Now.AddDays(( double ) getSubPathRelative); - inputPath = _appSettings.DatabasePathToFilePath( + var path = _appSettings.DatabasePathToFilePath( new StructureService(_iStorage, _appSettings.Structure) - .ParseSubfolders(dateTime),false); + .ParseSubfolders(dateTime)); + inputPath = !string.IsNullOrEmpty(path) ? path : string.Empty; } // used in this session to find the files back @@ -122,7 +123,7 @@ public async Task CommandLineAsync(string[] args) var listOfFiles = _iStorage.GetAllFilesInDirectory("/") .Where(ExtensionRolesHelper.IsExtensionSyncSupported).ToList(); - var fileIndexList = _readMeta.ReadExifAndXmpFromFileAddFilePathHash(listOfFiles); + var fileIndexList = await _readMeta.ReadExifAndXmpFromFileAddFilePathHashAsync(listOfFiles); var toMetaFilesUpdate = new List(); if ( ArgsHelper.GetIndexMode(args) ) @@ -131,7 +132,7 @@ public async Task CommandLineAsync(string[] args) _console.WriteLine($"Folder: {inputPath}"); var geoIndexGpx = new GeoIndexGpx(_appSettings, _iStorage, _logger); - toMetaFilesUpdate = geoIndexGpx.LoopFolder(fileIndexList); + toMetaFilesUpdate = await geoIndexGpx.LoopFolderAsync(fileIndexList); _console.Write("¬"); await _geoLocationWrite.LoopFolderAsync(toMetaFilesUpdate, false); diff --git a/starsky/starsky.feature.geolookup/Services/GeoIndexGpx.cs b/starsky/starsky.feature.geolookup/Services/GeoIndexGpx.cs index 688d3496e3..d621fb467b 100644 --- a/starsky/starsky.feature.geolookup/Services/GeoIndexGpx.cs +++ b/starsky/starsky.feature.geolookup/Services/GeoIndexGpx.cs @@ -2,6 +2,7 @@ using System.Collections.Generic; using System.Linq; using System.Runtime.CompilerServices; +using System.Threading.Tasks; using Microsoft.Extensions.Caching.Memory; using starsky.feature.geolookup.Interfaces; using starsky.feature.geolookup.Models; @@ -11,7 +12,6 @@ using starsky.foundation.platform.Models; using starsky.foundation.readmeta.Models; using starsky.foundation.readmeta.ReadMetaHelpers; -using starsky.foundation.readmeta.Services; using starsky.foundation.storage.Interfaces; [assembly: InternalsVisibleTo("starskytest")] @@ -42,7 +42,7 @@ private static List GetNoLocationItems(IEnumerable .ToList(); } - private List GetGpxFile(List metaFilesInDirectory) + private async Task> GetGpxFileAsync(List metaFilesInDirectory) { var geoList = new List(); foreach (var metaFileItem in metaFilesInDirectory) @@ -54,7 +54,7 @@ private List GetGpxFile(List metaFilesInDirectory) using ( var stream = _iStorage.ReadStream(metaFileItem.FilePath!) ) { - geoList.AddRange(new ReadMetaGpx(_logger).ReadGpxFile(stream, geoList)); + geoList.AddRange(await new ReadMetaGpx(_logger).ReadGpxFileAsync(stream, geoList)); } } return geoList; @@ -69,10 +69,13 @@ private List GetGpxFile(List metaFilesInDirectory) /// DateTime Kind should not be Local internal DateTime ConvertTimeZone(DateTime valueDateTime, string subPath = "") { - if ( valueDateTime.Kind == DateTimeKind.Utc ) return valueDateTime; + if ( valueDateTime.Kind == DateTimeKind.Utc ) + { + return valueDateTime; + } // Not supported by TimeZoneInfo convert - if ( valueDateTime.Kind != DateTimeKind.Unspecified ) + if ( valueDateTime.Kind != DateTimeKind.Unspecified || _appSettings.CameraTimeZoneInfo == null ) { throw new ArgumentException($"valueDateTime DateTime-Kind '{valueDateTime.Kind}' " + $"'{subPath}' should be Unspecified", nameof(valueDateTime)); @@ -82,12 +85,15 @@ internal DateTime ConvertTimeZone(DateTime valueDateTime, string subPath = "") _appSettings.CameraTimeZoneInfo, TimeZoneInfo.Utc); } - public List LoopFolder(List metaFilesInDirectory) + public async Task> LoopFolderAsync(List metaFilesInDirectory) { var toUpdateMetaFiles = new List(); - var gpxList = GetGpxFile(metaFilesInDirectory); - if(!gpxList.Any()) return toUpdateMetaFiles; + var gpxList = await GetGpxFileAsync(metaFilesInDirectory); + if ( gpxList.Count == 0 ) + { + return toUpdateMetaFiles; + } metaFilesInDirectory = GetNoLocationItems(metaFilesInDirectory); diff --git a/starsky/starsky.feature.geolookup/starsky.feature.geolookup.csproj b/starsky/starsky.feature.geolookup/starsky.feature.geolookup.csproj index 456e9ecb9c..d61ee3c029 100644 --- a/starsky/starsky.feature.geolookup/starsky.feature.geolookup.csproj +++ b/starsky/starsky.feature.geolookup/starsky.feature.geolookup.csproj @@ -1,7 +1,7 @@ - net6.0 + net8.0 {23e26a58-29c5-4d0c-813b-9f7bd991b107} starsky.feature.geolookup @@ -11,9 +11,9 @@ - - - + + + diff --git a/starsky/starsky.feature.health/HealthCheck/SetupHealthCheck.cs b/starsky/starsky.feature.health/HealthCheck/SetupHealthCheck.cs index 7a7064c05c..63d34395b3 100644 --- a/starsky/starsky.feature.health/HealthCheck/SetupHealthCheck.cs +++ b/starsky/starsky.feature.health/HealthCheck/SetupHealthCheck.cs @@ -67,7 +67,7 @@ public void BuilderHealth() _services.AddHealthChecks().AddMySql(_appSettings.DatabaseConnection); break; case AppSettings.DatabaseTypeList.Sqlite: - _services.AddHealthChecks().AddSqlite(_appSettings.DatabaseConnection, healthSqlQuery, "sqlite"); + _services.AddHealthChecks().AddSqlite(_appSettings.DatabaseConnection, healthSqlQuery); break; case AppSettings.DatabaseTypeList.InMemoryDatabase: break; diff --git a/starsky/starsky.feature.health/UpdateCheck/Services/CheckForUpdates.cs b/starsky/starsky.feature.health/UpdateCheck/Services/CheckForUpdates.cs index 0145953593..dafd8888f9 100644 --- a/starsky/starsky.feature.health/UpdateCheck/Services/CheckForUpdates.cs +++ b/starsky/starsky.feature.health/UpdateCheck/Services/CheckForUpdates.cs @@ -11,6 +11,7 @@ using starsky.feature.health.UpdateCheck.Models; using starsky.foundation.http.Interfaces; using starsky.foundation.injection; +using starsky.foundation.platform.JsonConverter; using starsky.foundation.platform.Models; using starsky.foundation.platform.VersionHelpers; @@ -20,7 +21,7 @@ namespace starsky.feature.health.UpdateCheck.Services [Service(typeof(ICheckForUpdates), InjectionLifetime = InjectionLifetime.Singleton)] public class CheckForUpdates : ICheckForUpdates { - internal const string GithubApi = "https://api.github.com/repos/qdraw/starsky/releases"; + internal const string GithubStarskyReleaseApi = "https://api.github.com/repos/qdraw/starsky/releases"; private readonly AppSettings? _appSettings; private readonly IMemoryCache? _cache; @@ -58,6 +59,7 @@ public async Task> IsUpdateNeeded(string curr if ( _cache.TryGetValue(QueryCheckForUpdatesCacheName, out var cacheResult) ) { + cacheResult ??= new List(); return Parse(( List ) cacheResult, currentVersion); } @@ -72,14 +74,20 @@ public async Task> IsUpdateNeeded(string curr internal async Task?> QueryIsUpdateNeededAsync() { // argument check is done in QueryIsUpdateNeeded - var (key, value) = await _httpClientHelper.ReadString(GithubApi); - return !key ? new List() : JsonSerializer.Deserialize>(value, new JsonSerializerOptions()); + var (key, value) = await _httpClientHelper.ReadString(GithubStarskyReleaseApi); + return !key ? new List() : + JsonSerializer.Deserialize>(value, DefaultJsonSerializer.CamelCase); } - internal static KeyValuePair Parse(IEnumerable? releaseModelList, string currentVersion ) + internal static KeyValuePair Parse(IEnumerable? releaseModelList, + string currentVersion ) { - var orderedReleaseModelList = releaseModelList?.OrderByDescending(p => p.TagName); - var tagName = orderedReleaseModelList?.FirstOrDefault(p => p is { Draft: false, PreRelease: false })?.TagName; + var orderedReleaseModelList = + releaseModelList?.OrderByDescending(p => p.TagName); + + var tagName = orderedReleaseModelList? + .FirstOrDefault(p => p is { Draft: false, PreRelease: false })?.TagName; + if ( string.IsNullOrWhiteSpace(tagName) || !tagName.StartsWith('v') ) { diff --git a/starsky/starsky.feature.health/starsky.feature.health.csproj b/starsky/starsky.feature.health/starsky.feature.health.csproj index 602256e0aa..e99903635e 100644 --- a/starsky/starsky.feature.health/starsky.feature.health.csproj +++ b/starsky/starsky.feature.health/starsky.feature.health.csproj @@ -1,7 +1,7 @@ - net6.0 + net8.0 {d9c8e6e0-2526-4978-ad8c-b4e74993cfd8} starsky.feature.health 0.5.14 @@ -13,11 +13,11 @@ - - - - - + + + + + diff --git a/starsky/starsky.feature.import/Helpers/UpdateImportTransformations.cs b/starsky/starsky.feature.import/Helpers/UpdateImportTransformations.cs index 4661f57638..007f4dfd88 100644 --- a/starsky/starsky.feature.import/Helpers/UpdateImportTransformations.cs +++ b/starsky/starsky.feature.import/Helpers/UpdateImportTransformations.cs @@ -1,10 +1,8 @@ #nullable enable using System.Collections.Generic; -using System.Linq; using System.Threading.Tasks; using starsky.foundation.database.Interfaces; using starsky.foundation.database.Models; -using starsky.foundation.platform.Enums; using starsky.foundation.platform.Helpers; using starsky.foundation.platform.Interfaces; using starsky.foundation.platform.Models; @@ -70,16 +68,22 @@ internal async Task UpdateTransformations( comparedNamesList = ColorClassComparedNamesList(comparedNamesList); } - if ( !comparedNamesList.Any() ) return fileIndexItem; + if ( comparedNamesList.Count == 0 ) + { + return fileIndexItem; + } var exifToolCmdHelper = new ExifToolCmdHelper(_exifTool, _subPathStorage, _thumbnailStorage, - new ReadMeta(_subPathStorage, _appSettings, null, _logger), + new ReadMeta(_subPathStorage, _appSettings, null!, _logger), _thumbnailQuery); await exifToolCmdHelper.UpdateAsync(fileIndexItem, comparedNamesList); // Only update database when indexMode is true - if ( !indexMode || queryUpdateDelegate == null) return fileIndexItem; + if ( !indexMode || queryUpdateDelegate == null ) + { + return fileIndexItem; + } // Hash is changed after transformation fileIndexItem.FileHash = (await new FileHash(_subPathStorage).GetHashCodeAsync(fileIndexItem.FilePath!)).Key; diff --git a/starsky/starsky.feature.import/Services/Import.cs b/starsky/starsky.feature.import/Services/Import.cs index ecdd359172..5c429b2079 100644 --- a/starsky/starsky.feature.import/Services/Import.cs +++ b/starsky/starsky.feature.import/Services/Import.cs @@ -25,7 +25,6 @@ using starsky.foundation.platform.Helpers; using starsky.foundation.platform.Interfaces; using starsky.foundation.platform.Models; -using starsky.foundation.readmeta.Interfaces; using starsky.foundation.readmeta.Services; using starsky.foundation.storage.Interfaces; using starsky.foundation.storage.Models; @@ -52,7 +51,7 @@ public class Import : IImport private readonly AppSettings _appSettings; - private readonly IReadMeta _readMetaHost; + private readonly ReadMeta _readMetaHost; private readonly IExifTool _exifTool; private readonly IQuery _query; @@ -91,7 +90,7 @@ public Import( _thumbnailStorage = selectorStorage.Get(SelectorStorage.StorageServices.Thumbnail); _appSettings = appSettings; - _readMetaHost = new ReadMeta(_filesystemStorage, appSettings, null, logger); + _readMetaHost = new ReadMeta(_filesystemStorage, appSettings, null!, logger); _exifTool = exifTool; _query = query; _console = console; @@ -118,7 +117,10 @@ public async Task> Preflight(List fullFilePathsLis importSettings).ToList(); // When Directory is Empty - if ( !includedDirectoryFilePaths.Any() ) return new List(); + if ( includedDirectoryFilePaths.Count == 0 ) + { + return new List(); + } var importIndexItemsList = (await includedDirectoryFilePaths .ForEachAsync( @@ -136,7 +138,10 @@ public async Task> Preflight(List fullFilePathsLis internal List>> CheckForReadOnlyFileSystems( List importIndexItemsList, bool deleteAfter = true) { - if ( !deleteAfter ) return new List>>(); + if ( !deleteAfter ) + { + return new List>>(); + } var parentFolders = new List>>(); foreach ( var itemSourceFullFilePath in importIndexItemsList.Select(item => item.SourceFullFilePath) ) @@ -366,11 +371,11 @@ internal async Task PreflightPerFile(KeyValuePair // Only accept files with correct meta data // Check if there is a xmp file that contains data - var fileIndexItem = _readMetaHost.ReadExifAndXmpFromFile(inputFileFullPath.Key); + var fileIndexItem = await _readMetaHost.ReadExifAndXmpFromFileAsync(inputFileFullPath.Key); // Parse the filename and create a new importIndexItem object var importIndexItem = ObjectCreateIndexItem(inputFileFullPath.Key, imageFormat, - hashList.Key, fileIndexItem, importSettings.ColorClass, + hashList.Key, fileIndexItem!, importSettings.ColorClass, _filesystemStorage.Info(inputFileFullPath.Key).Size); // Update the parent and filenames @@ -493,7 +498,10 @@ public async Task> Importer(IEnumerable inputFullP var preflightItemList = await Preflight(inputFullPathList.ToList(), importSettings); // When directory is empty - if ( !preflightItemList.Any() ) return new List(); + if ( preflightItemList.Count == 0 ) + { + return new List(); + } var directoriesContent = ParentFoldersDictionary(preflightItemList); if ( importSettings.IndexMode ) await CreateParentFolders(directoriesContent); @@ -516,11 +524,20 @@ public async Task> Importer(IEnumerable inputFullP internal async Task> CreateMataThumbnail(IEnumerable importIndexItemsList, ImportSettingsModel importSettings) { - if ( _appSettings.MetaThumbnailOnImport == false || !importSettings.IndexMode) return new List<(bool, bool, string, string?)>(); + if ( _appSettings.MetaThumbnailOnImport == false || + !importSettings.IndexMode ) + { + return new List<(bool, bool, string, string?)>(); + } + var items = importIndexItemsList .Where(p => p.Status == ImportStatus.Ok) .Select(p => (p.FilePath, p.FileIndexItem!.FileHash)).Cast<(string,string)>().ToList(); - if ( !items.Any() ) return new List<(bool, bool, string, string?)>(); + + if ( items.Count == 0 ) + { + return new List<(bool, bool, string, string?)>(); + } return await _metaExifThumbnailService.AddMetaThumbnail(items); } @@ -638,7 +655,7 @@ private async Task CreateSideCarFile(ImportIndexItem importIndexItem, bool xmpEx { var exifCopy = new ExifCopy(_subPathStorage, _thumbnailStorage, _exifTool, new ReadMeta(_subPathStorage, - _appSettings, null, _logger),_thumbnailQuery); + _appSettings, null!, _logger),_thumbnailQuery); await exifCopy.XmpSync(importIndexItem.FileIndexItem!.FilePath); } } diff --git a/starsky/starsky.feature.import/starsky.feature.import.csproj b/starsky/starsky.feature.import/starsky.feature.import.csproj index 4d5c32b97a..1f91877370 100644 --- a/starsky/starsky.feature.import/starsky.feature.import.csproj +++ b/starsky/starsky.feature.import/starsky.feature.import.csproj @@ -1,7 +1,7 @@ - net6.0 + net8.0 {e9c60bf0-09b6-40c9-95b5-25c7a185365e} 0.5.14 diff --git a/starsky/starsky.feature.metaupdate/Interfaces/IMetaInfo.cs b/starsky/starsky.feature.metaupdate/Interfaces/IMetaInfo.cs index 9c829c3135..e8a1b98f16 100644 --- a/starsky/starsky.feature.metaupdate/Interfaces/IMetaInfo.cs +++ b/starsky/starsky.feature.metaupdate/Interfaces/IMetaInfo.cs @@ -1,10 +1,12 @@ using System.Collections.Generic; +using System.Threading.Tasks; using starsky.foundation.database.Models; namespace starsky.feature.metaupdate.Interfaces { public interface IMetaInfo { - List GetInfo(List inputFilePaths, bool collections); + Task> GetInfoAsync(List inputFilePaths, + bool collections); } } diff --git a/starsky/starsky.feature.metaupdate/Services/MetaInfo.cs b/starsky/starsky.feature.metaupdate/Services/MetaInfo.cs index d1c4389295..35039e278b 100644 --- a/starsky/starsky.feature.metaupdate/Services/MetaInfo.cs +++ b/starsky/starsky.feature.metaupdate/Services/MetaInfo.cs @@ -1,4 +1,5 @@ using System.Collections.Generic; +using System.Threading.Tasks; using Microsoft.Extensions.Caching.Memory; using starsky.feature.metaupdate.Interfaces; using starsky.foundation.database.Helpers; @@ -31,7 +32,7 @@ public MetaInfo(IQuery query, AppSettings appSettings, ISelectorStorage selector _statusCodeHelper = new StatusCodesHelper(appSettings); } - public List GetInfo(List inputFilePaths, bool collections) + public async Task> GetInfoAsync(List inputFilePaths, bool collections) { // the result list var fileIndexResultsList = new List(); @@ -62,7 +63,7 @@ public List GetInfo(List inputFilePaths, bool collections && !ExtensionRolesHelper.IsExtensionSidecar(detailView.FileIndexItem!.FileName)) { StatusCodesHelper.ReturnExifStatusError( - new FileIndexItemJsonParser(_iStorage).Read(detailView.FileIndexItem), + await new FileIndexItemJsonParser(_iStorage).ReadAsync(detailView.FileIndexItem), FileIndexItem.ExifStatus.ExifWriteNotSupported, fileIndexResultsList); continue; @@ -78,9 +79,9 @@ public List GetInfo(List inputFilePaths, bool collections foreach ( var collectionSubPath in collectionSubPathList ) { - var collectionItem = _readMeta.ReadExifAndXmpFromFile(collectionSubPath); + var collectionItem = await _readMeta.ReadExifAndXmpFromFileAsync(collectionSubPath); - collectionItem.Status = statusResults; + collectionItem!.Status = statusResults; collectionItem.CollectionPaths = collectionSubPathList; collectionItem.ImageFormat = ExtensionRolesHelper.MapFileTypesToExtension(collectionSubPath); diff --git a/starsky/starsky.feature.metaupdate/starsky.feature.metaupdate.csproj b/starsky/starsky.feature.metaupdate/starsky.feature.metaupdate.csproj index 16157e5fc6..6b5f2a3385 100644 --- a/starsky/starsky.feature.metaupdate/starsky.feature.metaupdate.csproj +++ b/starsky/starsky.feature.metaupdate/starsky.feature.metaupdate.csproj @@ -1,7 +1,7 @@ - net6.0 + net8.0 starsky.feature.metaupdate {9567d576-4dee-481b-b316-c55d493416f4} 0.5.14 diff --git a/starsky/starsky.feature.packagetelemetry/Services/DeviceIdService.cs b/starsky/starsky.feature.packagetelemetry/Services/DeviceIdService.cs index df8900c30b..a9d0e5b8fd 100644 --- a/starsky/starsky.feature.packagetelemetry/Services/DeviceIdService.cs +++ b/starsky/starsky.feature.packagetelemetry/Services/DeviceIdService.cs @@ -50,7 +50,7 @@ public async Task DeviceId(OSPlatform? currentPlatform ) if ( currentPlatform == OSPlatform.Linux || currentPlatform == OSPlatform.FreeBSD) { - id = DeviceIdLinuxBsd(); + id = await DeviceIdLinuxBsdAsync(); } // For privacy reason this content of this id will be anonymous @@ -73,23 +73,23 @@ internal async Task DeviceIdDatabaseId() return generatedString; } - private string DeviceIdLinuxBsd() + private async Task DeviceIdLinuxBsdAsync() { if ( _hostStorage.ExistFile(DbusMachineIdPath) ) { var stream = _hostStorage.ReadStream(DbusMachineIdPath); - return PlainTextFileHelper.StreamToString(stream); + return await StreamToStringHelper.StreamToStringAsync(stream); } if ( _hostStorage.ExistFile(MachineIdPath2) ) { var stream = _hostStorage.ReadStream(MachineIdPath2); - return PlainTextFileHelper.StreamToString(stream); + return await StreamToStringHelper.StreamToStringAsync(stream); } if ( !_hostStorage.ExistFile(BsdHostIdPath) ) return string.Empty; var streamBsd = _hostStorage.ReadStream(BsdHostIdPath); - return PlainTextFileHelper.StreamToString(streamBsd); + return await StreamToStringHelper.StreamToStringAsync(streamBsd); } /// @@ -119,11 +119,17 @@ internal async Task DeviceIdOsX() try { // Windows Only feature - var registryKey = Registry.LocalMachine.OpenSubKey(@"SOFTWARE\Microsoft\Cryptography"); + var registryKey = + Registry.LocalMachine.OpenSubKey( + @"SOFTWARE\Microsoft\Cryptography"); var title = registryKey?.GetValue("MachineGuid")?.ToString(); registryKey?.Dispose(); return title; } + catch ( NullReferenceException ) + { + return string.Empty; + } catch ( TypeInitializationException ) { return string.Empty; diff --git a/starsky/starsky.feature.packagetelemetry/starsky.feature.packagetelemetry.csproj b/starsky/starsky.feature.packagetelemetry/starsky.feature.packagetelemetry.csproj index f33ce6a5ad..9d7cb5fb9e 100644 --- a/starsky/starsky.feature.packagetelemetry/starsky.feature.packagetelemetry.csproj +++ b/starsky/starsky.feature.packagetelemetry/starsky.feature.packagetelemetry.csproj @@ -1,7 +1,7 @@ - net6.0 + net8.0 starsky.feature.packagetelemetry {6fbad8a6-53fa-41d2-98a4-61eb46d70794} 0.5.14 diff --git a/starsky/starsky.feature.realtime/starsky.feature.realtime.csproj b/starsky/starsky.feature.realtime/starsky.feature.realtime.csproj index 0219301cb5..163c3e9eaf 100644 --- a/starsky/starsky.feature.realtime/starsky.feature.realtime.csproj +++ b/starsky/starsky.feature.realtime/starsky.feature.realtime.csproj @@ -1,7 +1,7 @@ - net6.0 + net8.0 starsky.feature.realtime {4a749ec1-4e6d-4c68-b69c-00c5c80f5660} 0.5.14 diff --git a/starsky/starsky.feature.rename/starsky.feature.rename.csproj b/starsky/starsky.feature.rename/starsky.feature.rename.csproj index 56b8a256f5..b8a6c88d15 100644 --- a/starsky/starsky.feature.rename/starsky.feature.rename.csproj +++ b/starsky/starsky.feature.rename/starsky.feature.rename.csproj @@ -1,7 +1,7 @@ - net6.0 + net8.0 {a864f834-133f-4ea8-9a4d-53e5cad837ab} 0.5.14 diff --git a/starsky/starsky.feature.search/starsky.feature.search.csproj b/starsky/starsky.feature.search/starsky.feature.search.csproj index 71462f0c4c..9d4b5e3f13 100644 --- a/starsky/starsky.feature.search/starsky.feature.search.csproj +++ b/starsky/starsky.feature.search/starsky.feature.search.csproj @@ -1,6 +1,6 @@ - net6.0 + net8.0 {c9e6cec6-c453-4c61-a955-ec65765afe0a} 0.5.14 diff --git a/starsky/starsky.feature.settings/Interfaces/IUpdateAppSettingsByPath.cs b/starsky/starsky.feature.settings/Interfaces/IUpdateAppSettingsByPath.cs new file mode 100644 index 0000000000..ff25028858 --- /dev/null +++ b/starsky/starsky.feature.settings/Interfaces/IUpdateAppSettingsByPath.cs @@ -0,0 +1,10 @@ +using starsky.feature.settings.Models; +using starsky.foundation.platform.Models; + +namespace starsky.feature.settings.Interfaces; + +public interface IUpdateAppSettingsByPath +{ + Task UpdateAppSettingsAsync( + AppSettingsTransferObject appSettingTransferObject); +} diff --git a/starsky/starsky.feature.settings/Models/UpdateAppSettingsStatusModel.cs b/starsky/starsky.feature.settings/Models/UpdateAppSettingsStatusModel.cs new file mode 100644 index 0000000000..24e26cc79a --- /dev/null +++ b/starsky/starsky.feature.settings/Models/UpdateAppSettingsStatusModel.cs @@ -0,0 +1,10 @@ +namespace starsky.feature.settings.Models; + +public class UpdateAppSettingsStatusModel +{ + public int StatusCode { get; set; } = 200; + + public bool IsError => StatusCode >= 400; + + public string Message { get; set; } = string.Empty; +} diff --git a/starsky/starsky.feature.settings/Services/UpdateAppSettingsByPath.cs b/starsky/starsky.feature.settings/Services/UpdateAppSettingsByPath.cs new file mode 100644 index 0000000000..e249534447 --- /dev/null +++ b/starsky/starsky.feature.settings/Services/UpdateAppSettingsByPath.cs @@ -0,0 +1,69 @@ +using System.Text.Json; +using starsky.feature.settings.Interfaces; +using starsky.feature.settings.Models; +using starsky.foundation.injection; +using starsky.foundation.platform.Helpers; +using starsky.foundation.platform.JsonConverter; +using starsky.foundation.platform.Models; +using starsky.foundation.storage.Helpers; +using starsky.foundation.storage.Interfaces; +using starsky.foundation.storage.Storage; + +namespace starsky.feature.settings.Services; + +[Service(typeof(IUpdateAppSettingsByPath), InjectionLifetime = InjectionLifetime.Scoped)] +public class UpdateAppSettingsByPath : IUpdateAppSettingsByPath +{ + private readonly AppSettings _appSettings; + private readonly IStorage _hostStorage; + + public UpdateAppSettingsByPath(AppSettings appSettings, ISelectorStorage selectorStorage) + { + _appSettings = appSettings; + _hostStorage = + selectorStorage.Get(SelectorStorage.StorageServices.HostFilesystem); + } + + public async Task UpdateAppSettingsAsync(AppSettingsTransferObject appSettingTransferObject) + { + if ( !string.IsNullOrEmpty(appSettingTransferObject.StorageFolder)) + { + if ( !_appSettings.StorageFolderAllowEdit ) + { + return new UpdateAppSettingsStatusModel + { + StatusCode = 403, + Message = + "There is an Environment variable set so you can't update it here" + }; + } + if (!_hostStorage.ExistFolder(appSettingTransferObject.StorageFolder) ) + { + return new UpdateAppSettingsStatusModel + { + StatusCode = 404, + Message = + "Location of StorageFolder on disk not found" + }; + } + } + + AppSettingsCompareHelper.Compare(_appSettings, appSettingTransferObject); + var transfer = ( AppSettingsTransferObject ) _appSettings; + + // should not forget app: prefix + var jsonOutput = JsonSerializer.Serialize(new { app = transfer }, DefaultJsonSerializer.NoNamingPolicy); + + await _hostStorage.WriteStreamAsync( + StringToStreamHelper.StringToStream(jsonOutput), + _appSettings.AppSettingsPath); + + return new UpdateAppSettingsStatusModel + { + StatusCode = 200, + Message = "Updated" + }; + } + + +} diff --git a/starsky/starsky.feature.settings/starsky.feature.settings.csproj b/starsky/starsky.feature.settings/starsky.feature.settings.csproj new file mode 100644 index 0000000000..8dab16e831 --- /dev/null +++ b/starsky/starsky.feature.settings/starsky.feature.settings.csproj @@ -0,0 +1,19 @@ + + + net8.0 + {67a8a132-6551-4042-96a4-3ec507b0cb83} + 0.5.14 + enable + enable + + + + + + + + + true + + + diff --git a/starsky/starsky.feature.syncbackground/starsky.feature.syncbackground.csproj b/starsky/starsky.feature.syncbackground/starsky.feature.syncbackground.csproj index 8d48b53622..d19ece6af1 100644 --- a/starsky/starsky.feature.syncbackground/starsky.feature.syncbackground.csproj +++ b/starsky/starsky.feature.syncbackground/starsky.feature.syncbackground.csproj @@ -1,7 +1,7 @@ - net6.0 + net8.0 starsky.feature.syncbackground {15e1493e-6e79-4314-907f-b3ef18eb9046} 0.5.14 @@ -13,7 +13,7 @@ - + diff --git a/starsky/starsky.feature.thumbnail/starsky.feature.thumbnail.csproj b/starsky/starsky.feature.thumbnail/starsky.feature.thumbnail.csproj index 9f08048c8b..9eee8da742 100644 --- a/starsky/starsky.feature.thumbnail/starsky.feature.thumbnail.csproj +++ b/starsky/starsky.feature.thumbnail/starsky.feature.thumbnail.csproj @@ -1,7 +1,7 @@ - net6.0 + net8.0 starsky.feature.thumbnail {93a6019f-6627-483e-a18e-0d073d7b0883} 0.5.14 diff --git a/starsky/starsky.feature.trash/Services/MoveToTrashService.cs b/starsky/starsky.feature.trash/Services/MoveToTrashService.cs index 81b504f369..457a417774 100644 --- a/starsky/starsky.feature.trash/Services/MoveToTrashService.cs +++ b/starsky/starsky.feature.trash/Services/MoveToTrashService.cs @@ -120,7 +120,7 @@ await _metaUpdateService.UpdateAsync(changedFileIndexItemName, .Select(p => p.FilePath).Cast() .ToList(); - if ( !parentSubPaths.Any() ) + if ( parentSubPaths.Count == 0 ) { return ( moveToTrash, changedFileIndexItemName ); } @@ -142,12 +142,13 @@ await _metaUpdateService.UpdateAsync(changedFileIndexItemName, return (moveToTrash,changedFileIndexItemName); } - internal async Task SystemTrashInQueue(List moveToTrash) + private async Task SystemTrashInQueue(List moveToTrash) { var fullFilePaths = moveToTrash .Where(p => p.FilePath != null) - .Select(p => _appSettings.DatabasePathToFilePath(p.FilePath, false)) + .Select(p => _appSettings.DatabasePathToFilePath(p.FilePath!)) .ToList(); + _systemTrashService.Trash(fullFilePaths); await _query.RemoveItemAsync(moveToTrash); diff --git a/starsky/starsky.feature.trash/starsky.feature.trash.csproj b/starsky/starsky.feature.trash/starsky.feature.trash.csproj index 0a08b8ba55..83550f30f2 100644 --- a/starsky/starsky.feature.trash/starsky.feature.trash.csproj +++ b/starsky/starsky.feature.trash/starsky.feature.trash.csproj @@ -1,7 +1,7 @@ - net6.0 + net8.0 starsky.feature.trash {21affb47-1f8c-458a-84bb-24959e0fda31} 0.5.14 diff --git a/starsky/starsky.feature.webftppublish/Helpers/WebFtpCli.cs b/starsky/starsky.feature.webftppublish/Helpers/WebFtpCli.cs index 569ec7013c..e6097c6f2b 100644 --- a/starsky/starsky.feature.webftppublish/Helpers/WebFtpCli.cs +++ b/starsky/starsky.feature.webftppublish/Helpers/WebFtpCli.cs @@ -1,4 +1,5 @@ using System.IO; +using System.Threading.Tasks; using starsky.feature.webftppublish.FtpAbstractions.Interfaces; using starsky.feature.webftppublish.Models; using starsky.feature.webftppublish.Services; @@ -30,7 +31,7 @@ public WebFtpCli(AppSettings appSettings, ISelectorStorage selectorStorage, ICon _webRequestFactory = webRequestFactory; } - public void Run(string[] args) + public async Task RunAsync(string[] args) { _appSettings.Verbose = ArgsHelper.NeedVerbose(args); @@ -75,8 +76,8 @@ public void Run(string[] args) return; } - var settings = - new DeserializeJson(_hostStorageProvider).Read( + var settings = await + new DeserializeJson(_hostStorageProvider).ReadAsync( settingsFullFilePath); var ftpService = new FtpService(_appSettings,_hostStorageProvider, diff --git a/starsky/starsky.feature.webftppublish/starsky.feature.webftppublish.csproj b/starsky/starsky.feature.webftppublish/starsky.feature.webftppublish.csproj index 859f9eb804..feaf8a80a0 100644 --- a/starsky/starsky.feature.webftppublish/starsky.feature.webftppublish.csproj +++ b/starsky/starsky.feature.webftppublish/starsky.feature.webftppublish.csproj @@ -1,7 +1,7 @@ - net6.0 + net8.0 {31df1419-6c81-4372-b7ae-a6ebb429e7e9} 0.5.14 diff --git a/starsky/starsky.feature.webhtmlpublish/Helpers/PublishCli.cs b/starsky/starsky.feature.webhtmlpublish/Helpers/PublishCli.cs index 6d8f9b3218..84aa31aa32 100644 --- a/starsky/starsky.feature.webhtmlpublish/Helpers/PublishCli.cs +++ b/starsky/starsky.feature.webhtmlpublish/Helpers/PublishCli.cs @@ -94,8 +94,8 @@ public async Task Publisher(string[] args) var listOfFiles = _subPathStorage.GetAllFilesInDirectory("/") .Where(ExtensionRolesHelper.IsExtensionExifToolSupported).ToList(); - var fileIndexList = new ReadMeta(_subPathStorage, _appSettings, null, _logger) - .ReadExifAndXmpFromFileAddFilePathHash(listOfFiles); + var fileIndexList = await new ReadMeta(_subPathStorage, _appSettings, null, _logger) + .ReadExifAndXmpFromFileAddFilePathHashAsync(listOfFiles); // todo introduce selector var profileName = new PublishPreflight(_appSettings,_console, _storageSelector, _logger) diff --git a/starsky/starsky.feature.webhtmlpublish/Helpers/PublishManifest.cs b/starsky/starsky.feature.webhtmlpublish/Helpers/PublishManifest.cs index f1470cc4a8..a171fe9721 100644 --- a/starsky/starsky.feature.webhtmlpublish/Helpers/PublishManifest.cs +++ b/starsky/starsky.feature.webhtmlpublish/Helpers/PublishManifest.cs @@ -3,6 +3,7 @@ using System.Text.Json; using System.Text.Json.Serialization; using starsky.feature.webhtmlpublish.Models; +using starsky.foundation.platform.JsonConverter; using starsky.foundation.storage.Helpers; using starsky.foundation.storage.Interfaces; @@ -25,7 +26,7 @@ public PublishManifest(IStorage storage) /// without ManifestName /// /// - public void ExportManifest( string parentFullFilePath, string itemName, + public PublishManifestModel ExportManifest( string parentFullFilePath, string itemName, Dictionary copyContent) { var manifest = new PublishManifestModel @@ -33,16 +34,13 @@ public void ExportManifest( string parentFullFilePath, string itemName, Name = itemName, Copy = copyContent }; - var output = JsonSerializer.Serialize(manifest, - new JsonSerializerOptions - { - DefaultIgnoreCondition = JsonIgnoreCondition.WhenWritingNull, - WriteIndented = true - }); + var output = JsonSerializer.Serialize(manifest, DefaultJsonSerializer.NoNamingPolicy); var outputLocation = Path.Combine(parentFullFilePath, ManifestName); _storage.FileDelete(outputLocation); - _storage.WriteStream(PlainTextFileHelper.StringToStream(output), outputLocation); + _storage.WriteStream(StringToStreamHelper.StringToStream(output), outputLocation); + + return manifest; } } } diff --git a/starsky/starsky.feature.webhtmlpublish/Models/PublishManifestModel.cs b/starsky/starsky.feature.webhtmlpublish/Models/PublishManifestModel.cs index 6c51fe4633..4f75aef9b2 100644 --- a/starsky/starsky.feature.webhtmlpublish/Models/PublishManifestModel.cs +++ b/starsky/starsky.feature.webhtmlpublish/Models/PublishManifestModel.cs @@ -37,6 +37,6 @@ public string Slug /// /// Starsky Version /// - public string Version => Assembly.GetExecutingAssembly().GetName().Version.ToString(); + public string Version => Assembly.GetExecutingAssembly().GetName().Version?.ToString(); } } diff --git a/starsky/starsky.feature.webhtmlpublish/Services/WebHtmlPublishService.cs b/starsky/starsky.feature.webhtmlpublish/Services/WebHtmlPublishService.cs index a6c431c36a..ab5ed5f17c 100644 --- a/starsky/starsky.feature.webhtmlpublish/Services/WebHtmlPublishService.cs +++ b/starsky/starsky.feature.webhtmlpublish/Services/WebHtmlPublishService.cs @@ -135,7 +135,7 @@ private async Task> Render(List fileIndex string[] base64ImageArray, string publishProfileName, string itemName, string outputParentFullFilePathFolder, bool moveSourceFiles = false) { - if ( !_appSettings.PublishProfiles.Any() ) + if ( _appSettings.PublishProfiles.Count == 0 ) { _console.WriteLine("There are no config items"); return null; @@ -190,7 +190,10 @@ private async Task> Render(List fileIndex ,true); break; case TemplateContentType.OnlyFirstJpeg: - if ( !fileIndexItemsList.Any() ) break; + if ( fileIndexItemsList.Count == 0 ) + { + break; + } var firstInList = new List{fileIndexItemsList.FirstOrDefault()}; copyResult.AddRangeOverride(await GenerateJpeg(currentProfile, firstInList, outputParentFullFilePathFolder)); @@ -233,7 +236,7 @@ internal async Task> GenerateWebHtml(List {outputPath}, comparedNames, false, false); @@ -408,7 +410,7 @@ public async Task GenerateZip(string fullFileParentFolderPath, string itemName, // Write a single file to be sure that writing is ready var doneFileFullPath = Path.Combine(_appSettings.TempFolder, slugItemName) + ".done"; await _hostFileSystemStorage. - WriteStreamAsync(PlainTextFileHelper.StringToStream("OK"), doneFileFullPath); + WriteStreamAsync(StringToStreamHelper.StringToStream("OK"), doneFileFullPath); if ( deleteFolderAfterwards ) { diff --git a/starsky/starsky.feature.webhtmlpublish/starsky.feature.webhtmlpublish.csproj b/starsky/starsky.feature.webhtmlpublish/starsky.feature.webhtmlpublish.csproj index ad0a42e5ef..d2ce4dd8f8 100644 --- a/starsky/starsky.feature.webhtmlpublish/starsky.feature.webhtmlpublish.csproj +++ b/starsky/starsky.feature.webhtmlpublish/starsky.feature.webhtmlpublish.csproj @@ -1,7 +1,7 @@ - net6.0 + net8.0 8.0 {7f7fe502-31a8-409b-bd0b-92d7d1bfeb31} @@ -17,7 +17,7 @@ - + diff --git a/starsky/starsky.foundation.accountmanagement/Middleware/BasicAuthenticationSignInManager.cs b/starsky/starsky.foundation.accountmanagement/Middleware/BasicAuthenticationSignInManager.cs index a791c979ff..f22889e1bd 100644 --- a/starsky/starsky.foundation.accountmanagement/Middleware/BasicAuthenticationSignInManager.cs +++ b/starsky/starsky.foundation.accountmanagement/Middleware/BasicAuthenticationSignInManager.cs @@ -35,7 +35,7 @@ public async Task TrySignInUser() _context.Response.StatusCode = 401; if(!_context.Response.Headers.ContainsKey("WWW-Authenticate") ) { - _context.Response.Headers.Add("WWW-Authenticate", "Basic realm=\"Starsky " + validateResult.Error + " \""); + _context.Response.Headers.Append("WWW-Authenticate", "Basic realm=\"Starsky " + validateResult.Error + " \""); } return; } diff --git a/starsky/starsky.foundation.accountmanagement/Services/UserManager.cs b/starsky/starsky.foundation.accountmanagement/Services/UserManager.cs index 24d2bc746d..5a6b809b56 100644 --- a/starsky/starsky.foundation.accountmanagement/Services/UserManager.cs +++ b/starsky/starsky.foundation.accountmanagement/Services/UserManager.cs @@ -49,8 +49,7 @@ public UserManager(ApplicationDbContext dbContext, AppSettings appSettings, IWeb private bool IsCacheEnabled() { // || _appSettings?.AddMemoryCache == false > disabled - if( _cache == null ) return false; - return true; + return _cache != null; } /// @@ -107,7 +106,7 @@ private List AddDefaultRoles() .Equals(credentialTypeCode.ToLower())); // When not exist add it - if (credentialType == null && credentialTypeCode.ToLower() == "email" ) + if (credentialType == null && credentialTypeCode.Equals("email", StringComparison.CurrentCultureIgnoreCase) ) { credentialType = new CredentialType { @@ -134,7 +133,7 @@ public async Task AllUsersAsync() { if (IsCacheEnabled() && _cache?.TryGetValue(AllUsersCacheKey, out var objectAllUsersResult) == true) { - return new UserOverviewModel(( List ) objectAllUsersResult); + return new UserOverviewModel(( List? ) objectAllUsersResult); } try @@ -142,7 +141,7 @@ public async Task AllUsersAsync() var allUsers = await _dbContext.Users.TagWith("AllUsersAsync").ToListAsync(); if ( IsCacheEnabled() ) { - _cache.Set(AllUsersCacheKey, allUsers, + _cache!.Set(AllUsersCacheKey, allUsers, new TimeSpan(99,0,0)); } return new UserOverviewModel(allUsers); @@ -173,7 +172,7 @@ internal async Task AddUserToCache(User user) { allUsers.Add(user); } - _cache.Set(AllUsersCacheKey, allUsers, + _cache!.Set(AllUsersCacheKey, allUsers, new TimeSpan(99,0,0)); } @@ -185,7 +184,7 @@ private async Task RemoveUserFromCacheAsync(User user) if ( !IsCacheEnabled() ) return; var allUsers = (await AllUsersAsync()).Users; allUsers.Remove(user); - _cache.Set(AllUsersCacheKey, allUsers, + _cache!.Set(AllUsersCacheKey, allUsers, new TimeSpan(99,0,0)); } @@ -230,7 +229,8 @@ internal string GetRoleAddToUser(string identifier, User user) return AccountRoles.AppAccountRoles.Administrator.ToString(); } - if ( _appSettings.AccountRolesByEmailRegisterOverwrite + if (_appSettings.AccountRolesByEmailRegisterOverwrite != null + && _appSettings.AccountRolesByEmailRegisterOverwrite .TryGetValue(identifier, out var emailsForConfig) && AccountRoles.GetAllRoles().Contains(emailsForConfig) ) { @@ -407,7 +407,7 @@ public ChangeSecretResult ChangeSecret(string credentialTypeCode, string identif if ( IsCacheEnabled() ) { - _cache.Set(CredentialCacheKey(credentialType, identifier), + _cache!.Set(CredentialCacheKey(credentialType, identifier), credential,new TimeSpan(99,0,0)); } @@ -433,7 +433,7 @@ internal static string CredentialCacheKey(CredentialType credentialType, string if (IsCacheEnabled() && _cache?.TryGetValue(key, out var objectCredentialTypeCode) == true) { - return ( Credential ) objectCredentialTypeCode; + return ( Credential? ) objectCredentialTypeCode; } @@ -460,7 +460,7 @@ internal static string CredentialCacheKey(CredentialType credentialType, string if ( IsCacheEnabled()) { - _cache.Set(key, credential,new TimeSpan(99,0,0)); + _cache!.Set(key, credential,new TimeSpan(99,0,0)); } return credential; @@ -479,7 +479,7 @@ internal static string CredentialCacheKey(CredentialType credentialType, string if (IsCacheEnabled() && _cache?.TryGetValue(cacheKey, out var objectCredentialTypeCode) == true) { - return ( CredentialType ) objectCredentialTypeCode; + return ( CredentialType? ) objectCredentialTypeCode; } var credentialTypeSelect = _dbContext.CredentialTypes.AsNoTracking().TagWith("CredentialType").Where( @@ -502,7 +502,7 @@ internal static string CredentialCacheKey(CredentialType credentialType, string if ( IsCacheEnabled() ) { - _cache.Set(cacheKey, credentialType, + _cache!.Set(cacheKey, credentialType, new TimeSpan(99,0,0)); } return credentialType; @@ -623,9 +623,15 @@ internal async Task SetLockIfFailedCountIsToHigh(int userId) public async Task SignIn(HttpContext httpContext, User? user, bool isPersistent = false) { - if ( user == null ) return false; + if ( user == null ) + { + return false; + } var claims = GetUserClaims(user).ToList(); - if ( !claims.Any() ) return false; + if ( claims.Count == 0 ) + { + return false; + } ClaimsIdentity identity = new ClaimsIdentity(claims, CookieAuthenticationDefaults.AuthenticationScheme); ClaimsPrincipal principal = new ClaimsPrincipal(identity); @@ -775,7 +781,7 @@ internal IEnumerable GetUserClaims(User? user) return claims; } - private IEnumerable GetUserRoleClaims(User user) + private List GetUserRoleClaims(User user) { var claims = new List(); IEnumerable roleIds = _dbContext.UserRoles.TagWith("GetUserRoleClaims").Where( diff --git a/starsky/starsky.foundation.accountmanagement/starsky.foundation.accountmanagement.csproj b/starsky/starsky.foundation.accountmanagement/starsky.foundation.accountmanagement.csproj index 6974496b5d..01ebda3032 100644 --- a/starsky/starsky.foundation.accountmanagement/starsky.foundation.accountmanagement.csproj +++ b/starsky/starsky.foundation.accountmanagement/starsky.foundation.accountmanagement.csproj @@ -1,7 +1,7 @@ - net6.0 + net8.0 {842d2080-b847-43c3-8535-e5065970dd47} starsky.foundation.accountmanagement @@ -14,7 +14,7 @@ - + diff --git a/starsky/starsky.foundation.consoletelemetry/starsky.foundation.consoletelemetry.csproj b/starsky/starsky.foundation.consoletelemetry/starsky.foundation.consoletelemetry.csproj index 3435dca407..e9c2c1f137 100644 --- a/starsky/starsky.foundation.consoletelemetry/starsky.foundation.consoletelemetry.csproj +++ b/starsky/starsky.foundation.consoletelemetry/starsky.foundation.consoletelemetry.csproj @@ -1,7 +1,7 @@ - net6.0 + net8.0 {9402eb61-ae4c-4e8b-8413-c47573d16c9d} Full @@ -16,7 +16,8 @@ - + + diff --git a/starsky/starsky.foundation.database/Helpers/StatusCodesHelper.cs b/starsky/starsky.foundation.database/Helpers/StatusCodesHelper.cs index f94bd19dbf..39bad585b3 100644 --- a/starsky/starsky.foundation.database/Helpers/StatusCodesHelper.cs +++ b/starsky/starsky.foundation.database/Helpers/StatusCodesHelper.cs @@ -16,12 +16,12 @@ public StatusCodesHelper(AppSettings appSettings) public FileIndexItem.ExifStatus IsReadOnlyStatus(FileIndexItem fileIndexItem) { - if (fileIndexItem.IsDirectory == true && _appSettings.IsReadOnly(fileIndexItem.FilePath)) + if (fileIndexItem.IsDirectory == true && _appSettings.IsReadOnly(fileIndexItem.FilePath!)) { return FileIndexItem.ExifStatus.DirReadOnly; } - if ( _appSettings.IsReadOnly(fileIndexItem.ParentDirectory) ) + if ( _appSettings.IsReadOnly(fileIndexItem.ParentDirectory!) ) { return FileIndexItem.ExifStatus.ReadOnly; } @@ -43,7 +43,7 @@ public FileIndexItem.ExifStatus IsReadOnlyStatus(DetailView? detailView) return FileIndexItem.ExifStatus.DirReadOnly; } - if ( _appSettings.IsReadOnly(detailView.FileIndexItem?.ParentDirectory) ) + if ( _appSettings.IsReadOnly(detailView.FileIndexItem?.ParentDirectory!) ) { return FileIndexItem.ExifStatus.ReadOnly; } diff --git a/starsky/starsky.foundation.database/Migrations/20180419182654_importdatabase.Designer.cs b/starsky/starsky.foundation.database/Migrations/20180419182654_importdatabase.Designer.cs index ee13e0b22a..d433f6745d 100644 --- a/starsky/starsky.foundation.database/Migrations/20180419182654_importdatabase.Designer.cs +++ b/starsky/starsky.foundation.database/Migrations/20180419182654_importdatabase.Designer.cs @@ -10,7 +10,9 @@ namespace starsky.foundation.database.Migrations { [DbContext(typeof(ApplicationDbContext))] [Migration("20180419182654_importdatabase")] +#pragma warning disable CS8981 // The type name only contains lower-cased ascii characters. Such names may become reserved for the language. partial class importdatabase +#pragma warning restore CS8981 // The type name only contains lower-cased ascii characters. Such names may become reserved for the language. { protected override void BuildTargetModel(ModelBuilder modelBuilder) { diff --git a/starsky/starsky.foundation.database/Migrations/20180419182654_importdatabase.cs b/starsky/starsky.foundation.database/Migrations/20180419182654_importdatabase.cs index 49e3e0f027..fce51e67af 100644 --- a/starsky/starsky.foundation.database/Migrations/20180419182654_importdatabase.cs +++ b/starsky/starsky.foundation.database/Migrations/20180419182654_importdatabase.cs @@ -1,5 +1,6 @@ using System; using Microsoft.EntityFrameworkCore.Migrations; +#pragma warning disable CS8981 // The type name only contains lower-cased ascii characters. Such names may become reserved for the language. namespace starsky.foundation.database.Migrations { diff --git a/starsky/starsky.foundation.database/Migrations/20221025182759_data-protection-keys.Designer.cs b/starsky/starsky.foundation.database/Migrations/20221025182759_data-protection-keys.Designer.cs index 67d4a1b02d..acd47bd45e 100644 --- a/starsky/starsky.foundation.database/Migrations/20221025182759_data-protection-keys.Designer.cs +++ b/starsky/starsky.foundation.database/Migrations/20221025182759_data-protection-keys.Designer.cs @@ -13,7 +13,9 @@ namespace starsky.foundation.database.Migrations { [DbContext(typeof(ApplicationDbContext))] [Migration("20221025182759_data-protection-keys")] +#pragma warning disable CS8981 // The type name only contains lower-cased ascii characters. Such names may become reserved for the language. partial class dataprotectionkeys +#pragma warning restore CS8981 // The type name only contains lower-cased ascii characters. Such names may become reserved for the language. { protected override void BuildTargetModel(ModelBuilder modelBuilder) { diff --git a/starsky/starsky.foundation.database/Migrations/20221025182759_data-protection-keys.cs b/starsky/starsky.foundation.database/Migrations/20221025182759_data-protection-keys.cs index 62c720e508..1ad19190a8 100644 --- a/starsky/starsky.foundation.database/Migrations/20221025182759_data-protection-keys.cs +++ b/starsky/starsky.foundation.database/Migrations/20221025182759_data-protection-keys.cs @@ -1,4 +1,5 @@ using Microsoft.EntityFrameworkCore.Migrations; +#pragma warning disable CS8981 // The type name only contains lower-cased ascii characters. Such names may become reserved for the language. #nullable disable diff --git a/starsky/starsky.foundation.database/Query/Query.cs b/starsky/starsky.foundation.database/Query/Query.cs index 4da9419b78..a382022737 100644 --- a/starsky/starsky.foundation.database/Query/Query.cs +++ b/starsky/starsky.foundation.database/Query/Query.cs @@ -1,5 +1,6 @@ using System; using System.Collections.Generic; +using System.Collections.Specialized; using System.Diagnostics.CodeAnalysis; using System.Linq; using System.Text; @@ -143,7 +144,7 @@ public void SetGetObjectByFilePathCache(string filePath, // if result is not null return cached value if ( _cache.TryGetValue(queryHashListCacheName, out var cachedSubPath) - && !string.IsNullOrEmpty((string)cachedSubPath)) return ( string ) cachedSubPath; + && !string.IsNullOrEmpty((string?)cachedSubPath)) return ( string ) cachedSubPath; cachedSubPath = await QueryGetItemByHashAsync(fileHash); @@ -278,7 +279,10 @@ async Task LocalQuery(ApplicationDbContext context, FileIndexItem fileIndexItem) /// same item public async Task> UpdateItemAsync(List updateStatusContentList) { - if ( !updateStatusContentList.Any() ) return new List(); + if ( updateStatusContentList.Count == 0 ) + { + return new List(); + } async Task> LocalQuery(DbContext context, List fileIndexItems) { @@ -430,6 +434,7 @@ internal void AddCacheItem(FileIndexItem updateStatusContent) if (!_cache.TryGetValue(queryCacheName, out var objectFileFolders)) return; + objectFileFolders ??= new List(); var displayFileFolders = (List) objectFileFolders; if ( updateStatusContent.FilePath == "/" ) @@ -471,7 +476,8 @@ public void CacheUpdateItem(List updateStatusContent) skippedCacheItems.Add(item.ParentDirectory!); continue; } - + + objectFileFolders ??= new List(); var displayFileFolders = (List) objectFileFolders; // make it a list to avoid enum errors @@ -499,7 +505,7 @@ public void CacheUpdateItem(List updateStatusContent) _cache.Set(queryCacheName, displayFileFolders, new TimeSpan(1,0,0)); } - if ( skippedCacheItems.Any() && _appSettings.Verbose == true ) + if ( skippedCacheItems.Count >= 1 && _appSettings.Verbose == true ) { _logger.LogInformation($"[CacheUpdateItem] skipped: {string.Join(", ", skippedCacheItems)}"); } @@ -536,7 +542,9 @@ public void RemoveCacheItem(FileIndexItem updateStatusContent) if (!_cache.TryGetValue(queryCacheName, out var objectFileFolders)) return; + objectFileFolders ??= new List(); var displayFileFolders = (List) objectFileFolders; + // Order by filename displayFileFolders = displayFileFolders .Where(p => p.FilePath != updateStatusContent.FilePath) diff --git a/starsky/starsky.foundation.database/starsky.foundation.database.csproj b/starsky/starsky.foundation.database/starsky.foundation.database.csproj index 9b330ebd9a..d8ef23590c 100644 --- a/starsky/starsky.foundation.database/starsky.foundation.database.csproj +++ b/starsky/starsky.foundation.database/starsky.foundation.database.csproj @@ -1,7 +1,7 @@ - net6.0 + net8.0 {46588bf9-d745-460d-a22d-d8fdfc698809} Full @@ -11,14 +11,15 @@ - - - - - - - - + + + + + + + + + diff --git a/starsky/starsky.foundation.databasetelemetry/starsky.foundation.databasetelemetry.csproj b/starsky/starsky.foundation.databasetelemetry/starsky.foundation.databasetelemetry.csproj index cb485384e2..54aa069c91 100644 --- a/starsky/starsky.foundation.databasetelemetry/starsky.foundation.databasetelemetry.csproj +++ b/starsky/starsky.foundation.databasetelemetry/starsky.foundation.databasetelemetry.csproj @@ -1,7 +1,7 @@ - net6.0 + net8.0 {0697d621-f50c-430b-9a41-9a9992d63a2b} Full @@ -12,7 +12,7 @@ - + diff --git a/starsky/starsky.foundation.http/starsky.foundation.http.csproj b/starsky/starsky.foundation.http/starsky.foundation.http.csproj index 40f4f2f578..83b6d27c9a 100644 --- a/starsky/starsky.foundation.http/starsky.foundation.http.csproj +++ b/starsky/starsky.foundation.http/starsky.foundation.http.csproj @@ -1,7 +1,7 @@ - net6.0 + net8.0 {60193d91-0d92-4fc2-b469-d7691cb0e986} Full @@ -14,11 +14,6 @@ - - - - - true diff --git a/starsky/starsky.foundation.injection/starsky.foundation.injection.csproj b/starsky/starsky.foundation.injection/starsky.foundation.injection.csproj index ce698d6caf..28c0d2cc08 100644 --- a/starsky/starsky.foundation.injection/starsky.foundation.injection.csproj +++ b/starsky/starsky.foundation.injection/starsky.foundation.injection.csproj @@ -1,7 +1,7 @@ - net6.0 + net8.0 starsky.foundation.injection {e1753943-96a7-4dee-afc3-234c1c83b8a3} @@ -11,8 +11,8 @@ - - + + diff --git a/starsky/starsky.foundation.native/starsky.foundation.native.csproj b/starsky/starsky.foundation.native/starsky.foundation.native.csproj index e794ee86bd..7918c8d1ee 100644 --- a/starsky/starsky.foundation.native/starsky.foundation.native.csproj +++ b/starsky/starsky.foundation.native/starsky.foundation.native.csproj @@ -1,7 +1,7 @@ - net6.0 + net8.0 enable enable diff --git a/starsky/starsky.foundation.platform/Exceptions/TelemetryServiceException.cs b/starsky/starsky.foundation.platform/Exceptions/TelemetryServiceException.cs index 076b1314cb..9296069232 100644 --- a/starsky/starsky.foundation.platform/Exceptions/TelemetryServiceException.cs +++ b/starsky/starsky.foundation.platform/Exceptions/TelemetryServiceException.cs @@ -17,7 +17,9 @@ public TelemetryServiceException(string message) /// /// protected TelemetryServiceException(SerializationInfo info, StreamingContext context) +#pragma warning disable SYSLIB0051 : base(info, context) +#pragma warning restore SYSLIB0051 { } } diff --git a/starsky/starsky.foundation.platform/Extensions/MemoryCacheExtensions.cs b/starsky/starsky.foundation.platform/Extensions/MemoryCacheExtensions.cs index 4bc1f583b5..5abfde895f 100644 --- a/starsky/starsky.foundation.platform/Extensions/MemoryCacheExtensions.cs +++ b/starsky/starsky.foundation.platform/Extensions/MemoryCacheExtensions.cs @@ -4,20 +4,44 @@ using System.Diagnostics.CodeAnalysis; using System.Linq; using System.Reflection; +using System.Reflection.Emit; using Microsoft.Extensions.Caching.Memory; namespace starsky.foundation.platform.Extensions { + /// + /// @see: https://stackoverflow.com/a/64291008 + /// + [SuppressMessage("Usage", "S3011:Make sure that this accessibility bypass is safe here", Justification = "Safe")] public static class MemoryCacheExtensions { - [SuppressMessage("Usage", "S3011:Make sure that this accessibility bypass is safe here", Justification = "Safe")] - private static readonly Func GetEntriesCollection = Delegate.CreateDelegate( - typeof(Func), - typeof(MemoryCache).GetProperty("EntriesCollection", BindingFlags.NonPublic | BindingFlags.Instance)?.GetGetMethod(true)!, - throwOnBindFailure: true) as Func; + private static readonly Lazy> GetCoherentState = + new(() => + CreateGetter(typeof(MemoryCache) + .GetField("_coherentState", BindingFlags.NonPublic | BindingFlags.Instance))); - private static IEnumerable GetKeys(this IMemoryCache memoryCache) => - ((IDictionary)GetEntriesCollection((MemoryCache)memoryCache)).Keys; + private static readonly Lazy> GetEntries7 = + new(() => + CreateGetter(typeof(MemoryCache) + .GetNestedType("CoherentState", BindingFlags.NonPublic)? + .GetField("_entries", BindingFlags.NonPublic | BindingFlags.Instance))); + + private static Func CreateGetter(FieldInfo field) + { + var methodName = $"{field.ReflectedType?.FullName}.get_{field.Name}"; + var method = new DynamicMethod(methodName, typeof(TReturn), new[] { typeof(TParam) }, typeof(TParam), true); + var ilGen = method.GetILGenerator(); + ilGen.Emit(OpCodes.Ldarg_0); + ilGen.Emit(OpCodes.Ldfld, field); + ilGen.Emit(OpCodes.Ret); + return (Func)method.CreateDelegate(typeof(Func)); + } + + private static readonly Func GetEntries = + cache => GetEntries7.Value(GetCoherentState.Value(cache)); + + private static ICollection GetKeys(this IMemoryCache memoryCache) => + GetEntries((MemoryCache)memoryCache).Keys; /// /// Get Keys @@ -36,5 +60,6 @@ public static IEnumerable GetKeys(this IMemoryCache memoryCache) { } } + } } diff --git a/starsky/starsky.foundation.platform/JsonConverter/DefaultJsonSerializer.cs b/starsky/starsky.foundation.platform/JsonConverter/DefaultJsonSerializer.cs index cfc1c9cf83..4da9542e03 100644 --- a/starsky/starsky.foundation.platform/JsonConverter/DefaultJsonSerializer.cs +++ b/starsky/starsky.foundation.platform/JsonConverter/DefaultJsonSerializer.cs @@ -1,4 +1,5 @@ using System.Text.Json; +using System.Text.Json.Serialization; namespace starsky.foundation.platform.JsonConverter { @@ -27,5 +28,23 @@ public static class DefaultJsonSerializer AllowTrailingCommas = true, WriteIndented = true }; + + /// + /// Please use CamelCase if possible + /// Bool is written as quoted string + /// + public static JsonSerializerOptions NoNamingPolicy => + new JsonSerializerOptions + { + PropertyNamingPolicy = null, + DefaultIgnoreCondition = JsonIgnoreCondition.WhenWritingNull, + PropertyNameCaseInsensitive = true, + AllowTrailingCommas = true, + WriteIndented = true, + Converters = + { + new JsonBoolQuotedConverter(), + }, + }; } } diff --git a/starsky/starsky.foundation.platform/Middleware/ContentSecurityPolicyMiddleware.cs b/starsky/starsky.foundation.platform/Middleware/ContentSecurityPolicyMiddleware.cs index 680d3aef96..d3c8f613db 100644 --- a/starsky/starsky.foundation.platform/Middleware/ContentSecurityPolicyMiddleware.cs +++ b/starsky/starsky.foundation.platform/Middleware/ContentSecurityPolicyMiddleware.cs @@ -20,7 +20,7 @@ public async Task Invoke(HttpContext httpContext) { // For Error pages (for example 404) this middleware will be executed double, // so Adding a Header that already exist give an Error 500 - if (string.IsNullOrEmpty(httpContext.Response.Headers["Content-Security-Policy"]) ) + if (string.IsNullOrEmpty(httpContext.Response.Headers.ContentSecurityPolicy) ) { // CSP 2.0 nonce // used in ApplicationInsightsJsHelper var nonce = Guid.NewGuid().ToString("N"); @@ -62,7 +62,7 @@ public async Task Invoke(HttpContext httpContext) // When change also update in Electron httpContext.Response.Headers - .Add("Content-Security-Policy",cspHeader); + .Append("Content-Security-Policy",cspHeader); } // @see: https://www.permissionspolicy.com/ @@ -70,7 +70,7 @@ public async Task Invoke(HttpContext httpContext) httpContext.Response.Headers["Permissions-Policy"]) ) { httpContext.Response.Headers - .Add("Permissions-Policy", "autoplay=(self), " + + .Append("Permissions-Policy", "autoplay=(self), " + "fullscreen=(self), " + "geolocation=(self), " + "picture-in-picture=(self), " + @@ -82,25 +82,25 @@ public async Task Invoke(HttpContext httpContext) if (string.IsNullOrEmpty(httpContext.Response.Headers["Referrer-Policy"]) ) { httpContext.Response.Headers - .Add("Referrer-Policy", "no-referrer"); + .Append("Referrer-Policy", "no-referrer"); } - if (string.IsNullOrEmpty(httpContext.Response.Headers["X-Frame-Options"]) ) + if (string.IsNullOrEmpty(httpContext.Response.Headers.XFrameOptions) ) { httpContext.Response.Headers - .Add("X-Frame-Options", "DENY"); + .Append("X-Frame-Options", "DENY"); } - if (string.IsNullOrEmpty(httpContext.Response.Headers["X-Xss-Protection"]) ) + if (string.IsNullOrEmpty(httpContext.Response.Headers.XXSSProtection) ) { httpContext.Response.Headers - .Add("X-Xss-Protection", "1; mode=block"); + .Append("X-Xss-Protection", "1; mode=block"); } - if (string.IsNullOrEmpty(httpContext.Response.Headers["X-Content-Type-Options"]) ) + if (string.IsNullOrEmpty(httpContext.Response.Headers.XContentTypeOptions) ) { httpContext.Response.Headers - .Add("X-Content-Type-Options", "nosniff"); + .Append("X-Content-Type-Options", "nosniff"); } await _next(httpContext); diff --git a/starsky/starsky.foundation.platform/Models/AppSettings.cs b/starsky/starsky.foundation.platform/Models/AppSettings.cs index 73946ff904..3be8a8ef3e 100644 --- a/starsky/starsky.foundation.platform/Models/AppSettings.cs +++ b/starsky/starsky.foundation.platform/Models/AppSettings.cs @@ -1,3 +1,4 @@ +#nullable enable using System.Text.Json.Serialization; using System; using System.Collections.Generic; @@ -167,8 +168,10 @@ public string AppVersion [PackageTelemetry] public DateTime AppVersionBuildDateTime => DateAssembly.GetBuildDate(Assembly.GetExecutingAssembly()); - // Can be used in the cli session to select files out of the file database system - private string _storageFolder; + /// + /// Can be used in the cli session to select files out of the file database system + /// + private string _storageFolder = string.Empty; /// /// Main Storage provider on disk @@ -205,7 +208,7 @@ public bool IsVerbose() // Used in the webHtmlCli to store the log item name // used for the url - private string _name; + private string? _name; [PackageTelemetry] public string Name @@ -280,7 +283,7 @@ public enum DatabaseTypeList } // DatabaseType > above this one - private string _databaseConnection; + private string _databaseConnection = string.Empty; /// /// Connection string for the database @@ -298,7 +301,7 @@ public string DatabaseConnection /// /// Internal Structure save location /// - private string _structure; + private string? _structure; /// /// Auto storage structure @@ -368,7 +371,7 @@ internal static TimeZoneInfo ConvertTimeZoneId(string value) } [JsonIgnore] - public TimeZoneInfo CameraTimeZoneInfo { get; set; } + public TimeZoneInfo? CameraTimeZoneInfo { get; set; } /// /// To Check if the structure is any good @@ -392,14 +395,14 @@ public static void StructureCheck(string structure) /// /// Private: Location of storage of Thumbnails /// - private string _thumbnailTempFolder; + private string? _thumbnailTempFolder; /// /// Location of storage of Thumbnails /// public string ThumbnailTempFolder { - get => _thumbnailTempFolder; + get => _thumbnailTempFolder ??= string.Empty; set { var thumbnailTempFolder = ReplaceEnvironmentVariable(value); @@ -410,7 +413,7 @@ public string ThumbnailTempFolder /// /// Private: Location of temp folder /// - private string _tempFolder; + private string? _tempFolder; /// /// Location of temp folder @@ -428,7 +431,7 @@ public string TempFolder /// /// Private: Location of dependencies folder /// - private string _dependenciesFolder; + private string? _dependenciesFolder; /// /// Location of dependencies folder @@ -446,7 +449,7 @@ public string DependenciesFolder /// /// Private: Location of AppSettings Path /// - private string _appSettingsPathPrivate; + private string? _appSettingsPathPrivate; /// /// To store the settings by user in the AppData folder @@ -467,7 +470,7 @@ public string AppSettingsPath /// /// Private Location of ExifTool.exe /// - private string ExifToolPathPrivate { get; set; } + private string? ExifToolPathPrivate { get; set; } /// /// Set in ctor on startup @@ -516,7 +519,10 @@ public string ExifToolPath /// true = don't edit public bool IsReadOnly(string f) { - if (!ReadOnlyFolders.Any() ) return false; + if ( ReadOnlyFolders.Count == 0 ) + { + return false; + } var result = ReadOnlyFolders.Find(f.Contains); return result != null; @@ -568,7 +574,7 @@ public bool IsReadOnly(string f) /// /// Internal location for webFtp credentials /// - private string _webFtp; + private string? _webFtp; /// /// Connection string for FTP @@ -606,7 +612,7 @@ public string WebFtp /// Publishing profiles used within the publishing module (Order by Key) /// [PackageTelemetry] - public Dictionary> PublishProfiles { + public Dictionary>? PublishProfiles { get => PublishProfilesPrivate; set { @@ -654,7 +660,7 @@ public Dictionary> PublishProfiles { /// /// { "demo@qdraw.nl": "Administrator" } /// - public Dictionary AccountRolesByEmailRegisterOverwrite { + public Dictionary? AccountRolesByEmailRegisterOverwrite { get => AccountRolesByEmailRegisterOverwritePrivate; init { @@ -686,7 +692,10 @@ public string ApplicationInsightsConnectionString { { if ( string.IsNullOrWhiteSpace(ApplicationInsightsConnectionStringPrivate) ) { - return Environment.GetEnvironmentVariable("APPLICATIONINSIGHTS_CONNECTION_STRING"); + var connectionString = + Environment.GetEnvironmentVariable( + "APPLICATIONINSIGHTS_CONNECTION_STRING"); + return !string.IsNullOrEmpty(connectionString) ? connectionString : string.Empty ; } return ApplicationInsightsConnectionStringPrivate; } @@ -845,8 +854,9 @@ public bool? EnablePackageTelemetry // ------------------- Modifiers ------------------- // ------------------------------------------------- - private string AssemblyDirectoryReplacer(string value) + private string AssemblyDirectoryReplacer(string? value) { + value ??= string.Empty; return value.Replace("{AssemblyDirectory}", BaseDirectoryProject); } @@ -879,7 +889,7 @@ private string AssemblyDirectoryReplacer(string value) /// public bool? ExiftoolSkipDownloadOnStartup { get; set; } = false; - public OpenTelemetrySettings OpenTelemetry { get; set; } = + public OpenTelemetrySettings? OpenTelemetry { get; set; } = new OpenTelemetrySettings(); /// AppSettings duplicated @@ -1050,23 +1060,14 @@ private string _pathToFilePathStyle(string subPath) /// from relative database path => file location path /// /// databaseFilePath - /// checkIfExist /// - public string DatabasePathToFilePath(string databaseFilePath, bool checkIfExist = true) + public string DatabasePathToFilePath(string databaseFilePath) { var filepath = StorageFolder + databaseFilePath; filepath = _pathToFilePathStyle(filepath); - // Used for deleted files - if (!checkIfExist) return filepath; - - var fileExist = File.Exists(filepath) ? filepath : null; - if (fileExist != null) - { - return fileExist; - } - return Directory.Exists(filepath) ? filepath : null; + return filepath; } /// @@ -1112,6 +1113,40 @@ public string SqLiteFullPath(string connectionString, string baseDirectoryProjec Path.DirectorySeparatorChar+ databaseFileName; return dataSource; } + + public static explicit operator AppSettingsTransferObject(AppSettings appSettings) + { + var transferObject = new AppSettingsTransferObject(); + CopyProperties(appSettings, transferObject); + return transferObject; + } + + public static explicit operator AppSettings(AppSettingsTransferObject transferObject) + { + var appSettings = new AppSettings(); + CopyProperties(transferObject, appSettings); + return appSettings; + } + + internal static void CopyProperties(object source, object destination) + { + var sourceType = source.GetType(); + var destinationType = destination.GetType(); + + var sourceProperties = sourceType.GetProperties(); + foreach (var sourceProperty in sourceProperties) + { + var destinationProperty = destinationType.GetProperty(sourceProperty.Name); + + if ( destinationProperty == null || + !destinationProperty.CanWrite ) + { + continue; + } + var value = sourceProperty.GetValue(source); + destinationProperty.SetValue(destination, value); + } + } } } diff --git a/starsky/starsky.foundation.platform/starsky.foundation.platform.csproj b/starsky/starsky.foundation.platform/starsky.foundation.platform.csproj index 4c76a9c9d8..fecac1a0f0 100644 --- a/starsky/starsky.foundation.platform/starsky.foundation.platform.csproj +++ b/starsky/starsky.foundation.platform/starsky.foundation.platform.csproj @@ -1,7 +1,7 @@ - net6.0 + net8.0 {10a49647-83ab-43c4-a3ff-8b0767518023} Full @@ -14,16 +14,16 @@ - - - - - - - + + + + + + + - + diff --git a/starsky/starsky.foundation.readmeta/Interfaces/IReadMeta.cs b/starsky/starsky.foundation.readmeta/Interfaces/IReadMeta.cs index 1c06341293..9d86e4ef41 100644 --- a/starsky/starsky.foundation.readmeta/Interfaces/IReadMeta.cs +++ b/starsky/starsky.foundation.readmeta/Interfaces/IReadMeta.cs @@ -1,4 +1,6 @@ -using System.Collections.Generic; +#nullable enable +using System.Collections.Generic; +using System.Threading.Tasks; using starsky.foundation.database.Models; namespace starsky.foundation.readmeta.Interfaces @@ -10,8 +12,8 @@ public interface IReadMeta /// /// subPath /// - FileIndexItem ReadExifAndXmpFromFile(string subPath); - List ReadExifAndXmpFromFileAddFilePathHash(List subPathList, List fileHashes = null); + Task ReadExifAndXmpFromFileAsync(string subPath); + Task> ReadExifAndXmpFromFileAddFilePathHashAsync(List subPathList, List? fileHashes = null); bool? RemoveReadMetaCache(string fullFilePath); void UpdateReadMetaCache(IEnumerable objectExifToolModel); } diff --git a/starsky/starsky.foundation.readmeta/ReadMetaHelpers/ReadMetaGpx.cs b/starsky/starsky.foundation.readmeta/ReadMetaHelpers/ReadMetaGpx.cs index da7807deaa..86c0e23430 100644 --- a/starsky/starsky.foundation.readmeta/ReadMetaHelpers/ReadMetaGpx.cs +++ b/starsky/starsky.foundation.readmeta/ReadMetaHelpers/ReadMetaGpx.cs @@ -5,6 +5,7 @@ using System.IO; using System.Linq; using System.Text; +using System.Threading.Tasks; using System.Xml; using GeoTimeZone; using starsky.foundation.database.Models; @@ -26,7 +27,7 @@ public ReadMetaGpx(IWebLogger logger) private const string GpxXmlNameSpaceName = "http://www.topografix.com/GPX/1/1"; - public FileIndexItem ReadGpxFromFileReturnAfterFirstField(Stream? stream, + public async Task ReadGpxFromFileReturnAfterFirstFieldAsync(Stream? stream, string subPath, bool useLocal = true) { if ( stream == null ) @@ -38,9 +39,9 @@ public FileIndexItem ReadGpxFromFileReturnAfterFirstField(Stream? stream, return returnItem; } - var readGpxFile = ReadGpxFile(stream, null, 1); + var readGpxFile = await ReadGpxFileAsync(stream, null, 1); - if ( !readGpxFile.Any() ) + if ( readGpxFile.Count == 0 ) { _logger.LogInformation($"[ReadMetaGpx] SystemXmlXmlException for {subPath}"); return new FileIndexItem(subPath) @@ -103,13 +104,13 @@ private static string GetTrkName(XmlNode? gpxDoc, XmlNamespaceManager namespaceM /// /// default complete file, but can be used to read only the first point /// - public List ReadGpxFile(Stream stream, + public async Task> ReadGpxFileAsync(Stream stream, List? geoList = null, int returnAfter = int.MaxValue) { - if (geoList == null) geoList = new List(); + geoList ??= new List(); // Some files are having problems with gpxDoc.Load() - var fileString = PlainTextFileHelper.StreamToString(stream); + var fileString = await StreamToStringHelper.StreamToStringAsync(stream); try { diff --git a/starsky/starsky.foundation.readmeta/ReadMetaHelpers/ReadMetaXmp.cs b/starsky/starsky.foundation.readmeta/ReadMetaHelpers/ReadMetaXmp.cs index fad384d361..520c32ead1 100644 --- a/starsky/starsky.foundation.readmeta/ReadMetaHelpers/ReadMetaXmp.cs +++ b/starsky/starsky.foundation.readmeta/ReadMetaHelpers/ReadMetaXmp.cs @@ -2,6 +2,7 @@ using System.Diagnostics.CodeAnalysis; using System.Globalization; using System.Text; +using System.Threading.Tasks; using starsky.foundation.database.Models; using starsky.foundation.platform.Helpers; using starsky.foundation.platform.Interfaces; @@ -23,7 +24,7 @@ public ReadMetaXmp(IStorage iStorage, IWebLogger logger) _logger = logger; } - public FileIndexItem XmpGetSidecarFile(FileIndexItem databaseItem) + public async Task XmpGetSidecarFileAsync(FileIndexItem databaseItem) { databaseItem ??= new FileIndexItem(); @@ -38,7 +39,7 @@ public FileIndexItem XmpGetSidecarFile(FileIndexItem databaseItem) !_iStorage.ExistFile(xmpSubPath) ) return databaseItem; // Read the text-content of the xmp file. - var xmp = PlainTextFileHelper.StreamToString(_iStorage.ReadStream(xmpSubPath)); + var xmp = await StreamToStringHelper.StreamToStringAsync(_iStorage.ReadStream(xmpSubPath)); // Get the data from the xmp databaseItem = GetDataFromString(xmp,databaseItem); return databaseItem; diff --git a/starsky/starsky.foundation.readmeta/Services/ReadMeta.cs b/starsky/starsky.foundation.readmeta/Services/ReadMeta.cs index a6e890d587..e824bdde16 100644 --- a/starsky/starsky.foundation.readmeta/Services/ReadMeta.cs +++ b/starsky/starsky.foundation.readmeta/Services/ReadMeta.cs @@ -1,6 +1,8 @@ -using System; +#nullable enable +using System; using System.Collections.Generic; using System.IO; +using System.Threading.Tasks; using Microsoft.Extensions.Caching.Memory; using starsky.foundation.database.Helpers; using starsky.foundation.database.Models; @@ -16,8 +18,8 @@ namespace starsky.foundation.readmeta.Services { public sealed class ReadMeta : IReadMeta { - private readonly AppSettings _appSettings; - private readonly IMemoryCache _cache; + private readonly AppSettings? _appSettings; + private readonly IMemoryCache? _cache; private readonly IStorage _iStorage; private readonly ReadMetaExif _readExif; private readonly ReadMetaXmp _readXmp; @@ -40,13 +42,13 @@ public ReadMeta(IStorage iStorage, AppSettings appSettings, IMemoryCache memoryC _readMetaGpx = new ReadMetaGpx(logger); } - private FileIndexItem ReadExifAndXmpFromFileDirect(string subPath) + private async Task ReadExifAndXmpFromFileDirectAsync(string subPath) { if ( _iStorage.ExistFile(subPath) && ExtensionRolesHelper.IsExtensionForceGpx(subPath) ) { // Get the item back with DateTime as Camera local datetime - return _readMetaGpx.ReadGpxFromFileReturnAfterFirstField( + return await _readMetaGpx.ReadGpxFromFileReturnAfterFirstFieldAsync( _iStorage.ReadStream(subPath), subPath); // use local } @@ -54,7 +56,7 @@ private FileIndexItem ReadExifAndXmpFromFileDirect(string subPath) var fileIndexItemWithPath = new FileIndexItem(subPath); // Read first the sidecar file - var xmpFileIndexItem = _readXmp.XmpGetSidecarFile(fileIndexItemWithPath.Clone()); + var xmpFileIndexItem = await _readXmp.XmpGetSidecarFileAsync(fileIndexItemWithPath.Clone()); // if the sidecar file is not complete, read the original file // when reading a .xmp file direct ignore the readExifFromFile @@ -78,7 +80,7 @@ private FileIndexItem ReadExifAndXmpFromFileDirect(string subPath) } // used by the html generator - public List ReadExifAndXmpFromFileAddFilePathHash(List subPathList, List fileHashes = null) + public async Task> ReadExifAndXmpFromFileAddFilePathHashAsync(List subPathList, List? fileHashes = null) { var fileIndexList = new List(); @@ -86,10 +88,10 @@ public List ReadExifAndXmpFromFileAddFilePathHash(List su { var subPath = subPathList[i]; - var returnItem = ReadExifAndXmpFromFile(subPath); + var returnItem = await ReadExifAndXmpFromFileAsync(subPath); var imageFormat = ExtensionRolesHelper.GetImageFormat(_iStorage.ReadStream(subPath, 50)); - returnItem.ImageFormat = imageFormat; + returnItem!.ImageFormat = imageFormat; returnItem.FileName = Path.GetFileName(subPath); returnItem.IsDirectory = false; returnItem.Status = FileIndexItem.ExifStatus.Ok; @@ -97,7 +99,7 @@ public List ReadExifAndXmpFromFileAddFilePathHash(List su if ( fileHashes == null || fileHashes.Count <= i ) { - returnItem.FileHash = new FileHash(_iStorage).GetHashCode(subPath).Key; + returnItem.FileHash = (await new FileHash(_iStorage).GetHashCodeAsync(subPath)).Key; } else { @@ -118,11 +120,11 @@ public List ReadExifAndXmpFromFileAddFilePathHash(List su /// /// path /// metaData - public FileIndexItem ReadExifAndXmpFromFile(string subPath) + public async Task ReadExifAndXmpFromFileAsync(string subPath) { // The CLI programs uses no cache if( _cache == null || _appSettings?.AddMemoryCache == false) - return ReadExifAndXmpFromFileDirect(subPath); + return await ReadExifAndXmpFromFileDirectAsync(subPath); // Return values from IMemoryCache var queryReadMetaCacheName = CachePrefix + subPath; @@ -132,10 +134,11 @@ public FileIndexItem ReadExifAndXmpFromFile(string subPath) return objectExifToolModel as FileIndexItem; // Try to catch a new object - objectExifToolModel = ReadExifAndXmpFromFileDirect(subPath); + objectExifToolModel = await ReadExifAndXmpFromFileDirectAsync(subPath); + _cache.Set(queryReadMetaCacheName, objectExifToolModel, new TimeSpan(0,1,0)); - return (FileIndexItem) objectExifToolModel; + return (FileIndexItem?) objectExifToolModel!; } @@ -165,7 +168,7 @@ public void UpdateReadMetaCache(IEnumerable objectExifToolModel) { foreach ( var item in objectExifToolModel ) { - UpdateReadMetaCache(item.FilePath, item); + UpdateReadMetaCache(item.FilePath!, item); } } diff --git a/starsky/starsky.foundation.readmeta/Services/ReadMetaSubPathStorage.cs b/starsky/starsky.foundation.readmeta/Services/ReadMetaSubPathStorage.cs index 41ee9fc514..b9f79d8d8f 100644 --- a/starsky/starsky.foundation.readmeta/Services/ReadMetaSubPathStorage.cs +++ b/starsky/starsky.foundation.readmeta/Services/ReadMetaSubPathStorage.cs @@ -1,4 +1,6 @@ +#nullable enable using System.Collections.Generic; +using System.Threading.Tasks; using Microsoft.Extensions.Caching.Memory; using starsky.foundation.database.Models; using starsky.foundation.injection; @@ -21,15 +23,15 @@ public ReadMetaSubPathStorage(ISelectorStorage selectorStorage, AppSettings appS _readMeta = new ReadMeta(storage, appSettings, memoryCache,logger); } - public FileIndexItem ReadExifAndXmpFromFile(string subPath) + public async Task> ReadExifAndXmpFromFileAddFilePathHashAsync(List subPathList, + List? fileHashes = null) { - return _readMeta.ReadExifAndXmpFromFile(subPath); + return await _readMeta.ReadExifAndXmpFromFileAddFilePathHashAsync(subPathList,fileHashes); } - public List ReadExifAndXmpFromFileAddFilePathHash(List subPathList, - List fileHashes = null) + public async Task ReadExifAndXmpFromFileAsync(string subPath) { - return _readMeta.ReadExifAndXmpFromFileAddFilePathHash(subPathList,fileHashes); + return await _readMeta.ReadExifAndXmpFromFileAsync(subPath); } public bool? RemoveReadMetaCache(string fullFilePath) diff --git a/starsky/starsky.foundation.readmeta/starsky.foundation.readmeta.csproj b/starsky/starsky.foundation.readmeta/starsky.foundation.readmeta.csproj index 945a5b314c..2e9c669e7f 100644 --- a/starsky/starsky.foundation.readmeta/starsky.foundation.readmeta.csproj +++ b/starsky/starsky.foundation.readmeta/starsky.foundation.readmeta.csproj @@ -1,7 +1,7 @@ - net6.0 + net8.0 {82ba730f-0aca-470d-ad0e-af046d422f8c} Full @@ -11,8 +11,8 @@ - - + + diff --git a/starsky/starsky.foundation.realtime/starsky.foundation.realtime.csproj b/starsky/starsky.foundation.realtime/starsky.foundation.realtime.csproj index 4805a63dfe..ce3c304915 100644 --- a/starsky/starsky.foundation.realtime/starsky.foundation.realtime.csproj +++ b/starsky/starsky.foundation.realtime/starsky.foundation.realtime.csproj @@ -1,7 +1,7 @@ - net6.0 + net8.0 starsky.foundation.realtime {b90175e1-ba3f-4a18-a0ff-2cde71e8151e} @@ -12,8 +12,8 @@ - - + + diff --git a/starsky/starsky.foundation.settings/starsky.foundation.settings.csproj b/starsky/starsky.foundation.settings/starsky.foundation.settings.csproj index 6c745f7302..fb11e597cc 100644 --- a/starsky/starsky.foundation.settings/starsky.foundation.settings.csproj +++ b/starsky/starsky.foundation.settings/starsky.foundation.settings.csproj @@ -1,7 +1,7 @@ - net6.0 + net8.0 starsky.foundation.settings {67e301f1-e700-4ca5-81ae-696abab1bb0f} diff --git a/starsky/starsky.foundation.storage/Exceptions/DecodingException.cs b/starsky/starsky.foundation.storage/Exceptions/DecodingException.cs index f34c45b1ee..ef3183ef99 100644 --- a/starsky/starsky.foundation.storage/Exceptions/DecodingException.cs +++ b/starsky/starsky.foundation.storage/Exceptions/DecodingException.cs @@ -20,7 +20,9 @@ public DecodingException(string message) : base(message) /// /// protected DecodingException(SerializationInfo info, StreamingContext context) +#pragma warning disable SYSLIB0051 : base(info, context) +#pragma warning restore SYSLIB0051 { } } diff --git a/starsky/starsky.foundation.storage/Helpers/DeserializeJson.cs b/starsky/starsky.foundation.storage/Helpers/DeserializeJson.cs index 776a1a65b8..20b9fc64d7 100644 --- a/starsky/starsky.foundation.storage/Helpers/DeserializeJson.cs +++ b/starsky/starsky.foundation.storage/Helpers/DeserializeJson.cs @@ -1,5 +1,6 @@ using System.IO; using System.Text.Json; +using System.Threading.Tasks; using starsky.foundation.platform.JsonConverter; using starsky.foundation.storage.Interfaces; @@ -21,11 +22,11 @@ public DeserializeJson(IStorage iStorage) /// Typed /// Data /// when file is not found - public T? Read(string jsonSubPath) + public async Task ReadAsync(string jsonSubPath) { if ( !_iStorage.ExistFile(jsonSubPath) ) throw new FileNotFoundException(jsonSubPath); var stream = _iStorage.ReadStream(jsonSubPath); - var jsonAsString = PlainTextFileHelper.StreamToString(stream); + var jsonAsString = await StreamToStringHelper.StreamToStringAsync(stream); var returnFileIndexItem = JsonSerializer.Deserialize(jsonAsString, DefaultJsonSerializer.CamelCase); return returnFileIndexItem; } diff --git a/starsky/starsky.foundation.storage/Helpers/PlainTextFileHelper.cs b/starsky/starsky.foundation.storage/Helpers/PlainTextFileHelper.cs deleted file mode 100644 index a7321bc3ae..0000000000 --- a/starsky/starsky.foundation.storage/Helpers/PlainTextFileHelper.cs +++ /dev/null @@ -1,48 +0,0 @@ -using System.IO; -using System.Text; -using System.Threading.Tasks; - -namespace starsky.foundation.storage.Helpers -{ - public static class PlainTextFileHelper - { - /// - /// Stream to string (UTF8) - /// - /// stream - /// content of the file as string - public static string StreamToString(Stream stream) - { - var reader = new StreamReader(stream, Encoding.UTF8); - var result = reader.ReadToEnd(); - stream.Dispose(); - return result; - } - - /// - /// Stream to string (UTF8) But Async - /// - /// stream - /// dispose afterwards = default true - /// content of the file as string - public static async Task StreamToStringAsync(Stream stream, bool dispose = true) - { - var reader = new StreamReader(stream, Encoding.UTF8); - var result = await reader.ReadToEndAsync(); - if ( dispose ) await stream.DisposeAsync(); - return result; - } - - /// - /// String (UTF8) to Stream - /// - /// - /// - public static Stream StringToStream(string input) - { - byte[] byteArray = Encoding.UTF8.GetBytes(input); - MemoryStream stream = new MemoryStream(byteArray); - return stream; - } - } -} diff --git a/starsky/starsky.foundation.storage/Helpers/StreamToStringHelper.cs b/starsky/starsky.foundation.storage/Helpers/StreamToStringHelper.cs new file mode 100644 index 0000000000..2f0fda9600 --- /dev/null +++ b/starsky/starsky.foundation.storage/Helpers/StreamToStringHelper.cs @@ -0,0 +1,31 @@ +using System.IO; +using System.Text; +using System.Threading.Tasks; + +namespace starsky.foundation.storage.Helpers +{ + /// + /// Before known as PlainTextFileHelper + /// + public static class StreamToStringHelper + { + + /// + /// Stream to string (UTF8) But Async + /// + /// stream + /// dispose afterwards = default true + /// content of the file as string + public static async Task StreamToStringAsync(Stream stream, bool dispose = true) + { + var reader = new StreamReader(stream, Encoding.UTF8); + var result = await reader.ReadToEndAsync(); + if ( dispose ) + { + await stream.DisposeAsync(); + } + return result; + } + + } +} diff --git a/starsky/starsky.foundation.storage/Helpers/StringToStreamHelper.cs b/starsky/starsky.foundation.storage/Helpers/StringToStreamHelper.cs new file mode 100644 index 0000000000..0ce0ee7970 --- /dev/null +++ b/starsky/starsky.foundation.storage/Helpers/StringToStreamHelper.cs @@ -0,0 +1,19 @@ +using System.IO; +using System.Text; + +namespace starsky.foundation.storage.Helpers; + +public static class StringToStreamHelper +{ + /// + /// String (UTF8) to Stream + /// + /// + /// + public static Stream StringToStream(string input) + { + var byteArray = Encoding.UTF8.GetBytes(input); + var stream = new MemoryStream(byteArray); + return stream; + } +} diff --git a/starsky/starsky.foundation.storage/Storage/StorageHostFullPathFilesystem.cs b/starsky/starsky.foundation.storage/Storage/StorageHostFullPathFilesystem.cs index e3fcc7782e..124eb7917d 100644 --- a/starsky/starsky.foundation.storage/Storage/StorageHostFullPathFilesystem.cs +++ b/starsky/starsky.foundation.storage/Storage/StorageHostFullPathFilesystem.cs @@ -304,7 +304,11 @@ public void FileCopy(string fromPath, string toPath) public bool FileDelete(string path) { - if ( !File.Exists(path) ) return false; + if ( !File.Exists(path) ) + { + return false; + } + bool LocalRun() { File.Delete(path); @@ -384,7 +388,6 @@ async Task LocalRun() FileOptions.Asynchronous | FileOptions.SequentialScan)) { await stream.CopyToAsync(fileStream); - await fileStream.DisposeAsync(); } await stream.DisposeAsync(); return true; diff --git a/starsky/starsky.foundation.storage/Storage/StorageSubPathFilesystem.cs b/starsky/starsky.foundation.storage/Storage/StorageSubPathFilesystem.cs index 2ab505a8df..7f15db11ba 100644 --- a/starsky/starsky.foundation.storage/Storage/StorageSubPathFilesystem.cs +++ b/starsky/starsky.foundation.storage/Storage/StorageSubPathFilesystem.cs @@ -30,14 +30,14 @@ public StorageSubPathFilesystem(AppSettings appSettings, IWebLogger logger) /// StorageInfo object public StorageInfo Info(string path) { - var subPath = _appSettings.DatabasePathToFilePath(path, false); + var subPath = _appSettings.DatabasePathToFilePath(path); return new StorageHostFullPathFilesystem(_logger).Info(subPath); } public DateTime SetLastWriteTime(string path, DateTime? dateTime = null) { - var subPath = _appSettings.DatabasePathToFilePath(path, false); + var subPath = _appSettings.DatabasePathToFilePath(path); return new StorageHostFullPathFilesystem(_logger).SetLastWriteTime(subPath, dateTime); } @@ -72,7 +72,7 @@ public bool ExistFolder(string path) /// is file, folder or deleted public FolderOrFileModel.FolderOrFileTypeList IsFolderOrFile(string path) { - var fullFilePath = _appSettings.DatabasePathToFilePath(path,false); + var fullFilePath = _appSettings.DatabasePathToFilePath(path); return new StorageHostFullPathFilesystem(_logger).IsFolderOrFile(fullFilePath); } @@ -83,8 +83,8 @@ public FolderOrFileModel.FolderOrFileTypeList IsFolderOrFile(string path) /// toSubPath public void FolderMove(string fromPath, string toPath) { - var inputFileFullPath = _appSettings.DatabasePathToFilePath(fromPath, false); - var toFileFullPath = _appSettings.DatabasePathToFilePath(toPath, false); + var inputFileFullPath = _appSettings.DatabasePathToFilePath(fromPath); + var toFileFullPath = _appSettings.DatabasePathToFilePath(toPath); new StorageHostFullPathFilesystem(_logger).FolderMove(inputFileFullPath,toFileFullPath); } @@ -95,8 +95,8 @@ public void FolderMove(string fromPath, string toPath) /// toSubPath public void FileMove(string fromPath, string toPath) { - var inputFileFullPath = _appSettings.DatabasePathToFilePath(fromPath, false); - var toFileFullPath = _appSettings.DatabasePathToFilePath(toPath, false); + var inputFileFullPath = _appSettings.DatabasePathToFilePath(fromPath); + var toFileFullPath = _appSettings.DatabasePathToFilePath(toPath); new StorageHostFullPathFilesystem(_logger).FileMove(inputFileFullPath,toFileFullPath); } @@ -107,8 +107,8 @@ public void FileMove(string fromPath, string toPath) /// toSubPath public void FileCopy(string fromPath, string toPath) { - var inputFileFullPath = _appSettings.DatabasePathToFilePath(fromPath, false); - var toFileFullPath = _appSettings.DatabasePathToFilePath(toPath, false); + var inputFileFullPath = _appSettings.DatabasePathToFilePath(fromPath); + var toFileFullPath = _appSettings.DatabasePathToFilePath(toPath); new StorageHostFullPathFilesystem(_logger).FileCopy(inputFileFullPath,toFileFullPath); } @@ -119,7 +119,7 @@ public void FileCopy(string fromPath, string toPath) /// bool public bool FileDelete(string path) { - var inputFileFullPath = _appSettings.DatabasePathToFilePath(path, false); + var inputFileFullPath = _appSettings.DatabasePathToFilePath(path); return new StorageHostFullPathFilesystem(_logger).FileDelete(inputFileFullPath); } @@ -129,7 +129,7 @@ public bool FileDelete(string path) /// subPath location public void CreateDirectory(string path) { - var inputFileFullPath = _appSettings.DatabasePathToFilePath(path, false); + var inputFileFullPath = _appSettings.DatabasePathToFilePath(path); Directory.CreateDirectory(inputFileFullPath); } @@ -140,7 +140,7 @@ public void CreateDirectory(string path) /// bool public bool FolderDelete(string path) { - var inputFileFullPath = _appSettings.DatabasePathToFilePath(path, false); + var inputFileFullPath = _appSettings.DatabasePathToFilePath(path); return new StorageHostFullPathFilesystem(_logger).FolderDelete(inputFileFullPath); } @@ -154,11 +154,15 @@ public bool FolderDelete(string path) /// public IEnumerable GetAllFilesInDirectory(string path) { + var storage = new StorageHostFullPathFilesystem(_logger); var fullFilePath = _appSettings.DatabasePathToFilePath(path); - // null is not found - if (fullFilePath == null) return Enumerable.Empty(); - var imageFilesList = new StorageHostFullPathFilesystem(_logger).GetAllFilesInDirectory(fullFilePath); + if ( !storage.ExistFolder(fullFilePath) ) + { + return Enumerable.Empty(); + } + + var imageFilesList = storage.GetAllFilesInDirectory(fullFilePath); // to filter use: // ..etAllFilesInDirectory(subPath) @@ -180,9 +184,14 @@ public IEnumerable GetAllFilesInDirectory(string path) public IEnumerable GetAllFilesInDirectoryRecursive(string path) { var fullFilePath = _appSettings.DatabasePathToFilePath(path); - if (fullFilePath == null) return Enumerable.Empty(); + var storage = new StorageHostFullPathFilesystem(_logger); + + if ( !storage.ExistFolder(fullFilePath) ) + { + return Enumerable.Empty(); + } - var imageFilesList = new StorageHostFullPathFilesystem(_logger).GetAllFilesInDirectoryRecursive(fullFilePath); + var imageFilesList = storage.GetAllFilesInDirectoryRecursive(fullFilePath); // to filter use: // ..etAllFilesInDirectory(subPath) @@ -202,9 +211,15 @@ public IEnumerable GetAllFilesInDirectoryRecursive(string path) public IEnumerable GetDirectories(string path) { var fullFilePath = _appSettings.DatabasePathToFilePath(path); - if (fullFilePath == null) return Enumerable.Empty(); + var storage = new StorageHostFullPathFilesystem(_logger); + + if ( !storage.ExistFolder(fullFilePath) ) + { + return Enumerable.Empty(); + } + + var folders = storage.GetDirectories(fullFilePath); - var folders = new StorageHostFullPathFilesystem(_logger).GetDirectories(fullFilePath); // Used For subfolders // convert back to subPath style return _appSettings.RenameListItemsToDbStyle(folders.ToList()); @@ -218,10 +233,15 @@ public IEnumerable GetDirectories(string path) /// list of paths public IEnumerable> GetDirectoryRecursive(string path) { + var storage = new StorageHostFullPathFilesystem(_logger); + var fullFilePath = _appSettings.DatabasePathToFilePath(path); - if (fullFilePath == null) return Enumerable.Empty>(); + if ( !storage.ExistFolder(fullFilePath) ) + { + return Enumerable.Empty>(); + } - var folders = new StorageHostFullPathFilesystem(_logger).GetDirectoryRecursive(fullFilePath); + var folders = storage.GetDirectoryRecursive(fullFilePath); // Used For subfolders // convert back to subPath style @@ -242,7 +262,7 @@ public Stream ReadStream(string path, int maxRead = -1) Stream LocalGet() { - var fullFilePath = _appSettings.DatabasePathToFilePath(path,false); + var fullFilePath = _appSettings.DatabasePathToFilePath(path); var fileStream = new FileStream(fullFilePath, FileMode.Open, FileAccess.Read); if ( maxRead <= 1 ) { @@ -274,7 +294,7 @@ Stream LocalGet() public bool WriteStream(Stream stream, string path) { // should be able to write files that are not exist yet - var fullFilePath = _appSettings.DatabasePathToFilePath(path,false); + var fullFilePath = _appSettings.DatabasePathToFilePath(path); return new StorageHostFullPathFilesystem(_logger).WriteStream(stream, fullFilePath); } @@ -286,7 +306,7 @@ public bool WriteStreamOpenOrCreate(Stream stream, string path) public Task WriteStreamAsync(Stream stream, string path) { - var fullFilePath = _appSettings.DatabasePathToFilePath(path,false); + var fullFilePath = _appSettings.DatabasePathToFilePath(path); return new StorageHostFullPathFilesystem(_logger).WriteStreamAsync(stream, fullFilePath); } } diff --git a/starsky/starsky.foundation.storage/starsky.foundation.storage.csproj b/starsky/starsky.foundation.storage/starsky.foundation.storage.csproj index 1828bc9b3e..f70556e2fe 100644 --- a/starsky/starsky.foundation.storage/starsky.foundation.storage.csproj +++ b/starsky/starsky.foundation.storage/starsky.foundation.storage.csproj @@ -1,7 +1,7 @@ - net6.0 + net8.0 {12f5ae66-8d7f-4d81-86c5-e3e3864f44a1} Full diff --git a/starsky/starsky.foundation.sync/Helpers/NewItem.cs b/starsky/starsky.foundation.sync/Helpers/NewItem.cs index 601337d12b..513854573d 100644 --- a/starsky/starsky.foundation.sync/Helpers/NewItem.cs +++ b/starsky/starsky.foundation.sync/Helpers/NewItem.cs @@ -24,12 +24,12 @@ public NewItem(IStorage subPathStorage, IReadMeta readMeta) _readMeta = readMeta; } - public async Task> NewFileItem(List inputItems) + public async Task> NewFileItemAsync(List inputItems) { var result = new List(); foreach ( var inputItem in inputItems ) { - result.Add(await NewFileItem(inputItem)); + result.Add(await NewFileItemAsync(inputItem)); } return result; } @@ -39,9 +39,9 @@ public async Task> NewFileItem(List inputItem /// /// at least FilePath and ParentDirectory, fileHash is optional /// - public async Task NewFileItem(FileIndexItem inputItem) + public async Task NewFileItemAsync(FileIndexItem inputItem) { - return await NewFileItem(inputItem.FilePath, inputItem.FileHash, + return await NewFileItemAsync(inputItem.FilePath, inputItem.FileHash, inputItem.ParentDirectory, inputItem.FileName); } @@ -53,10 +53,10 @@ public async Task NewFileItem(FileIndexItem inputItem) /// parent directory name /// name without path /// - private async Task NewFileItem(string filePath, string fileHash, string parentDirectory, string fileName) + private async Task NewFileItemAsync(string filePath, string fileHash, string parentDirectory, string fileName) { - var updatedDatabaseItem = _readMeta.ReadExifAndXmpFromFile(filePath); - updatedDatabaseItem.ImageFormat = ExtensionRolesHelper + var updatedDatabaseItem = await _readMeta.ReadExifAndXmpFromFileAsync(filePath); + updatedDatabaseItem!.ImageFormat = ExtensionRolesHelper .GetImageFormat(_subPathStorage.ReadStream(filePath,50)); // future: read json sidecar @@ -79,14 +79,14 @@ private async Task NewFileItem(string filePath, string fileHash, /// database item /// byte size /// the updated item - public async Task PrepareUpdateFileItem(FileIndexItem dbItem, long size) + public async Task PrepareUpdateFileItemAsync(FileIndexItem dbItem, long size) { - var metaDataItem = _readMeta.ReadExifAndXmpFromFile(dbItem.FilePath); + var metaDataItem = await _readMeta.ReadExifAndXmpFromFileAsync(dbItem.FilePath!); var compare = FileIndexCompareHelper.Compare(dbItem, metaDataItem); dbItem.Size = size; await SetFileHashStatus(dbItem.FilePath, dbItem.FileHash, dbItem); dbItem.LastChanged.AddRange(compare); - if ( !compare.Any() ) + if ( compare.Count == 0 ) { dbItem.Status = FileIndexItem.ExifStatus.OkAndSame; } diff --git a/starsky/starsky.foundation.sync/Helpers/NewUpdateItemWrapper.cs b/starsky/starsky.foundation.sync/Helpers/NewUpdateItemWrapper.cs index f37644fb81..12712aa225 100644 --- a/starsky/starsky.foundation.sync/Helpers/NewUpdateItemWrapper.cs +++ b/starsky/starsky.foundation.sync/Helpers/NewUpdateItemWrapper.cs @@ -37,7 +37,7 @@ public NewUpdateItemWrapper(IQuery query, IStorage subPathStorage, AppSettings a internal async Task NewItem(FileIndexItem statusItem, string subPath) { // Add a new Item - var dbItem = await _newItem.NewFileItem(statusItem); + var dbItem = await _newItem.NewFileItemAsync(statusItem); // When not OK do not Add (fileHash issues) if ( dbItem.Status != FileIndexItem.ExifStatus.Ok ) return dbItem; @@ -58,7 +58,7 @@ internal async Task NewItem(FileIndexItem statusItem, string subP internal async Task> NewItem(List statusItems, bool addParentItem) { // Add a new Item - var dbItems = await _newItem.NewFileItem(statusItems); + var dbItems = await _newItem.NewFileItemAsync(statusItems); // When not OK do not Add (fileHash issues) var okDbItems = @@ -115,7 +115,7 @@ internal async Task UpdateItem(FileIndexItem dbItem, long size, s _logger.LogDebug($"[SyncSingleFile] Trigger Update Item {subPath}"); } - var updateItem = await _newItem.PrepareUpdateFileItem(dbItem, size); + var updateItem = await _newItem.PrepareUpdateFileItemAsync(dbItem, size); if ( updateItem.Status == FileIndexItem.ExifStatus.OkAndSame) { return updateItem; diff --git a/starsky/starsky.foundation.sync/WatcherHelpers/EventQueueOverflowException.cs b/starsky/starsky.foundation.sync/WatcherHelpers/EventQueueOverflowException.cs index 3220a70471..c37c51f992 100644 --- a/starsky/starsky.foundation.sync/WatcherHelpers/EventQueueOverflowException.cs +++ b/starsky/starsky.foundation.sync/WatcherHelpers/EventQueueOverflowException.cs @@ -20,7 +20,9 @@ public EventQueueOverflowException(string message) /// /// protected EventQueueOverflowException(SerializationInfo info, StreamingContext context) +#pragma warning disable SYSLIB0051 : base(info, context) +#pragma warning restore SYSLIB0051 { } } diff --git a/starsky/starsky.foundation.sync/WatcherHelpers/SyncWatcherConnector.cs b/starsky/starsky.foundation.sync/WatcherHelpers/SyncWatcherConnector.cs index c4bb0d9dc1..ddf0c942a2 100644 --- a/starsky/starsky.foundation.sync/WatcherHelpers/SyncWatcherConnector.cs +++ b/starsky/starsky.foundation.sync/WatcherHelpers/SyncWatcherConnector.cs @@ -162,7 +162,7 @@ private async Task> SyncTaskInternal(Tuple p.FileName).ToArray()) + " ~ " + diff --git a/starsky/starsky.foundation.sync/starsky.foundation.sync.csproj b/starsky/starsky.foundation.sync/starsky.foundation.sync.csproj index 0ba8a005f8..1eaa9c7eec 100644 --- a/starsky/starsky.foundation.sync/starsky.foundation.sync.csproj +++ b/starsky/starsky.foundation.sync/starsky.foundation.sync.csproj @@ -1,7 +1,7 @@ - net6.0 + net8.0 {8cd2e452-ab62-446c-ad42-7d90b63d1b81} 0.5.14 @@ -19,7 +19,7 @@ - + diff --git a/starsky/starsky.foundation.thumbnailgeneration/Helpers/Thumbnail.cs b/starsky/starsky.foundation.thumbnailgeneration/Helpers/Thumbnail.cs index 2d06e39d80..4bbf4c9d83 100644 --- a/starsky/starsky.foundation.thumbnailgeneration/Helpers/Thumbnail.cs +++ b/starsky/starsky.foundation.thumbnailgeneration/Helpers/Thumbnail.cs @@ -153,7 +153,7 @@ private async Task> CreateThumbInternal(strin var largeImageResult = await CreateLargestImageFromSource(fileHash, largeThumbnailHash, subPath, thumbnailToSourceSize); // when all images are already created - if ( !thumbnailFromThumbnailUpdateList.Any() ) + if ( thumbnailFromThumbnailUpdateList.Count == 0 ) { return ThumbnailNameHelper.GeneratedThumbnailSizes.Select(size => new GenerationResultModel { @@ -260,7 +260,7 @@ void AddFileNames(ThumbnailSize size) internal async Task WriteErrorMessageToBlockLog(string subPath, string resizeMessage) { - var stream = PlainTextFileHelper.StringToStream("Thumbnail error " + resizeMessage); + var stream = StringToStreamHelper.StringToStream("Thumbnail error " + resizeMessage); await _iStorage.WriteStreamAsync(stream, GetErrorLogItemFullPath(subPath)); } @@ -424,10 +424,7 @@ internal static Task SaveThumbnailImageFormat(Image image, ExtensionRolesHelper.ImageFormat imageFormat, MemoryStream outputStream) { - if ( outputStream == null ) - { - throw new ArgumentNullException(nameof(outputStream)); - } + ArgumentNullException.ThrowIfNull(outputStream); return SaveThumbnailImageFormatInternal(image, imageFormat, outputStream); } diff --git a/starsky/starsky.foundation.thumbnailgeneration/starsky.foundation.thumbnailgeneration.csproj b/starsky/starsky.foundation.thumbnailgeneration/starsky.foundation.thumbnailgeneration.csproj index 7916771c22..b8bb2eaa3a 100644 --- a/starsky/starsky.foundation.thumbnailgeneration/starsky.foundation.thumbnailgeneration.csproj +++ b/starsky/starsky.foundation.thumbnailgeneration/starsky.foundation.thumbnailgeneration.csproj @@ -1,7 +1,7 @@ - net6.0 + net8.0 {4b3990c9-171b-4d53-a821-f458e8ac072f} Full @@ -16,7 +16,7 @@ - + diff --git a/starsky/starsky.foundation.thumbnailmeta/starsky.foundation.thumbnailmeta.csproj b/starsky/starsky.foundation.thumbnailmeta/starsky.foundation.thumbnailmeta.csproj index 86be0a274f..cb0cf00180 100644 --- a/starsky/starsky.foundation.thumbnailmeta/starsky.foundation.thumbnailmeta.csproj +++ b/starsky/starsky.foundation.thumbnailmeta/starsky.foundation.thumbnailmeta.csproj @@ -1,7 +1,7 @@ - net6.0 + net8.0 {88e70822-ae50-4fc5-9384-a8726b70849a} Full @@ -20,7 +20,7 @@ - + diff --git a/starsky/starsky.foundation.webtelemetry/Extensions/OpenTelemetryExtension.cs b/starsky/starsky.foundation.webtelemetry/Extensions/OpenTelemetryExtension.cs index 3fb7a94de9..d231be561b 100644 --- a/starsky/starsky.foundation.webtelemetry/Extensions/OpenTelemetryExtension.cs +++ b/starsky/starsky.foundation.webtelemetry/Extensions/OpenTelemetryExtension.cs @@ -23,6 +23,11 @@ public static class OpenTelemetryExtension public static void AddOpenTelemetryMonitoring( this IServiceCollection services, AppSettings appSettings) { + if ( appSettings.OpenTelemetry == null ) + { + return; + } + var telemetryBuilder = services.AddOpenTelemetry() .ConfigureResource(resource => resource.AddService( serviceNamespace: appSettings.OpenTelemetry.GetServiceName(), @@ -63,10 +68,10 @@ public static void AddOpenTelemetryMonitoring( return; } + // AddHttpClientInstrumentation from OpenTelemetry.Instrumentation.Http telemetryBuilder.WithMetrics(metrics => metrics.AddAspNetCoreInstrumentation() .AddRuntimeInstrumentation() - .AddHttpClientInstrumentation() .AddOtlpExporter( o => { diff --git a/starsky/starsky.foundation.webtelemetry/Helpers/SetupLogging.cs b/starsky/starsky.foundation.webtelemetry/Helpers/SetupLogging.cs index 040e8ce6aa..e222ab25f6 100644 --- a/starsky/starsky.foundation.webtelemetry/Helpers/SetupLogging.cs +++ b/starsky/starsky.foundation.webtelemetry/Helpers/SetupLogging.cs @@ -21,11 +21,10 @@ public static void AddTelemetryLogging(this IServiceCollection services, AppSett logging.ClearProviders(); logging.AddConsole(); - if ( !string.IsNullOrEmpty(appSettings.OpenTelemetry.LogsEndpoint) ) + if ( !string.IsNullOrEmpty(appSettings.OpenTelemetry?.LogsEndpoint) ) { logging.AddOpenTelemetry(builder => builder.AddOtlpExporter( - "logging", options => { options.Protocol = OtlpExportProtocol.HttpProtobuf; diff --git a/starsky/starsky.foundation.webtelemetry/starsky.foundation.webtelemetry.csproj b/starsky/starsky.foundation.webtelemetry/starsky.foundation.webtelemetry.csproj index cc8776c41b..717dae6bba 100644 --- a/starsky/starsky.foundation.webtelemetry/starsky.foundation.webtelemetry.csproj +++ b/starsky/starsky.foundation.webtelemetry/starsky.foundation.webtelemetry.csproj @@ -1,7 +1,7 @@ - net6.0 + net8.0 {3b84ed27-fef0-4c2b-8cb5-04b7fdb613f8} Full @@ -21,17 +21,16 @@ + - + - - - - - - + + + + diff --git a/starsky/starsky.foundation.worker/ThumbnailServices/Exceptions/ToManyUsageException.cs b/starsky/starsky.foundation.worker/ThumbnailServices/Exceptions/ToManyUsageException.cs index 580cd95e8e..dbc79693ef 100644 --- a/starsky/starsky.foundation.worker/ThumbnailServices/Exceptions/ToManyUsageException.cs +++ b/starsky/starsky.foundation.worker/ThumbnailServices/Exceptions/ToManyUsageException.cs @@ -22,10 +22,12 @@ public ToManyUsageException(string message) /// /// /// +#pragma warning disable SYSLIB0051 protected ToManyUsageException(SerializationInfo info, StreamingContext context) : base(info, context) { } +#pragma warning restore SYSLIB0051 } } diff --git a/starsky/starsky.foundation.worker/starsky.foundation.worker.csproj b/starsky/starsky.foundation.worker/starsky.foundation.worker.csproj index 9c9ac5986b..7bc6a8e176 100644 --- a/starsky/starsky.foundation.worker/starsky.foundation.worker.csproj +++ b/starsky/starsky.foundation.worker/starsky.foundation.worker.csproj @@ -1,7 +1,7 @@ - net6.0 + net8.0 {240fbcdb-4379-4bbe-b154-eb4f87504d9e} Full @@ -16,7 +16,7 @@ - + diff --git a/starsky/starsky.foundation.writemeta/Helpers/ExifTool.cs b/starsky/starsky.foundation.writemeta/Helpers/ExifTool.cs index ee1566a1df..e3f4d60a71 100644 --- a/starsky/starsky.foundation.writemeta/Helpers/ExifTool.cs +++ b/starsky/starsky.foundation.writemeta/Helpers/ExifTool.cs @@ -63,7 +63,7 @@ public async Task> WriteTagsAndRenameThumbnailAsync(s // Need to Dispose for Windows inputStream.Close(); - if ( stream.Length <= 15 && (await PlainTextFileHelper.StreamToStringAsync(stream)) + if ( stream.Length <= 15 && (await StreamToStringHelper.StreamToStringAsync(stream)) .Contains("Fake ExifTool", StringComparison.InvariantCultureIgnoreCase)) { _logger.LogError($"[WriteTagsAndRenameThumbnailAsync] Fake Exiftool detected {subPath}"); @@ -158,18 +158,18 @@ public async Task RunProcessAsync(string optionsArgs) try { - + // run with pipes - var cmd = Default.Run(_appSettings.ExifToolPath, options: opts => { + var cmd = Default.Run(_appSettings.ExifToolPath, options: opts => + { opts.StartInfo(si => si.Arguments = args); - }) < _src > ms; - - var result = await cmd.Task.ConfigureAwait(false); - - // option without pipes: - // await cmd.StandardInput.PipeFromAsync(_src).ConfigureAwait(false) await - // cmd.StandardOutput.BaseStream.CopyToAsync(ms).ConfigureAwait(false) - + }); + + cmd.RedirectFrom(_src); + cmd.RedirectTo(ms); + + var result = await cmd.Task; + if ( _appSettings.IsVerbose() ) _logger.LogInformation($"[RunProcessAsync] ~ exifTool {optionsArgs} " + $"run with result: {result.Success} ~ "); diff --git a/starsky/starsky.foundation.writemeta/JsonService/FileIndexItemJsonParser.cs b/starsky/starsky.foundation.writemeta/JsonService/FileIndexItemJsonParser.cs index ef0c768412..2f8b83be01 100644 --- a/starsky/starsky.foundation.writemeta/JsonService/FileIndexItemJsonParser.cs +++ b/starsky/starsky.foundation.writemeta/JsonService/FileIndexItemJsonParser.cs @@ -35,7 +35,7 @@ public async Task WriteAsync(FileIndexItem fileIndexItem) fileIndexItem.FileName); await _iStorage.WriteStreamAsync( - PlainTextFileHelper.StringToStream(jsonOutput), jsonSubPath); + StringToStreamHelper.StringToStream(jsonOutput), jsonSubPath); } /// @@ -43,13 +43,13 @@ await _iStorage.WriteStreamAsync( /// /// data object /// data - public FileIndexItem Read(FileIndexItem fileIndexItem) + public async Task ReadAsync(FileIndexItem fileIndexItem) { var jsonSubPath = JsonSidecarLocation.JsonLocation(fileIndexItem.ParentDirectory, fileIndexItem.FileName); // when sidecar file does not exist if ( !_iStorage.ExistFile(jsonSubPath) ) return fileIndexItem; - var returnContainer = new DeserializeJson(_iStorage).Read(jsonSubPath); + var returnContainer = await new DeserializeJson(_iStorage).ReadAsync(jsonSubPath); // in case of invalid json returnContainer.Item ??= fileIndexItem; diff --git a/starsky/starsky.foundation.writemeta/Services/ExifCopy.cs b/starsky/starsky.foundation.writemeta/Services/ExifCopy.cs index a8ab4314e8..1636f01dc1 100644 --- a/starsky/starsky.foundation.writemeta/Services/ExifCopy.cs +++ b/starsky/starsky.foundation.writemeta/Services/ExifCopy.cs @@ -18,7 +18,8 @@ public sealed class ExifCopy private readonly IReadMeta _readMeta; private readonly ExifToolCmdHelper _exifToolCmdHelper; - public ExifCopy(IStorage iStorage, IStorage thumbnailStorage, IExifTool exifTool, IReadMeta readMeta, IThumbnailQuery thumbnailQuery) + public ExifCopy(IStorage iStorage, IStorage thumbnailStorage, IExifTool exifTool, + IReadMeta readMeta, IThumbnailQuery thumbnailQuery) { _iStorage = iStorage; _readMeta = readMeta; @@ -39,7 +40,7 @@ public void XmpCreate(string xmpPath) { if ( _iStorage.ExistFile(xmpPath) ) return; - var plainTextStream = PlainTextFileHelper.StringToStream(XmpStartContent); + var plainTextStream = StringToStreamHelper.StringToStream(XmpStartContent); _iStorage.WriteStream(plainTextStream, xmpPath); } @@ -76,10 +77,10 @@ public async Task XmpSync(string subPath) /// internal async Task CopyExifPublish(string fromSubPath, string toSubPath) { - var updateModel = _readMeta.ReadExifAndXmpFromFile(fromSubPath); + var updateModel = await _readMeta.ReadExifAndXmpFromFileAsync(fromSubPath); var comparedNames = FileIndexCompareHelper.Compare(new FileIndexItem(), updateModel); comparedNames.Add(nameof(FileIndexItem.Software)); - updateModel.SetFilePath(toSubPath); + updateModel!.SetFilePath(toSubPath); return (await _exifToolCmdHelper.UpdateAsync(updateModel, comparedNames, true, false)).Item1; } diff --git a/starsky/starsky.foundation.writemeta/starsky.foundation.writemeta.csproj b/starsky/starsky.foundation.writemeta/starsky.foundation.writemeta.csproj index c61b0abaaa..4e90605c44 100644 --- a/starsky/starsky.foundation.writemeta/starsky.foundation.writemeta.csproj +++ b/starsky/starsky.foundation.writemeta/starsky.foundation.writemeta.csproj @@ -1,7 +1,7 @@ - net6.0 + net8.0 {bc265f9e-e0f1-46da-9c40-0babe44de9ee} Full @@ -10,7 +10,7 @@ - + diff --git a/starsky/starsky.sln b/starsky/starsky.sln index 8ee10ff2ff..5fd79f26ca 100644 --- a/starsky/starsky.sln +++ b/starsky/starsky.sln @@ -166,6 +166,8 @@ Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "starsky.foundation.native", EndProject Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "starsky.feature.trash", "starsky.feature.trash\starsky.feature.trash.csproj", "{A62C129C-5D0C-4A0A-B5AA-261E041FF55D}" EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "starsky.feature.settings", "starsky.feature.settings\starsky.feature.settings.csproj", "{F2C4C9DE-22A1-4B34-AC1D-0F08353E0742}" +EndProject Global GlobalSection(SolutionConfigurationPlatforms) = preSolution Debug|Any CPU = Debug|Any CPU @@ -368,6 +370,10 @@ Global {A62C129C-5D0C-4A0A-B5AA-261E041FF55D}.Debug|Any CPU.Build.0 = Debug|Any CPU {A62C129C-5D0C-4A0A-B5AA-261E041FF55D}.Release|Any CPU.ActiveCfg = Release|Any CPU {A62C129C-5D0C-4A0A-B5AA-261E041FF55D}.Release|Any CPU.Build.0 = Release|Any CPU + {F2C4C9DE-22A1-4B34-AC1D-0F08353E0742}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {F2C4C9DE-22A1-4B34-AC1D-0F08353E0742}.Debug|Any CPU.Build.0 = Debug|Any CPU + {F2C4C9DE-22A1-4B34-AC1D-0F08353E0742}.Release|Any CPU.ActiveCfg = Release|Any CPU + {F2C4C9DE-22A1-4B34-AC1D-0F08353E0742}.Release|Any CPU.Build.0 = Release|Any CPU EndGlobalSection GlobalSection(SolutionProperties) = preSolution HideSolutionNode = FALSE @@ -428,5 +434,6 @@ Global {35222B74-4D4C-4848-A5E3-7C3E084FB2FD} = {E638B7CE-3CAC-4772-8D3B-49A202D0975A} {0072F697-4E18-4B5F-80DF-530361D3E847} = {1C1EB4A5-08D0-4014-AE1F-962642A4E5D3} {A62C129C-5D0C-4A0A-B5AA-261E041FF55D} = {4B9276C3-651E-48D3-B3A7-3F4D74F3D01A} + {F2C4C9DE-22A1-4B34-AC1D-0F08353E0742} = {4B9276C3-651E-48D3-B3A7-3F4D74F3D01A} EndGlobalSection EndGlobal diff --git a/starsky/starsky.sln.DotSettings b/starsky/starsky.sln.DotSettings index 391011bceb..e416a4928a 100644 --- a/starsky/starsky.sln.DotSettings +++ b/starsky/starsky.sln.DotSettings @@ -11,6 +11,7 @@ True True True + True True True True diff --git a/starsky/starsky/Controllers/AppSettingsController.cs b/starsky/starsky/Controllers/AppSettingsController.cs index eb866b3fe5..1e7ada77c2 100644 --- a/starsky/starsky/Controllers/AppSettingsController.cs +++ b/starsky/starsky/Controllers/AppSettingsController.cs @@ -6,6 +6,7 @@ using Microsoft.AspNetCore.Authorization; using Microsoft.AspNetCore.Mvc; using starsky.Attributes; +using starsky.feature.settings.Interfaces; using starsky.foundation.accountmanagement.Services; using starsky.foundation.platform.Helpers; using starsky.foundation.platform.JsonConverter; @@ -20,12 +21,12 @@ namespace starsky.Controllers public sealed class AppSettingsController : Controller { private readonly AppSettings _appSettings; - private readonly IStorage _hostStorage; + private readonly IUpdateAppSettingsByPath _updateAppSettingsByPath; - public AppSettingsController(AppSettings appSettings, ISelectorStorage selectorStorage) + public AppSettingsController(AppSettings appSettings, IUpdateAppSettingsByPath updateAppSettingsByPath) { _appSettings = appSettings; - _hostStorage = selectorStorage.Get( SelectorStorage.StorageServices.HostFilesystem); + _updateAppSettingsByPath = updateAppSettingsByPath; } /// @@ -61,38 +62,16 @@ public IActionResult Env() [Permission(UserManager.AppPermissions.AppSettingsWrite)] public async Task UpdateAppSettings(AppSettingsTransferObject appSettingTransferObject ) { - if ( !string.IsNullOrEmpty(appSettingTransferObject.StorageFolder)) - { - if ( !_appSettings.StorageFolderAllowEdit ) - { - Response.StatusCode = 403; - return Content("There is an Environment variable set so you can't update it here"); - } - if (!_hostStorage.ExistFolder(appSettingTransferObject.StorageFolder) ) - { - return NotFound("Location on disk not found"); - } - } - - // To update current session - AppSettingsCompareHelper.Compare(_appSettings, appSettingTransferObject); + var result = await _updateAppSettingsByPath.UpdateAppSettingsAsync( + appSettingTransferObject); - // should not forget app: prefix - var jsonOutput = JsonSerializer.Serialize(new { app = appSettingTransferObject }, new JsonSerializerOptions + if ( !result.IsError ) { - WriteIndented = true, - Converters = - { - new JsonBoolQuotedConverter(), - }, - DefaultIgnoreCondition = JsonIgnoreCondition.WhenWritingNull, - }); - - await _hostStorage.WriteStreamAsync( - PlainTextFileHelper.StringToStream(jsonOutput), - _appSettings.AppSettingsPath); + return Env(); + } - return Env(); + Response.StatusCode = result.StatusCode; + return Content(result.Message); } } } diff --git a/starsky/starsky/Controllers/MetaInfoController.cs b/starsky/starsky/Controllers/MetaInfoController.cs index aa86dc1ea7..a2ee4d79e3 100644 --- a/starsky/starsky/Controllers/MetaInfoController.cs +++ b/starsky/starsky/Controllers/MetaInfoController.cs @@ -1,5 +1,6 @@ using System.Collections.Generic; using System.Linq; +using System.Threading.Tasks; using Microsoft.AspNetCore.Authorization; using Microsoft.AspNetCore.Mvc; using starsky.feature.metaupdate.Interfaces; @@ -33,11 +34,11 @@ public MetaInfoController(IMetaInfo metaInfo) [ProducesResponseType(typeof(List),404)] [ProducesResponseType(typeof(List),203)] [Produces("application/json")] - public IActionResult Info(string f, bool collections = true) + public async Task InfoAsync(string f, bool collections = true) { var inputFilePaths = PathHelper.SplitInputFilePaths(f).ToList(); - var fileIndexResultsList = _metaInfo.GetInfo(inputFilePaths, collections); + var fileIndexResultsList = await _metaInfo.GetInfoAsync(inputFilePaths, collections); // returns read only if (fileIndexResultsList.TrueForAll(p => p.Status == FileIndexItem.ExifStatus.ReadOnly)) diff --git a/starsky/starsky/Controllers/PublishController.cs b/starsky/starsky/Controllers/PublishController.cs index a450f13195..2e54339785 100644 --- a/starsky/starsky/Controllers/PublishController.cs +++ b/starsky/starsky/Controllers/PublishController.cs @@ -82,7 +82,7 @@ public async Task PublishCreateAsync(string f, string itemName, } var inputFilePaths = PathHelper.SplitInputFilePaths(f).ToList(); - var info = _metaInfo.GetInfo(inputFilePaths, false); + var info = await _metaInfo.GetInfoAsync(inputFilePaths, false); if ( info.TrueForAll(p => p.Status != FileIndexItem.ExifStatus.Ok && p.Status != FileIndexItem.ExifStatus.ReadOnly) ) diff --git a/starsky/starsky/Controllers/UploadController.cs b/starsky/starsky/Controllers/UploadController.cs index 0e8554e55f..14d440c066 100644 --- a/starsky/starsky/Controllers/UploadController.cs +++ b/starsky/starsky/Controllers/UploadController.cs @@ -263,7 +263,7 @@ public async Task UploadToFolderSidecarFile() var importedList = new List(); foreach ( var tempImportSinglePath in tempImportPaths ) { - var data = await PlainTextFileHelper.StreamToStringAsync( + var data = await StreamToStringHelper.StreamToStringAsync( _iHostStorage.ReadStream(tempImportSinglePath)); if ( !IsValidXml(data) ) continue; @@ -287,7 +287,7 @@ public async Task UploadToFolderSidecarFile() _logger.LogInformation($"delete {tempImportSinglePath} is {deleteStatus}"); } - if ( !importedList.Any() ) + if ( importedList.Count == 0 ) { Response.StatusCode = 415; } diff --git a/starsky/starsky/Helpers/SwaggerExportHelper.cs b/starsky/starsky/Helpers/SwaggerExportHelper.cs index 9f55f2756c..0687903fec 100644 --- a/starsky/starsky/Helpers/SwaggerExportHelper.cs +++ b/starsky/starsky/Helpers/SwaggerExportHelper.cs @@ -77,7 +77,7 @@ public bool Add03AppExport(AppSettings appSettings, ISelectorStorage selectorSto var storage = selectorStorage.Get(SelectorStorage.StorageServices.HostFilesystem); storage.FileDelete(swaggerJsonFullPath); - storage.WriteStream(PlainTextFileHelper.StringToStream(swaggerJsonText), + storage.WriteStream(StringToStreamHelper.StringToStream(swaggerJsonText), swaggerJsonFullPath); _logger?.LogInformation($"app__addSwaggerExport {swaggerJsonFullPath}"); diff --git a/starsky/starsky/cleanup-build-tools.sh b/starsky/starsky/cleanup-build-tools.sh index 8b7a024ba8..8460de813a 100755 --- a/starsky/starsky/cleanup-build-tools.sh +++ b/starsky/starsky/cleanup-build-tools.sh @@ -15,6 +15,26 @@ else fi PARENT_DIR="$(dirname "$SCRIPT_DIR")" +# eg starsky/starsky + +## docs +GIT_ROOT_DIR="$(dirname "$PARENT_DIR")" + +if [ -d "$GIT_ROOT_DIR""/documentation/bin" ] +then + rm -rf "$GIT_ROOT_DIR""/documentation/bin" +else + echo "Skip: remove documentation bin. -> ""$GIT_ROOT_DIR""/documentation/bin" +fi + +if [ -d "$GIT_ROOT_DIR""/documentation/obj" ] +then + rm -rf "$GIT_ROOT_DIR""/documentation/obj" +else + echo "Skip: remove documentation obj. -> ""$GIT_ROOT_DIR""/documentation/obj" +fi +## end docs + if [ -d "$PARENT_DIR""/TestResults" ] then diff --git a/starsky/starsky/starsky.csproj b/starsky/starsky/starsky.csproj index 94959dfc7e..b07de4253c 100644 --- a/starsky/starsky/starsky.csproj +++ b/starsky/starsky/starsky.csproj @@ -1,7 +1,7 @@  - net6.0 - 6.0.25 + net8.0 + 8.0.1 An attempt to create a database driven photo library 0.5.14 @@ -54,8 +54,8 @@ 0 - - + + @@ -141,6 +141,7 @@ + diff --git a/starsky/starskyadmincli/starskyadmincli.csproj b/starsky/starskyadmincli/starskyadmincli.csproj index af3a7dade0..e5adbe78bd 100644 --- a/starsky/starskyadmincli/starskyadmincli.csproj +++ b/starsky/starskyadmincli/starskyadmincli.csproj @@ -2,10 +2,10 @@ Exe - net6.0 + net8.0 {dcf1f6cb-1c65-4394-bef7-cccc2967b56c} - 6.0.25 + 8.0.1 Full 0.5.14 diff --git a/starsky/starskycore/starskycore.csproj b/starsky/starskycore/starskycore.csproj index a5fe1dd092..f1befdad7c 100644 --- a/starsky/starskycore/starskycore.csproj +++ b/starsky/starskycore/starskycore.csproj @@ -1,7 +1,7 @@  - net6.0 + net8.0 An attempt to create a database driven photo library 0.5.14 true diff --git a/starsky/starskydemoseedcli/starskydemoseedcli.csproj b/starsky/starskydemoseedcli/starskydemoseedcli.csproj index 9625e7e5bf..983834ebae 100644 --- a/starsky/starskydemoseedcli/starskydemoseedcli.csproj +++ b/starsky/starskydemoseedcli/starskydemoseedcli.csproj @@ -1,11 +1,11 @@ Exe - net6.0 + net8.0 enable {215a3302-a418-4148-8d20-1127e27c3dae} - 6.0.25 + 8.0.1 Full 0.5.14 diff --git a/starsky/starskygeocli/starskygeocli.csproj b/starsky/starskygeocli/starskygeocli.csproj index d8ef0f69f1..43446b1079 100644 --- a/starsky/starskygeocli/starskygeocli.csproj +++ b/starsky/starskygeocli/starskygeocli.csproj @@ -1,11 +1,11 @@  Exe - net6.0 + net8.0 enable {a030c158-2f79-4317-a9f9-bdd46d66d1d8} - 6.0.25 + 8.0.1 Full 0.5.14 diff --git a/starsky/starskyimportercli/starskyimportercli.csproj b/starsky/starskyimportercli/starskyimportercli.csproj index 804088a2c7..3a24aeb23c 100644 --- a/starsky/starskyimportercli/starskyimportercli.csproj +++ b/starsky/starskyimportercli/starskyimportercli.csproj @@ -1,10 +1,10 @@  Exe - net6.0 + net8.0 {23e4ea86-970a-4de1-badc-8d7e9d3d4dd6} - 6.0.25 + 8.0.1 Full 0.5.14 diff --git a/starsky/starskysynchronizecli/starskysynchronizecli.csproj b/starsky/starskysynchronizecli/starskysynchronizecli.csproj index 81c472535b..e799d4a867 100644 --- a/starsky/starskysynchronizecli/starskysynchronizecli.csproj +++ b/starsky/starskysynchronizecli/starskysynchronizecli.csproj @@ -2,10 +2,10 @@ Exe - net6.0 + net8.0 {7e1136a7-cc43-49d2-91d3-48e557f0fb66} - 6.0.25 + 8.0.1 starskysynchronizecli 0.5.14 diff --git a/starsky/starskytest/Controllers/AppSettingsControllerTest.cs b/starsky/starskytest/Controllers/AppSettingsControllerTest.cs index 8f9f32c3e6..177d824484 100644 --- a/starsky/starskytest/Controllers/AppSettingsControllerTest.cs +++ b/starsky/starskytest/Controllers/AppSettingsControllerTest.cs @@ -6,11 +6,11 @@ using Microsoft.AspNetCore.Mvc; using Microsoft.VisualStudio.TestTools.UnitTesting; using starsky.Controllers; +using starsky.feature.settings.Models; +using starsky.feature.settings.Services; using starsky.foundation.platform.Helpers; using starsky.foundation.platform.Models; -using starsky.foundation.platform.Services; using starsky.foundation.storage.Helpers; -using starsky.foundation.storage.Storage; using starskytest.FakeMocks; namespace starskytest.Controllers @@ -22,7 +22,7 @@ public sealed class AppSettingsControllerTest [TestMethod] public void ENV_StarskyTestEnv() { - var controller = new AppSettingsController(new AppSettings(),new FakeSelectorStorage()); + var controller = new AppSettingsController(new AppSettings(),new FakeIUpdateAppSettingsByPath()); var actionResult = controller.Env() as JsonResult; var resultAppSettings = actionResult?.Value as AppSettings; Assert.AreEqual("Starsky", resultAppSettings?.Name); @@ -32,19 +32,23 @@ public void ENV_StarskyTestEnv() public void ENV_StarskyTestEnv_ForceHtml() { var controller = new AppSettingsController(new AppSettings(), - new FakeSelectorStorage()); + new FakeIUpdateAppSettingsByPath()); controller.ControllerContext.HttpContext = new DefaultHttpContext(); - controller.ControllerContext.HttpContext.Request.Headers.Add("x-force-html", "true"); + controller.ControllerContext.HttpContext.Request.Headers.Append("x-force-html", "true"); var actionResult = controller.Env() as JsonResult; var resultAppSettings = actionResult?.Value as AppSettings; Assert.AreEqual("Starsky", resultAppSettings?.Name); - Assert.AreEqual("text/html; charset=utf-8", controller.ControllerContext.HttpContext.Response.Headers.ContentType.ToString()); + Assert.AreEqual("text/html; charset=utf-8", + controller.ControllerContext.HttpContext.Response.Headers.ContentType.ToString()); } [TestMethod] public async Task UpdateAppSettings_Verbose() { - var controller = new AppSettingsController(new AppSettings(), new FakeSelectorStorage()); + var appSettings = new AppSettings(); + var storage = new FakeIStorage(new List { "/" }); + var controller = new AppSettingsController(appSettings, new UpdateAppSettingsByPath(appSettings,new FakeSelectorStorage(storage))); + var actionResult = await controller.UpdateAppSettings(new AppSettingsTransferObject {Verbose = true}) as JsonResult; var result = actionResult?.Value as AppSettings; Assert.IsTrue(result?.Verbose); @@ -53,29 +57,34 @@ public async Task UpdateAppSettings_Verbose() [TestMethod] public async Task UpdateAppSettings_StorageFolder() { - var storage = new FakeIStorage(new List { "test" }); - Environment.SetEnvironmentVariable("app__storageFolder", string.Empty); + var appSettings = new AppSettings(); + var controller = new AppSettingsController(appSettings, new UpdateAppSettingsByPath(appSettings, + new FakeSelectorStorage(new FakeIStorage(new List{ $"{Path.DirectorySeparatorChar}test"})))); - var controller = new AppSettingsController(new AppSettings(), new FakeSelectorStorage(storage)); + controller.ControllerContext.HttpContext = new DefaultHttpContext(); + var actionResult = await controller.UpdateAppSettings(new AppSettingsTransferObject { - Verbose = true, StorageFolder = "test" + Verbose = true, + StorageFolder = $"{Path.DirectorySeparatorChar}test" }) as JsonResult; + var result = actionResult?.Value as AppSettings; Assert.IsTrue(result?.Verbose); - Assert.AreEqual(PathHelper.AddBackslash("test"),result?.StorageFolder); + Assert.AreEqual(Path.DirectorySeparatorChar + PathHelper.AddBackslash("test"),result?.StorageFolder); } [TestMethod] public async Task UpdateAppSettingsTest_IgnoreWhenEnvIsSet() { - var storage = new FakeIStorage(new List { "test" }); - Environment.SetEnvironmentVariable("app__storageFolder", "any_value"); var appSettings = new AppSettings(); - var controller = new AppSettingsController(appSettings, new FakeSelectorStorage(storage)); + var controller = new AppSettingsController(appSettings, new FakeIUpdateAppSettingsByPath(new UpdateAppSettingsStatusModel + { + StatusCode = 403 + })); controller.ControllerContext.HttpContext = new DefaultHttpContext(); await controller.UpdateAppSettings( new AppSettingsTransferObject @@ -89,20 +98,20 @@ await controller.UpdateAppSettings( [TestMethod] public async Task UpdateAppSettingsTest_DirNotFound() { - var storage = new FakeIStorage(new List { "test" }); - - Environment.SetEnvironmentVariable("app__storageFolder",string.Empty); - var appSettings = new AppSettings(); - var controller = new AppSettingsController(appSettings, new FakeSelectorStorage(storage)); + var controller = new AppSettingsController(appSettings, new FakeIUpdateAppSettingsByPath(new UpdateAppSettingsStatusModel + { + StatusCode = 404 + })); controller.ControllerContext.HttpContext = new DefaultHttpContext(); - var actionResult = (await controller.UpdateAppSettings( + + await controller.UpdateAppSettings( new AppSettingsTransferObject { StorageFolder = "not_found" - })) as NotFoundObjectResult; + }); - Assert.AreEqual(404, actionResult?.StatusCode); + Assert.AreEqual(404, controller.Response.StatusCode); } [TestMethod] @@ -115,7 +124,7 @@ public async Task UpdateAppSettingsTest_StorageFolder_JsonCheck() { AppSettingsPath = $"{Path.DirectorySeparatorChar}temp{Path.DirectorySeparatorChar}appsettings.json" }; - var controller = new AppSettingsController(appSettings, new FakeSelectorStorage(storage)); + var controller = new AppSettingsController(appSettings, new UpdateAppSettingsByPath(appSettings,new FakeSelectorStorage(storage))); await controller.UpdateAppSettings( new AppSettingsTransferObject { @@ -124,7 +133,7 @@ await controller.UpdateAppSettings( Assert.IsTrue(storage.ExistFile(appSettings.AppSettingsPath)); - var jsonContent= await PlainTextFileHelper.StreamToStringAsync( + var jsonContent= await StreamToStringHelper.StreamToStringAsync( storage.ReadStream(appSettings.AppSettingsPath)); Assert.IsTrue(jsonContent.Contains("app\": {")); @@ -134,7 +143,10 @@ await controller.UpdateAppSettings( [TestMethod] public async Task UpdateAppSettings_UseLocalDesktopUi() { - var controller = new AppSettingsController(new AppSettings(), new FakeSelectorStorage()); + var appSettings = new AppSettings(); + var storage = new FakeIStorage(new List { "/" }); + var controller = new AppSettingsController(appSettings, new UpdateAppSettingsByPath(appSettings,new FakeSelectorStorage(storage))); + var actionResult = await controller.UpdateAppSettings(new AppSettingsTransferObject {UseLocalDesktopUi = true}) as JsonResult; var result = actionResult?.Value as AppSettings; Assert.IsTrue(result?.UseLocalDesktopUi); @@ -143,7 +155,10 @@ public async Task UpdateAppSettings_UseLocalDesktopUi() [TestMethod] public async Task UpdateAppSettings_UseSystemTrash() { - var controller = new AppSettingsController(new AppSettings(), new FakeSelectorStorage()); + var appSettings = new AppSettings(); + var storage = new FakeIStorage(new List { "/" }); + var controller = new AppSettingsController(appSettings, new UpdateAppSettingsByPath(appSettings,new FakeSelectorStorage(storage))); + var actionResult = await controller.UpdateAppSettings(new AppSettingsTransferObject {UseSystemTrash = true}) as JsonResult; var result = actionResult?.Value as AppSettings; Assert.IsTrue(result?.UseSystemTrash); @@ -153,7 +168,9 @@ public async Task UpdateAppSettings_UseSystemTrash() public async Task UpdateAppSettings_Verbose_IgnoreSystemTrashValue() { var appSettings = new AppSettings(); - var controller = new AppSettingsController(appSettings, new FakeSelectorStorage()); + var storage = new FakeIStorage(new List { "/" }); + var controller = new AppSettingsController(appSettings, new UpdateAppSettingsByPath(appSettings,new FakeSelectorStorage(storage))); + var actionResult = await controller.UpdateAppSettings(new AppSettingsTransferObject {Verbose = true}) as JsonResult; var result = actionResult?.Value as AppSettings; diff --git a/starsky/starskytest/Controllers/CacheIndexControllerTest.cs b/starsky/starskytest/Controllers/CacheIndexControllerTest.cs index 7d9de67772..da9cab487c 100644 --- a/starsky/starskytest/Controllers/CacheIndexControllerTest.cs +++ b/starsky/starskytest/Controllers/CacheIndexControllerTest.cs @@ -29,7 +29,7 @@ namespace starskytest.Controllers [TestClass] public sealed class CacheIndexControllerTest { - private readonly IQuery _query; + private readonly Query _query; private readonly AppSettings _appSettings; private readonly ApplicationDbContext _context; @@ -56,7 +56,7 @@ public CacheIndexControllerTest() services.AddSingleton(new ConfigurationBuilder().Build()); // random config var createAnImage = new CreateAnImage(); - var dict = new Dictionary + var dict = new Dictionary { { "App:StorageFolder", createAnImage.BasePath }, { "App:ThumbnailTempFolder",createAnImage.BasePath }, diff --git a/starsky/starskytest/Controllers/ExportControllerTest.cs b/starsky/starskytest/Controllers/ExportControllerTest.cs index e6e9e1320d..3c0e1aefd5 100644 --- a/starsky/starskytest/Controllers/ExportControllerTest.cs +++ b/starsky/starskytest/Controllers/ExportControllerTest.cs @@ -15,7 +15,6 @@ using starsky.Controllers; using starsky.feature.export.Services; using starsky.foundation.database.Data; -using starsky.foundation.database.Interfaces; using starsky.foundation.database.Models; using starsky.foundation.database.Query; using starsky.foundation.platform.Extensions; @@ -39,7 +38,7 @@ namespace starskytest.Controllers [TestClass] public sealed class ExportControllerTest { - private readonly IQuery _query; + private readonly Query _query; private readonly AppSettings _appSettings; private readonly CreateAnImage _createAnImage; private readonly IUpdateBackgroundTaskQueue _bgTaskQueue; @@ -66,7 +65,6 @@ public ExportControllerTest() // Fake the readMeta output services.AddSingleton(); - // Inject Config helper services.AddSingleton(new ConfigurationBuilder().Build()); @@ -280,8 +278,8 @@ public async Task ExportControllerTest__ThumbFalse_AddXmpFile_CreateListToExport { var storage = new FakeIStorage(new List{"/"}, new List { - _appSettings.DatabasePathToFilePath("/test.dng", false), - _appSettings.DatabasePathToFilePath("/test.xmp", false), + _appSettings.DatabasePathToFilePath("/test.dng"), + _appSettings.DatabasePathToFilePath("/test.xmp"), "/test.dng", "/test.xmp" }); diff --git a/starsky/starskytest/Controllers/ImportControllerTest.cs b/starsky/starskytest/Controllers/ImportControllerTest.cs index 95b4ccc816..7c01a0d793 100644 --- a/starsky/starskytest/Controllers/ImportControllerTest.cs +++ b/starsky/starskytest/Controllers/ImportControllerTest.cs @@ -68,7 +68,7 @@ public ImportControllerTest() private static ControllerContext RequestWithFile() { var httpContext = new DefaultHttpContext(); - httpContext.Request.Headers.Add("Content-Type", "application/octet-stream"); + httpContext.Request.Headers.Append("Content-Type", "application/octet-stream"); httpContext.Request.Body = new MemoryStream(CreateAnImage.Bytes.ToArray()); var actionContext = new ActionContext(httpContext, new RouteData(), diff --git a/starsky/starskytest/Controllers/ImportThumbnailControllerTest.cs b/starsky/starskytest/Controllers/ImportThumbnailControllerTest.cs index adcb2b556f..1b7497586e 100644 --- a/starsky/starskytest/Controllers/ImportThumbnailControllerTest.cs +++ b/starsky/starskytest/Controllers/ImportThumbnailControllerTest.cs @@ -33,7 +33,7 @@ public ImportThumbnailControllerTest() private static ControllerContext RequestWithFile() { var httpContext = new DefaultHttpContext(); - httpContext.Request.Headers.Add("Content-Type", "application/octet-stream"); + httpContext.Request.Headers.Append("Content-Type", "application/octet-stream"); httpContext.Request.Body = new MemoryStream(CreateAnImage.Bytes.ToArray()); var actionContext = new ActionContext(httpContext, new RouteData(), diff --git a/starsky/starskytest/Controllers/MetaInfoControllerTest.cs b/starsky/starskytest/Controllers/MetaInfoControllerTest.cs index 76cacf11c3..48ce9df871 100644 --- a/starsky/starskytest/Controllers/MetaInfoControllerTest.cs +++ b/starsky/starskytest/Controllers/MetaInfoControllerTest.cs @@ -1,5 +1,6 @@ using System.Collections.Generic; using System.Linq; +using System.Threading.Tasks; using Microsoft.AspNetCore.Http; using Microsoft.AspNetCore.Mvc; using Microsoft.VisualStudio.TestTools.UnitTesting; @@ -32,35 +33,35 @@ public MetaInfoControllerTest() } [TestMethod] - public void Info_AllDataIncluded_WithFakeExifTool() + public async Task Info_AllDataIncluded_WithFakeExifTool() { var controller = new MetaInfoController(_metaInfo); - var jsonResult = controller.Info("/test.jpg", false) as JsonResult; - var listResult = jsonResult.Value as List; - Assert.AreEqual("test, sion", listResult.FirstOrDefault().Tags); - Assert.AreEqual(FileIndexItem.ExifStatus.Ok, listResult.FirstOrDefault().Status); + var jsonResult = await controller.InfoAsync("/test.jpg", false) as JsonResult; + var listResult = jsonResult?.Value as List; + Assert.AreEqual("test, sion", listResult?.FirstOrDefault()?.Tags); + Assert.AreEqual(FileIndexItem.ExifStatus.Ok, listResult?.FirstOrDefault()?.Status); } [TestMethod] - public void Info_SourceImageMissing_WithFakeExifTool() + public async Task Info_SourceImageMissing_WithFakeExifTool() { var controller = new MetaInfoController(_metaInfo); - var notFoundResult = controller.Info("/source_missing.jpg") as NotFoundObjectResult; - Assert.AreEqual(404, notFoundResult.StatusCode); + var notFoundResult = await controller.InfoAsync("/source_missing.jpg") as NotFoundObjectResult; + Assert.AreEqual(404, notFoundResult?.StatusCode); } [TestMethod] - public void ReadOnly() + public async Task ReadOnly() { var controller = new MetaInfoController(_metaInfo) { ControllerContext = {HttpContext = new DefaultHttpContext()} }; - var jsonResult = controller.Info("/readonly/image.jpg", false) as JsonResult; + var jsonResult = await controller.InfoAsync("/readonly/image.jpg", false) as JsonResult; - var listResult = jsonResult.Value as List; - Assert.AreEqual("test, sion", listResult.FirstOrDefault().Tags); - Assert.AreEqual(FileIndexItem.ExifStatus.ReadOnly, listResult.FirstOrDefault().Status); + var listResult = jsonResult?.Value as List; + Assert.AreEqual("test, sion", listResult?.FirstOrDefault()?.Tags); + Assert.AreEqual(FileIndexItem.ExifStatus.ReadOnly, listResult?.FirstOrDefault()?.Status); } } } diff --git a/starsky/starskytest/Controllers/ThumbnailControllerTest.cs b/starsky/starskytest/Controllers/ThumbnailControllerTest.cs index a048c3bd25..d2f2ee5aa6 100644 --- a/starsky/starskytest/Controllers/ThumbnailControllerTest.cs +++ b/starsky/starskytest/Controllers/ThumbnailControllerTest.cs @@ -28,7 +28,7 @@ namespace starskytest.Controllers [TestClass] public sealed class ThumbnailControllerTest { - private readonly IQuery _query; + private readonly Query _query; public ThumbnailControllerTest() { @@ -63,7 +63,7 @@ private async Task InsertSearchData() return item; } - private static IStorage ArrangeStorage() + private static FakeIStorage ArrangeStorage() { var folderPaths = new List{"/"}; var inputSubPaths = new List{"/test.jpg","/test2.jpg", "/test.dng"}; @@ -88,7 +88,7 @@ public async Task Thumbnail_CorruptImage_NoContentResult_Test() { // Arrange var storage = ArrangeStorage(); - var plainTextStream = PlainTextFileHelper.StringToStream("CorruptImage"); + var plainTextStream = StringToStreamHelper.StringToStream("CorruptImage"); await storage.WriteStreamAsync(plainTextStream, ThumbnailNameHelper.Combine( "hash-corrupt-image", ThumbnailSize.ExtraLarge)); diff --git a/starsky/starskytest/Controllers/ThumbnailGenerationControllerTest.cs b/starsky/starskytest/Controllers/ThumbnailGenerationControllerTest.cs index b5aa2949a5..70a832cfe2 100644 --- a/starsky/starskytest/Controllers/ThumbnailGenerationControllerTest.cs +++ b/starsky/starskytest/Controllers/ThumbnailGenerationControllerTest.cs @@ -30,8 +30,11 @@ public ThumbnailGenerationControllerTest() public async Task ThumbnailGeneration_Endpoint() { var selectorStorage = new FakeSelectorStorage(new FakeIStorage(new List{"/"})); - var controller = new ThumbnailGenerationController(selectorStorage, new ManualThumbnailGenerationService( new FakeIQuery(), - new FakeIWebLogger(), new FakeIWebSocketConnectionsService(), new FakeIThumbnailService(), new FakeThumbnailBackgroundTaskQueue())); + var controller = new ThumbnailGenerationController(selectorStorage, + new ManualThumbnailGenerationService( new FakeIQuery(), + new FakeIWebLogger(), new FakeIWebSocketConnectionsService(), + new FakeIThumbnailService(selectorStorage), + new FakeThumbnailBackgroundTaskQueue())); var json = await controller.ThumbnailGeneration("/") as JsonResult; Assert.IsNotNull(json); diff --git a/starsky/starskytest/Controllers/UploadControllerTest.cs b/starsky/starskytest/Controllers/UploadControllerTest.cs index 87b6187049..960b6fd506 100644 --- a/starsky/starskytest/Controllers/UploadControllerTest.cs +++ b/starsky/starskytest/Controllers/UploadControllerTest.cs @@ -39,8 +39,8 @@ namespace starskytest.Controllers [TestClass] public sealed class UploadControllerTest { - private readonly IQuery _query; - private readonly IStorage _iStorage; + private readonly Query _query; + private readonly FakeIStorage _iStorage; private readonly AppSettings _appSettings; private readonly Import _import; private readonly IMemoryCache _memoryCache; @@ -107,7 +107,7 @@ private static ControllerContext RequestWithFile(byte[] bytes = null) // ReSharper disable once ConvertIfStatementToNullCoalescingAssignment if ( bytes == null ) bytes = CreateAnImage.Bytes.ToArray(); var httpContext = new DefaultHttpContext(); - httpContext.Request.Headers.Add("Content-Type", "application/octet-stream"); + httpContext.Request.Headers.Append("Content-Type", "application/octet-stream"); httpContext.Request.Body = new MemoryStream(bytes); var actionContext = new ActionContext(httpContext, new RouteData(), new ControllerActionDescriptor()); @@ -296,16 +296,16 @@ public async Task UploadToFolder_UnknownFailFlow() controller.ControllerContext.HttpContext.Request.Headers["to"] = "/"; //Set header var actionResult = await controller.UploadToFolder() as JsonResult; - var list = actionResult.Value as List; + var list = actionResult?.Value as List; - Assert.AreEqual( ImportStatus.FileError, list.FirstOrDefault().Status); + Assert.AreEqual( ImportStatus.FileError, list?.FirstOrDefault()?.Status); } [TestMethod] public void GetParentDirectoryFromRequestHeader_InputToAsSubPath() { var controllerContext = RequestWithFile(); - controllerContext.HttpContext.Request.Headers.Add("to", "/test.jpg"); + controllerContext.HttpContext.Request.Headers.Append("to", "/test.jpg"); var controller = new UploadController(_import, _appSettings, new FakeSelectorStorage(_iStorage), _query, @@ -323,7 +323,7 @@ public void GetParentDirectoryFromRequestHeader_InputToAsSubPath() public void GetParentDirectoryFromRequestHeader_InputToAsSubPath_TestFolder() { var controllerContext = RequestWithFile(); - controllerContext.HttpContext.Request.Headers.Add("to", "/test/test.jpg"); + controllerContext.HttpContext.Request.Headers.Append("to", "/test/test.jpg"); var controller = new UploadController(_import, _appSettings, new FakeSelectorStorage(_iStorage), _query, @@ -341,7 +341,7 @@ public void GetParentDirectoryFromRequestHeader_InputToAsSubPath_TestFolder() public void GetParentDirectoryFromRequestHeader_InputToAsSubPath_TestDirectFolder() { var controllerContext = RequestWithFile(); - controllerContext.HttpContext.Request.Headers.Add("to", "/test/"); + controllerContext.HttpContext.Request.Headers.Append("to", "/test/"); var controller = new UploadController(_import, _appSettings, new FakeSelectorStorage(_iStorage), _query, @@ -359,7 +359,7 @@ public void GetParentDirectoryFromRequestHeader_InputToAsSubPath_TestDirectFolde public void GetParentDirectoryFromRequestHeader_InputToAsSubPath_NonExistFolder() { var controllerContext = RequestWithFile(); - controllerContext.HttpContext.Request.Headers.Add("to", "/non-exist/test.jpg"); + controllerContext.HttpContext.Request.Headers.Append("to", "/non-exist/test.jpg"); var controller = new UploadController(_import, _appSettings, @@ -381,7 +381,7 @@ public void GetParentDirectoryFromRequestHeader_InputToAsSubPath_NonExistFolder( private static ControllerContext RequestWithSidecar() { var httpContext = new DefaultHttpContext(); - httpContext.Request.Headers.Add("Content-Type", "application/octet-stream"); + httpContext.Request.Headers.Append("Content-Type", "application/octet-stream"); httpContext.Request.Body = new MemoryStream(CreateAnXmp.Bytes.ToArray()); var actionContext = new ActionContext(httpContext, new RouteData(), new ControllerActionDescriptor()); diff --git a/starsky/starskytest/Extensions/EntityFrameworkExtensionsTest.cs b/starsky/starskytest/Extensions/EntityFrameworkExtensionsTest.cs index 84ef6c44f7..f42d010ce3 100644 --- a/starsky/starskytest/Extensions/EntityFrameworkExtensionsTest.cs +++ b/starsky/starskytest/Extensions/EntityFrameworkExtensionsTest.cs @@ -92,29 +92,22 @@ public AppDbMySqlException(DbContextOptions options) : base(options) private static MySqlException CreateMySqlException(string message) { - var info = new SerializationInfo(typeof(Exception), - new FormatterConverter()); - info.AddValue("Number", 1); - info.AddValue("SqlState", "SqlState"); - info.AddValue("Message", message); - info.AddValue("InnerException", new Exception()); - info.AddValue("HelpURL", ""); - info.AddValue("StackTraceString", ""); - info.AddValue("RemoteStackTraceString", ""); - info.AddValue("RemoteStackIndex", 1); - info.AddValue("HResult", 1); - info.AddValue("Source", ""); - info.AddValue("WatsonBuckets", Array.Empty() ); - - // private MySqlException(SerializationInfo info, StreamingContext context) - var ctor = - typeof(MySqlException).GetConstructors(BindingFlags.Instance | - BindingFlags.NonPublic | BindingFlags.InvokeMethod).FirstOrDefault(); + // MySqlErrorCode errorCode, string? sqlState, string message, Exception? innerException + + var ctorLIst = + typeof(MySqlException).GetConstructors( + BindingFlags.Instance | + BindingFlags.NonPublic | BindingFlags.InvokeMethod); + var ctor = ctorLIst.FirstOrDefault(p => + p.ToString() == "Void .ctor(MySqlConnector.MySqlErrorCode, System.String, System.String, System.Exception)" ); + var instance = ( MySqlException ) ctor?.Invoke(new object[] { - info, - new StreamingContext(StreamingContextStates.All) + MySqlErrorCode.AccessDenied, + "test", + message, + new Exception() }); return instance; } diff --git a/starsky/starskytest/FakeMocks/FakeIGeoIndexGpx.cs b/starsky/starskytest/FakeMocks/FakeIGeoIndexGpx.cs index 6c65acaf4b..1830235c94 100644 --- a/starsky/starskytest/FakeMocks/FakeIGeoIndexGpx.cs +++ b/starsky/starskytest/FakeMocks/FakeIGeoIndexGpx.cs @@ -1,4 +1,5 @@ using System.Collections.Generic; +using System.Threading.Tasks; using starsky.feature.geolookup.Interfaces; using starsky.foundation.database.Models; @@ -8,10 +9,10 @@ public class FakeIGeoIndexGpx : IGeoIndexGpx { public int Count { get; set; } - public List LoopFolder(List metaFilesInDirectory) + public Task> LoopFolderAsync(List metaFilesInDirectory) { Count++; - return metaFilesInDirectory; + return Task.FromResult(new List()); } } } diff --git a/starsky/starskytest/FakeMocks/FakeIMetaInfo.cs b/starsky/starskytest/FakeMocks/FakeIMetaInfo.cs index 8d8244a1da..6a0d0bdde2 100644 --- a/starsky/starskytest/FakeMocks/FakeIMetaInfo.cs +++ b/starsky/starskytest/FakeMocks/FakeIMetaInfo.cs @@ -1,5 +1,6 @@ using System.Collections.Generic; using System.Linq; +using System.Threading.Tasks; using starsky.feature.metaupdate.Interfaces; using starsky.foundation.database.Models; @@ -17,7 +18,7 @@ public FakeIMetaInfo(List existItems) } } - public List GetInfo(List inputFilePaths, bool collections) + public Task> GetInfoAsync(List inputFilePaths, bool collections) { var result = new List(); foreach ( var path in inputFilePaths ) @@ -26,7 +27,7 @@ public List GetInfo(List inputFilePaths, bool collections if ( data == null ) continue; result.Add(data); } - return result; + return Task.FromResult(result); } } } diff --git a/starsky/starskytest/FakeMocks/FakeIThumbnailService.cs b/starsky/starskytest/FakeMocks/FakeIThumbnailService.cs index 26562abdf1..336572c360 100644 --- a/starsky/starskytest/FakeMocks/FakeIThumbnailService.cs +++ b/starsky/starskytest/FakeMocks/FakeIThumbnailService.cs @@ -30,12 +30,13 @@ public FakeIThumbnailService(FakeSelectorStorage? selectorStorage = null, Except public Task> CreateThumbnailAsync(string subPath) { if ( _exception != null ) throw _exception; + if ( _subPathStorage == null ) throw new NullReferenceException("_subPathStorage not be null"); - _subPathStorage?.WriteStream( - PlainTextFileHelper.StringToStream("test"), subPath); + _subPathStorage.WriteStream( + StringToStreamHelper.StringToStream("test"), subPath); Inputs.Add(new Tuple(subPath, null)); - var items = _subPathStorage?.GetAllFilesInDirectory(subPath); + var items = _subPathStorage.GetAllFilesInDirectory(subPath); if ( items == null ) { return Task.FromResult(new List{new GenerationResultModel() @@ -46,8 +47,8 @@ public Task> CreateThumbnailAsync(string subPath) } var name = Base32.Encode(System.Text.Encoding.UTF8.GetBytes(subPath)); - _subPathStorage?.WriteStream( - PlainTextFileHelper.StringToStream("test"), "/"+ name + "@2000.jpg"); + _subPathStorage.WriteStream( + StringToStreamHelper.StringToStream("test"), "/"+ name + "@2000.jpg"); var resultModel = new List(); foreach ( var item in items ) @@ -66,7 +67,7 @@ public Task> CreateThumbAsync(string subPath, if ( _exception != null ) throw _exception; _subPathStorage?.WriteStream( - PlainTextFileHelper.StringToStream("test"), fileHash); + StringToStreamHelper.StringToStream("test"), fileHash); Inputs.Add(new Tuple(subPath, fileHash)); return Task.FromResult(new List{new GenerationResultModel() diff --git a/starsky/starskytest/FakeMocks/FakeIUpdateAppSettingsByPath.cs b/starsky/starskytest/FakeMocks/FakeIUpdateAppSettingsByPath.cs new file mode 100644 index 0000000000..0d3bff8633 --- /dev/null +++ b/starsky/starskytest/FakeMocks/FakeIUpdateAppSettingsByPath.cs @@ -0,0 +1,31 @@ +#nullable enable +using System.Threading.Tasks; +using starsky.feature.settings.Interfaces; +using starsky.feature.settings.Models; +using starsky.foundation.platform.Models; + +namespace starskytest.FakeMocks; + +public class FakeIUpdateAppSettingsByPath : IUpdateAppSettingsByPath +{ + private readonly UpdateAppSettingsStatusModel? _updateAppSettingsStatusModel; + + public FakeIUpdateAppSettingsByPath(UpdateAppSettingsStatusModel? updateAppSettingsStatusModel = null) + { + _updateAppSettingsStatusModel = updateAppSettingsStatusModel; + } + + public Task UpdateAppSettingsAsync(AppSettingsTransferObject appSettingTransferObject) + { + if ( _updateAppSettingsStatusModel == null ) + { + return Task.FromResult(new UpdateAppSettingsStatusModel + { + Message = "Ok", + StatusCode = 200 + }); + } + + return Task.FromResult(_updateAppSettingsStatusModel); + } +} diff --git a/starsky/starskytest/FakeMocks/FakeReadMeta.cs b/starsky/starskytest/FakeMocks/FakeReadMeta.cs index b69d0601cd..6b8995a523 100644 --- a/starsky/starskytest/FakeMocks/FakeReadMeta.cs +++ b/starsky/starskytest/FakeMocks/FakeReadMeta.cs @@ -1,4 +1,5 @@ using System.Collections.Generic; +using System.Threading.Tasks; using starsky.foundation.database.Models; using starsky.foundation.readmeta.Interfaces; using starskytest.FakeCreateAn; @@ -7,27 +8,27 @@ namespace starskytest.FakeMocks { public class FakeReadMeta : IReadMeta { - public FileIndexItem ReadExifAndXmpFromFile(string subPath) + public Task ReadExifAndXmpFromFileAsync(string subPath) { - return new FileIndexItem + return Task.FromResult(new FileIndexItem { Status = FileIndexItem.ExifStatus.Ok, Tags = "test, fake read meta" - }; + }); } - public List ReadExifAndXmpFromFileAddFilePathHash(List subPathList, + public Task> ReadExifAndXmpFromFileAddFilePathHashAsync(List subPathList, List fileHashes = null) { var createAnImage = new CreateAnImage(); - return new List + return Task.FromResult(new List { new FileIndexItem { Status = FileIndexItem.ExifStatus.Ok, FileName = createAnImage.FileName } - }; + }); } public bool? RemoveReadMetaCache(string fullFilePath) diff --git a/starsky/starskytest/FakeMocks/FakeReadMetaSubPathStorage.cs b/starsky/starskytest/FakeMocks/FakeReadMetaSubPathStorage.cs index e99f6b5734..32369db11c 100644 --- a/starsky/starskytest/FakeMocks/FakeReadMetaSubPathStorage.cs +++ b/starsky/starskytest/FakeMocks/FakeReadMetaSubPathStorage.cs @@ -1,4 +1,6 @@ +#nullable enable using System.Collections.Generic; +using System.Threading.Tasks; using starsky.foundation.database.Models; using starsky.foundation.readmeta.Interfaces; @@ -6,22 +8,22 @@ namespace starskytest.FakeMocks { public class FakeReadMetaSubPathStorage : IReadMetaSubPathStorage { - private readonly IReadMeta _readMeta; + private readonly FakeReadMeta _readMeta; public FakeReadMetaSubPathStorage() { _readMeta = new FakeReadMeta(); } - public FileIndexItem ReadExifAndXmpFromFile(string subPath) + public async Task ReadExifAndXmpFromFileAsync(string subPath) { - return _readMeta.ReadExifAndXmpFromFile(subPath); + return await _readMeta.ReadExifAndXmpFromFileAsync(subPath); } - public List ReadExifAndXmpFromFileAddFilePathHash(List subPathList, - List fileHashes = null) + public async Task> ReadExifAndXmpFromFileAddFilePathHashAsync(List subPathList, + List? fileHashes = null) { - return _readMeta.ReadExifAndXmpFromFileAddFilePathHash(subPathList,fileHashes); + return await _readMeta.ReadExifAndXmpFromFileAddFilePathHashAsync(subPathList, fileHashes!); } public bool? RemoveReadMetaCache(string fullFilePath) diff --git a/starsky/starskytest/Helpers/Base64HelperTest.cs b/starsky/starskytest/Helpers/Base64HelperTest.cs index 473a75e50a..904039511b 100644 --- a/starsky/starskytest/Helpers/Base64HelperTest.cs +++ b/starsky/starskytest/Helpers/Base64HelperTest.cs @@ -2,7 +2,6 @@ using System.IO; using Microsoft.VisualStudio.TestTools.UnitTesting; using starsky.foundation.platform.Helpers; -using starskycore.Helpers; namespace starskytest.Helpers { diff --git a/starsky/starskytest/Helpers/SwaggerHelperTest.cs b/starsky/starskytest/Helpers/SwaggerHelperTest.cs index 695b6c0cd3..fb565c42ab 100644 --- a/starsky/starskytest/Helpers/SwaggerHelperTest.cs +++ b/starsky/starskytest/Helpers/SwaggerHelperTest.cs @@ -97,7 +97,7 @@ public async Task SwaggerTest_Integration_Test() Assert.AreEqual(true,storage.ExistFile(swaggerFilePath)); var swaggerFileContent = - await PlainTextFileHelper.StreamToStringAsync( + await StreamToStringHelper.StreamToStringAsync( storage.ReadStream(swaggerFilePath)); System.Console.WriteLine("swaggerFileContent " + swaggerFileContent); diff --git a/starsky/starskytest/Middleware/MiddlewareExtensionsTest.cs b/starsky/starskytest/Middleware/MiddlewareExtensionsTest.cs index f84ffe0ae5..1fb55693e8 100644 --- a/starsky/starskytest/Middleware/MiddlewareExtensionsTest.cs +++ b/starsky/starskytest/Middleware/MiddlewareExtensionsTest.cs @@ -1,13 +1,7 @@ using System.Threading.Tasks; using Microsoft.AspNetCore.Http; -using Microsoft.EntityFrameworkCore; using Microsoft.VisualStudio.TestTools.UnitTesting; -using starsky.foundation.accountmanagement.Interfaces; using starsky.foundation.accountmanagement.Middleware; -using starsky.foundation.accountmanagement.Services; -using starsky.foundation.database.Data; -using starsky.foundation.platform.Models; -using starskytest.FakeMocks; namespace starskytest.Middleware { @@ -21,55 +15,12 @@ public async Task MiddlewareExtensionsBasicAuthenticationMiddlewareNotSignedIn() { // Arrange var httpContext = new DefaultHttpContext(); - var authMiddleware = new BasicAuthenticationMiddleware(next: (innerHttpContext) => Task.FromResult(0)); + var authMiddleware = new BasicAuthenticationMiddleware(next: (_) => Task.CompletedTask); // Act await authMiddleware.Invoke(httpContext); Assert.IsNotNull(httpContext); } - - -// [TestMethod] -// public async Task MiddlewareExtensionsBasicAuthenticationMiddlewareSignedIn() -// { -// // // Arrange -// // var httpContext = new DefaultHttpContext(); -// // var authMiddleware = new BasicAuthenticationMiddleware(next: (innerHttpContext) => Task.FromResult(0)); -// -// var httpContext = new DefaultHttpContext(); -// -// var services = new ServiceCollection() -// // .AddDbContext(options => options.UseInMemoryDatabase("starsky")) -// .AddIdentity(options => -// { -// // Password settings -// options.Password.RequireDigit = false; -// options.Password.RequiredLength = 10; -// options.Password.RequiredUniqueChars = 0; -// options.Password.RequireLowercase = false; -// options.Password.RequireNonAlphanumeric = false; -// options.Password.RequireUppercase = false; -// }) -// .AddEntityFrameworkStores() -// .AddDefaultTokenProviders(); -// -// var serviceProvider = services..BuildServiceProvider(); -// -// serviceProvider.Services. -// // var userManager = httpContext.RequestServices.GetRequiredService>(); -// -// var user = new ApplicationUser { UserName = "test", Email = "test" }; -// var result = await userManager.CreateAsync(user, "model.Password"); -// -// -// var t = await userManager.FindByNameAsync("test"); -// -// -// Console.WriteLine(); -// // Act -// // await authMiddleware.Invoke(httpContext); -// } - } } diff --git a/starsky/starskytest/Models/FakeExifTool.cs b/starsky/starskytest/Models/FakeExifTool.cs index 9e6e594edc..a2e178f776 100644 --- a/starsky/starskytest/Models/FakeExifTool.cs +++ b/starsky/starskytest/Models/FakeExifTool.cs @@ -34,7 +34,7 @@ public async Task WriteTagsAsync(string subPath, string command) if ( subPath.EndsWith(".xmp") ) { - var stream = PlainTextFileHelper.StringToStream(XmpInjection); + var stream = StringToStreamHelper.StringToStream(XmpInjection); await _iStorage.WriteStreamAsync(stream, subPath); } return true; @@ -47,7 +47,7 @@ public async Task> WriteTagsAndRenameThumbnailAsync(s if ( subPath.EndsWith(".xmp") ) { - var stream = PlainTextFileHelper.StringToStream(XmpInjection); + var stream = StringToStreamHelper.StringToStream(XmpInjection); await _iStorage.WriteStreamAsync(stream, subPath); } diff --git a/starsky/starskytest/root/ProgramTest.cs b/starsky/starskytest/root/ProgramTest.cs index 6f29315ee6..cabdc0b1cb 100644 --- a/starsky/starskytest/root/ProgramTest.cs +++ b/starsky/starskytest/root/ProgramTest.cs @@ -61,7 +61,7 @@ public async Task Program_Main_NoAddress_UnixOnly() Environment.SetEnvironmentVariable("app__ExiftoolSkipDownloadOnStartup","true"); Environment.SetEnvironmentVariable("app__EnablePackageTelemetry","false"); - await Program.Main(new []{"--do-not-start"}); + await Program.Main(["--do-not-start"]); using HttpClient client = new(); await client.GetAsync("http://localhost:7514").TimeoutAfter(3000); @@ -77,22 +77,26 @@ public async Task Program_RunAsync_Null_False() } [TestMethod] - [Timeout(9000)] + [Timeout(20000)] [ExpectedException(typeof(TimeoutException))] - public async Task Program_RunAsync_ReturnedTrue() + public async Task Program_RunAsync_WebApplication_CreateBuilder_TimeoutException() { - Environment.SetEnvironmentVariable("ASPNETCORE_URLS","http://*:7518"); + var number = new Random().Next(7500, 7900); + var url = $"http://*:{number}"; + await Console.Out.WriteLineAsync(url); + + Environment.SetEnvironmentVariable("ASPNETCORE_URLS", url); var builder = WebApplication.CreateBuilder(Array.Empty()); var app = builder.Build(); await Program.RunAsync(app).TimeoutAfter(1000); } - + [TestMethod] [Timeout(9000)] [ExpectedException(typeof(FormatException))] - public async Task Program_RunAsync_InvalidUrl() + public async Task Program_RunAsync_WebApplication_CreateBuilder_InvalidUrl() { Environment.SetEnvironmentVariable("ASPNETCORE_URLS","test"); diff --git a/starsky/starskytest/starsky.feature.geolookup/Services/GeoBackgroundTaskTest.cs b/starsky/starskytest/starsky.feature.geolookup/Services/GeoBackgroundTaskTest.cs index 834c2061b3..25cc1da184 100644 --- a/starsky/starskytest/starsky.feature.geolookup/Services/GeoBackgroundTaskTest.cs +++ b/starsky/starskytest/starsky.feature.geolookup/Services/GeoBackgroundTaskTest.cs @@ -62,7 +62,7 @@ private void Setup() new StorageHostFullPathFilesystem().WriteStream( - PlainTextFileHelper.StringToStream(mockCities1000), + StringToStreamHelper.StringToStream(mockCities1000), Path.Combine(_appSettings.DependenciesFolder, "cities1000.txt")); // Mockup data to: @@ -75,7 +75,7 @@ private void Setup() "AR.07\tBuenos Aires F.D.\tBuenos Aires F.D.\t3433955\r\n"; new StorageHostFullPathFilesystem().WriteStream( - PlainTextFileHelper.StringToStream(admin1CodesAscii), + StringToStreamHelper.StringToStream(admin1CodesAscii), Path.Combine(_appSettings.DependenciesFolder, "admin1CodesASCII.txt")); } diff --git a/starsky/starskytest/starsky.feature.geolookup/Services/GeoCliTest.cs b/starsky/starskytest/starsky.feature.geolookup/Services/GeoCliTest.cs index cd3897726c..105d6ad21e 100644 --- a/starsky/starskytest/starsky.feature.geolookup/Services/GeoCliTest.cs +++ b/starsky/starskytest/starsky.feature.geolookup/Services/GeoCliTest.cs @@ -49,7 +49,7 @@ public async Task GeoCliInput_RelativeUrl_HappyFlow() { var relativeParentFolder = new AppSettings().DatabasePathToFilePath( new StructureService(new FakeIStorage(), new AppSettings().Structure) - .ParseSubfolders(0),false); + .ParseSubfolders(0)!); var storage = new FakeIStorage(new List {"/"}, new List {"/test.jpg"}, diff --git a/starsky/starskytest/starsky.feature.geolookup/Services/GeoFileDownloadTest.cs b/starsky/starskytest/starsky.feature.geolookup/Services/GeoFileDownloadTest.cs index b1562c578b..7e13fca7c5 100644 --- a/starsky/starskytest/starsky.feature.geolookup/Services/GeoFileDownloadTest.cs +++ b/starsky/starskytest/starsky.feature.geolookup/Services/GeoFileDownloadTest.cs @@ -117,16 +117,16 @@ public async Task DownloadAsync_ShouldNotDownloadFileIfAlreadyExists() var geoFileDownload = new GeoFileDownload(appSettings, httpClientHelper, new FakeSelectorStorage(storage)); storage.CreateDirectory(_dependenciesFolder3); - await storage.WriteStreamAsync(PlainTextFileHelper.StringToStream("1"), + await storage.WriteStreamAsync(StringToStreamHelper.StringToStream("1"), Path.Combine(_dependenciesFolder3, GeoFileDownload.CountryName + ".txt")); - await storage.WriteStreamAsync(PlainTextFileHelper.StringToStream("1"), + await storage.WriteStreamAsync(StringToStreamHelper.StringToStream("1"), Path.Combine(_dependenciesFolder3, "admin1CodesASCII.txt")); // Act await geoFileDownload.DownloadAsync(); // Assert - Assert.IsTrue(!httpClientHelper.UrlsCalled.Any()); + Assert.IsTrue(httpClientHelper.UrlsCalled.Count == 0); storage.FolderDelete(_dependenciesFolder3); } @@ -158,7 +158,7 @@ public async Task RemoveFailedDownload_FileToSmall_SoRemove() geoFileDownload.CreateDependenciesFolder(); - await storage.WriteStreamAsync(PlainTextFileHelper.StringToStream("1"), + await storage.WriteStreamAsync(StringToStreamHelper.StringToStream("1"), Path.Combine(_dependenciesFolder5, GeoFileDownload.CountryName + ".zip")); Assert.IsTrue(storage.ExistFile(Path.Combine(_dependenciesFolder5, GeoFileDownload.CountryName + ".zip"))); @@ -180,7 +180,7 @@ public async Task RemoveFailedDownload_FileRightSize_SoKeep() geoFileDownload.CreateDependenciesFolder(); geoFileDownload.MinimumSizeInBytes = -1; - await storage.WriteStreamAsync(PlainTextFileHelper.StringToStream("1"), + await storage.WriteStreamAsync(StringToStreamHelper.StringToStream("1"), Path.Combine(_dependenciesFolder6, GeoFileDownload.CountryName + ".zip")); Assert.IsTrue(storage.ExistFile(Path.Combine(_dependenciesFolder6, GeoFileDownload.CountryName + ".zip"))); diff --git a/starsky/starskytest/starsky.feature.geolookup/Services/GeoIndexGpxTest.cs b/starsky/starskytest/starsky.feature.geolookup/Services/GeoIndexGpxTest.cs index 5b58808de8..fefac104dd 100644 --- a/starsky/starskytest/starsky.feature.geolookup/Services/GeoIndexGpxTest.cs +++ b/starsky/starskytest/starsky.feature.geolookup/Services/GeoIndexGpxTest.cs @@ -1,6 +1,7 @@ using System; using System.Collections.Generic; using System.Linq; +using System.Threading.Tasks; using Microsoft.VisualStudio.TestTools.UnitTesting; using starsky.feature.geolookup.Services; using starsky.foundation.database.Models; @@ -80,7 +81,7 @@ public void GeoIndexGpx_ConvertTimeZone_typeLocal_Expect_ArgumentException() } [TestMethod] - public void GeoIndexGpx_LoopFolderLookupTest() + public async Task GeoIndexGpx_LoopFolderLookupTest() { var exampleFiles = new List(); exampleFiles.AddRange(new List @@ -102,8 +103,8 @@ public void GeoIndexGpx_LoopFolderLookupTest() var fakeIStorage = new FakeIStorage(new List{"/"}, new List{_metaFilesDirectory[0].FilePath}, new List{CreateAnGpx.Bytes.ToArray()} ); - var returnFileIndexItems = new GeoIndexGpx(_appSettings, - fakeIStorage, new FakeIWebLogger()).LoopFolder(exampleFiles); + var returnFileIndexItems = await new GeoIndexGpx(_appSettings, + fakeIStorage, new FakeIWebLogger()).LoopFolderAsync(exampleFiles); Assert.AreEqual(null,returnFileIndexItems.Find(p => p.FileName == "NotInRange.jpg")); Assert.AreEqual("01.jpg",returnFileIndexItems.Find(p => p.FileName == "01.jpg")?.FileName); diff --git a/starsky/starskytest/starsky.feature.geolookup/Services/GeoReverseLookupTest.cs b/starsky/starskytest/starsky.feature.geolookup/Services/GeoReverseLookupTest.cs index bc477ee240..eccd4899b3 100644 --- a/starsky/starskytest/starsky.feature.geolookup/Services/GeoReverseLookupTest.cs +++ b/starsky/starskytest/starsky.feature.geolookup/Services/GeoReverseLookupTest.cs @@ -67,7 +67,7 @@ private void Setup() new StorageHostFullPathFilesystem().WriteStream( - PlainTextFileHelper.StringToStream(mockCities1000), + StringToStreamHelper.StringToStream(mockCities1000), Path.Combine(_appSettings.DependenciesFolder, "cities1000.txt")); // Mockup data to: @@ -80,7 +80,7 @@ private void Setup() "AR.07\tBuenos Aires F.D.\tBuenos Aires F.D.\t3433955\r\n"; new StorageHostFullPathFilesystem().WriteStream( - PlainTextFileHelper.StringToStream(admin1CodesAscii), + StringToStreamHelper.StringToStream(admin1CodesAscii), Path.Combine(_appSettings.DependenciesFolder, "admin1CodesASCII.txt")); } @@ -296,7 +296,7 @@ public async Task GetLocation_NearestPlace2_Valkenswaard() public async Task GetLocation_No_nearest_place_found() { await new StorageHostFullPathFilesystem().WriteStreamAsync( - PlainTextFileHelper.StringToStream(""), // empty file yes! + StringToStreamHelper.StringToStream(string.Empty), // empty file yes! Path.Combine(_appSettings.DependenciesFolder, "cities1000.txt")); var result = await new GeoReverseLookup(_appSettings, new FakeIGeoFileDownload(), diff --git a/starsky/starskytest/starsky.feature.health/Helpers/CheckForUpdatesHelperTest.cs b/starsky/starskytest/starsky.feature.health/Helpers/CheckForUpdatesHelperTest.cs index e016d1b2f9..444be53fc5 100644 --- a/starsky/starskytest/starsky.feature.health/Helpers/CheckForUpdatesHelperTest.cs +++ b/starsky/starskytest/starsky.feature.health/Helpers/CheckForUpdatesHelperTest.cs @@ -60,7 +60,7 @@ public async Task QueryIsUpdateNeeded() var replace = ExamplePublicReleases.Replace("vtest__remove_this_version", "v0.9"); var fakeIHttpProvider = new FakeIHttpProvider(new Dictionary { - {CheckForUpdates.GithubApi, new StringContent(replace)}, + {CheckForUpdates.GithubStarskyReleaseApi, new StringContent(replace)}, }); var httpClientHelper = new HttpClientHelper(fakeIHttpProvider, _serviceScopeFactory, new FakeIWebLogger()); @@ -202,7 +202,7 @@ public async Task IsUpdateNeeded_CacheIsFilled() var replace = ExamplePublicReleases.Replace("vtest__remove_this_version", "v0.9"); var fakeIHttpProvider = new FakeIHttpProvider(new Dictionary { - {CheckForUpdates.GithubApi, new StringContent(replace)}, + {CheckForUpdates.GithubStarskyReleaseApi, new StringContent(replace)}, }); var httpClientHelper = new HttpClientHelper(fakeIHttpProvider, _serviceScopeFactory, new FakeIWebLogger()); @@ -265,7 +265,7 @@ public async Task IsUpdateNeeded_CacheExistButDisableInSettings() var replace = ExamplePublicReleases.Replace("vtest__remove_this_version", "test"); var fakeIHttpProvider = new FakeIHttpProvider(new Dictionary { - {CheckForUpdates.GithubApi, new StringContent(replace)}, + {CheckForUpdates.GithubStarskyReleaseApi, new StringContent(replace)}, }); var httpClientHelper = new HttpClientHelper(fakeIHttpProvider, _serviceScopeFactory, new FakeIWebLogger()); @@ -282,7 +282,7 @@ public async Task IsUpdateNeeded_CacheIsNull() var replace = ExamplePublicReleases.Replace("vtest__remove_this_version", "test"); var fakeIHttpProvider = new FakeIHttpProvider(new Dictionary { - {CheckForUpdates.GithubApi, new StringContent(replace)}, + {CheckForUpdates.GithubStarskyReleaseApi, new StringContent(replace)}, }); var httpClientHelper = new HttpClientHelper(fakeIHttpProvider, _serviceScopeFactory, new FakeIWebLogger()); diff --git a/starsky/starskytest/starsky.feature.import/Services/ImportTest.cs b/starsky/starskytest/starsky.feature.import/Services/ImportTest.cs index 54eb71baf4..a775905824 100644 --- a/starsky/starskytest/starsky.feature.import/Services/ImportTest.cs +++ b/starsky/starskytest/starsky.feature.import/Services/ImportTest.cs @@ -369,10 +369,10 @@ public void AppendIndexerToFilePath_5() /// subPath style /// number /// expected result - public static string GetExpectedFilePath(IStorage storage, AppSettings appSettings, string inputFileFullPath, int index = 0) + public static async Task GetExpectedFilePathAsync(IStorage storage, AppSettings appSettings, string inputFileFullPath, int index = 0) { - var fileIndexItem = new ReadMeta(storage, appSettings, - null, new FakeIWebLogger()).ReadExifAndXmpFromFile(inputFileFullPath); + var fileIndexItem = await new ReadMeta(storage, appSettings, + null, new FakeIWebLogger()).ReadExifAndXmpFromFileAsync(inputFileFullPath); var importIndexItem = new ImportIndexItem(appSettings) { FileIndexItem = fileIndexItem, @@ -430,7 +430,7 @@ public async Task Importer_EmptyDirectory() new ImportSettingsModel()); Assert.IsNotNull(result); - Assert.IsTrue(!result.Any()); + Assert.IsTrue(result.Count == 0); } [TestMethod] @@ -446,7 +446,7 @@ public async Task Importer_Xmp_WhenImportingAFileThatAlreadyHasAnXmpSidecarFile( var importService = new Import(new FakeSelectorStorage(storage), appSettings, new FakeIImportQuery(), new FakeExifTool(storage, appSettings),query,_console, new FakeIMetaExifThumbnailService(), new FakeIWebLogger(), new FakeIThumbnailQuery(), new FakeMemoryCache()); - var expectedFilePath = GetExpectedFilePath(storage, appSettings, + var expectedFilePath = await GetExpectedFilePathAsync(storage, appSettings, "/test.dng"); var result = await importService.Importer(new List {"/test.dng"}, @@ -509,13 +509,13 @@ public async Task Importer_Xmp_NotOverWriteExistingFile() new ImportSettingsModel()); Assert.AreEqual(1, result.Count); - var xmpExpectedFilePath = GetExpectedFilePath(storage, appSettings, - "/test.dng").Replace(".dng",".xmp"); + var xmpExpectedFilePath = (await GetExpectedFilePathAsync(storage, appSettings, + "/test.dng")).Replace(".dng",".xmp"); var xmpReadStream = storage.ReadStream(xmpExpectedFilePath); var xmpStreamLength = xmpReadStream.Length; - var toStringAsync = await PlainTextFileHelper.StreamToStringAsync(xmpReadStream); + var toStringAsync = await StreamToStringHelper.StreamToStringAsync(xmpReadStream); Assert.AreEqual(CreateAnXmp.Bytes.Length,xmpStreamLength); Assert.IsTrue(toStringAsync.Contains("Apple")); @@ -539,13 +539,13 @@ public async Task Importer_XmpIsCreatedDuringImport() await importService.Importer(new List {"/test.dng"}, new ImportSettingsModel()); - var expectedFilePath = GetExpectedFilePath(storage, appSettings, - "/test.dng").Replace(".dng",".xmp"); + var expectedFilePath = (await GetExpectedFilePathAsync(storage, appSettings, + "/test.dng")).Replace(".dng",".xmp"); Assert.IsTrue(storage.ExistFile(expectedFilePath)); var stream = storage.ReadStream(expectedFilePath); - var toStringAsync = await PlainTextFileHelper.StreamToStringAsync(stream); + var toStringAsync = await StreamToStringHelper.StreamToStringAsync(stream); Assert.AreEqual(FakeExifTool.XmpInjection,toStringAsync); } @@ -561,7 +561,7 @@ await storage.WriteStreamAsync( new MemoryStream(CreateAnImage.Bytes.ToArray()), "/test.jpg" ); // write /2018/04/2018_04_22/20180422_161454_test.jpg - var path = GetExpectedFilePath(storage, appSettings, "/test.jpg"); + var path = await GetExpectedFilePathAsync(storage, appSettings, "/test.jpg"); await storage.WriteStreamAsync( new MemoryStream(FakeCreateAn.CreateAnImage.Bytes.ToArray()), path ); @@ -600,7 +600,7 @@ public async Task Importer_DuplicateFileName() Assert.AreEqual(ImportStatus.Ok,result[0].Status); // get something like /2018/04/2018_04_22/20180422_161454_test_1.jpg - var expectedFilePath = GetExpectedFilePath(storage, appSettings, "/test.jpg", 1); + var expectedFilePath = await GetExpectedFilePathAsync(storage, appSettings, "/test.jpg", 1); Assert.AreEqual(expectedFilePath,result[0].FilePath); } diff --git a/starsky/starskytest/starsky.feature.import/Services/ImportTest_InMemoryDb.cs b/starsky/starskytest/starsky.feature.import/Services/ImportTest_InMemoryDb.cs index 63273ec05e..d76290180f 100644 --- a/starsky/starskytest/starsky.feature.import/Services/ImportTest_InMemoryDb.cs +++ b/starsky/starskytest/starsky.feature.import/Services/ImportTest_InMemoryDb.cs @@ -77,7 +77,7 @@ public async Task Importer_Gpx() var importService = new Import(new FakeSelectorStorage(storage), _appSettings, new FakeIImportQuery(), new FakeExifTool(storage, _appSettings),_query,_console, new FakeIMetaExifThumbnailService(), new FakeIWebLogger(),new FakeIThumbnailQuery(), new FakeMemoryCache()); - var expectedFilePath = ImportTest.GetExpectedFilePath(storage, _appSettings, "/test.gpx"); + var expectedFilePath = await ImportTest.GetExpectedFilePathAsync(storage, _appSettings, "/test.gpx"); var result = await importService.Importer(new List {"/test.gpx"}, new ImportSettingsModel()); @@ -103,7 +103,7 @@ public async Task Importer_OverwriteStructure_HappyFlow() Structure = "/yyyy/MM/yyyy_MM_dd*/_yyyyMMdd_HHmmss.ext" }); - var expectedFilePath = ImportTest.GetExpectedFilePath(_iStorageFake, new AppSettings + var expectedFilePath = await ImportTest.GetExpectedFilePathAsync(_iStorageFake, new AppSettings { Structure = "/yyyy/MM/yyyy_MM_dd*/_yyyyMMdd_HHmmss.ext" }, "/test.jpg"); @@ -135,7 +135,7 @@ await importService.Importer(new List {"/test.jpg"}, var isHashInImportDb = await _importQuery.IsHashInImportDbAsync(_exampleHash); Assert.IsTrue(isHashInImportDb); - var expectedFilePath = ImportTest.GetExpectedFilePath(_iStorageFake, new AppSettings + var expectedFilePath = await ImportTest.GetExpectedFilePathAsync(_iStorageFake, new AppSettings { Structure = "/yyyy/MM/yyyy_MM_dd*/_yyyyMMdd_HHmmss.ext" }, "/test.jpg"); @@ -156,7 +156,7 @@ public async Task Importer_OverwriteColorClass() _query, _console, new FakeIMetaExifThumbnailService(), new FakeIWebLogger(), new FakeIThumbnailQuery()); - var expectedFilePath = ImportTest.GetExpectedFilePath(_iStorageFake, _appSettings, "/test.jpg"); + var expectedFilePath = await ImportTest.GetExpectedFilePathAsync(_iStorageFake, _appSettings, "/test.jpg"); var result = await importService.Importer(new List {"/test.jpg"}, new ImportSettingsModel{ ColorClass = 5 @@ -183,7 +183,7 @@ public async Task Importer_ToDefaultFolderStructure_default_HappyFlow() _query,_console, new FakeIMetaExifThumbnailService(), new FakeIWebLogger(), new FakeIThumbnailQuery()); - var expectedFilePath = ImportTest.GetExpectedFilePath(_iStorageFake, _appSettings, "/test.jpg"); + var expectedFilePath = await ImportTest.GetExpectedFilePathAsync(_iStorageFake, _appSettings, "/test.jpg"); var result = await importService.Importer(new List {"/test.jpg"}, new ImportSettingsModel()); diff --git a/starsky/starskytest/starsky.feature.metaupdate/Services/MetaInfoTest.cs b/starsky/starskytest/starsky.feature.metaupdate/Services/MetaInfoTest.cs index e6cfc57821..72a286b615 100644 --- a/starsky/starskytest/starsky.feature.metaupdate/Services/MetaInfoTest.cs +++ b/starsky/starskytest/starsky.feature.metaupdate/Services/MetaInfoTest.cs @@ -1,6 +1,7 @@ using System; using System.Collections.Generic; using System.Linq; +using System.Threading.Tasks; using Microsoft.VisualStudio.TestTools.UnitTesting; using starsky.feature.metaupdate.Services; using starsky.foundation.database.Models; @@ -14,35 +15,35 @@ namespace starskytest.starsky.feature.metaupdate.Services public sealed class MetaInfoTest { [TestMethod] - public void FileNotInIndex() + public async Task FileNotInIndex() { var metaInfo = new MetaInfo(new FakeIQuery(), new AppSettings(), new FakeSelectorStorage(),null, new FakeIWebLogger()); - var test = metaInfo.GetInfo(new List{"/test"}, false); + var test = await metaInfo.GetInfoAsync(new List{"/test"}, false); Assert.AreEqual(FileIndexItem.ExifStatus.NotFoundNotInIndex, test.FirstOrDefault()?.Status); } [TestMethod] - public void NotFoundSourceMissing() + public async Task NotFoundSourceMissing() { var metaInfo = new MetaInfo(new FakeIQuery(new List{new FileIndexItem("/test")}), new AppSettings(), new FakeSelectorStorage(),null, new FakeIWebLogger()); - var test = metaInfo.GetInfo(new List{"/test"}, false); + var test = await metaInfo.GetInfoAsync(new List{"/test"}, false); Assert.AreEqual(FileIndexItem.ExifStatus.NotFoundSourceMissing, test.FirstOrDefault()?.Status); } [TestMethod] - public void ExtensionNotSupported_ExifWriteNotSupported() + public async Task ExtensionNotSupported_ExifWriteNotSupported() { var metaInfo = new MetaInfo(new FakeIQuery(new List{new FileIndexItem("/test")}), new AppSettings(), new FakeSelectorStorage(new FakeIStorage(new List(), new List {"/test"})),null, new FakeIWebLogger()); - var test = metaInfo.GetInfo(new List{"/test"}, false); + var test = await metaInfo.GetInfoAsync(new List{"/test"}, false); Assert.AreEqual(FileIndexItem.ExifStatus.ExifWriteNotSupported,test.FirstOrDefault()?.Status); } [TestMethod] - public void GetInfo_XmpFile() + public async Task GetInfo_XmpFile() { var metaInfo = new MetaInfo(new FakeIQuery(new List{new FileIndexItem("/test.xmp")}), new AppSettings(), new FakeSelectorStorage(new FakeIStorage(new List(), @@ -50,12 +51,12 @@ public void GetInfo_XmpFile() { FakeCreateAn.CreateAnXmp.Bytes.ToArray() })),null, new FakeIWebLogger()); - var test = metaInfo.GetInfo(new List{"/test.xmp"}, false); + var test = await metaInfo.GetInfoAsync(new List{"/test.xmp"}, false); Assert.AreEqual(FileIndexItem.ExifStatus.Ok,test.FirstOrDefault()?.Status); } [TestMethod] - public void GetInfo_JpegFile_OkStatus() + public async Task GetInfo_JpegFile_OkStatus() { var metaInfo = new MetaInfo(new FakeIQuery(new List{new FileIndexItem("/test.jpg")}), new AppSettings(), new FakeSelectorStorage(new FakeIStorage(new List(), @@ -63,14 +64,14 @@ public void GetInfo_JpegFile_OkStatus() { FakeCreateAn.CreateAnImage.Bytes.ToArray() })),null, new FakeIWebLogger()); - var test = metaInfo.GetInfo(new List{"/test.jpg"}, false); + var test = await metaInfo.GetInfoAsync(new List{"/test.jpg"}, false); Assert.AreEqual(ExtensionRolesHelper.ImageFormat.jpg,test.FirstOrDefault()?.ImageFormat); Assert.AreEqual(FileIndexItem.ExifStatus.Ok,test.FirstOrDefault()?.Status); } [TestMethod] - public void GetInfo_JpegFile_LastWriteDate() + public async Task GetInfo_JpegFile_LastWriteDate() { var metaInfo = new MetaInfo(new FakeIQuery(new List{new FileIndexItem("/test.jpg")}), new AppSettings(), new FakeSelectorStorage(new FakeIStorage(new List(), @@ -78,7 +79,7 @@ public void GetInfo_JpegFile_LastWriteDate() { FakeCreateAn.CreateAnImage.Bytes.ToArray() }, new List{new DateTime(2000,01,01)})),null, new FakeIWebLogger()); - var test = metaInfo.GetInfo(new List{"/test.jpg"}, false); + var test = await metaInfo.GetInfoAsync(new List{"/test.jpg"}, false); Assert.AreEqual(new DateTime(2000,01,01),test.FirstOrDefault()?.LastEdited); } diff --git a/starsky/starskytest/Services/ReplaceServiceTest.cs b/starsky/starskytest/starsky.feature.metaupdate/Services/ReplaceServiceTest.cs similarity index 99% rename from starsky/starskytest/Services/ReplaceServiceTest.cs rename to starsky/starskytest/starsky.feature.metaupdate/Services/ReplaceServiceTest.cs index 19917b2419..ab54492665 100644 --- a/starsky/starskytest/Services/ReplaceServiceTest.cs +++ b/starsky/starskytest/starsky.feature.metaupdate/Services/ReplaceServiceTest.cs @@ -13,7 +13,7 @@ using starsky.foundation.platform.Models; using starskytest.FakeMocks; -namespace starskytest.Services +namespace starskytest.starsky.feature.metaupdate.Services { [TestClass] public sealed class ReplaceServiceTest diff --git a/starsky/starskytest/starsky.feature.packagetelemetry/Services/DeviceIdServiceTest.cs b/starsky/starskytest/starsky.feature.packagetelemetry/Services/DeviceIdServiceTest.cs index 564d91b3b7..03d001be72 100644 --- a/starsky/starskytest/starsky.feature.packagetelemetry/Services/DeviceIdServiceTest.cs +++ b/starsky/starskytest/starsky.feature.packagetelemetry/Services/DeviceIdServiceTest.cs @@ -105,7 +105,7 @@ public async Task DeviceId_Linux_BsdHostIdPath() var storage = new FakeIStorage(new List{"/"}); var storageSelector = new FakeSelectorStorage(storage); var deviceService = new DeviceIdService(storageSelector,new FakeISettingsService()); - await storage.WriteStreamAsync(PlainTextFileHelper.StringToStream("test-id"), deviceService.BsdHostIdPath); + await storage.WriteStreamAsync(StringToStreamHelper.StringToStream("test-id"), deviceService.BsdHostIdPath); var id = await deviceService.DeviceId(OSPlatform.Linux); Assert.IsNotNull( id ); Assert.AreEqual("6CC41D5EC590AB78CCCECF81EF167D418C309A4598E8E45FEF78039F7D9AA9FE", id ); @@ -118,8 +118,8 @@ public async Task DeviceId_Linux_MachineIdPath2() var storageSelector = new FakeSelectorStorage(storage); var deviceService = new DeviceIdService(storageSelector, new FakeISettingsService()); - await storage.WriteStreamAsync(PlainTextFileHelper.StringToStream("should-not-use"), deviceService.BsdHostIdPath); - await storage.WriteStreamAsync(PlainTextFileHelper.StringToStream("test-id"), deviceService.MachineIdPath2); + await storage.WriteStreamAsync(StringToStreamHelper.StringToStream("should-not-use"), deviceService.BsdHostIdPath); + await storage.WriteStreamAsync(StringToStreamHelper.StringToStream("test-id"), deviceService.MachineIdPath2); var id = await deviceService.DeviceId(OSPlatform.Linux); Assert.IsNotNull( id ); Assert.AreEqual("6CC41D5EC590AB78CCCECF81EF167D418C309A4598E8E45FEF78039F7D9AA9FE", id ); @@ -131,9 +131,9 @@ public async Task DeviceId_Linux_DbusMachineIdPath() var storage = new FakeIStorage(new List{"/"}); var storageSelector = new FakeSelectorStorage(storage); var deviceService = new DeviceIdService(storageSelector,new FakeISettingsService()); - await storage.WriteStreamAsync(PlainTextFileHelper.StringToStream("should-not-use"), deviceService.BsdHostIdPath); - await storage.WriteStreamAsync(PlainTextFileHelper.StringToStream("should-not-use"), deviceService.MachineIdPath2); - await storage.WriteStreamAsync(PlainTextFileHelper.StringToStream("test-id"), deviceService.DbusMachineIdPath); + await storage.WriteStreamAsync(StringToStreamHelper.StringToStream("should-not-use"), deviceService.BsdHostIdPath); + await storage.WriteStreamAsync(StringToStreamHelper.StringToStream("should-not-use"), deviceService.MachineIdPath2); + await storage.WriteStreamAsync(StringToStreamHelper.StringToStream("test-id"), deviceService.DbusMachineIdPath); var id = await deviceService.DeviceId(OSPlatform.Linux); Assert.IsNotNull( id ); @@ -147,9 +147,9 @@ public async Task DeviceId_Bsd_DbusMachineIdPath() var storageSelector = new FakeSelectorStorage(storage); var deviceService = new DeviceIdService(storageSelector, new FakeISettingsService()); - await storage.WriteStreamAsync(PlainTextFileHelper.StringToStream("should-not-use"), deviceService.BsdHostIdPath); - await storage.WriteStreamAsync(PlainTextFileHelper.StringToStream("should-not-use"), deviceService.MachineIdPath2); - await storage.WriteStreamAsync(PlainTextFileHelper.StringToStream("test-id"), deviceService.DbusMachineIdPath); + await storage.WriteStreamAsync(StringToStreamHelper.StringToStream("should-not-use"), deviceService.BsdHostIdPath); + await storage.WriteStreamAsync(StringToStreamHelper.StringToStream("should-not-use"), deviceService.MachineIdPath2); + await storage.WriteStreamAsync(StringToStreamHelper.StringToStream("test-id"), deviceService.DbusMachineIdPath); var id = await deviceService.DeviceId(OSPlatform.FreeBSD); Assert.IsNotNull( id ); @@ -228,7 +228,7 @@ public async Task DeviceId_MacOS__UnixOnly() text += " } "; text += " ' "; - await hostFullPathFilesystem.WriteStreamAsync(PlainTextFileHelper.StringToStream(text),osxHostIdMockPath); + await hostFullPathFilesystem.WriteStreamAsync(StringToStreamHelper.StringToStream(text),osxHostIdMockPath); await Command.Run("chmod", "+x", osxHostIdMockPath).Task; @@ -273,7 +273,7 @@ public async Task DeviceId_MacOS_Direct__UnixOnly() text += " } "; text += " ' "; - await hostFullPathFilesystem.WriteStreamAsync(PlainTextFileHelper.StringToStream(text),osxHostIdMockPath); + await hostFullPathFilesystem.WriteStreamAsync(StringToStreamHelper.StringToStream(text),osxHostIdMockPath); await Command.Run("chmod", "+x", osxHostIdMockPath).Task; diff --git a/starsky/starskytest/starsky.feature.rename/Services/RenameServiceTest.cs b/starsky/starskytest/starsky.feature.rename/Services/RenameServiceTest.cs index 321957ea29..037e04d597 100644 --- a/starsky/starskytest/starsky.feature.rename/Services/RenameServiceTest.cs +++ b/starsky/starskytest/starsky.feature.rename/Services/RenameServiceTest.cs @@ -70,14 +70,14 @@ public async Task RenameFsTest_DuplicateFile() if ( !_iStorageSubPath.ExistFile(fileAlreadyExistSubPath) ) { - await _iStorageSubPath.WriteStreamAsync(PlainTextFileHelper.StringToStream("test"), + await _iStorageSubPath.WriteStreamAsync(StringToStreamHelper.StringToStream("test"), fileAlreadyExistSubPath); } var renameFs = await new RenameService( _query,_iStorageSubPath).Rename(_newImage.DbPath, fileAlreadyExistSubPath); - var result = await PlainTextFileHelper.StreamToStringAsync( + var result = await StreamToStringHelper.StreamToStringAsync( _iStorageSubPath.ReadStream(fileAlreadyExistSubPath)); // it should not overwrite the target file diff --git a/starsky/starskytest/starsky.feature.settings/Services/UpdateAppSettingsByPathTest.cs b/starsky/starskytest/starsky.feature.settings/Services/UpdateAppSettingsByPathTest.cs new file mode 100644 index 0000000000..37c52206b5 --- /dev/null +++ b/starsky/starskytest/starsky.feature.settings/Services/UpdateAppSettingsByPathTest.cs @@ -0,0 +1,184 @@ +using System; +using System.Collections.Generic; +using System.IO; +using System.Text.Json; +using System.Threading.Tasks; +using Microsoft.VisualStudio.TestTools.UnitTesting; +using starsky.feature.settings.Services; +using starsky.foundation.platform.JsonConverter; +using starsky.foundation.platform.Models; +using starsky.foundation.storage.Helpers; +using starskytest.FakeMocks; + +namespace starskytest.starsky.feature.settings.Services +{ + [TestClass] + public class UpdateAppSettingsByPathTests + { + + [TestMethod] + public async Task UpdateAppSettingsAsync_ValidInput_Success() + { + var before = Environment.GetEnvironmentVariable("app__storageFolder"); + Environment.SetEnvironmentVariable("app__storageFolder", string.Empty); + + // Arrange + var testFolderPath = Path.DirectorySeparatorChar.ToString() + "test" + Path.DirectorySeparatorChar.ToString(); + + var storage = new FakeIStorage(new List{"/", testFolderPath }); + var selectorStorage = new FakeSelectorStorage(storage); + var updateAppSettingsByPath = new UpdateAppSettingsByPath(new AppSettings(), selectorStorage); + var appSettingTransferObject = new AppSettingsTransferObject + { + StorageFolder = testFolderPath, + Verbose = true + }; + + // Act + var result = await updateAppSettingsByPath.UpdateAppSettingsAsync(appSettingTransferObject); + + Environment.SetEnvironmentVariable("app__storageFolder", before); + + // Assert + Assert.AreEqual(200, result.StatusCode); + Assert.AreEqual("Updated", result.Message); + } + + [TestMethod] + public async Task UpdateAppSettingsAsync_ValidInput_Success_CompareJson() + { + // Arrange + + var before = Environment.GetEnvironmentVariable("app__storageFolder"); + Environment.SetEnvironmentVariable("app__storageFolder", string.Empty); + + var testFolderPath = Path.DirectorySeparatorChar.ToString() + "test" + Path.DirectorySeparatorChar.ToString(); + + var storage = new FakeIStorage(new List{"/", testFolderPath }); + var selectorStorage = new FakeSelectorStorage(storage); + var appSettings = new AppSettings(); + var updateAppSettingsByPath = new UpdateAppSettingsByPath(appSettings, selectorStorage); + var appSettingTransferObject = new AppSettingsTransferObject + { + StorageFolder = testFolderPath, + Verbose = true, + UseLocalDesktopUi = null + }; + + // Act + await updateAppSettingsByPath.UpdateAppSettingsAsync(appSettingTransferObject); + + var result = (await StreamToStringHelper.StreamToStringAsync(storage.ReadStream(appSettings.AppSettingsPath))).Replace("\r\n","\n"); + + Environment.SetEnvironmentVariable("app__storageFolder", before); + + + var storageFolderJson = JsonSerializer.Serialize(testFolderPath, DefaultJsonSerializer.NoNamingPolicy); + + + // Assert + var expectedResult = "{\n \"app\": {\n \"Verbose\": \"true\",\n \"StorageFolder\": " + // rm quotes + storageFolderJson + ",\n \"UseLocalDesktopUi\": \"false\"\n }\n}"; + + Assert.AreEqual(expectedResult, result); + } + + [TestMethod] + public async Task UpdateAppSettingsAsync_InvalidStorageFolder_Returns404() + { + var before = Environment.GetEnvironmentVariable("app__storageFolder"); + Environment.SetEnvironmentVariable("app__storageFolder", string.Empty); + + // Arrange + var selectorStorage = new FakeSelectorStorage(); + var updateAppSettingsByPath = new UpdateAppSettingsByPath(new AppSettings(), selectorStorage); + var appSettingTransferObject = new AppSettingsTransferObject + { + StorageFolder = "NonExistentFolder" + }; + + // Act + var result = await updateAppSettingsByPath.UpdateAppSettingsAsync(appSettingTransferObject); + + Environment.SetEnvironmentVariable("app__storageFolder", before); + + + // Assert + Assert.AreEqual(404, result.StatusCode); + Assert.AreEqual("Location of StorageFolder on disk not found", result.Message); + } + + [TestMethod] + public async Task UpdateAppSettingsAsync_InvalidStorageFolder_Returns403() + { + var before = Environment.GetEnvironmentVariable("app__storageFolder"); + Environment.SetEnvironmentVariable("app__storageFolder", "test"); + + // Arrange + var selectorStorage = new FakeSelectorStorage(new FakeIStorage(new List{"/"})); + var updateAppSettingsByPath = new UpdateAppSettingsByPath(new AppSettings(), selectorStorage); + var appSettingTransferObject = new AppSettingsTransferObject + { + StorageFolder = "/" + }; + + // Act + var result = await updateAppSettingsByPath.UpdateAppSettingsAsync(appSettingTransferObject); + + // Set back to what is was before + Environment.SetEnvironmentVariable("app__storageFolder", before); + + // Assert + Assert.AreEqual(403, result.StatusCode); + Assert.AreEqual("There is an Environment variable set so you can't update it here", result.Message); + } + + + [TestMethod] + public async Task UpdateAppSettingsAsync_ValidInput_TwoTimes_Success() + { + var before = Environment.GetEnvironmentVariable("app__storageFolder"); + Environment.SetEnvironmentVariable("app__storageFolder", string.Empty); + + // Arrange + var testFolderPath = Path.DirectorySeparatorChar + "test" + Path.DirectorySeparatorChar; + + var storage = new FakeIStorage(new List{ + "/", testFolderPath }); + var appSettings = new AppSettings(); + var selectorStorage = new FakeSelectorStorage(storage); + var updateAppSettingsByPath = new UpdateAppSettingsByPath(appSettings, selectorStorage); + var appSettingTransferObject1 = new AppSettingsTransferObject + { + Verbose = true + }; + + // Act + var re1 = await updateAppSettingsByPath.UpdateAppSettingsAsync(appSettingTransferObject1); + Assert.IsFalse(re1.IsError); + + var fileResultString1 = await StreamToStringHelper.StreamToStringAsync(storage.ReadStream(appSettings.AppSettingsPath)); + var fileResult1 = JsonSerializer.Deserialize(fileResultString1, DefaultJsonSerializer.NoNamingPolicy); + + Assert.IsTrue(fileResult1.App.Verbose); + + var appSettingTransferObject2 = new AppSettingsTransferObject + { + StorageFolder = testFolderPath + }; + + await updateAppSettingsByPath.UpdateAppSettingsAsync(appSettingTransferObject2); + + var fileResultString2 = await StreamToStringHelper.StreamToStringAsync(storage.ReadStream(appSettings.AppSettingsPath)); + var fileResult2 = JsonSerializer.Deserialize(fileResultString2, DefaultJsonSerializer.NoNamingPolicy); + + + // Set back to what is was before + Environment.SetEnvironmentVariable("app__storageFolder", before); + + Assert.AreEqual(testFolderPath, fileResult2.App.StorageFolder); + Assert.IsTrue(fileResult2.App.Verbose); + } + + } +} diff --git a/starsky/starskytest/starsky.feature.thumbnail/Services/ManualThumbnailGenerationServiceTest.cs b/starsky/starskytest/starsky.feature.thumbnail/Services/ManualThumbnailGenerationServiceTest.cs index 3beb4fb47b..33a3b9184f 100644 --- a/starsky/starskytest/starsky.feature.thumbnail/Services/ManualThumbnailGenerationServiceTest.cs +++ b/starsky/starskytest/starsky.feature.thumbnail/Services/ManualThumbnailGenerationServiceTest.cs @@ -26,7 +26,8 @@ public async Task ThumbnailGenerationTest_CheckIfGenerated() var selectorStorage = new FakeSelectorStorage(storage); var controller = new ManualThumbnailGenerationService( new FakeIQuery( new List{new FileIndexItem("/test.jpg")} - ), new FakeIWebLogger(), new FakeIWebSocketConnectionsService(), new FakeIThumbnailService(selectorStorage), new FakeThumbnailBackgroundTaskQueue()); + ), new FakeIWebLogger(), new FakeIWebSocketConnectionsService(), + new FakeIThumbnailService(selectorStorage), new FakeThumbnailBackgroundTaskQueue()); await controller.WorkThumbnailGeneration("/"); @@ -59,7 +60,8 @@ public async Task ThumbnailGenerationTest_CheckIfGenerated_Socket_NoResultsInDat { var socket = new FakeIWebSocketConnectionsService(); var controller = new ManualThumbnailGenerationService( new FakeIQuery( - new List()), new FakeIWebLogger(), socket, new FakeIThumbnailService(), new FakeThumbnailBackgroundTaskQueue()); + new List()), new FakeIWebLogger(), socket, + new FakeIThumbnailService(new FakeSelectorStorage()), new FakeThumbnailBackgroundTaskQueue()); await controller.WorkThumbnailGeneration("/"); diff --git a/starsky/starskytest/starsky.feature.webftppublish/Helpers/WebFtpCliTest.cs b/starsky/starskytest/starsky.feature.webftppublish/Helpers/WebFtpCliTest.cs index e05653b919..9339c94672 100644 --- a/starsky/starskytest/starsky.feature.webftppublish/Helpers/WebFtpCliTest.cs +++ b/starsky/starskytest/starsky.feature.webftppublish/Helpers/WebFtpCliTest.cs @@ -2,6 +2,7 @@ using System.Collections.Generic; using System.IO; using System.Linq; +using System.Threading.Tasks; using Microsoft.VisualStudio.TestTools.UnitTesting; using starsky.feature.webftppublish.Helpers; using starsky.foundation.platform.Models; @@ -32,68 +33,68 @@ private static byte[] ExampleManifest() "true,\n \"_settings.json\": false\n },\n" + " \"Slug\": \"test\",\n \"Export\": \"20200808121411\",\n" + " \"Version\": \"0.3.0.0\"\n}"; - var stream = PlainTextFileHelper.StringToStream(input) as MemoryStream; + var stream = StringToStreamHelper.StringToStream(input) as MemoryStream; return stream?.ToArray(); } [TestMethod] - public void Run_Help() + public async Task Run_Help() { var console = new FakeConsoleWrapper(); - new WebFtpCli(_appSettings, new FakeSelectorStorage(), console,_webRequestFactory ) - .Run(new []{"-h"}); + await new WebFtpCli(_appSettings, new FakeSelectorStorage(), console,_webRequestFactory ) + .RunAsync(["-h"]); Assert.IsTrue(console.WrittenLines.FirstOrDefault()?.Contains("Starsky WebFtp Cli ~ Help:")); Assert.IsTrue(console.WrittenLines.LastOrDefault()?.Contains(" use -v -help to show settings: ")); } [TestMethod] - public void Run_Default() + public async Task Run_Default() { var console = new FakeConsoleWrapper(); - new WebFtpCli(_appSettings, new FakeSelectorStorage(), console, _webRequestFactory) - .Run(new []{""}); + await new WebFtpCli(_appSettings, new FakeSelectorStorage(), console, _webRequestFactory) + .RunAsync([""]); - Assert.IsTrue(console.WrittenLines.FirstOrDefault().Contains("Please use the -p to add a path first")); + Assert.IsTrue(console.WrittenLines.FirstOrDefault()?.Contains("Please use the -p to add a path first")); } [TestMethod] - public void Run_PathArg() + public async Task Run_PathArg() { var console = new FakeConsoleWrapper(); - new WebFtpCli(_appSettings, new FakeSelectorStorage(), console, _webRequestFactory) - .Run(new []{"-p"}); + await new WebFtpCli(_appSettings, new FakeSelectorStorage(), console, _webRequestFactory) + .RunAsync(["-p"]); Assert.IsTrue(console.WrittenLines.LastOrDefault()?.Contains("is not found")); } [TestMethod] - public void Run_NoFtpSettings() + public async Task Run_NoFtpSettings() { var console = new FakeConsoleWrapper(); var fakeSelectorStorage = new FakeSelectorStorage(new FakeIStorage(new List{"/test"})); // no ftp settings - new WebFtpCli(new AppSettings(),fakeSelectorStorage , console, _webRequestFactory) - .Run(new []{"-p", "/test"}); + await new WebFtpCli(new AppSettings(),fakeSelectorStorage , console, _webRequestFactory) + .RunAsync(["-p", "/test"]); Assert.IsTrue(console.WrittenLines.LastOrDefault()?.Contains("WebFtp settings")); } [TestMethod] - public void Run_NoSettingsFileInFolder() + public async Task Run_NoSettingsFileInFolder() { var console = new FakeConsoleWrapper(); var fakeSelectorStorage = new FakeSelectorStorage(new FakeIStorage(new List{"/test"})); - new WebFtpCli(_appSettings,fakeSelectorStorage , console, _webRequestFactory) - .Run(new []{"-p", "/test"}); + await new WebFtpCli(_appSettings,fakeSelectorStorage , console, _webRequestFactory) + .RunAsync(["-p", "/test"]); Assert.IsTrue(console.WrittenLines.LastOrDefault()?.Contains("generate a settings file")); } [TestMethod] - public void Run_SettingsFile_successful() + public async Task Run_SettingsFile_successful() { var console = new FakeConsoleWrapper(); @@ -102,10 +103,10 @@ public void Run_SettingsFile_successful() "/test/1000/0_kl1k.jpg"}, new List {ExampleManifest(), Array.Empty()})); // instead of new byte[0] - new WebFtpCli(_appSettings, fakeSelectorStorage , console, _webRequestFactory) - .Run(new []{"-p", "/test"}); + await new WebFtpCli(_appSettings, fakeSelectorStorage , console, _webRequestFactory) + .RunAsync(["-p", "/test"]); - var isSuccess = console?.WrittenLines?.LastOrDefault()? + var isSuccess = console.WrittenLines?.LastOrDefault()? .Contains("Ftp copy successful done"); switch ( isSuccess ) diff --git a/starsky/starskytest/starsky.feature.webhtmlpublish/Helpers/ExportManifestTest.cs b/starsky/starskytest/starsky.feature.webhtmlpublish/Helpers/ExportManifestTest.cs index c162918636..6a8624f8af 100644 --- a/starsky/starskytest/starsky.feature.webhtmlpublish/Helpers/ExportManifestTest.cs +++ b/starsky/starskytest/starsky.feature.webhtmlpublish/Helpers/ExportManifestTest.cs @@ -1,8 +1,11 @@ +using System; using System.Collections.Generic; using System.IO; +using System.Threading.Tasks; using Microsoft.VisualStudio.TestTools.UnitTesting; using starsky.feature.webhtmlpublish.Helpers; using starsky.foundation.platform.Models; +using starsky.foundation.storage.Helpers; using starskytest.FakeMocks; namespace starskytest.starsky.feature.webhtmlpublish.Helpers @@ -24,6 +27,27 @@ public void ExportManifestTest_Export() var expectedPath = Path.Combine(appSettings.StorageFolder, "_settings.json"); Assert.IsTrue(storage.ExistFile(expectedPath)); } - + + [TestMethod] + public async Task ExportManifestTest_Export_JsonCompare() + { + var appSettings = new AppSettings(); + + var storage = new FakeIStorage(); + var manifest = new PublishManifest(storage) + .ExportManifest(appSettings.StorageFolder, "Test", + new Dictionary()); + + var expectedPath = Path.Combine(appSettings.StorageFolder, "_settings.json"); + var output = (await + StreamToStringHelper.StreamToStringAsync( + storage.ReadStream(expectedPath))).Replace("\r\n","\n"); + + var expectedOutput = + $"{{\n \"Name\": \"Test\",\n \"Copy\": {{}},\n \"Slug\": \"test\",\n" + + $" \"Export\": \"{manifest.Export}\",\n \"Version\": \"{manifest.Version}\"\n}}"; + + Assert.AreEqual(expectedOutput, output); + } } } diff --git a/starsky/starskytest/starsky.foundation.database/DataProtection/SqlXmlRepositoryTest.cs b/starsky/starskytest/starsky.foundation.database/DataProtection/SqlXmlRepositoryTest.cs index 588979d6a9..32651457e3 100644 --- a/starsky/starskytest/starsky.foundation.database/DataProtection/SqlXmlRepositoryTest.cs +++ b/starsky/starskytest/starsky.foundation.database/DataProtection/SqlXmlRepositoryTest.cs @@ -65,29 +65,22 @@ public void SqlXmlRepositoryTest_ExpectedException_NullReferenceException() private static MySqlException CreateMySqlException(string message) { - var info = new SerializationInfo(typeof(Exception), - new FormatterConverter()); - info.AddValue("Number", 1); - info.AddValue("SqlState", "SqlState"); - info.AddValue("Message", message); - info.AddValue("InnerException", new Exception()); - info.AddValue("HelpURL", ""); - info.AddValue("StackTraceString", ""); - info.AddValue("RemoteStackTraceString", ""); - info.AddValue("RemoteStackIndex", 1); - info.AddValue("HResult", 1); - info.AddValue("Source", ""); - info.AddValue("WatsonBuckets", Array.Empty() ); - - // private MySqlException(SerializationInfo info, StreamingContext context) - var ctor = - typeof(MySqlException).GetConstructors(BindingFlags.Instance | - BindingFlags.NonPublic | BindingFlags.InvokeMethod).FirstOrDefault(); + // MySqlErrorCode errorCode, string? sqlState, string message, Exception? innerException + + var ctorLIst = + typeof(MySqlException).GetConstructors( + BindingFlags.Instance | + BindingFlags.NonPublic | BindingFlags.InvokeMethod); + var ctor = ctorLIst.FirstOrDefault(p => + p.ToString() == "Void .ctor(MySqlConnector.MySqlErrorCode, System.String, System.String, System.Exception)" ); + var instance = ( MySqlException ) ctor?.Invoke(new object[] { - info, - new StreamingContext(StreamingContextStates.All) + MySqlErrorCode.AccessDenied, + "test", + message, + new Exception() }); return instance; } diff --git a/starsky/starskytest/starsky.foundation.database/Extensions/TestConnectionTest.cs b/starsky/starskytest/starsky.foundation.database/Extensions/TestConnectionTest.cs index 0e7cbb606f..84666d2caf 100644 --- a/starsky/starskytest/starsky.foundation.database/Extensions/TestConnectionTest.cs +++ b/starsky/starskytest/starsky.foundation.database/Extensions/TestConnectionTest.cs @@ -33,6 +33,7 @@ public override DatabaseFacade Database return null; } +#pragma warning disable SYSLIB0050 var info = new SerializationInfo(typeof(Exception), new FormatterConverter()); info.AddValue("Number", 1); @@ -57,6 +58,7 @@ public override DatabaseFacade Database info, new StreamingContext(StreamingContextStates.All) }); +#pragma warning restore SYSLIB0050 throw instance; } diff --git a/starsky/starskytest/starsky.foundation.database/Helpers/RunMigrationsTest.cs b/starsky/starskytest/starsky.foundation.database/Helpers/RunMigrationsTest.cs index 7cd754de06..7d9be63e9e 100644 --- a/starsky/starskytest/starsky.foundation.database/Helpers/RunMigrationsTest.cs +++ b/starsky/starskytest/starsky.foundation.database/Helpers/RunMigrationsTest.cs @@ -49,29 +49,22 @@ public async Task Test() private static MySqlException CreateMySqlException(string message) { - var info = new SerializationInfo(typeof(Exception), - new FormatterConverter()); - info.AddValue("Number", 1); - info.AddValue("SqlState", "SqlState"); - info.AddValue("Message", message); - info.AddValue("InnerException", new Exception()); - info.AddValue("HelpURL", ""); - info.AddValue("StackTraceString", ""); - info.AddValue("RemoteStackTraceString", ""); - info.AddValue("RemoteStackIndex", 1); - info.AddValue("HResult", 1); - info.AddValue("Source", ""); - info.AddValue("WatsonBuckets", Array.Empty() ); - - // private MySqlException(SerializationInfo info, StreamingContext context) - var ctor = - typeof(MySqlException).GetConstructors(BindingFlags.Instance | - BindingFlags.NonPublic | BindingFlags.InvokeMethod).FirstOrDefault(); + // MySqlErrorCode errorCode, string? sqlState, string message, Exception? innerException + + var ctorLIst = + typeof(MySqlException).GetConstructors( + BindingFlags.Instance | + BindingFlags.NonPublic | BindingFlags.InvokeMethod); + var ctor = ctorLIst.FirstOrDefault(p => + p.ToString() == "Void .ctor(MySqlConnector.MySqlErrorCode, System.String, System.String, System.Exception)" ); + var instance = - ( MySqlException ) ctor.Invoke(new object[] + ( MySqlException ) ctor?.Invoke(new object[] { - info, - new StreamingContext(StreamingContextStates.All) + MySqlErrorCode.AccessDenied, + "test", + message, + new Exception() }); return instance; } diff --git a/starsky/starskytest/starsky.foundation.database/NotificationsTest/NotificationQueryErrorTest.cs b/starsky/starskytest/starsky.foundation.database/NotificationsTest/NotificationQueryErrorTest.cs index 382f532d4e..3fc4245676 100644 --- a/starsky/starskytest/starsky.foundation.database/NotificationsTest/NotificationQueryErrorTest.cs +++ b/starsky/starskytest/starsky.foundation.database/NotificationsTest/NotificationQueryErrorTest.cs @@ -66,7 +66,13 @@ public TProperty GetOriginalValue(IProperty property) { throw new System.NotImplementedException(); } - + + public void SetStoreGeneratedValue(IProperty property, object? value, + bool setModified = true) + { + throw new NotImplementedException(); + } + public void SetStoreGeneratedValue(IProperty property, object? value) { throw new System.NotImplementedException(); @@ -94,12 +100,14 @@ public bool IsConceptualNull(IProperty property) throw new NotImplementedException(); } -#pragma warning disable 8618 +#pragma warning disable CS8618 // Non-nullable field must contain a non-null value when exiting constructor. Consider declaring as nullable. + public DbContext Context { get; } + // ReSharper disable once UnassignedGetOnlyAutoProperty public IEntityType EntityType { get; } -#pragma warning restore 8618 + public EntityState EntityState { get; set; } -#pragma warning disable 8618 + // ReSharper disable once UnassignedGetOnlyAutoProperty public IUpdateEntry SharedIdentityEntry { get; } #pragma warning restore 8618 diff --git a/starsky/starskytest/starsky.foundation.database/QueryTest/QueryGetAllRecursiveTest.cs b/starsky/starskytest/starsky.foundation.database/QueryTest/QueryGetAllRecursiveTest.cs index b7216e8b9f..f72a2bcaeb 100644 --- a/starsky/starskytest/starsky.foundation.database/QueryTest/QueryGetAllRecursiveTest.cs +++ b/starsky/starskytest/starsky.foundation.database/QueryTest/QueryGetAllRecursiveTest.cs @@ -22,10 +22,9 @@ namespace starskytest.starsky.foundation.database.QueryTest [TestClass] public sealed class QueryGetAllRecursiveTest { - private readonly IMemoryCache? _memoryCache; - private readonly IQuery _query; + private readonly Query _query; - private IServiceScopeFactory CreateNewScope() + private static IServiceScopeFactory CreateNewScope() { var services = new ServiceCollection(); services.AddDbContext(options => options.UseInMemoryDatabase(nameof(QueryGetAllFilesTest))); @@ -38,12 +37,12 @@ public QueryGetAllRecursiveTest() var provider = new ServiceCollection() .AddMemoryCache() .BuildServiceProvider(); - _memoryCache = provider.GetService(); + var memoryCache = provider.GetService(); var serviceScope = CreateNewScope(); var scope = serviceScope.CreateScope(); var dbContext = scope.ServiceProvider.GetRequiredService(); _query = new Query(dbContext, - new AppSettings{Verbose = true}, serviceScope, new FakeIWebLogger(),_memoryCache); + new AppSettings{Verbose = true}, serviceScope, new FakeIWebLogger(),memoryCache); } [TestMethod] @@ -77,31 +76,24 @@ await _query.AddItemAsync( private static MySqlException CreateMySqlException(string message) { - var info = new SerializationInfo(typeof(Exception), - new FormatterConverter()); - info.AddValue("Number", 1); - info.AddValue("SqlState", "SqlState"); - info.AddValue("Message", message); - info.AddValue("InnerException", new Exception()); - info.AddValue("HelpURL", ""); - info.AddValue("StackTraceString", ""); - info.AddValue("RemoteStackTraceString", ""); - info.AddValue("RemoteStackIndex", 1); - info.AddValue("HResult", 1); - info.AddValue("Source", ""); - info.AddValue("WatsonBuckets", Array.Empty() ); - - // private MySqlException(SerializationInfo info, StreamingContext context) - var ctor = - typeof(MySqlException).GetConstructors(BindingFlags.Instance | - BindingFlags.NonPublic | BindingFlags.InvokeMethod).FirstOrDefault(); + // MySqlErrorCode errorCode, string? sqlState, string message, Exception? innerException + + var ctorLIst = + typeof(MySqlException).GetConstructors( + BindingFlags.Instance | + BindingFlags.NonPublic | BindingFlags.InvokeMethod); + var ctor = ctorLIst.FirstOrDefault(p => + p.ToString() == "Void .ctor(MySqlConnector.MySqlErrorCode, System.String, System.String, System.Exception)" ); + var instance = - ( MySqlException? ) ctor?.Invoke(new object[] + ( MySqlException ) ctor?.Invoke(new object[] { - info, - new StreamingContext(StreamingContextStates.All) - }); - return instance!; + MySqlErrorCode.AccessDenied, + "test", + message, + new Exception() + })!; + return instance; } private static bool IsCalledMySqlSaveDbExceptionContext { get; set; } diff --git a/starsky/starskytest/starsky.foundation.database/QueryTest/QueryTest.cs b/starsky/starskytest/starsky.foundation.database/QueryTest/QueryTest.cs index d4a19ea938..f15c16fad0 100644 --- a/starsky/starskytest/starsky.foundation.database/QueryTest/QueryTest.cs +++ b/starsky/starskytest/starsky.foundation.database/QueryTest/QueryTest.cs @@ -1102,9 +1102,11 @@ public void QueryFolder_Add_And_UpdateFolderCache_UpdateCacheItemTest() public void CacheUpdateItem_Skip_ShouldSetItem() { var item1 = new FileIndexItem {Id = 400, Tags = "hi", FileName = "cache"}; + // already verbose _query.CacheUpdateItem(new List{item1}); + Assert.IsTrue(_logger.TrackedInformation.Count != 0); Assert.IsTrue(_logger.TrackedInformation.FirstOrDefault().Item2.Contains("[CacheUpdateItem]")); } diff --git a/starsky/starskytest/starsky.foundation.database/QueryTest/QueryUpdateItem_Error.cs b/starsky/starskytest/starsky.foundation.database/QueryTest/QueryUpdateItem_Error.cs index 524777ca9d..f2e66b66f1 100644 --- a/starsky/starskytest/starsky.foundation.database/QueryTest/QueryUpdateItem_Error.cs +++ b/starsky/starskytest/starsky.foundation.database/QueryTest/QueryUpdateItem_Error.cs @@ -87,7 +87,13 @@ public TProperty GetOriginalValue(IProperty property) { throw new System.NotImplementedException(); } - + + public void SetStoreGeneratedValue(IProperty property, object? value, + bool setModified = true) + { + throw new NotImplementedException(); + } + public void SetStoreGeneratedValue(IProperty property, object? value) { throw new System.NotImplementedException(); @@ -116,11 +122,13 @@ public bool IsConceptualNull(IProperty property) } #pragma warning disable 8618 + public DbContext Context { get; } + // ReSharper disable once UnassignedGetOnlyAutoProperty public IEntityType EntityType { get; } -#pragma warning restore 8618 + public EntityState EntityState { get; set; } -#pragma warning disable 8618 + // ReSharper disable once UnassignedGetOnlyAutoProperty public IUpdateEntry SharedIdentityEntry { get; } #pragma warning restore 8618 @@ -302,31 +310,24 @@ public override Task SaveChangesAsync(CancellationToken cancellationToken = private static MySqlException CreateMySqlException(string message) { - var info = new SerializationInfo(typeof(Exception), - new FormatterConverter()); - info.AddValue("Number", 1); - info.AddValue("SqlState", "SqlState"); - info.AddValue("Message", message); - info.AddValue("InnerException", new Exception()); - info.AddValue("HelpURL", ""); - info.AddValue("StackTraceString", ""); - info.AddValue("RemoteStackTraceString", ""); - info.AddValue("RemoteStackIndex", 1); - info.AddValue("HResult", 1); - info.AddValue("Source", ""); - info.AddValue("WatsonBuckets", Array.Empty() ); - - // private MySqlException(SerializationInfo info, StreamingContext context) - var ctor = - typeof(MySqlException).GetConstructors(BindingFlags.Instance | - BindingFlags.NonPublic | BindingFlags.InvokeMethod).FirstOrDefault(); + // MySqlErrorCode errorCode, string? sqlState, string message, Exception? innerException + + var ctorLIst = + typeof(MySqlException).GetConstructors( + BindingFlags.Instance | + BindingFlags.NonPublic | BindingFlags.InvokeMethod); + var ctor = ctorLIst.FirstOrDefault(p => + p.ToString() == "Void .ctor(MySqlConnector.MySqlErrorCode, System.String, System.String, System.Exception)" ); + var instance = - ( MySqlException? ) ctor?.Invoke(new object[] + ( MySqlException ) ctor?.Invoke(new object[] { - info, - new StreamingContext(StreamingContextStates.All) - }); - return instance!; + MySqlErrorCode.AccessDenied, + "test", + message, + new Exception() + })!; + return instance; } [TestMethod] diff --git a/starsky/starskytest/starsky.foundation.database/Thumbnails/ThumbnailQueryErrorTest.cs b/starsky/starskytest/starsky.foundation.database/Thumbnails/ThumbnailQueryErrorTest.cs index 0a2c9a03e9..dadcefa05d 100644 --- a/starsky/starskytest/starsky.foundation.database/Thumbnails/ThumbnailQueryErrorTest.cs +++ b/starsky/starskytest/starsky.foundation.database/Thumbnails/ThumbnailQueryErrorTest.cs @@ -71,7 +71,13 @@ public TProperty GetOriginalValue(IProperty property) { throw new System.NotImplementedException(); } - + + public void SetStoreGeneratedValue(IProperty property, object? value, + bool setModified = true) + { + throw new NotImplementedException(); + } + public void SetStoreGeneratedValue(IProperty property, object? value) { throw new NotImplementedException(); @@ -98,15 +104,15 @@ public bool IsConceptualNull(IProperty property) { throw new NotImplementedException(); } - #pragma warning disable 8618 + public DbContext Context { get; } + // ReSharper disable once UnassignedGetOnlyAutoProperty public IEntityType EntityType { get; } -#pragma warning restore 8618 public EntityState EntityState { get; set; } -#pragma warning disable 8618 // ReSharper disable once UnassignedGetOnlyAutoProperty public IUpdateEntry SharedIdentityEntry { get; } + #pragma warning restore 8618 } @@ -200,31 +206,24 @@ public async Task ThumbnailQuery_3ConcurrencyException() private static MySqlException CreateMySqlException(string message) { - var info = new SerializationInfo(typeof(Exception), - new FormatterConverter()); - info.AddValue("Number", 1); - info.AddValue("SqlState", "SqlState"); - info.AddValue("Message", message); - info.AddValue("InnerException", new Exception()); - info.AddValue("HelpURL", ""); - info.AddValue("StackTraceString", ""); - info.AddValue("RemoteStackTraceString", ""); - info.AddValue("RemoteStackIndex", 1); - info.AddValue("HResult", 1); - info.AddValue("Source", ""); - info.AddValue("WatsonBuckets", Array.Empty() ); - - // private MySqlException(SerializationInfo info, StreamingContext context) - var ctor = - typeof(MySqlException).GetConstructors(BindingFlags.Instance | - BindingFlags.NonPublic | BindingFlags.InvokeMethod).FirstOrDefault(); + // MySqlErrorCode errorCode, string? sqlState, string message, Exception? innerException + + var ctorLIst = + typeof(MySqlException).GetConstructors( + BindingFlags.Instance | + BindingFlags.NonPublic | BindingFlags.InvokeMethod); + var ctor = ctorLIst.FirstOrDefault(p => + p.ToString() == "Void .ctor(MySqlConnector.MySqlErrorCode, System.String, System.String, System.Exception)" ); + var instance = - ( MySqlException? ) ctor?.Invoke(new object[] + ( MySqlException ) ctor?.Invoke(new object[] { - info, - new StreamingContext(StreamingContextStates.All) - }); - return instance!; + MySqlErrorCode.AccessDenied, + "test", + message, + new Exception() + })!; + return instance; } private static bool IsCalledMySqlSaveDbExceptionContext { get; set; } diff --git a/starsky/starskytest/starsky.foundation.native/Trash/Helpers/MacOsTrashBindingHelperTest.cs b/starsky/starskytest/starsky.foundation.native/Trash/Helpers/MacOsTrashBindingHelperTest.cs index 96acdadaad..c6b9c411ab 100644 --- a/starsky/starskytest/starsky.foundation.native/Trash/Helpers/MacOsTrashBindingHelperTest.cs +++ b/starsky/starskytest/starsky.foundation.native/Trash/Helpers/MacOsTrashBindingHelperTest.cs @@ -6,11 +6,10 @@ using System.Threading.Tasks; using Microsoft.VisualStudio.TestTools.UnitTesting; using starsky.foundation.native.Helpers; -using starsky.foundation.native.Trash; using starsky.foundation.native.Trash.Helpers; using starskytest.FakeCreateAn; -namespace starskytest.starsky.foundation.native.Trash; +namespace starskytest.starsky.foundation.native.Trash.Helpers; [TestClass] public class MacOsTrashBindingHelperTest diff --git a/starsky/starskytest/starsky.foundation.platform/Exceptions/TelemetryServiceExceptionTest.cs b/starsky/starskytest/starsky.foundation.platform/Exceptions/TelemetryServiceExceptionTest.cs index e75a3911bd..b81a0cc3b5 100644 --- a/starsky/starskytest/starsky.foundation.platform/Exceptions/TelemetryServiceExceptionTest.cs +++ b/starsky/starskytest/starsky.foundation.platform/Exceptions/TelemetryServiceExceptionTest.cs @@ -3,6 +3,7 @@ using System.Reflection; using System.Runtime.Serialization; using Microsoft.VisualStudio.TestTools.UnitTesting; +using MySqlConnector; using starsky.foundation.platform.Exceptions; namespace starskytest.starsky.foundation.platform.Exceptions @@ -10,12 +11,15 @@ namespace starskytest.starsky.foundation.platform.Exceptions [TestClass] public class TelemetryServiceExceptionTest { + [TestMethod] [ExpectedException(typeof(TelemetryServiceException))] public void TelemetryServiceException() { +#pragma warning disable SYSLIB0050 var info = new SerializationInfo(typeof(Exception), new FormatterConverter()); +#pragma warning restore SYSLIB0050 info.AddValue("Message", ""); info.AddValue("InnerException", new Exception()); @@ -32,7 +36,9 @@ public void TelemetryServiceException() ( TelemetryServiceException ) ctor!.Invoke(new object[] { info, +#pragma warning disable SYSLIB0050 new StreamingContext(StreamingContextStates.All) +#pragma warning restore SYSLIB0050 }); throw instance; diff --git a/starsky/starskytest/Services/ConfigReadTest.cs b/starsky/starskytest/starsky.foundation.platform/Helpers/PathHelper2Test.cs similarity index 92% rename from starsky/starskytest/Services/ConfigReadTest.cs rename to starsky/starskytest/starsky.foundation.platform/Helpers/PathHelper2Test.cs index 9d61ca19ae..ffa2f4b750 100644 --- a/starsky/starskytest/Services/ConfigReadTest.cs +++ b/starsky/starskytest/starsky.foundation.platform/Helpers/PathHelper2Test.cs @@ -2,12 +2,11 @@ using Microsoft.VisualStudio.TestTools.UnitTesting; using starsky.foundation.platform.Helpers; using starskycore.Attributes; -using starskycore.Helpers; -namespace starskytest.Services +namespace starskytest.starsky.foundation.platform.Helpers { [TestClass] - public sealed class ConfigReadTest + public sealed class PathHelper2Test { [ExcludeFromCoverage] diff --git a/starsky/starskytest/starsky.foundation.platform/Helpers/PathHelperTest.cs b/starsky/starskytest/starsky.foundation.platform/Helpers/PathHelperTest.cs index 2792e5f08e..853e0db76a 100644 --- a/starsky/starskytest/starsky.foundation.platform/Helpers/PathHelperTest.cs +++ b/starsky/starskytest/starsky.foundation.platform/Helpers/PathHelperTest.cs @@ -1,8 +1,10 @@ using System.IO; using System.Linq; using System.Text.RegularExpressions; +using System.Threading.Tasks; using Microsoft.VisualStudio.TestTools.UnitTesting; using starsky.foundation.platform.Helpers; +using starsky.foundation.platform.Models; using starsky.foundation.storage.Helpers; using starskytest.FakeCreateAn; @@ -27,16 +29,23 @@ public void GetFileName_ReturnsValidFileName() [TestMethod] [ExpectedException(typeof(RegexMatchTimeoutException))] - public void GetFileName_ReturnsFileName_WithMaliciousInput() + public async Task GetFileName_ReturnsFileName_WithMaliciousInput_UnixOnly() { + if ( new AppSettings().IsWindows ) + { + Assert.Inconclusive("Test is Linux & Mac OS Only"); + return; + } + // Act and Assert - var test = - PlainTextFileHelper.StreamToString( + var test = await + StreamToStringHelper.StreamToStringAsync( new MemoryStream(CreateAnImage.Bytes.ToArray())); - var test2 = - PlainTextFileHelper.StreamToString( + var test2 = await + StreamToStringHelper.StreamToStringAsync( new MemoryStream(CreateAnImageA6600.Bytes.ToArray())); - PathHelper.GetFileName(test + test2,100); + + PathHelper.GetFileName(test + test2 + test + test,1); } [TestMethod] diff --git a/starsky/starskytest/starsky.foundation.platform/Helpers/PortProgramHelperTest.cs b/starsky/starskytest/starsky.foundation.platform/Helpers/PortProgramHelperTest.cs index a6746e36cf..ba7704ed6d 100644 --- a/starsky/starskytest/starsky.foundation.platform/Helpers/PortProgramHelperTest.cs +++ b/starsky/starskytest/starsky.foundation.platform/Helpers/PortProgramHelperTest.cs @@ -69,7 +69,7 @@ public async Task SetEnvPortAspNetUrlsAndSetDefault_ShouldIgnore_DueAppSettingsF Environment.SetEnvironmentVariable("ASPNETCORE_URLS",""); var appSettingsPath = Path.Combine(new AppSettings().BaseDirectoryProject,"appsettings-222.json"); - var stream = PlainTextFileHelper.StringToStream("{ \"Kestrel\": {\n \"Endpoints\": {\n " + + var stream = StringToStreamHelper.StringToStream("{ \"Kestrel\": {\n \"Endpoints\": {\n " + " \"Https\": {\n \"Url\": \"https://*:8001\"\n },\n \"Http\": {\n " + " \"Url\": \"http://*:8000\"\n }\n }\n }\n }"); await new StorageHostFullPathFilesystem().WriteStreamAsync(stream,appSettingsPath); @@ -93,7 +93,7 @@ public async Task SkipForAppSettingsJsonFile_ShouldIgnore_DueAppSettingsFile() Environment.SetEnvironmentVariable("ASPNETCORE_URLS",""); var appSettingsPath = Path.Combine(new AppSettings().BaseDirectoryProject,"appsettings-111.json"); - var stream = PlainTextFileHelper.StringToStream("{ \"Kestrel\": {\n \"Endpoints\": {\n " + + var stream = StringToStreamHelper.StringToStream("{ \"Kestrel\": {\n \"Endpoints\": {\n " + " \"Https\": {\n \"Url\": \"https://*:8001\"\n },\n \"Http\": {\n " + " \"Url\": \"http://*:8000\"\n }\n }\n }\n }"); await new StorageHostFullPathFilesystem().WriteStreamAsync(stream,appSettingsPath); @@ -117,7 +117,7 @@ public async Task SkipForAppSettingsJsonFile_ShouldIgnore_DueAppSettingsFile2() Environment.SetEnvironmentVariable("ASPNETCORE_URLS",""); var appSettingsPath = Path.Combine(new AppSettings().BaseDirectoryProject,"appsettings-333.json"); - var stream = PlainTextFileHelper.StringToStream("{ \"Kestrel\": {\n \"Endpoints\": {\n " + + var stream = StringToStreamHelper.StringToStream("{ \"Kestrel\": {\n \"Endpoints\": {\n " + " \"Https\": {\n \"Url\": \"https://*:8001\"\n }\n " + "\n }\n }\n }"); await new StorageHostFullPathFilesystem().WriteStreamAsync(stream,appSettingsPath); diff --git a/starsky/starskytest/starsky.foundation.platform/Helpers/ReadAppSettingsTest.cs b/starsky/starskytest/starsky.foundation.platform/Helpers/ReadAppSettingsTest.cs index 4f89c3ed8f..80e30c555e 100644 --- a/starsky/starskytest/starsky.foundation.platform/Helpers/ReadAppSettingsTest.cs +++ b/starsky/starskytest/starsky.foundation.platform/Helpers/ReadAppSettingsTest.cs @@ -22,7 +22,7 @@ public void ReadAppSettingsTest_default() public async Task ReadAppSettingsTest_readKestrelData() { var appSettingsPath = Path.Combine(new AppSettings().BaseDirectoryProject,"appsettings-test2.json"); - var stream = PlainTextFileHelper.StringToStream("{ \"Kestrel\": {\n \"Endpoints\": {\n " + + var stream = StringToStreamHelper.StringToStream("{ \"Kestrel\": {\n \"Endpoints\": {\n " + " \"Https\": {\n \"Url\": \"https://*:8001\"\n },\n \"Http\": {\n " + " \"Url\": \"http://*:8000\"\n }\n }\n }\n }"); await new StorageHostFullPathFilesystem().WriteStreamAsync(stream,appSettingsPath); diff --git a/starsky/starskytest/starsky.foundation.platform/Helpers/SetupAppSettingsTest.cs b/starsky/starskytest/starsky.foundation.platform/Helpers/SetupAppSettingsTest.cs index bb296e6d3f..f376a1db51 100644 --- a/starsky/starskytest/starsky.foundation.platform/Helpers/SetupAppSettingsTest.cs +++ b/starsky/starskytest/starsky.foundation.platform/Helpers/SetupAppSettingsTest.cs @@ -32,7 +32,7 @@ public async Task SetLocalAppData_ShouldRead() var path = Path.Combine(appDataFolderFullPath, "appsettings.json"); var example = - PlainTextFileHelper.StringToStream( + StringToStreamHelper.StringToStream( "{\n \"app\" :{\n \"isAccountRegisterOpen\": \"true\"\n }\n}\n"); await _hostStorage.WriteStreamAsync(example, path); @@ -73,7 +73,7 @@ public async Task MergeJsonFiles_DefaultFile() } _hostStorage.CreateDirectory(testDir); - await _hostStorage.WriteStreamAsync(PlainTextFileHelper.StringToStream( + await _hostStorage.WriteStreamAsync(StringToStreamHelper.StringToStream( "{\n \"app\": {\n " + " \"StorageFolder\": \"/data/test\"\n " + " }\n}\n"), Path.Combine(testDir, "appsettings.json")); @@ -100,12 +100,12 @@ public async Task MergeJsonFiles_StackPatchFile() } _hostStorage.CreateDirectory(testDir); - await _hostStorage.WriteStreamAsync(PlainTextFileHelper.StringToStream( + await _hostStorage.WriteStreamAsync(StringToStreamHelper.StringToStream( "{\n \"app\": {\n " + " \"StorageFolder\": \"/data/test\",\n \"addSwagger\": \"true\" " + " }\n}\n"), Path.Combine(testDir, "appsettings.json")); - await _hostStorage.WriteStreamAsync(PlainTextFileHelper.StringToStream( + await _hostStorage.WriteStreamAsync(StringToStreamHelper.StringToStream( "{\n \"app\": {\n \"addSwagger\": \"false\" " + " }\n}\n"), Path.Combine(testDir, "appsettings.patch.json")); @@ -124,12 +124,12 @@ public async Task MergeJsonFiles_StackMachineNamePatchFile() } _hostStorage.CreateDirectory(testDir); - await _hostStorage.WriteStreamAsync(PlainTextFileHelper.StringToStream( + await _hostStorage.WriteStreamAsync(StringToStreamHelper.StringToStream( "{\n \"app\": {\n " + " \"StorageFolder\": \"/data/test\",\n \"addSwagger\": \"true\" " + " }\n}\n"), Path.Combine(testDir, "appsettings.json")); - await _hostStorage.WriteStreamAsync(PlainTextFileHelper.StringToStream( + await _hostStorage.WriteStreamAsync(StringToStreamHelper.StringToStream( "{\n \"app\": {\n \"addSwagger\": \"false\" " + " }\n}\n"), Path.Combine(testDir, $"{SetupAppSettings.AppSettingsMachineNameWithDot()}json")); @@ -145,12 +145,12 @@ public async Task MergeJsonFiles_StackFromEnv() _hostStorage.FolderDelete(testDir); _hostStorage.CreateDirectory(testDir); - await _hostStorage.WriteStreamAsync(PlainTextFileHelper.StringToStream( + await _hostStorage.WriteStreamAsync(StringToStreamHelper.StringToStream( "{\n \"app\": {\n " + " \"StorageFolder\": \"/data/test\",\n \"addSwagger\": \"true\" " + " }\n}\n"), Path.Combine(testDir, "appsettings.json")); - await _hostStorage.WriteStreamAsync(PlainTextFileHelper.StringToStream( + await _hostStorage.WriteStreamAsync(StringToStreamHelper.StringToStream( "{\n \"app\": {\n \"addSwagger\": \"false\" " + " }\n}\n"), Path.Combine(testDir, "appsettings_ref_patch.json")); diff --git a/starsky/starskytest/starsky.foundation.platform/Middleware/CheckIfAccountExistMiddlewareTest.cs b/starsky/starskytest/starsky.foundation.platform/Middleware/CheckIfAccountExistMiddlewareTest.cs index 7aa9c64b21..7a3477b5bb 100644 --- a/starsky/starskytest/starsky.foundation.platform/Middleware/CheckIfAccountExistMiddlewareTest.cs +++ b/starsky/starskytest/starsky.foundation.platform/Middleware/CheckIfAccountExistMiddlewareTest.cs @@ -74,7 +74,7 @@ public async Task NotLoggedIn() (_) => { invoked = true; - return Task.FromResult(0); + return Task.CompletedTask; }); var httpContext = new DefaultHttpContext @@ -96,7 +96,7 @@ public async Task HasClaim_AndAuthenticated() (_) => { invoked = true; - return Task.FromResult(0); + return Task.CompletedTask; }); var httpContextAccessor = _serviceProvider.GetRequiredService(); @@ -109,7 +109,7 @@ public async Task HasClaim_AndAuthenticated() await middleware.Invoke(httpContextAccessor.HttpContext); Assert.IsTrue(invoked); - Assert.IsTrue(httpContextAccessor.HttpContext.User.Identity.IsAuthenticated); + Assert.IsTrue(httpContextAccessor.HttpContext?.User.Identity?.IsAuthenticated); } @@ -122,7 +122,7 @@ public async Task HasClaim_AndAuthenticated_ButRemoved() (_) => { invoked = true; - return Task.FromResult(0); + return Task.CompletedTask; }); var httpContextAccessor = _serviceProvider.GetRequiredService(); @@ -134,12 +134,11 @@ public async Task HasClaim_AndAuthenticated_ButRemoved() // and remove user await userManager.RemoveUser("email", "test"); - await middleware.Invoke(httpContextAccessor.HttpContext); Assert.IsFalse(invoked); - Assert.AreEqual(401,httpContextAccessor.HttpContext.Response.StatusCode); + Assert.AreEqual(401,httpContextAccessor.HttpContext?.Response.StatusCode); } [TestMethod] @@ -153,7 +152,7 @@ public void GetUserTableIdFromClaims_NameIdentifierNull() [TestMethod] public void GetUserTableIdFromClaims_Valid() { - var userId = "2"; + const string userId = "2"; var httpContext = new DefaultHttpContext(); var claims = new List { new Claim(ClaimTypes.NameIdentifier, userId) }; httpContext.User = new ClaimsPrincipal(new ClaimsIdentity(claims)); diff --git a/starsky/starskytest/starsky.foundation.platform/Middleware/ContentSecurityPolicyMiddlewareTest.cs b/starsky/starskytest/starsky.foundation.platform/Middleware/ContentSecurityPolicyMiddlewareTest.cs index 1700a8d206..b68f7ae235 100644 --- a/starsky/starskytest/starsky.foundation.platform/Middleware/ContentSecurityPolicyMiddlewareTest.cs +++ b/starsky/starskytest/starsky.foundation.platform/Middleware/ContentSecurityPolicyMiddlewareTest.cs @@ -4,7 +4,6 @@ using Microsoft.AspNetCore.Http; using Microsoft.VisualStudio.TestTools.UnitTesting; using starsky.foundation.accountmanagement.Extensions; -using starsky.foundation.accountmanagement.Middleware; using starsky.foundation.platform.Extensions; using starsky.foundation.platform.Middleware; @@ -36,14 +35,16 @@ public async Task MiddlewareExtensionsTest_CSPBasicSetupTest() public async Task ContentSecurityPolicyMiddlewareTest_invoke_testContent() { // Arrange - var httpContext = new DefaultHttpContext(); - httpContext.Request.Scheme = "http"; - var authMiddleware = new ContentSecurityPolicyMiddleware(next: (innerHttpContext) => Task.FromResult(0)); - + var httpContext = new DefaultHttpContext { Request = + { + Scheme = "http" + } }; + var authMiddleware = new ContentSecurityPolicyMiddleware(next: (_) => Task.CompletedTask); + // Act await authMiddleware.Invoke(httpContext); //test - var csp = httpContext.Response.Headers["Content-Security-Policy"].ToString(); + var csp = httpContext.Response.Headers.ContentSecurityPolicy.ToString(); Assert.AreEqual(true,csp.Contains("default-src")); Assert.AreEqual(true,csp.Contains("ws://")); } @@ -52,15 +53,17 @@ public async Task ContentSecurityPolicyMiddlewareTest_invoke_testContent() public async Task invoke_httpsTest_websockets() { // Arrange - var httpContext = new DefaultHttpContext(); - httpContext.Request.Scheme = "https"; - - var authMiddleware = new ContentSecurityPolicyMiddleware(next: (innerHttpContext) => Task.FromResult(0)); + var httpContext = new DefaultHttpContext { Request = + { + Scheme = "https" + } }; + + var authMiddleware = new ContentSecurityPolicyMiddleware(next: (_) => Task.CompletedTask); // Act await authMiddleware.Invoke(httpContext); //test - var csp = httpContext.Response.Headers["Content-Security-Policy"].ToString(); + var csp = httpContext.Response.Headers.ContentSecurityPolicy.ToString(); Assert.AreEqual(true,csp.Contains("default-src")); Assert.AreEqual(true,csp.Contains("wss://")); @@ -70,16 +73,18 @@ public async Task invoke_httpsTest_websockets() public async Task invoke_httpsTest_websockets_localhostWithPort9000() { // Arrange - var httpContext = new DefaultHttpContext(); - httpContext.Request.Scheme = "https"; - httpContext.Request.Host = new HostString("localhost", 9000); - - var authMiddleware = new ContentSecurityPolicyMiddleware(next: (innerHttpContext) => Task.FromResult(0)); + var httpContext = new DefaultHttpContext { Request = + { + Scheme = "https", + Host = new HostString("localhost", 9000) + } }; + + var authMiddleware = new ContentSecurityPolicyMiddleware(next: (_) => Task.CompletedTask); // Act await authMiddleware.Invoke(httpContext); //test - var csp = httpContext.Response.Headers["Content-Security-Policy"].ToString(); + var csp = httpContext.Response.Headers.ContentSecurityPolicy.ToString(); Assert.AreEqual(true,csp.Contains("default-src")); Assert.AreEqual(true,csp.Contains("wss://localhost")); @@ -90,16 +95,18 @@ public async Task invoke_httpsTest_websockets_localhostWithPort9000() public async Task invoke_httpsTest_websockets_localhostWithNoPort() { // Arrange - var httpContext = new DefaultHttpContext(); - httpContext.Request.Scheme = "https"; - httpContext.Request.Host = new HostString("localhost"); - - var authMiddleware = new ContentSecurityPolicyMiddleware(next: (innerHttpContext) => Task.FromResult(0)); + var httpContext = new DefaultHttpContext { Request = + { + Scheme = "https", + Host = new HostString("localhost") + } }; + + var authMiddleware = new ContentSecurityPolicyMiddleware(next: (_) => Task.CompletedTask); // Act await authMiddleware.Invoke(httpContext); //test - var csp = httpContext.Response.Headers["Content-Security-Policy"].ToString(); + var csp = httpContext.Response.Headers.ContentSecurityPolicy.ToString(); Assert.AreEqual(true,csp.Contains("default-src")); Assert.AreEqual(true,csp.Contains("wss://localhost")); @@ -110,9 +117,11 @@ public async Task invoke_httpsTest_websockets_localhostWithNoPort() public async Task ContentSecurityPolicyMiddlewareTest_invoke_otherTypes() { // Arrange - var httpContext = new DefaultHttpContext(); - httpContext.Request.Scheme = "http"; - var authMiddleware = new ContentSecurityPolicyMiddleware((innerHttpContext) => Task.FromResult(0)); + var httpContext = new DefaultHttpContext { Request = + { + Scheme = "http" + } }; + var authMiddleware = new ContentSecurityPolicyMiddleware(next: (_) => Task.CompletedTask); // Act await authMiddleware.Invoke(httpContext); @@ -121,15 +130,15 @@ public async Task ContentSecurityPolicyMiddlewareTest_invoke_otherTypes() var referrerPolicy = httpContext.Response.Headers["Referrer-Policy"].ToString(); Assert.AreEqual( "no-referrer",referrerPolicy); - var frameOptions = httpContext.Response.Headers["X-Frame-Options"].ToString(); + var frameOptions = httpContext.Response.Headers.XFrameOptions.ToString(); Assert.AreEqual( "DENY",frameOptions); // X-Xss-Protection - var xssProtection = httpContext.Response.Headers["X-Xss-Protection"].ToString(); + var xssProtection = httpContext.Response.Headers.XXSSProtection.ToString(); Assert.AreEqual( "1; mode=block",xssProtection); // X-Content-Type-Options - var contentTypeOptions = httpContext.Response.Headers["X-Content-Type-Options"].ToString(); + var contentTypeOptions = httpContext.Response.Headers.XContentTypeOptions.ToString(); Assert.AreEqual( "nosniff",contentTypeOptions); } @@ -139,15 +148,17 @@ public async Task ContentSecurityPolicyMiddlewareTest_invoke_Chrome() { // Arrange - var httpContext = new DefaultHttpContext(); - httpContext.Request.Scheme = "http"; - httpContext.Request.Headers.Add("User-Agent","Chrome"); - var authMiddleware = new ContentSecurityPolicyMiddleware((innerHttpContext) => Task.FromResult(0)); + var httpContext = new DefaultHttpContext { Request = + { + Scheme = "http" + } }; + httpContext.Request.Headers.Append("User-Agent","Chrome"); + var authMiddleware = new ContentSecurityPolicyMiddleware(next: (_) => Task.CompletedTask); // Act await authMiddleware.Invoke(httpContext); - var csp = httpContext.Response.Headers["Content-Security-Policy"].ToString(); + var csp = httpContext.Response.Headers.ContentSecurityPolicy.ToString(); Assert.AreEqual(true,csp.Contains("require-trusted-types-for")); } diff --git a/starsky/starskytest/starsky.foundation.platform/Middleware/NoAccountMiddlewareTest.cs b/starsky/starskytest/starsky.foundation.platform/Middleware/NoAccountMiddlewareTest.cs index a1876c0cce..3121a703bd 100644 --- a/starsky/starskytest/starsky.foundation.platform/Middleware/NoAccountMiddlewareTest.cs +++ b/starsky/starskytest/starsky.foundation.platform/Middleware/NoAccountMiddlewareTest.cs @@ -74,7 +74,7 @@ public async Task OnHomePageNotLoginShouldAutoLogin() (_) => { invoked = true; - return Task.FromResult(0); + return Task.CompletedTask; }, new AppSettings()); var services = new ServiceCollection(); @@ -106,7 +106,7 @@ public async Task OnHomePageNotLoginShouldAutoLogin_DemoModeOn() (_) => { invoked = true; - return Task.FromResult(0); + return Task.CompletedTask; }, new AppSettings{DemoUnsafeDeleteStorageFolder = true}); var services = new ServiceCollection(); @@ -138,7 +138,7 @@ public async Task OnApiPageNotLoginShouldIgnore() (_) => { invoked = true; - return Task.FromResult(0); + return Task.CompletedTask; },new AppSettings()); var services = new ServiceCollection(); @@ -170,7 +170,7 @@ public async Task NullNotLoginShouldCreate() (_) => { invoked = true; - return Task.FromResult(0); + return Task.CompletedTask; }, new AppSettings()); var services = new ServiceCollection(); @@ -199,7 +199,7 @@ public async Task HasClaim_AndAuthenticated() (_) => { invoked = true; - return Task.FromResult(0); + return Task.CompletedTask; },new AppSettings()); var httpContextAccessor = _serviceProvider.GetRequiredService(); @@ -224,7 +224,7 @@ public async Task OnHomePageNotLoginShouldIgnoreDueOffNetwork() (_) => { invoked = true; - return Task.FromResult(0); + return Task.CompletedTask; },new AppSettings()); var services = new ServiceCollection(); diff --git a/starsky/starskytest/starsky.foundation.platform/Models/AppSettingsTest.cs b/starsky/starskytest/starsky.foundation.platform/Models/AppSettingsTest.cs index 7c84008cc2..c9120bbeed 100644 --- a/starsky/starskytest/starsky.foundation.platform/Models/AppSettingsTest.cs +++ b/starsky/starskytest/starsky.foundation.platform/Models/AppSettingsTest.cs @@ -541,26 +541,61 @@ public void AccountRolesByEmailRegisterOverwrite_ValidRole2() Assert.AreEqual(2,appSettings.AccountRolesByEmailRegisterOverwrite.Count); Assert.AreEqual("Administrator", appSettings.AccountRolesByEmailRegisterOverwrite["bogusEmail2"]); } - - + [TestMethod] - public void DatabasePathToFilePath_Null() + public void DatabasePathToFilePath_NoNull() { var appSettings = new AppSettings(); var result = appSettings.DatabasePathToFilePath("\\test"); - Assert.IsNull(result); + Assert.IsNotNull(result); } [TestMethod] - public void DatabasePathToFilePath_NoNull() + public void AppSettingsToTransferObjectConversion() { - var appSettings = new AppSettings(); - - var result = appSettings.DatabasePathToFilePath("\\test",false); - - Assert.IsNotNull(result); + // Arrange + var appSettings = new AppSettings { StorageFolder = "Value1", Verbose = true }; + + // Act + AppSettingsTransferObject transferObject = (AppSettingsTransferObject)appSettings; + + // Assert + Assert.AreEqual(appSettings.StorageFolder, transferObject.StorageFolder); + Assert.AreEqual(appSettings.Verbose, transferObject.Verbose); + } + + [TestMethod] + public void TransferObjectToAppSettingsConversion() + { + // Arrange + var transferObject = new AppSettingsTransferObject { + StorageFolder = $"Value1{Path.DirectorySeparatorChar}", + Verbose = true + }; + + // Act + var appSettings = (AppSettings)transferObject; + + // Assert + Assert.AreEqual(appSettings.StorageFolder, transferObject.StorageFolder); + Assert.AreEqual(appSettings.Verbose, transferObject.Verbose); + } + + [TestMethod] + public void CopyProperties_CopiesPropertiesCorrectly() + { + // Arrange + AppSettings source = new AppSettings { StorageFolder = "Value1", Verbose = true }; + AppSettings destination = new AppSettings(); + + // Act + AppSettings.CopyProperties(source, destination); + + // Assert + Assert.AreEqual(source.StorageFolder, destination.StorageFolder); + Assert.AreEqual(source.Verbose, destination.Verbose); } } } diff --git a/starsky/starskytest/starsky.foundation.readmeta/Services/ReadMetaSubPathStorageTest.cs b/starsky/starskytest/starsky.foundation.readmeta/Services/ReadMetaSubPathStorageTest.cs index d02788b280..b4ea1de78f 100644 --- a/starsky/starskytest/starsky.foundation.readmeta/Services/ReadMetaSubPathStorageTest.cs +++ b/starsky/starskytest/starsky.foundation.readmeta/Services/ReadMetaSubPathStorageTest.cs @@ -1,5 +1,6 @@ using System.Collections.Generic; using System.Text.Json; +using System.Threading.Tasks; using Microsoft.Extensions.Caching.Memory; using Microsoft.Extensions.DependencyInjection; using Microsoft.VisualStudio.TestTools.UnitTesting; @@ -15,21 +16,21 @@ namespace starskytest.starsky.foundation.readmeta.Services; public class ReadMetaSubPathStorageTest { [TestMethod] - public void ReadExifAndXmpFromFile() + public async Task ReadExifAndXmpFromFile() { var fakeStorage = new FakeIStorage(); var readMetaSubPathStorage = new ReadMetaSubPathStorage(new FakeSelectorStorage(fakeStorage), new AppSettings(), new FakeMemoryCache(), new FakeIWebLogger()); - var result = readMetaSubPathStorage.ReadExifAndXmpFromFile("test.jpg"); + var result = await readMetaSubPathStorage.ReadExifAndXmpFromFileAsync("test.jpg"); Assert.AreEqual("test.jpg", result.FileName); Assert.AreEqual(FileIndexItem.ExifStatus.OperationNotSupported, result.Status); } [TestMethod] - public void ReadExifAndXmpFromFileAddFilePathHash() + public async Task ReadExifAndXmpFromFileAddFilePathHash() { var fakeStorage = new FakeIStorage(); var readMetaSubPathStorage = new ReadMetaSubPathStorage(new FakeSelectorStorage(fakeStorage), new AppSettings(), new FakeMemoryCache(), new FakeIWebLogger()); - var result = readMetaSubPathStorage.ReadExifAndXmpFromFileAddFilePathHash(new List(), new List()); + var result = await readMetaSubPathStorage.ReadExifAndXmpFromFileAddFilePathHashAsync(new List(), new List()); Assert.AreEqual(0, result.Count); } @@ -42,10 +43,13 @@ public void UpdateReadMetaCache() .BuildServiceProvider(); var memoryCache = provider.GetService(); - var readMetaSubPathStorage = new ReadMetaSubPathStorage(new FakeSelectorStorage(fakeStorage), new AppSettings(), memoryCache, new FakeIWebLogger()); + var readMetaSubPathStorage = new ReadMetaSubPathStorage(new FakeSelectorStorage(fakeStorage), + new AppSettings(), memoryCache, new FakeIWebLogger()); var addItem = new FileIndexItem("/test.jpg"); readMetaSubPathStorage.UpdateReadMetaCache(new List{addItem}); - var actualJson = JsonSerializer.Serialize(memoryCache.Get("info_/test.jpg"),DefaultJsonSerializer.CamelCaseNoEnters); + var actualJson = JsonSerializer.Serialize(memoryCache.Get("info_/test.jpg"), + DefaultJsonSerializer.CamelCaseNoEnters); + var expectedJson = JsonSerializer.Serialize(addItem,DefaultJsonSerializer.CamelCaseNoEnters); Assert.AreEqual(expectedJson, actualJson); diff --git a/starsky/starskytest/Services/ReadMetaTest.cs b/starsky/starskytest/starsky.foundation.readmeta/Services/ReadMetaTest.cs similarity index 83% rename from starsky/starskytest/Services/ReadMetaTest.cs rename to starsky/starskytest/starsky.foundation.readmeta/Services/ReadMetaTest.cs index 657dcaa20f..7d1fee7387 100644 --- a/starsky/starskytest/Services/ReadMetaTest.cs +++ b/starsky/starskytest/starsky.foundation.readmeta/Services/ReadMetaTest.cs @@ -3,6 +3,7 @@ using System.Globalization; using System.Linq; using System.Text; +using System.Threading.Tasks; using Microsoft.Extensions.Caching.Memory; using Microsoft.Extensions.DependencyInjection; using Microsoft.VisualStudio.TestTools.UnitTesting; @@ -13,13 +14,13 @@ using starskytest.FakeCreateAn; using starskytest.FakeMocks; -namespace starskytest.Services +namespace starskytest.starsky.foundation.readmeta.Services { [TestClass] public sealed class ReadMetaTest { [TestMethod] - public void ReadMetaTest_HalfCompleteFile() + public async Task ReadMetaTest_HalfCompleteFile() { const string xmpString = "" + "" + @@ -46,8 +47,8 @@ public void ReadMetaTest_HalfCompleteFile() var fakeIStorage = new FakeIStorage(new List {"/"}, new List {"/test.arw", "/test.xmp"}, new List{CreateAnImage.Bytes.ToArray(),xmpByteArray} ); - var data = new ReadMeta(fakeIStorage, new AppSettings(), - null, new FakeIWebLogger()).ReadExifAndXmpFromFile("/test.arw"); + var data = await new ReadMeta(fakeIStorage, new AppSettings(), + null, new FakeIWebLogger()).ReadExifAndXmpFromFileAsync("/test.arw"); // Is in source file Assert.AreEqual(200,data.IsoSpeed); @@ -69,7 +70,7 @@ public void ReadMetaTest_HalfCompleteFile() } [TestMethod] - public void UpdateReadMetaCache_Null() + public async Task UpdateReadMetaCache_Null() { var readMeta = new ReadMeta(new FakeIStorage(), new AppSettings(), null, new FakeIWebLogger()); @@ -81,11 +82,11 @@ public void UpdateReadMetaCache_Null() } }); - Assert.AreEqual(string.Empty,readMeta.ReadExifAndXmpFromFile("/test.jpg").Tags); + Assert.AreEqual(string.Empty,(await readMeta.ReadExifAndXmpFromFileAsync("/test.jpg"))!.Tags); } [TestMethod] - public void UpdateReadMetaCache_AppSettingsDisabled() + public async Task UpdateReadMetaCache_AppSettingsDisabled() { var provider = new ServiceCollection() .AddMemoryCache() @@ -103,8 +104,10 @@ public void UpdateReadMetaCache_AppSettingsDisabled() Tags = "t2" } }); - - Assert.AreEqual(string.Empty,readMeta.ReadExifAndXmpFromFile("/test.jpg").Tags); + + var result = (await readMeta.ReadExifAndXmpFromFileAsync("/test.jpg") )? + .Tags; + Assert.AreEqual(string.Empty, result); } @@ -165,7 +168,7 @@ public void RemoveReadMetaCache_Exists() }, memoryCache, new FakeIWebLogger()); // set cache - readMeta.ReadExifAndXmpFromFile("/test.jpg"); + readMeta.ReadExifAndXmpFromFileAsync("/test.jpg"); var result = readMeta.RemoveReadMetaCache("/test.jpg"); @@ -173,7 +176,7 @@ public void RemoveReadMetaCache_Exists() } [TestMethod] - public void ReadMetaTest_CheckIfCacheListIsUpdated() + public async Task ReadMetaTest_CheckIfCacheListIsUpdated() { var provider = new ServiceCollection() .AddMemoryCache() @@ -188,12 +191,15 @@ public void ReadMetaTest_CheckIfCacheListIsUpdated() Tags = "t2" } }); + + var result = + await readMeta.ReadExifAndXmpFromFileAsync("/test.jpg"); - Assert.AreEqual("t2",readMeta.ReadExifAndXmpFromFile("/test.jpg").Tags); + Assert.AreEqual("t2",result?.Tags); } [TestMethod] - public void ReadMetaTest_CheckIfCacheIsUpdated_SingleItem() + public async Task ReadMetaTest_CheckIfCacheIsUpdated_SingleItem() { var provider = new ServiceCollection() .AddMemoryCache() @@ -207,12 +213,15 @@ public void ReadMetaTest_CheckIfCacheIsUpdated_SingleItem() Tags = "t2" } ); + + var result = + await readMeta.ReadExifAndXmpFromFileAsync("/test.jpg"); - Assert.AreEqual("t2",readMeta.ReadExifAndXmpFromFile("/test.jpg").Tags); + Assert.AreEqual("t2",result?.Tags); } [TestMethod] - public void CorruptXmpFile_SoIgnore() + public async Task CorruptXmpFile_SoIgnore() { var storage = new FakeIStorage(new List { "/" }, new List { "/test.dng", "/test.xmp" }, new List @@ -222,11 +231,15 @@ public void CorruptXmpFile_SoIgnore() }); var readMeta = new ReadMeta(storage, new AppSettings(), null!, new FakeIWebLogger()); - Assert.AreEqual("test, sion",readMeta.ReadExifAndXmpFromFile("/test.dng").Tags); + var resultDng = + await readMeta.ReadExifAndXmpFromFileAsync("/test.dng"); + + Assert.AreEqual("test, sion",resultDng?.Tags); + } [TestMethod] - public void ShouldPickXmpFile() + public async Task ShouldPickXmpFile() { var storage = new FakeIStorage(new List { "/" }, new List { "/test.dng", "/test.xmp" }, new List @@ -236,7 +249,10 @@ public void ShouldPickXmpFile() }); var readMeta = new ReadMeta(storage, new AppSettings(), null!, new FakeIWebLogger()); - Assert.AreEqual(string.Empty,readMeta.ReadExifAndXmpFromFile("/test.dng").Tags); + var result = + await readMeta.ReadExifAndXmpFromFileAsync("/test.jpg"); + + Assert.AreEqual(string.Empty,result?.Tags); } } } diff --git a/starsky/starskytest/Services/ReadMeta_ExifReadTest.cs b/starsky/starskytest/starsky.foundation.readmeta/Services/ReadMeta_ExifReadTest.cs similarity index 98% rename from starsky/starskytest/Services/ReadMeta_ExifReadTest.cs rename to starsky/starskytest/starsky.foundation.readmeta/Services/ReadMeta_ExifReadTest.cs index 97b8096dbb..dd5b67eef0 100644 --- a/starsky/starskytest/Services/ReadMeta_ExifReadTest.cs +++ b/starsky/starskytest/starsky.foundation.readmeta/Services/ReadMeta_ExifReadTest.cs @@ -18,7 +18,7 @@ using XmpCore; using XmpCore.Impl; -namespace starskytest.Services +namespace starskytest.starsky.foundation.readmeta.Services { public class MockDirectory : Directory { @@ -674,8 +674,12 @@ public void ExifRead_DataParsingCorruptStreamNull() Assert.AreEqual(FileIndexItem.ExifStatus.OperationNotSupported, item.Status); } - // https://github.com/drewnoakes/metadata-extractor-dotnet/blob/master/MetadataExtractor.Tests/DirectoryExtensionsTest.cs - private static Directory BuildDirectory(IEnumerable values) + /// + /// @see: https://github.com/drewnoakes/metadata-extractor-dotnet/blob/master/MetadataExtractor.Tests/DirectoryExtensionsTest.cs + /// + /// values to put in + /// a mock dir + private static MockDirectory BuildDirectory(IEnumerable values) { var directory = new MockDirectory(null); diff --git a/starsky/starskytest/Services/ReadMeta_GpxFromFileTest.cs b/starsky/starskytest/starsky.foundation.readmeta/Services/ReadMeta_GpxFromFileTest.cs similarity index 82% rename from starsky/starskytest/Services/ReadMeta_GpxFromFileTest.cs rename to starsky/starskytest/starsky.foundation.readmeta/Services/ReadMeta_GpxFromFileTest.cs index febc995677..45f82a987d 100644 --- a/starsky/starskytest/Services/ReadMeta_GpxFromFileTest.cs +++ b/starsky/starskytest/starsky.foundation.readmeta/Services/ReadMeta_GpxFromFileTest.cs @@ -2,39 +2,38 @@ using System.Globalization; using System.IO; using System.Linq; +using System.Threading.Tasks; using Microsoft.VisualStudio.TestTools.UnitTesting; using starsky.foundation.database.Models; using starsky.foundation.readmeta.ReadMetaHelpers; -using starsky.foundation.readmeta.Services; -using starsky.foundation.storage.Helpers; using starskytest.FakeCreateAn; using starskytest.FakeMocks; -namespace starskytest.Services +namespace starskytest.starsky.foundation.readmeta.Services { [TestClass] public sealed class ReadGpxFromFileTest { [TestMethod] - public void ReadGpxFromFileTest_ReturnAfterFirstFieldReadFile_Null() + public async Task ReadGpxFromFileTest_ReturnAfterFirstFieldReadFile_Null() { - var returnItem = + var returnItem = await new ReadMetaGpx(new FakeIWebLogger()) - .ReadGpxFromFileReturnAfterFirstField(null, "/test.gpx"); + .ReadGpxFromFileReturnAfterFirstFieldAsync(null, "/test.gpx"); Assert.AreEqual(FileIndexItem.ExifStatus.OperationNotSupported, returnItem.Status); Assert.AreEqual("/test.gpx", returnItem.FilePath); } [TestMethod] - public void ReadGpxFromFileTest_ReturnAfterFirstFieldReadFile() + public async Task ReadGpxFromFileTest_ReturnAfterFirstFieldReadFile() { var gpxBytes = CreateAnGpx.Bytes.ToArray(); MemoryStream stream = new MemoryStream(gpxBytes); - var returnItem = + var returnItem = await new ReadMetaGpx(new FakeIWebLogger()) - .ReadGpxFromFileReturnAfterFirstField(stream, "/test.gpx"); + .ReadGpxFromFileReturnAfterFirstFieldAsync(stream, "/test.gpx"); Assert.AreEqual(5.485941, returnItem.Longitude, 0.001); Assert.AreEqual(51.809360, returnItem.Latitude, 0.001); Assert.AreEqual("_20180905-fietsen-oss", returnItem.Title); @@ -51,14 +50,14 @@ public void ReadGpxFromFileTest_ReturnAfterFirstFieldReadFile() } [TestMethod] - public void + public async Task ReadGpxFromFileTest_ReturnAfterFirstFieldReadFile_Utc_UseLocalFalse() { var gpxBytes = CreateAnGpx.Bytes.ToArray(); MemoryStream stream = new MemoryStream(gpxBytes); - var returnItem = new ReadMetaGpx(new FakeIWebLogger()) - .ReadGpxFromFileReturnAfterFirstField(stream, "/test.gpx", + var returnItem = await new ReadMetaGpx(new FakeIWebLogger()) + .ReadGpxFromFileReturnAfterFirstFieldAsync(stream, "/test.gpx", false); Assert.AreEqual(5.485941, returnItem.Longitude, 0.001); Assert.AreEqual(51.809360, returnItem.Latitude, 0.001); @@ -76,38 +75,38 @@ public void } [TestMethod] - public void ReadGpxFromFileTest_NonValidInput() + public async Task ReadGpxFromFileTest_NonValidInput() { var gpxBytes = Array.Empty(); MemoryStream stream = new MemoryStream(gpxBytes); - var returnItem = + var returnItem = await new ReadMetaGpx(new FakeIWebLogger()) - .ReadGpxFromFileReturnAfterFirstField(stream, "/test.gpx"); + .ReadGpxFromFileReturnAfterFirstFieldAsync(stream, "/test.gpx"); Assert.AreEqual(new DateTime(), returnItem.DateTime); Assert.AreEqual("/test.gpx", returnItem.FilePath); } [TestMethod] - public void ReadGpxFromFileTest_TestFileName() + public async Task ReadGpxFromFileTest_TestFileName() { var gpxBytes = CreateAnGpx.Bytes.ToArray(); MemoryStream stream = new MemoryStream(gpxBytes); - var returnItem = + var returnItem = await new ReadMetaGpx(new FakeIWebLogger()) - .ReadGpxFromFileReturnAfterFirstField(stream, "/test.gpx"); + .ReadGpxFromFileReturnAfterFirstFieldAsync(stream, "/test.gpx"); Assert.AreEqual("test.gpx", returnItem.FileName); Assert.AreEqual("/", returnItem.ParentDirectory); } [TestMethod] - public void ReadGpxFromFileTest_ReadFile() + public async Task ReadGpxFromFileTest_ReadFile() { var gpxBytes = CreateAnGpx.Bytes.ToArray(); MemoryStream stream = new MemoryStream(gpxBytes); - var returnItem = - new ReadMetaGpx(new FakeIWebLogger()).ReadGpxFile(stream); + var returnItem = await + new ReadMetaGpx(new FakeIWebLogger()).ReadGpxFileAsync(stream); Assert.AreEqual(5.485941, returnItem.FirstOrDefault()!.Longitude, 0.001); Assert.AreEqual(51.809360, returnItem.FirstOrDefault()!.Latitude, diff --git a/starsky/starskytest/Services/ReadMeta_ReadMetaBoth_Cache_Test.cs b/starsky/starskytest/starsky.foundation.readmeta/Services/ReadMeta_ReadMetaBoth_Cache_Test.cs similarity index 61% rename from starsky/starskytest/Services/ReadMeta_ReadMetaBoth_Cache_Test.cs rename to starsky/starskytest/starsky.foundation.readmeta/Services/ReadMeta_ReadMetaBoth_Cache_Test.cs index d229d3c808..f31b84eded 100644 --- a/starsky/starskytest/Services/ReadMeta_ReadMetaBoth_Cache_Test.cs +++ b/starsky/starskytest/starsky.foundation.readmeta/Services/ReadMeta_ReadMetaBoth_Cache_Test.cs @@ -1,17 +1,15 @@ using System.Collections.Generic; using System.Linq; -using Microsoft.Extensions.Caching.Memory; -using Microsoft.Extensions.DependencyInjection; +using System.Threading.Tasks; using Microsoft.VisualStudio.TestTools.UnitTesting; using starsky.foundation.database.Models; using starsky.foundation.platform.Models; using starsky.foundation.readmeta.Services; using starsky.foundation.storage.Storage; -using starskycore.Helpers; using starskytest.FakeCreateAn; using starskytest.FakeMocks; -namespace starskytest.Services +namespace starskytest.starsky.foundation.readmeta.Services { [TestClass] public sealed class ReadMeta_ReadMetaBoth_Cache_Test @@ -19,19 +17,18 @@ public sealed class ReadMeta_ReadMetaBoth_Cache_Test [TestMethod] - public void ReadMeta_ReadMetaBothTest_ReadBothWithFilePath() + public async Task ReadMeta_ReadMetaBothTest_ReadBothWithFilePath() { + var appSettings = new AppSettings {StorageFolder = new CreateAnImage().BasePath}; + var iStorage = new StorageSubPathFilesystem(appSettings, new FakeIWebLogger()); - var appsettings = new AppSettings {StorageFolder = new CreateAnImage().BasePath}; - var iStorage = new StorageSubPathFilesystem(appsettings, new FakeIWebLogger()); - - var listofFiles = new List{ new CreateAnImage().DbPath}; + var listOfFiles = new List{ new CreateAnImage().DbPath}; var fakeCache = new FakeMemoryCache(new Dictionary()); - var listOfMetas = new ReadMeta(iStorage,appsettings,fakeCache, new FakeIWebLogger()) - .ReadExifAndXmpFromFileAddFilePathHash(listofFiles); + var listOfMetas = await new ReadMeta(iStorage,appSettings,fakeCache, new FakeIWebLogger()) + .ReadExifAndXmpFromFileAddFilePathHashAsync(listOfFiles); Assert.AreEqual(new CreateAnImage().DbPath.Remove(0,1), - listOfMetas.FirstOrDefault().FileName); + listOfMetas.FirstOrDefault()?.FileName); } [TestMethod] @@ -47,12 +44,15 @@ public void ReadMeta_ReadMetaBothTest_RemoveCache() } [TestMethod] - public void ReadMeta_ReadMetaBothTest_FakeReadEntry() + public async Task ReadMeta_ReadMetaBothTest_FakeReadEntry() { var iStorage = new FakeIStorage(); var fakeCache = new FakeMemoryCache(new Dictionary{{"info_test",new FileIndexItem(){Tags = "test"}}}); - Assert.AreEqual("test",new ReadMeta(iStorage,null, fakeCache, new FakeIWebLogger()).ReadExifAndXmpFromFile("test").Tags); + var result = ( await new ReadMeta(iStorage, null, fakeCache, + new FakeIWebLogger()) + .ReadExifAndXmpFromFileAsync("test") )?.Tags; + Assert.AreEqual("test",result); } } } diff --git a/starsky/starskytest/Services/ReadMeta_XmpReadHelperTest.cs b/starsky/starskytest/starsky.foundation.readmeta/Services/ReadMeta_XmpReadHelperTest.cs similarity index 95% rename from starsky/starskytest/Services/ReadMeta_XmpReadHelperTest.cs rename to starsky/starskytest/starsky.foundation.readmeta/Services/ReadMeta_XmpReadHelperTest.cs index 30e8b6e969..ac457d2689 100644 --- a/starsky/starskytest/Services/ReadMeta_XmpReadHelperTest.cs +++ b/starsky/starskytest/starsky.foundation.readmeta/Services/ReadMeta_XmpReadHelperTest.cs @@ -1,18 +1,15 @@ using System; using System.Collections.Generic; using System.Globalization; -using System.IO; using System.Text; +using System.Threading.Tasks; using Microsoft.VisualStudio.TestTools.UnitTesting; using starsky.foundation.database.Models; using starsky.foundation.platform.Helpers; using starsky.foundation.readmeta.ReadMetaHelpers; -using starsky.foundation.readmeta.Services; -using starskycore.Helpers; -using starskytest.FakeCreateAn; using starskytest.FakeMocks; -namespace starskytest.Services +namespace starskytest.starsky.foundation.readmeta.Services { [TestClass] public sealed class XmpReadHelperTest @@ -81,7 +78,7 @@ public void XmpReadHelperTest_GetData_usingStringExample() } [TestMethod] - public void XmpReadHelperTest_XmpGetSidecarFile_WithFakeStorage() + public async Task XmpReadHelperTest_XmpGetSidecarFile_WithFakeStorage() { // convert string to stream byte[] xmpByteArray = Encoding.UTF8.GetBytes(Input); @@ -94,7 +91,7 @@ public void XmpReadHelperTest_XmpGetSidecarFile_WithFakeStorage() FileName = "test.arw" }; - var data = new ReadMetaXmp(fakeIStorage, new FakeIWebLogger()).XmpGetSidecarFile(fileIndexItem); + var data = await new ReadMetaXmp(fakeIStorage, new FakeIWebLogger()).XmpGetSidecarFileAsync(fileIndexItem); Assert.AreEqual(52.3451333333,data.Latitude,0.001); @@ -122,7 +119,7 @@ public void XmpReadHelperTest_XmpGetSidecarFile_WithFakeStorage() [TestMethod] - public void XmpReadHelperTest_XmpGetSidecarFile_TestIfOverwrite() + public async Task XmpReadHelperTest_XmpGetSidecarFile_TestIfOverwrite() { // convert string to stream byte[] xmpByteArray = Encoding.UTF8.GetBytes(Input); @@ -143,8 +140,7 @@ public void XmpReadHelperTest_XmpGetSidecarFile_TestIfOverwrite() DateTime = new DateTime(1990,01,01,01,00,00) }; - var data = new ReadMetaXmp(fakeIStorage, new FakeIWebLogger()).XmpGetSidecarFile(fileIndexItem); - + var data = await new ReadMetaXmp(fakeIStorage, new FakeIWebLogger()).XmpGetSidecarFileAsync(fileIndexItem); Assert.AreEqual(52.3451333333,data.Latitude,0.001); Assert.AreEqual(5.930,data.Longitude,0.001); @@ -200,7 +196,7 @@ public void XmpBasicRead_InvalidXml() [TestMethod] - public void XmpGetSidecarFile_LocationCountryCode() + public async Task XmpGetSidecarFile_LocationCountryCode() { const string xmpData = "\n" + "\n" + @@ -217,7 +213,7 @@ public void XmpGetSidecarFile_LocationCountryCode() new List {"/test.arw", "/test.xmp"}, new List{null,xmpByteArray} ); var readMetaXmp = new ReadMetaXmp(fakeIStorage, new FakeIWebLogger()); - var data = readMetaXmp.XmpGetSidecarFile(new FileIndexItem("/test.arw")); + var data = await readMetaXmp.XmpGetSidecarFileAsync(new FileIndexItem("/test.arw")); Assert.AreEqual("NLD", data.LocationCountryCode); } diff --git a/starsky/starskytest/starsky.foundation.realtime/Middleware/DisabledWebSocketsMiddlewareTest.cs b/starsky/starskytest/starsky.foundation.realtime/Middleware/DisabledWebSocketsMiddlewareTest.cs index f7176212c6..6e1930fabf 100644 --- a/starsky/starskytest/starsky.foundation.realtime/Middleware/DisabledWebSocketsMiddlewareTest.cs +++ b/starsky/starskytest/starsky.foundation.realtime/Middleware/DisabledWebSocketsMiddlewareTest.cs @@ -15,7 +15,7 @@ public sealed class DisabledWebSocketsMiddlewareTest public async Task DisabledWebSocketsMiddleware_Invoke() { var httpContext = new DefaultHttpContext(); - var disabledWebSocketsMiddleware = new DisabledWebSocketsMiddleware(next: (innerHttpContext) => Task.FromResult(0)); + var disabledWebSocketsMiddleware = new DisabledWebSocketsMiddleware(next: (_) => Task.CompletedTask); await disabledWebSocketsMiddleware.Invoke(httpContext); Assert.AreEqual(400,httpContext.Response.StatusCode); } @@ -25,12 +25,12 @@ public async Task WebSocketConnection_MessageTooBig() { var httpContext = new FakeWebSocketHttpContext(false); - var disabledWebSocketsMiddleware = new DisabledWebSocketsMiddleware(next: (innerHttpContext) => Task.FromResult(0)); + var disabledWebSocketsMiddleware = new DisabledWebSocketsMiddleware(next: (_) => Task.CompletedTask); await disabledWebSocketsMiddleware.Invoke(httpContext); var socketManager = httpContext.WebSockets as FakeWebSocketManager; Assert.AreEqual(WebSocketCloseStatus.MessageTooBig, - (socketManager.FakeWebSocket as FakeWebSocket).FakeCloseOutputAsync.LastOrDefault()); + (socketManager?.FakeWebSocket as FakeWebSocket)?.FakeCloseOutputAsync.LastOrDefault()); } } } diff --git a/starsky/starskytest/starsky.foundation.storage/ArchiveFormats/TarBalTest.cs b/starsky/starskytest/starsky.foundation.storage/ArchiveFormats/TarBalTest.cs index 1b24c0b40e..20cbf1d575 100644 --- a/starsky/starskytest/starsky.foundation.storage/ArchiveFormats/TarBalTest.cs +++ b/starsky/starskytest/starsky.foundation.storage/ArchiveFormats/TarBalTest.cs @@ -60,7 +60,7 @@ public async Task ExtractTarGz_LongerThan100Chars() Assert.IsTrue(storage.ExistFile($"/test/{CreateAnTagGzLongerThan100CharsFileName.FileName}")); var file = storage.ReadStream($"/test/{CreateAnTagGzLongerThan100CharsFileName.FileName}"); // the filename is written as content in the file - Assert.AreEqual(CreateAnTagGzLongerThan100CharsFileName.FileName,PlainTextFileHelper.StreamToString(file).Trim()); + Assert.AreEqual(CreateAnTagGzLongerThan100CharsFileName.FileName,(await StreamToStringHelper.StreamToStringAsync(file)).Trim()); } } } diff --git a/starsky/starskytest/starsky.foundation.storage/Exceptions/DecodingExceptionTest.cs b/starsky/starskytest/starsky.foundation.storage/Exceptions/DecodingExceptionTest.cs index 6a86807ecd..a5046151ec 100644 --- a/starsky/starskytest/starsky.foundation.storage/Exceptions/DecodingExceptionTest.cs +++ b/starsky/starskytest/starsky.foundation.storage/Exceptions/DecodingExceptionTest.cs @@ -14,6 +14,7 @@ public sealed class DecodingExceptionTest [ExpectedException(typeof(DecodingException))] public void DecodingException() { +#pragma warning disable SYSLIB0050 var info = new SerializationInfo(typeof(Exception), new FormatterConverter()); info.AddValue("Message", ""); @@ -35,6 +36,7 @@ public void DecodingException() }); throw instance; +#pragma warning restore SYSLIB0050 } } } diff --git a/starsky/starskytest/starsky.foundation.storage/Helpers/DeserializeJsonTest.cs b/starsky/starskytest/starsky.foundation.storage/Helpers/DeserializeJsonTest.cs index 087b8fc839..4283d99c28 100644 --- a/starsky/starskytest/starsky.foundation.storage/Helpers/DeserializeJsonTest.cs +++ b/starsky/starskytest/starsky.foundation.storage/Helpers/DeserializeJsonTest.cs @@ -1,5 +1,6 @@ using System; using System.IO; +using System.Threading.Tasks; using Microsoft.VisualStudio.TestTools.UnitTesting; using starsky.foundation.database.Models; using starsky.foundation.storage.Helpers; @@ -11,18 +12,18 @@ namespace starskytest.starsky.foundation.storage.Helpers public sealed class DeserializeJsonTest { [TestMethod] - public void ReadTest_FromCopiedText_T_Model() + public async Task ReadTest_FromCopiedText_T_Model() { var input = "{\n \"Title\": \"Title\",\n \"Price\": 200,\n \"ShowButtons\": " + "true}"; var fakeStorage = new FakeIStorage(); - fakeStorage.WriteStream( - PlainTextFileHelper.StringToStream(input), "/test.json"); + await fakeStorage.WriteStreamAsync( + StringToStreamHelper.StringToStream(input), "/test.json"); var itemJsonParser = new DeserializeJson(fakeStorage); - var result = itemJsonParser.Read("/test.json"); + var result = await itemJsonParser.ReadAsync("/test.json"); Assert.AreEqual(200, result.Price); Assert.AreEqual("Title", result.Title); @@ -30,7 +31,7 @@ public void ReadTest_FromCopiedText_T_Model() } [TestMethod] - public void Item() + public async Task Item() { const string input = "{ \"$id\": \"https://docs.qdraw.nl/schema/meta-data-container.json\", " + "\"$schema\": \"https://json-schema.org/draft/2020-12/schema\", \"item\": { " + @@ -49,27 +50,29 @@ public void Item() "\"lensModel\": \"\", \"focalLength\": 200, \"size\": 0, " + "\"imageStabilisation\": \"Unknown\", \"lastChanged\": [] }}"; var fakeStorage = new FakeIStorage(); - fakeStorage.WriteStream( - PlainTextFileHelper.StringToStream(input), "/test.json"); + await fakeStorage.WriteStreamAsync( + StringToStreamHelper.StringToStream(input), "/test.json"); var itemJsonParser = new DeserializeJson(fakeStorage); - var result = itemJsonParser.Read("/test.json"); + var result = await itemJsonParser.ReadAsync("/test.json"); - Assert.AreEqual("/test.jpg", result.Item.FilePath); + Assert.AreEqual("/test.jpg", result.Item?.FilePath); } [TestMethod] [ExpectedException(typeof(FileNotFoundException))] - public void ReadTest_NotFound() + public async Task ReadTest_NotFound() { var fakeStorage = new FakeIStorage(); var itemJsonParser = new DeserializeJson(fakeStorage); - itemJsonParser.Read("/notfound.json"); + await itemJsonParser.ReadAsync("/notfound.json"); // expect error } } + // ReSharper disable once InconsistentNaming + // ReSharper disable once ClassNeverInstantiated.Global public class FileIndexItemJsonParserTest_TestModel { public string Title { get; set; } diff --git a/starsky/starskytest/Services/FileHashTest.cs b/starsky/starskytest/starsky.foundation.storage/Services/FileHashTest.cs similarity index 97% rename from starsky/starskytest/Services/FileHashTest.cs rename to starsky/starskytest/starsky.foundation.storage/Services/FileHashTest.cs index b9b42d885f..023b9f3f71 100644 --- a/starsky/starskytest/Services/FileHashTest.cs +++ b/starsky/starskytest/starsky.foundation.storage/Services/FileHashTest.cs @@ -7,7 +7,7 @@ using starskytest.FakeCreateAn; using starskytest.FakeMocks; -namespace starskytest.Services +namespace starskytest.starsky.foundation.storage.Services { [TestClass] public sealed class FileHashTest diff --git a/starsky/starskytest/starsky.foundation.storage/Storage/StorageSubPathFilesystemTest.cs b/starsky/starskytest/starsky.foundation.storage/Storage/StorageSubPathFilesystemTest.cs index d3f9a6a59c..bec714c693 100644 --- a/starsky/starskytest/starsky.foundation.storage/Storage/StorageSubPathFilesystemTest.cs +++ b/starsky/starskytest/starsky.foundation.storage/Storage/StorageSubPathFilesystemTest.cs @@ -37,7 +37,7 @@ public void StorageFilesystem_GetAllFilesDirectoryTest() _storage.CreateDirectory("/test"); var filesInFolder = _storage.GetDirectoryRecursive("/").Select(p => p.Key).ToList(); - Assert.AreEqual(true,filesInFolder.Any()); + Assert.AreEqual(true,filesInFolder.Count != 0); _storage.FolderDelete("/test"); } @@ -70,13 +70,13 @@ public void GetAllFilesInDirectoryRecursive() _storage.CreateDirectory("/test_GetAllFilesInDirectoryRecursive"); _storage.CreateDirectory("/test_GetAllFilesInDirectoryRecursive/test"); var fileAlreadyExistSubPath = "/test_GetAllFilesInDirectoryRecursive/test/already_09010.tmp"; - _storage.WriteStream(PlainTextFileHelper.StringToStream("test"), + _storage.WriteStream(StringToStreamHelper.StringToStream("test"), fileAlreadyExistSubPath); var filesInFolder = _storage.GetAllFilesInDirectoryRecursive( "/test_GetAllFilesInDirectoryRecursive").ToList(); - Assert.AreEqual(true,filesInFolder.Any()); + Assert.AreEqual(true,filesInFolder.Count != 0); Assert.AreEqual("/test_GetAllFilesInDirectoryRecursive/test", filesInFolder[0]); Assert.AreEqual("/test_GetAllFilesInDirectoryRecursive/test/already_09010.tmp", filesInFolder[1]); @@ -98,7 +98,7 @@ public void FileCopy() const string from = "/test_file_copy.tmp"; const string to = "/test_file_copy_2.tmp"; - _storage.WriteStream(PlainTextFileHelper.StringToStream("test"), + _storage.WriteStream(StringToStreamHelper.StringToStream("test"), from); _storage.FileCopy(from,to); @@ -115,7 +115,7 @@ public void FileMove() const string from = "/test_file_move.tmp"; const string to = "/test_file_move_2.tmp"; - _storage.WriteStream(PlainTextFileHelper.StringToStream("test"), + _storage.WriteStream(StringToStreamHelper.StringToStream("test"), from); _storage.FileMove(from,to); diff --git a/starsky/starskytest/starsky.foundation.sync/Helpers/NewItemTest.cs b/starsky/starskytest/starsky.foundation.sync/Helpers/NewItemTest.cs index 409f2d70a6..af59b8dc23 100644 --- a/starsky/starskytest/starsky.foundation.sync/Helpers/NewItemTest.cs +++ b/starsky/starskytest/starsky.foundation.sync/Helpers/NewItemTest.cs @@ -14,7 +14,7 @@ public class NewItemTest public async Task NewItemTest_KeepDefault() { var storage = new FakeIStorage(new List{"/"}, new List{"/test.jpg"}); - var newItem = await new NewItem(storage, new FakeReadMeta()).PrepareUpdateFileItem(new FileIndexItem("/test.jpg") + var newItem = await new NewItem(storage, new FakeReadMeta()).PrepareUpdateFileItemAsync(new FileIndexItem("/test.jpg") { LastChanged = new List{"test"} }, 100); @@ -28,7 +28,7 @@ public async Task NewItemTest_KeepDefault() public async Task NewItemTest_SetOkAndSame() { var storage = new FakeIStorage(new List{"/"}, new List{"/test.jpg"}); - var newItem = await new NewItem(storage, new FakeReadMeta()).PrepareUpdateFileItem(new FileIndexItem("/test.jpg") + var newItem = await new NewItem(storage, new FakeReadMeta()).PrepareUpdateFileItemAsync(new FileIndexItem("/test.jpg") { Tags = "test, fake read meta", LastChanged = new List() diff --git a/starsky/starskytest/starsky.foundation.sync/WatcherHelpers/EventQueueOverflowExceptionTest.cs b/starsky/starskytest/starsky.foundation.sync/WatcherHelpers/EventQueueOverflowExceptionTest.cs index 46deb3ecb3..15c54f0e73 100644 --- a/starsky/starskytest/starsky.foundation.sync/WatcherHelpers/EventQueueOverflowExceptionTest.cs +++ b/starsky/starskytest/starsky.foundation.sync/WatcherHelpers/EventQueueOverflowExceptionTest.cs @@ -28,6 +28,7 @@ public void EventQueueOverflowExceptionMessage() [ExpectedException(typeof(EventQueueOverflowException))] public void EventQueueOverflowException_Protected() { +#pragma warning disable SYSLIB0050 var info = new SerializationInfo(typeof(Exception), new FormatterConverter()); info.AddValue("Message", ""); @@ -50,6 +51,7 @@ public void EventQueueOverflowException_Protected() }); throw instance; +#pragma warning restore SYSLIB0050 } } } diff --git a/starsky/starskytest/starsky.foundation.thumbnailgeneration/Helpers/ThumbnailCliTest.cs b/starsky/starskytest/starsky.foundation.thumbnailgeneration/Helpers/ThumbnailCliTest.cs index 48df5727da..a4a075dc9b 100644 --- a/starsky/starskytest/starsky.foundation.thumbnailgeneration/Helpers/ThumbnailCliTest.cs +++ b/starsky/starskytest/starsky.foundation.thumbnailgeneration/Helpers/ThumbnailCliTest.cs @@ -20,7 +20,7 @@ public async Task Thumbnail_NoArgs_Assume_T_True() var fakeConsole = new FakeConsoleWrapper(); var storage = new FakeIStorage(new List {"/"}, new List {"/test.jpg"}); var thumbnailService = new ThumbnailCli(new AppSettings(), fakeConsole, - new FakeIThumbnailService(), new FakeIThumbnailCleaner(), + new FakeIThumbnailService(new FakeSelectorStorage(storage)), new FakeIThumbnailCleaner(), new FakeSelectorStorage(storage)); await thumbnailService.Thumbnail(Array.Empty()); @@ -38,7 +38,7 @@ public async Task Thumbnail_Enable_T_Param_AssumeHome() fakeIThumbnailService, new FakeIThumbnailCleaner(), new FakeSelectorStorage(storage)); - await thumbnailService.Thumbnail(new []{"-t", "true"}); + await thumbnailService.Thumbnail(["-t", "true"]); Assert.AreEqual("/", fakeIThumbnailService.Inputs[0].Item1); } @@ -52,7 +52,7 @@ public async Task Thumbnail_Help() new FakeIThumbnailService(), new FakeIThumbnailCleaner(), new FakeSelectorStorage(storage)); - await thumbnailService.Thumbnail(new []{"-h"}); + await thumbnailService.Thumbnail(["-h"]); Assert.IsTrue(fakeConsole.WrittenLines[0].Contains("Help")); } @@ -67,7 +67,7 @@ public async Task Thumbnail_Disable_T_Param() fakeThumbnail, new FakeIThumbnailCleaner(), new FakeSelectorStorage(storage)); - await thumbnailService.Thumbnail(new []{"-t", "false"}); + await thumbnailService.Thumbnail(["-t", "false"]); Assert.AreEqual(0, fakeThumbnail.Inputs.Count); } @@ -76,14 +76,15 @@ public async Task Thumbnail_Disable_T_Param() public async Task Thumbnail_MinusP_FullPath() { var fakeConsole = new FakeConsoleWrapper(); - var fakeIThumbnailService = new FakeIThumbnailService(); - var appSettings = new AppSettings(); var storage = new FakeIStorage(new List {"/"}, new List {"/test.jpg"}); + var fakeIThumbnailService = new FakeIThumbnailService(new FakeSelectorStorage(storage)); + var appSettings = new AppSettings(); var thumbnailService = new ThumbnailCli(appSettings, fakeConsole, fakeIThumbnailService, new FakeIThumbnailCleaner(), new FakeSelectorStorage(storage)); - await thumbnailService.Thumbnail(new []{"-v", "true", "-t","true", "-p", Path.Combine(appSettings.StorageFolder, "test")}); + await thumbnailService.Thumbnail(["-v", "true", "-t","true", "-p", Path.Combine(appSettings.StorageFolder, "test") + ]); Assert.AreEqual("/test", fakeIThumbnailService.Inputs[0].Item1); } @@ -92,14 +93,14 @@ public async Task Thumbnail_MinusP_FullPath() public async Task Thumbnail_MinusS_SubPath() { var fakeConsole = new FakeConsoleWrapper(); - var fakeIThumbnailService = new FakeIThumbnailService(); - var appSettings = new AppSettings(); var storage = new FakeIStorage(new List {"/"}, new List {"/test.jpg"}); + var fakeIThumbnailService = new FakeIThumbnailService(new FakeSelectorStorage(storage)); + var appSettings = new AppSettings(); var thumbnailService = new ThumbnailCli(appSettings, fakeConsole, fakeIThumbnailService, new FakeIThumbnailCleaner(), new FakeSelectorStorage(storage)); - await thumbnailService.Thumbnail(new []{"-t","true", "-s", "/test"}); + await thumbnailService.Thumbnail(["-t","true", "-s", "/test"]); Assert.AreEqual("/test", fakeIThumbnailService.Inputs[0].Item1); } @@ -108,14 +109,14 @@ public async Task Thumbnail_MinusS_SubPath() public async Task Thumbnail_MinusS_SubPath_Direct() { var fakeConsole = new FakeConsoleWrapper(); - var fakeIThumbnailService = new FakeIThumbnailService(); - var appSettings = new AppSettings(); var storage = new FakeIStorage(new List {"/"}, new List {"/test.jpg"}); + var fakeIThumbnailService = new FakeIThumbnailService(new FakeSelectorStorage(storage)); + var appSettings = new AppSettings(); var thumbnailService = new ThumbnailCli(appSettings, fakeConsole, fakeIThumbnailService, new FakeIThumbnailCleaner(), new FakeSelectorStorage(storage)); - await thumbnailService.Thumbnail(new []{"-t","true", "-s", "/test.jpg"}); + await thumbnailService.Thumbnail(["-t","true", "-s", "/test.jpg"]); Assert.AreEqual("/test.jpg", fakeIThumbnailService.Inputs[0].Item1); @@ -127,14 +128,14 @@ public async Task Thumbnail_MinusS_SubPath_Direct() public async Task Thumbnail_MinusG_Relative() { var fakeConsole = new FakeConsoleWrapper(); - var fakeIThumbnailService = new FakeIThumbnailService(); - var appSettings = new AppSettings(); var storage = new FakeIStorage(new List {"/"}, new List {"/test.jpg"}); + var fakeIThumbnailService = new FakeIThumbnailService(new FakeSelectorStorage(storage)); + var appSettings = new AppSettings(); var thumbnailService = new ThumbnailCli(appSettings, fakeConsole, fakeIThumbnailService, new FakeIThumbnailCleaner(), new FakeSelectorStorage(storage)); - await thumbnailService.Thumbnail(new []{"-t","true", "-g", "0"}); + await thumbnailService.Thumbnail(["-t","true", "-g", "0"]); var subPathRelative = new StructureService(new FakeIStorage(),appSettings.Structure) .ParseSubfolders(0); @@ -149,10 +150,10 @@ public async Task Thumbnail_MinusX_CleanAllUnusedFiles() var storage = new FakeIStorage(new List {"/"}, new List {"/test.jpg"}); var fakeIThumbnailCleaner = new FakeIThumbnailCleaner(); var thumbnailService = new ThumbnailCli(new AppSettings(), fakeConsole, - new FakeIThumbnailService(), fakeIThumbnailCleaner, + new FakeIThumbnailService(new FakeSelectorStorage(storage)), fakeIThumbnailCleaner, new FakeSelectorStorage(storage)); - await thumbnailService.Thumbnail(new []{"--clean","true"}); + await thumbnailService.Thumbnail(["--clean","true"]); Assert.IsTrue(fakeIThumbnailCleaner.Inputs[0]); } diff --git a/starsky/starskytest/starsky.foundation.thumbnailgeneration/Helpers/ThumbnailTest.cs b/starsky/starskytest/starsky.foundation.thumbnailgeneration/Helpers/ThumbnailTest.cs index 11a3ff3730..af87ba5402 100644 --- a/starsky/starskytest/starsky.foundation.thumbnailgeneration/Helpers/ThumbnailTest.cs +++ b/starsky/starskytest/starsky.foundation.thumbnailgeneration/Helpers/ThumbnailTest.cs @@ -127,13 +127,13 @@ public async Task CreateThumbTest_1arg_ThumbnailAlreadyExist() var hash = (await new FileHash(storage).GetHashCodeAsync(_fakeIStorageImageSubPath)).Key; await storage.WriteStreamAsync( - PlainTextFileHelper.StringToStream("not 0 bytes"), + StringToStreamHelper.StringToStream("not 0 bytes"), ThumbnailNameHelper.Combine(hash, ThumbnailSize.ExtraLarge)); await storage.WriteStreamAsync( - PlainTextFileHelper.StringToStream("not 0 bytes"), + StringToStreamHelper.StringToStream("not 0 bytes"), ThumbnailNameHelper.Combine(hash, ThumbnailSize.Large)); await storage.WriteStreamAsync( - PlainTextFileHelper.StringToStream("not 0 bytes"), + StringToStreamHelper.StringToStream("not 0 bytes"), ThumbnailNameHelper.Combine(hash, ThumbnailSize.Small)); var isCreated = await new Thumbnail(storage, diff --git a/starsky/starskytest/starsky.foundation.thumbnailmeta/Services/ReadMetaThumbnailTest.cs b/starsky/starskytest/starsky.foundation.thumbnailmeta/Services/ReadMetaThumbnailTest.cs index dc3f9691f0..29e1f10f70 100644 --- a/starsky/starskytest/starsky.foundation.thumbnailmeta/Services/ReadMetaThumbnailTest.cs +++ b/starsky/starskytest/starsky.foundation.thumbnailmeta/Services/ReadMetaThumbnailTest.cs @@ -6,7 +6,6 @@ using starsky.foundation.thumbnailmeta.Services; using starsky.foundation.platform.Models; using starsky.foundation.storage.Helpers; -using starsky.foundation.storage.Services; using starsky.foundation.storage.Storage; using starskytest.FakeCreateAn; using starskytest.FakeCreateAn.CreateAnImageWithThumbnail; @@ -18,7 +17,6 @@ namespace starskytest.starsky.foundation.thumbnailmeta.Services public sealed class MetaExifThumbnailServiceTest { private readonly FakeIStorage _iStorageFake; - private readonly string _exampleHash; public MetaExifThumbnailServiceTest() { @@ -27,8 +25,6 @@ public MetaExifThumbnailServiceTest() new List{"/no_thumbnail.jpg", "/poppy.jpg", ThumbnailNameHelper.Combine("test",ThumbnailSize.TinyMeta)}, new List{CreateAnImage.Bytes.ToArray(), new CreateAnImageWithThumbnail().Bytes, CreateAnImage.Bytes.ToArray()} ); - - _exampleHash = new FileHash(_iStorageFake).GetHashCode("/no_thumbnail.jpg").Key; } [TestMethod] @@ -81,7 +77,7 @@ public async Task AddMetaThumbnail_stringString_Fake_NoHashIncluded() var result = await new MetaExifThumbnailService(new AppSettings(), selectorStorage, new FakeIOffsetDataMetaExifThumbnail(), new FakeIWriteMetaThumbnailService(), logger) - .AddMetaThumbnail("/poppy.jpg",null); + .AddMetaThumbnail("/poppy.jpg",null!); Assert.IsTrue(result.Item1); } @@ -172,7 +168,7 @@ public async Task AddMetaThumbnail_Fake_stringString_NotFound() [TestMethod] public async Task AddMetaThumbnail_Fake_Corrupt() { - await _iStorageFake.WriteStreamAsync(PlainTextFileHelper.StringToStream("test"), "/poppy_corrupt_22.jpg"); + await _iStorageFake.WriteStreamAsync(StringToStreamHelper.StringToStream("test"), "/poppy_corrupt_22.jpg"); var selectorStorage = new FakeSelectorStorage(_iStorageFake); var logger = new FakeIWebLogger(); diff --git a/starsky/starskytest/starsky.foundation.worker/Services/UpdateBackgroundTaskQueueTest.cs b/starsky/starskytest/starsky.foundation.worker/Services/UpdateBackgroundTaskQueueTest.cs index 71cfcfb7b4..60938d83b8 100644 --- a/starsky/starskytest/starsky.foundation.worker/Services/UpdateBackgroundTaskQueueTest.cs +++ b/starsky/starskytest/starsky.foundation.worker/Services/UpdateBackgroundTaskQueueTest.cs @@ -17,8 +17,7 @@ using starsky.foundation.worker.Interfaces; using starsky.foundation.worker.Services; using starskytest.FakeMocks; - -#pragma warning disable 1998 +#pragma warning disable CS1998 // Async method lacks 'await' operators and will run synchronously namespace starskytest.starsky.foundation.worker.Services { diff --git a/starsky/starskytest/starsky.foundation.worker/ThumbnailServices/Exceptions/ToManyUsageExceptionTest.cs b/starsky/starskytest/starsky.foundation.worker/ThumbnailServices/Exceptions/ToManyUsageExceptionTest.cs index 34ef02de8f..92fe59fa04 100644 --- a/starsky/starskytest/starsky.foundation.worker/ThumbnailServices/Exceptions/ToManyUsageExceptionTest.cs +++ b/starsky/starskytest/starsky.foundation.worker/ThumbnailServices/Exceptions/ToManyUsageExceptionTest.cs @@ -28,6 +28,7 @@ public void ToManyUsageExceptionMessage() [ExpectedException(typeof(ToManyUsageException))] public void ToManyUsageException_Protected() { +#pragma warning disable SYSLIB0050 var info = new SerializationInfo(typeof(Exception), new FormatterConverter()); info.AddValue("Message", ""); @@ -50,6 +51,7 @@ public void ToManyUsageException_Protected() }); throw instance; +#pragma warning restore SYSLIB0050 } } } diff --git a/starsky/starskytest/starsky.foundation.writemeta/Helpers/ExifToolDownloadTest.cs b/starsky/starskytest/starsky.foundation.writemeta/Helpers/ExifToolDownloadTest.cs index bacf7d9a34..68d49a9863 100644 --- a/starsky/starskytest/starsky.foundation.writemeta/Helpers/ExifToolDownloadTest.cs +++ b/starsky/starskytest/starsky.foundation.writemeta/Helpers/ExifToolDownloadTest.cs @@ -23,7 +23,7 @@ public sealed class ExifToolDownloadTest { private readonly IServiceScopeFactory _serviceScopeFactory; private readonly AppSettings _appSettings; - private readonly IStorage _hostFileSystem; + private readonly StorageHostFullPathFilesystem _hostFileSystem; /// /// shasum -a 1 file.zip @@ -89,8 +89,8 @@ public async Task DownloadCheckSums_BaseChecksumDoesExist() // Happy flow var result = await new ExifToolDownload(httpClientHelper,_appSettings, new FakeIWebLogger() ) .DownloadCheckSums(); - Assert.AreEqual(ExampleCheckSum, result.Value.Value); - Assert.AreEqual(true, result.Value.Key); + Assert.AreEqual(ExampleCheckSum, result?.Value); + Assert.AreEqual(true, result?.Key); } [TestMethod] @@ -107,8 +107,8 @@ public async Task DownloadCheckSums_BaseChecksumDoesNotExist() var result = await new ExifToolDownload(httpClientHelper,_appSettings, new FakeIWebLogger() ) .DownloadCheckSums(); - Assert.AreEqual(ExampleCheckSum, result.Value.Value); - Assert.AreEqual(false, result.Value.Key); + Assert.AreEqual(ExampleCheckSum, result?.Value); + Assert.AreEqual(false, result?.Key); } [TestMethod] @@ -156,7 +156,7 @@ private async Task CreateTempFolderWithExifTool(string name = "test var appSettings = new AppSettings{DependenciesFolder = Path.Combine(_createAnImage.BasePath,name)}; Directory.CreateDirectory(appSettings.DependenciesFolder); Directory.CreateDirectory(Path.Combine(appSettings.DependenciesFolder,"exiftool-unix")); - var stream = PlainTextFileHelper.StringToStream("#!/bin/bash"); + var stream = StringToStreamHelper.StringToStream("#!/bin/bash"); try { await new StorageHostFullPathFilesystem().WriteStreamAsync(stream, @@ -312,7 +312,7 @@ public async Task DownloadExifTool_Windows_existVerbose() Directory.CreateDirectory(Path.Combine(appSettings.DependenciesFolder,"exiftool-windows")); var debugString = "\n\necho \"Fake ExifTool\"\n\n\n\necho 'test'"; - var stream = PlainTextFileHelper.StringToStream("#!/bin/bash\n"+ debugString+ debugString + var stream = StringToStreamHelper.StringToStream("#!/bin/bash\n"+ debugString+ debugString +debugString+debugString+debugString); await new StorageHostFullPathFilesystem().WriteStreamAsync(stream, Path.Combine(appSettings.DependenciesFolder, "exiftool-windows", "exiftool.exe")); diff --git a/starsky/starskytest/starsky.foundation.writemeta/Helpers/ExifToolTest.cs b/starsky/starskytest/starsky.foundation.writemeta/Helpers/ExifToolTest.cs index 27b08b69c2..85140a8181 100644 --- a/starsky/starskytest/starsky.foundation.writemeta/Helpers/ExifToolTest.cs +++ b/starsky/starskytest/starsky.foundation.writemeta/Helpers/ExifToolTest.cs @@ -5,8 +5,10 @@ using System.Threading.Tasks; using Microsoft.VisualStudio.TestTools.UnitTesting; using starsky.foundation.platform.Models; +using starsky.foundation.storage.Helpers; using starsky.foundation.writemeta.Helpers; using starsky.foundation.writemeta.Services; +using starskytest.FakeCreateAn; using starskytest.FakeMocks; namespace starskytest.starsky.foundation.writemeta.Helpers @@ -110,6 +112,9 @@ public async Task RunProcessAsync_RunChildObject_UnixOnly() var runner = new StreamToStreamRunner(appSettings, new MemoryStream(Array.Empty()), new FakeIWebLogger()); var result = await runner.RunProcessAsync(string.Empty); + + var test = await StreamToStringHelper.StreamToStringAsync(result, false); + Assert.AreEqual(0, result.Length); } diff --git a/starsky/starskytest/starsky.foundation.writemeta/JsonService/FileIndexItemJsonWriterTest.cs b/starsky/starskytest/starsky.foundation.writemeta/JsonService/FileIndexItemJsonWriterTest.cs index f233678ea7..52e0e36a55 100644 --- a/starsky/starskytest/starsky.foundation.writemeta/JsonService/FileIndexItemJsonWriterTest.cs +++ b/starsky/starskytest/starsky.foundation.writemeta/JsonService/FileIndexItemJsonWriterTest.cs @@ -77,7 +77,7 @@ public async Task Json_Write_Read() var itemJsonParser = new FileIndexItemJsonParser(fakeStorage); await itemJsonParser.WriteAsync(ExampleItem); - var result = itemJsonParser.Read(new FileIndexItem("/test.jpg")); + var result = await itemJsonParser.ReadAsync(new FileIndexItem("/test.jpg")); Assert.IsNotNull(result); Assert.AreEqual(ExampleItem.Tags, result.Tags); @@ -108,7 +108,7 @@ public async Task Json_Write_Read() } [TestMethod] - public void ReadTest_OldFormat_Unsupported() + public async Task ReadTest_OldFormat_Unsupported() { const string input = "{\n \"FilePath\": \"/test.jpg\",\n " + " \"FileName\": \"test.jpg\",\n \"FileHash\": " + @@ -135,18 +135,18 @@ public void ReadTest_OldFormat_Unsupported() var fakeStorage = new FakeIStorage(); var jsonSubPath = "/.starsky." + "test.jpg" + ".json"; - fakeStorage.WriteStream( - PlainTextFileHelper.StringToStream(input), jsonSubPath); + await fakeStorage.WriteStreamAsync( + StringToStreamHelper.StringToStream(input), jsonSubPath); var itemJsonParser = new FileIndexItemJsonParser(fakeStorage); - var result = itemJsonParser.Read(new FileIndexItem("/test.jpg")); + var result = await itemJsonParser.ReadAsync(new FileIndexItem("/test.jpg")); Assert.AreEqual(string.Empty, result.Tags); } [TestMethod] - public void ReadTest_FromCopiedText() + public async Task ReadTest_FromCopiedText() { const string input = "{ \"item\": {\n \"FilePath\": \"/test.jpg\",\n " + " \"FileName\": \"test.jpg\",\n \"FileHash\": " + @@ -174,12 +174,12 @@ public void ReadTest_FromCopiedText() var fakeStorage = new FakeIStorage(); var jsonSubPath = "/.starsky." + "test.jpg" + ".json"; - fakeStorage.WriteStream( - PlainTextFileHelper.StringToStream(input), jsonSubPath); + await fakeStorage.WriteStreamAsync( + StringToStreamHelper.StringToStream(input), jsonSubPath); var itemJsonParser = new FileIndexItemJsonParser(fakeStorage); - var result = itemJsonParser.Read(new FileIndexItem("/test.jpg")); + var result = await itemJsonParser.ReadAsync(new FileIndexItem("/test.jpg")); Assert.AreEqual(ExampleItem.Tags, result.Tags); Assert.AreEqual(ExampleItem.FileHash, result.FileHash); diff --git a/starsky/starskytest/Services/ExifCopyTest.cs b/starsky/starskytest/starsky.foundation.writemeta/Services/ExifCopyTest.cs similarity index 92% rename from starsky/starskytest/Services/ExifCopyTest.cs rename to starsky/starskytest/starsky.foundation.writemeta/Services/ExifCopyTest.cs index 689eda8acc..7d463d3e54 100644 --- a/starsky/starskytest/Services/ExifCopyTest.cs +++ b/starsky/starskytest/starsky.foundation.writemeta/Services/ExifCopyTest.cs @@ -9,7 +9,7 @@ using starskytest.FakeMocks; using starskytest.Models; -namespace starskytest.Services +namespace starskytest.starsky.foundation.writemeta.Services { [TestClass] public sealed class ExifCopyTest @@ -57,7 +57,7 @@ public async Task ExifToolCmdHelper_XmpSync() } [TestMethod] - public void ExifToolCmdHelper_XmpCreate() + public async Task ExifToolCmdHelper_XmpCreate() { var folderPaths = new List{"/"}; var inputSubPaths = new List{"/test.dng"}; @@ -71,7 +71,7 @@ public void ExifToolCmdHelper_XmpCreate() new ExifCopy(storage, storage, fakeExifTool, fakeReadMeta, new FakeIThumbnailQuery()) .XmpCreate("/test.xmp"); - var result = PlainTextFileHelper.StreamToString(storage.ReadStream("/test.xmp")); + var result = await StreamToStringHelper.StreamToStringAsync(storage.ReadStream("/test.xmp")); Assert.AreEqual("\n" + "\n\n",result); } @@ -95,7 +95,7 @@ public async Task ExifToolCmdHelper_TestForFakeExifToolInjection() Assert.AreEqual(true,storage.ExistFile("/test.xmp")); var xmpContentReadStream = storage.ReadStream("/test.xmp"); - var xmpContent = await PlainTextFileHelper.StreamToStringAsync(xmpContentReadStream); + var xmpContent = await StreamToStringHelper.StreamToStringAsync(xmpContentReadStream); // Those values are injected by fakeExifTool Assert.AreEqual(true,xmpContent.Contains("")); diff --git a/starsky/starskytest/starsky.foundation.writemeta/Services/ExifToolHostStorageServiceTest.cs b/starsky/starskytest/starsky.foundation.writemeta/Services/ExifToolHostStorageServiceTest.cs index a816d6c7f5..fd23a0d7ce 100644 --- a/starsky/starskytest/starsky.foundation.writemeta/Services/ExifToolHostStorageServiceTest.cs +++ b/starsky/starskytest/starsky.foundation.writemeta/Services/ExifToolHostStorageServiceTest.cs @@ -146,6 +146,7 @@ await hostFileSystemStorage.WriteStreamAsync(new MemoryStream(item), var appSettings = new AppSettings { ExifToolPath = Path.Combine(outputPath, "exiftool.exe"), + Verbose = true }; var fakeStorage = new FakeIStorage(new List{"/"}, diff --git a/starsky/starskytest/starsky.foundation.writemeta/Services/ExifToolServiceTest.cs b/starsky/starskytest/starsky.foundation.writemeta/Services/ExifToolServiceTest.cs index 04c61bea18..fb083f0e5a 100644 --- a/starsky/starskytest/starsky.foundation.writemeta/Services/ExifToolServiceTest.cs +++ b/starsky/starskytest/starsky.foundation.writemeta/Services/ExifToolServiceTest.cs @@ -23,7 +23,7 @@ public ExifToolServiceTest() { if ( !new AppSettings().IsWindows ) { - var stream = PlainTextFileHelper.StringToStream("#!/bin/bash\necho Fake ExifTool"); + var stream = StringToStreamHelper.StringToStream("#!/bin/bash\necho Fake ExifTool"); _exifToolPath = Path.Join(new CreateAnImage().BasePath, "exiftool-tmp"); new StorageHostFullPathFilesystem().WriteStream(stream, _exifToolPath); diff --git a/starsky/starskytest/starskytest.csproj b/starsky/starskytest/starskytest.csproj index feaf3ed6c3..e6661478b6 100644 --- a/starsky/starskytest/starskytest.csproj +++ b/starsky/starskytest/starskytest.csproj @@ -1,8 +1,8 @@  - net6.0 + net8.0 - 6.0.25 + 8.0.1 Full {b3342a3e-64e1-442f-b4f7-f7a718508aac} @@ -21,10 +21,10 @@ - - - - + + + + @@ -45,6 +45,7 @@ + diff --git a/starsky/starskythumbnailcli/starskythumbnailcli.csproj b/starsky/starskythumbnailcli/starskythumbnailcli.csproj index b2a1f50627..d8d7eea633 100644 --- a/starsky/starskythumbnailcli/starskythumbnailcli.csproj +++ b/starsky/starskythumbnailcli/starskythumbnailcli.csproj @@ -2,10 +2,10 @@ Exe - net6.0 + net8.0 {67e3fb34-1ca8-4a28-a0e0-00ff61821002} - 6.0.25 + 8.0.1 starskythumbnailcli 0.5.14 diff --git a/starsky/starskythumbnailmetacli/starskythumbnailmetacli.csproj b/starsky/starskythumbnailmetacli/starskythumbnailmetacli.csproj index 027d39bdbe..dd4f73ed67 100644 --- a/starsky/starskythumbnailmetacli/starskythumbnailmetacli.csproj +++ b/starsky/starskythumbnailmetacli/starskythumbnailmetacli.csproj @@ -2,10 +2,10 @@ Exe - net6.0 + net8.0 {a0cce905-ae43-4d1b-a97a-2bcd2c010ed1} - 6.0.25 + 8.0.1 starskythumbnailmetacli 0.5.14 diff --git a/starsky/starskywebftpcli/Program.cs b/starsky/starskywebftpcli/Program.cs index 8da13ebab8..b0b51d9d17 100644 --- a/starsky/starskywebftpcli/Program.cs +++ b/starsky/starskywebftpcli/Program.cs @@ -31,7 +31,7 @@ public static async Task Main(string[] args) var console = serviceProvider.GetRequiredService(); var webRequestFactory = serviceProvider.GetRequiredService(); - new WebFtpCli(appSettings, storageSelector, console, webRequestFactory).Run(args); + await new WebFtpCli(appSettings, storageSelector, console, webRequestFactory).RunAsync(args); } } } diff --git a/starsky/starskywebftpcli/starskywebftpcli.csproj b/starsky/starskywebftpcli/starskywebftpcli.csproj index 0272edd402..c88b578d58 100644 --- a/starsky/starskywebftpcli/starskywebftpcli.csproj +++ b/starsky/starskywebftpcli/starskywebftpcli.csproj @@ -2,9 +2,9 @@ Exe - net6.0 + net8.0 {eb1d57d1-29d8-4bfb-950e-447ef8522a10} - 6.0.25 + 8.0.1 Full 0.5.14 diff --git a/starsky/starskywebhtmlcli/starskywebhtmlcli.csproj b/starsky/starskywebhtmlcli/starskywebhtmlcli.csproj index 598a69ca63..c77f871f91 100644 --- a/starsky/starskywebhtmlcli/starskywebhtmlcli.csproj +++ b/starsky/starskywebhtmlcli/starskywebhtmlcli.csproj @@ -1,9 +1,9 @@  Exe - net6.0 + net8.0 {76d7bf62-9f1d-48f1-9035-dceb01de55c3} - 6.0.25 + 8.0.1 8.0 true Full diff --git a/starskydesktop/Dockerfile b/starskydesktop/Dockerfile index 61670a5a59..3e7496429f 100644 --- a/starskydesktop/Dockerfile +++ b/starskydesktop/Dockerfile @@ -19,7 +19,7 @@ RUN npm ci --legacy-peer-deps --prefer-offline --no-audit --no-fund RUN npm run build RUN echo "react done" -FROM --platform=$BUILDPLATFORM mcr.microsoft.com/dotnet/sdk:6.0 AS build-env +FROM --platform=$BUILDPLATFORM mcr.microsoft.com/dotnet/sdk:8.0 AS build-env ARG BUILDPLATFORM ARG TARGETPLATFORM