From 8c0a16904a0fa545c198c2ebe56335974925d120 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?nils=20m=C3=A5s=C3=A9n?= Date: Fri, 14 May 2021 12:45:43 +0200 Subject: [PATCH] PR #636: Fix unstable tests and switch to dotcover * test: use static random seed in tests this prevents the code coverage from varying depending on how well the random data compresses * ci: use dotcover for code coverage --- .github/workflows/build-test.yml | 70 ++++++++++++++----- .../BZip2/Bzip2Tests.cs | 5 +- .../Base/InflaterDeflaterTests.cs | 7 +- .../ICSharpCode.SharpZipLib.Tests.csproj | 5 -- 4 files changed, 60 insertions(+), 27 deletions(-) diff --git a/.github/workflows/build-test.yml b/.github/workflows/build-test.yml index b9217ee34..254ff46ed 100644 --- a/.github/workflows/build-test.yml +++ b/.github/workflows/build-test.yml @@ -22,7 +22,9 @@ jobs: LIB_PROJ: src/ICSharpCode.SharpZipLib/ICSharpCode.SharpZipLib.csproj steps: - uses: actions/checkout@v2 - + with: + fetch-depth: 0 + - name: Setup .NET Core uses: actions/setup-dotnet@v1 with: @@ -39,25 +41,20 @@ jobs: strategy: fail-fast: false matrix: - os: [ubuntu, windows, macos] + # Windows testing is combined with code coverage + os: [ubuntu, macos] target: [netcoreapp3.1] - include: - - os: windows - target: net46 steps: - uses: actions/checkout@v2 - + with: + fetch-depth: 0 + - name: Setup .NET Core if: matrix.target == 'netcoreapp3.1' uses: actions/setup-dotnet@v1 with: dotnet-version: '3.1.x' - # NOTE: This is the temporary fix for https://github.com/actions/virtual-environments/issues/1090 - - name: Cleanup before restore - if: ${{ matrix.os == 'windows' }} - run: dotnet clean ICSharpCode.SharpZipLib.sln && dotnet nuget locals all --clear - - name: Restore test dependencies run: dotnet restore @@ -65,20 +62,55 @@ jobs: run: dotnet test -c debug -f ${{ matrix.target }} --no-restore - name: Run tests (Release) - # Only upload code coverage for windows in an attempt to fix the broken code coverage - if: ${{ matrix.os == 'windows' }} - run: dotnet test -c release -f ${{ matrix.target }} --no-restore --collect="XPlat Code Coverage" - - - name: Run tests with coverage (Release) - # Only upload code coverage for windows in an attempt to fix the broken code coverage - if: ${{ matrix.os != 'windows' }} run: dotnet test -c release -f ${{ matrix.target }} --no-restore + + CodeCov: + name: Code Coverage + runs-on: windows-latest + env: + DOTCOVER_VER: 2021.1.2 + DOTCOVER_PKG: jetbrains.dotcover.commandlinetools + COVER_SNAPSHOT: SharpZipLib.dcvr + steps: + - uses: actions/checkout@v2 + with: + fetch-depth: 0 + + - name: Setup .NET + uses: actions/setup-dotnet@v1 + with: + dotnet-version: '3.1.x' + + # NOTE: This is the temporary fix for https://github.com/actions/virtual-environments/issues/1090 + - name: Cleanup before restore + run: dotnet clean ICSharpCode.SharpZipLib.sln && dotnet nuget locals all --clear + + - name: Install codecov + run: nuget install -o tools -version ${{env.DOTCOVER_VER}} ${{env.DOTCOVER_PKG}} + + - name: Add dotcover to path + run: echo "$(pwd)\tools\${{env.DOTCOVER_PKG}}.${{env.DOTCOVER_VER}}\tools" | Out-File -FilePath $env:GITHUB_PATH -Encoding utf8 -Append + + - name: Run tests with code coverage + run: dotcover dotnet --output=${{env.COVER_SNAPSHOT}} --filters=-:ICSharpCode.SharpZipLib.Tests -- test -c release + + - name: Create code coverage report + run: dotcover report --source=${{env.COVER_SNAPSHOT}} --reporttype=detailedxml --output=dotcover-report.xml + - name: Upload coverage to Codecov uses: codecov/codecov-action@v1.2.2 + with: + files: dotcover-report.xml + + - name: Upload coverage snapshot artifact + uses: actions/upload-artifact@v2 + with: + name: Code coverage snapshot + path: ${{env.COVER_SNAPSHOT}} Pack: - needs: [Build, Test] + needs: [Build, Test, CodeCov] runs-on: windows-latest env: PKG_SUFFIX: '' diff --git a/test/ICSharpCode.SharpZipLib.Tests/BZip2/Bzip2Tests.cs b/test/ICSharpCode.SharpZipLib.Tests/BZip2/Bzip2Tests.cs index 34dc288b1..8d6febc1b 100644 --- a/test/ICSharpCode.SharpZipLib.Tests/BZip2/Bzip2Tests.cs +++ b/test/ICSharpCode.SharpZipLib.Tests/BZip2/Bzip2Tests.cs @@ -12,6 +12,9 @@ namespace ICSharpCode.SharpZipLib.Tests.BZip2 [TestFixture] public class BZip2Suite { + // Use the same random seed to guarantee all the code paths are followed + const int RandomSeed = 4; + /// /// Basic compress/decompress test BZip2 /// @@ -23,7 +26,7 @@ public void BasicRoundTrip() var outStream = new BZip2OutputStream(ms); byte[] buf = new byte[10000]; - var rnd = new Random(); + var rnd = new Random(RandomSeed); rnd.NextBytes(buf); outStream.Write(buf, 0, buf.Length); diff --git a/test/ICSharpCode.SharpZipLib.Tests/Base/InflaterDeflaterTests.cs b/test/ICSharpCode.SharpZipLib.Tests/Base/InflaterDeflaterTests.cs index 6aff0a693..e6e3c4125 100644 --- a/test/ICSharpCode.SharpZipLib.Tests/Base/InflaterDeflaterTests.cs +++ b/test/ICSharpCode.SharpZipLib.Tests/Base/InflaterDeflaterTests.cs @@ -16,6 +16,9 @@ namespace ICSharpCode.SharpZipLib.Tests.Base [TestFixture] public class InflaterDeflaterTestSuite { + // Use the same random seed to guarantee all the code paths are followed + const int RandomSeed = 5; + private void Inflate(MemoryStream ms, byte[] original, int level, bool zlib) { byte[] buf2 = new byte[original.Length]; @@ -60,7 +63,7 @@ private MemoryStream Deflate(byte[] data, int level, bool zlib) private static byte[] GetRandomTestData(int size) { byte[] buffer = new byte[size]; - var rnd = new Random(); + var rnd = new Random(RandomSeed); rnd.NextBytes(buffer); return buffer; @@ -184,7 +187,7 @@ public async Task InflateDeflateZlibAsync([Range(0, 9)] int level) private int runLevel; private bool runZlib; private long runCount; - private readonly Random runRandom = new Random(5); + private readonly Random runRandom = new Random(RandomSeed); private void DeflateAndInflate(byte[] buffer) { diff --git a/test/ICSharpCode.SharpZipLib.Tests/ICSharpCode.SharpZipLib.Tests.csproj b/test/ICSharpCode.SharpZipLib.Tests/ICSharpCode.SharpZipLib.Tests.csproj index 2c2a261d5..fd6f61ae9 100644 --- a/test/ICSharpCode.SharpZipLib.Tests/ICSharpCode.SharpZipLib.Tests.csproj +++ b/test/ICSharpCode.SharpZipLib.Tests/ICSharpCode.SharpZipLib.Tests.csproj @@ -8,15 +8,10 @@ - - all - runtime; build; native; contentfiles; analyzers; buildtransitive - -