Skip to content

Commit

Permalink
[#164] Add workflow for running Windows tests on CI
Browse files Browse the repository at this point in the history
Problem: we are not testing behavior of xrefcheck on Windows

Solution: and add workflow to run
golden and tasty tests on CI
via github-actions windows runner
Some subproblems appear:

1.
Problem: CI build fails beacuse it needs `pcre` package
Solution: add it (somehow), see `install pacman dependencies`
in ci.yml

2.
Problem: Network errors displayed different on different platforms
Solution: collect output from both and use
`assert_diff expected_linux.gold || assert_diff expected_windows.gold`

3:
Problem: "Config matches" test is failing because checkout action
clone files with CRLF, and test assert equality of two ByteStrings
Solution: manually remove CR
  • Loading branch information
Sorokin-Anton committed Oct 13, 2022
1 parent c1cd260 commit 6fa646f
Show file tree
Hide file tree
Showing 7 changed files with 144 additions and 5 deletions.
81 changes: 81 additions & 0 deletions .github/workflows/ci.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,81 @@
# SPDX-FileCopyrightText: 2020 Kowainik
# SPDX-FileCopyrightText: 2022 Serokell <https://serokell.io/>
#
# SPDX-License-Identifier: MPL-2.0

# Sources:
# • https://github.com/kowainik/validation-selective/blob/5b46cd4810bbaa09b704062ebbfa2bb47137425d/.github/workflows/ci.yml
# • https://kodimensional.dev/github-actions
# • https://github.com/serokell/tztime/blob/336f585c2c7125a8ba58ffbf3dbea4f36a7c40e7/.github/workflows/ci.yml

name: CI

on: [push]

jobs:
xrefcheck-build-and-test:
runs-on: windows-latest
strategy:
matrix:
stack: ["2.7.5"]
ghc: ["9.0.2"]
include:
- ghc: "9.0.2"
stackyaml: stack.yaml
steps:
- uses: actions/checkout@v3
with:
submodules: 'true'

- uses: haskell/actions/setup@v2.0.1
id: setup-haskell-stack
name: Setup Haskell Stack
with:
ghc-version: ${{ matrix.ghc }}
stack-version: ${{ matrix.stack }}

- uses: actions/cache@v3
name: Cache stack root
with:
path: ~/AppData/Roaming/stack
key: ${{ runner.os }}-${{ matrix.ghc }}-stack

- uses: actions/cache@v3
name: Cache AppData/Local/Programs/stack
with:
path: ~/AppData/Local/Programs/stack
key: ${{ runner.os }}-${{ matrix.ghc }}-appdata-stack


# When editing this action, make sure it can run without using cached folders.
# Yes, it tries to install mingw-w64-x86_64-pcre twice
- name: install pacman dependencies
run: |
stack --system-ghc exec -- pacman -S --needed --noconfirm pkgconf;
stack --system-ghc exec -- pacman -S --needed --noconfirm msys2-keyring;
stack --system-ghc exec -- pacman --noconfirm -Syuu;
stack --system-ghc exec -- pacman -S --needed --noconfirm mingw-w64-x86_64-pcre;
stack --system-ghc exec -- pacman --noconfirm -Syuu;
stack --system-ghc exec -- pacman -S --needed --noconfirm mingw-w64-x86_64-pcre;
stack --system-ghc exec -- pacman -S --needed --noconfirm pcre-devel;
- name: Build
run: |
stack build --system-ghc --stack-yaml ${{ matrix.stackyaml }} --test --bench --no-run-tests --no-run-benchmarks --ghc-options '-Werror' --haddock --no-haddock-deps
- name: stack test xrefcheck:xrefcheck-tests
run: |
stack test --system-ghc --stack-yaml ${{ matrix.stackyaml }} xrefcheck:xrefcheck-tests
- name: install xrefcheck to use with golden tests
run: |
stack --system-ghc --stack-yaml ${{ matrix.stackyaml }} install;
- uses: mig4/setup-bats@v1
name: Setup bats

- name: Golden tests
run: |
export PATH=$PATH:/c/Users/runneradmin/AppData/Roaming/local/bin;
bats ./tests/golden/**
shell: bash
4 changes: 4 additions & 0 deletions CHANGES.md
Original file line number Diff line number Diff line change
Expand Up @@ -25,6 +25,10 @@ Unreleased
as broken (with message `Link targets a local file outside repository`).
Same for links that are using directories outside repository (e.g. `/../repo/a.md`),
since such things are not supported by GitHub markdown renderer.
* [#191](https://github.com/serokell/xrefcheck/pull/191)
+ Now we consider slash `/` (and only it) as path separator in local links for all OS,
so xrefcheck's report is OS-independent
+ Use utf-8 compatible codepage on Windows

0.2.1
==========
Expand Down
13 changes: 11 additions & 2 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -164,7 +164,17 @@ Currently supported options include:
## Build instructions [↑](#xrefcheck)

Run `stack install` to build everything and install the executable.
If you want to use cabal, you need to run (`stack2cabal`)[https://hackage.haskell.org/package/stack2cabal] first!
If you want to use cabal, you need to run [`stack2cabal`](https://hackage.haskell.org/package/stack2cabal) first!

### Run on Windows [↑](#xrefcheck)
On Windows, executable requires some dynamic libraries (DLLs).
They are shipped together with executable in [releases page](https://github.com/serokell/xrefcheck/releases).
If you have builded executable from source using `stack install`,
those DLLs are downloaded by stack to location is not on `%PATH%` by default.
There are several ways to fix this:
- Add `%LocalAppData%\Programs\stack\x86_64-windows\msys2-<...>\mingw64\bin` to your PATH
- run `stack exec xrefcheck.exe -- <args>` instead of `xrefcheck.exe <args>`
- add DLLs from archive from releases page to a folder containing `xrefcheck.exe`

### CI and nix [↑](#xrefcheck)

Expand All @@ -179,7 +189,6 @@ You can do that too if you wish.

## For further work [↑](#xrefcheck)

- [ ] Support for non-Unix systems.
- [ ] Support link detection in different languages, not only Markdown.
- [ ] Haskell Haddock is first in turn.

Expand Down
6 changes: 4 additions & 2 deletions tests/Test/Xrefcheck/ConfigSpec.hs
Original file line number Diff line number Diff line change
Expand Up @@ -10,7 +10,7 @@ import Universum
import Control.Concurrent (forkIO, killThread)
import Control.Exception qualified as E

import Data.ByteString qualified as BS
import Data.ByteString.Char8 qualified as BS
import Data.List (isInfixOf)
import Data.Yaml (ParseException (..), decodeEither')
import Network.HTTP.Types (Status (..))
Expand All @@ -37,7 +37,9 @@ test_config =
-- stack exec xrefcheck -- dump-config -t GitHub -o tests/configs/github-config.yaml
[ testCase "Config matches" $ do
config <- BS.readFile "tests/configs/github-config.yaml"
when (config /= defConfigText GitHub) $
-- On Windows, git clone can replace \n with \r\n in some files
let removeCR = BS.filter (/= '\r')
when (removeCR config /= removeCR (defConfigText GitHub)) $
assertFailure $ toString $ unwords
[ "Config does not match the expected format."
, "Run"
Expand Down
2 changes: 1 addition & 1 deletion tests/golden/check-ignoreRefs/check-ignoreRefs.bats
Original file line number Diff line number Diff line change
Expand Up @@ -22,7 +22,7 @@ load '../helpers'
-c config-check-enabled.yaml \
-r .

assert_diff expected.gold
assert_diff expected_linux.gold || assert_diff expected_windows.gold
}

@test "Ignore localhost, no config specified" {
Expand Down
File renamed without changes.
43 changes: 43 additions & 0 deletions tests/golden/check-ignoreRefs/expected_windows.gold
Original file line number Diff line number Diff line change
@@ -0,0 +1,43 @@
=== Invalid references found ===

➥ In file check-ignoreRefs.md
bad reference (external) at src:7:10-53:
- text: "web-site"
- link: https://localhost:20000/web-site
- anchor: -

⛂ InternalException (HostCannotConnect "localhost" [Network.Socket.connect: <socket: N>: failed (Connection refused (WSAECONNREFUSED)),Network.Socket.connect: <socket: N>: failed (Connection refused (WSAECONNREFUSED))])



➥ In file check-ignoreRefs.md
bad reference (external) at src:9:10-45:
- text: "team"
- link: https://127.0.0.1:20000/team
- anchor: -

⛂ InternalException (HostCannotConnect "127.0.0.1" [Network.Socket.connect: <socket: N>: failed (Connection refused (WSAECONNREFUSED))])



➥ In file check-ignoreRefs.md
bad reference (external) at src:11:10-44:
- text: "blog"
- link: http://localhost:20000/blog
- anchor: -

⛂ ConnectionFailure Network.Socket.connect: <socket: N>: failed (Connection refused (WSAECONNREFUSED))



➥ In file check-ignoreRefs.md
bad reference (external) at src:13:10-44:
- text: "labs"
- link: http://127.0.0.1:20000/labs
- anchor: -

⛂ ConnectionFailure Network.Socket.connect: <socket: N>: failed (Connection refused (WSAECONNREFUSED))



Invalid references dumped, 4 in total.

0 comments on commit 6fa646f

Please sign in to comment.