diff --git a/.github/workflows/macos.yaml b/.github/workflows/macos.yaml index c7f5724..2e6aaca 100644 --- a/.github/workflows/macos.yaml +++ b/.github/workflows/macos.yaml @@ -1,230 +1,235 @@ -name: Build - macOS -on: [workflow_dispatch, push, pull_request] -env: - TERM: xterm-256color - -jobs: - build: - name: ${{ matrix.name }} - runs-on: ${{ matrix.runs-on }} - strategy: - fail-fast: false - matrix: - include: - - name: Build - macOS Xcode - runs-on: macos-latest - compiler: clang - cxx-compiler: clang++ - cmake-args: -G Xcode -D PROXYRES_CODE_COVERAGE=ON - codecov: macos - - steps: - - name: Checkout repository - uses: actions/checkout@v3 - - - name: Generate project - run: | - cmake -S . -B build ${{ matrix.cmake-args }} \ - -D CMAKE_BUILD_TYPE=RelWithDebInfo \ - -D BUILD_SHARED_LIBS=OFF - env: - CC: ${{ matrix.compiler }} - CXX: ${{ matrix.cxx-compiler }} - - - name: Build project - run: cmake --build build --config RelWithDebInfo - - - name: Install test dependencies - run: | - corepack enable - yarn install - working-directory: test - - - name: Run test http server - run: | - npx pm2 start http_server_cmd.js - sleep 15 - working-directory: test - - - name: Run test dhcp server - # Used by wpad.dhcp googletest - run: | - npx pm2 start dhcp_server_cmd.js --output dhcp_server.log - sleep 5 - working-directory: test - - - name: Run tests - run: ctest --verbose -C RelWithDebInfo - working-directory: build - #env: - # WPAD: true - - - name: Download pac from http server - run: curl -v http://127.0.0.1:8080/pac.js - working-directory: test - - - name: Dump proxy info - run: scutil --proxy - - - name: Dump network services - run: networksetup -listallnetworkservices - - - name: Turn on proxy auto discovery (networksetup) - run: networksetup -setproxyautodiscovery Ethernet on - - - name: Check proxy auto discovery setting (networksetup) - run: | - out=$(./proxycli config auto_discover) - echo "Auto discovery: $out" - if [ "$out" = "enabled" ]; then - echo "Auto discovery set successfully" - else - echo "Auto discovery set failed" - exit 1 - fi - working-directory: build/test/RelWithDebInfo - - - name: Turn off proxy auto discovery (networksetup) - run: networksetup -setproxyautodiscovery Ethernet off - - - name: Set proxy auto config url setting (networksetup) - run: networksetup -setautoproxyurl Ethernet http://wpad/wpad3.dat - - - name: Check proxy auto config url setting (networksetup) - run: | - out=$(./proxycli config auto_config_url) - echo "Auto config url: $out" - if [ "$out" = "http://wpad/wpad3.dat" ]; then - echo "Auto config url set successfully" - else - echo "Auto config url set failed" - exit 1 - fi - working-directory: build/test/RelWithDebInfo - - - name: Set manual proxy settings (networksetup) - run: | - networksetup -setwebproxy Ethernet my.proxy7.com 8007 - networksetup -setsecurewebproxy Ethernet my.proxy8.com 8008 - networksetup -setproxybypassdomains Ethernet hi.com world.com - - - name: Check manual proxy settings (networksetup) - shell: bash - run: | - out=$(./proxycli config proxy http) - echo "Proxy (http): $out" - if [ "$out" = "my.proxy7.com:8007" ]; then - echo "Proxy (http) set successfully" - else - echo "Proxy (http) set failed" - exit 1 - fi - out=$(./proxycli config proxy https) - echo "Proxy (https): $out" - if [ "$out" = "my.proxy8.com:8008" ]; then - echo "Proxy (https) set successfully" - else - echo "Proxy (https) set failed" - exit 1 - fi - out=$(./proxycli config bypass_list) - echo "Proxy bypass: $out" - if [ "$out" = "hi.com,world.com" ]; then - echo "Proxy bypass set successfully" - else - echo "Proxy bypass set failed" - exit 1 - fi - working-directory: build/test/RelWithDebInfo - - - name: Set proxy auto config url setting (networksetup) - run: | - networksetup -setautoproxyurl Ethernet http://127.0.0.1:8080/pac.js - networksetup -setautoproxystate Ethernet on - - - name: Check proxy resolution (networksetup) - shell: bash - run: | - out=$(./proxycli config auto_config_url) - echo "Auto config url: $out" - if [ "$out" = "http://127.0.0.1:8080/pac.js" ]; then - echo "Auto config url set successfully" - else - echo "Auto config url set failed" - exit 1 - fi - out=$(./proxycli resolve https://google.com/) - echo "Proxy for https://google.com/: $out" - if [ "$out" = "direct://" ]; then - echo "Proxy for https://google.com/ set successfully" - else - echo "Proxy for https://google.com/ set failed" - exit 1 - fi - out=$(./proxycli resolve http://simple.com/) - echo "Proxy for http://simple.com/: $out" - if [ "$out" = "http://no-such-proxy:80" ]; then - echo "Proxy for http://simple.com/ set successfully" - else - echo "Proxy for http://simple.com/ set failed" - exit 1 - fi - out=$(./proxycli resolve https://simple.com/) - echo "Proxy for https://simple.com/: $out" - if [ "$out" = "http://no-such-proxy:80" ]; then - echo "Proxy for https://simple.com/ set successfully" - else - echo "Proxy for https://simple.com/ set failed" - exit 1 - fi - out=$(./proxycli resolve https://multi-legacy.com/) - echo "Proxy for https://multi-legacy.com/: $out" - if [ "$out" = "http://some-such-proxy:443,http://any-such-proxy:41" ]; then - echo "Proxy for https://multi-legacy.com/ set successfully" - else - echo "Proxy for https://multi-legacy.com/ set failed" - exit 1 - fi - working-directory: build/test/RelWithDebInfo - - - name: Reset proxy settings (networksetup) - run: | - networksetup -setautoproxystate Ethernet off - networksetup -setwebproxystate Ethernet off - networksetup -setsecurewebproxystate Ethernet off - - - name: Generate coverage report - if: always() && matrix.codecov - run: | - python3 -u -m pip install --user gcovr - python3 -m gcovr \ - --exclude-unreachable-branches \ - --gcov-ignore-parse-errors \ - --root . \ - --xml \ - --output coverage.xml \ - --verbose - - - name: Upload coverage report - uses: codecov/codecov-action@v2 - if: always() && matrix.codecov && env.CODECOV_TOKEN != '' - with: - token: ${{ secrets.CODECOV_TOKEN }} - flags: ${{ matrix.codecov }} - name: ${{ matrix.name }} - verbose: false - fail_ci_if_error: true - env: - CODECOV_TOKEN: "${{ secrets.CODECOV_TOKEN }}" - - - name: Upload build errors - uses: actions/upload-artifact@v2 - if: failure() - with: - name: Build Errors - ${{ matrix.name }} - path: | - **/CMakeFiles/CMakeOutput.log - **/CMakeFiles/CMakeError.log - **/Testing/Temporary/LastTest.log - **/*.log - retention-days: 3 +name: Build - macOS +on: [workflow_dispatch, push, pull_request] +env: + TERM: xterm-256color + +jobs: + build: + name: ${{ matrix.name }} + runs-on: ${{ matrix.runs-on }} + strategy: + fail-fast: false + matrix: + include: + - name: Build - macOS Xcode + runs-on: macos-latest + compiler: clang + cxx-compiler: clang++ + cmake-args: -G Xcode -D PROXYRES_CODE_COVERAGE=ON + codecov: macos + + steps: + - name: Checkout repository + uses: actions/checkout@v3 + + - name: Generate project + run: | + cmake -S . -B build ${{ matrix.cmake-args }} \ + -D CMAKE_BUILD_TYPE=RelWithDebInfo \ + -D BUILD_SHARED_LIBS=OFF + env: + CC: ${{ matrix.compiler }} + CXX: ${{ matrix.cxx-compiler }} + + - name: Build project + run: cmake --build build --config RelWithDebInfo + + - name: Setup node version + uses: actions/setup-node@v3 + with: + node-version: 18.18.0 + + - name: Install test dependencies + run: | + corepack enable + yarn install + working-directory: test + + - name: Run test http server + run: | + npx pm2 start http_server_cmd.js + sleep 15 + working-directory: test + + - name: Run test dhcp server + # Used by wpad.dhcp googletest + run: | + npx pm2 start dhcp_server_cmd.js --output dhcp_server.log + sleep 5 + working-directory: test + + - name: Run tests + run: ctest --verbose -C RelWithDebInfo + working-directory: build + #env: + # WPAD: true + + - name: Download pac from http server + run: curl -v http://127.0.0.1:8080/pac.js + working-directory: test + + - name: Dump proxy info + run: scutil --proxy + + - name: Dump network services + run: networksetup -listallnetworkservices + + - name: Turn on proxy auto discovery (networksetup) + run: networksetup -setproxyautodiscovery Ethernet on + + - name: Check proxy auto discovery setting (networksetup) + run: | + out=$(./proxycli config auto_discover) + echo "Auto discovery: $out" + if [ "$out" = "enabled" ]; then + echo "Auto discovery set successfully" + else + echo "Auto discovery set failed" + exit 1 + fi + working-directory: build/test/RelWithDebInfo + + - name: Turn off proxy auto discovery (networksetup) + run: networksetup -setproxyautodiscovery Ethernet off + + - name: Set proxy auto config url setting (networksetup) + run: networksetup -setautoproxyurl Ethernet http://wpad/wpad3.dat + + - name: Check proxy auto config url setting (networksetup) + run: | + out=$(./proxycli config auto_config_url) + echo "Auto config url: $out" + if [ "$out" = "http://wpad/wpad3.dat" ]; then + echo "Auto config url set successfully" + else + echo "Auto config url set failed" + exit 1 + fi + working-directory: build/test/RelWithDebInfo + + - name: Set manual proxy settings (networksetup) + run: | + networksetup -setwebproxy Ethernet my.proxy7.com 8007 + networksetup -setsecurewebproxy Ethernet my.proxy8.com 8008 + networksetup -setproxybypassdomains Ethernet hi.com world.com + + - name: Check manual proxy settings (networksetup) + shell: bash + run: | + out=$(./proxycli config proxy http) + echo "Proxy (http): $out" + if [ "$out" = "my.proxy7.com:8007" ]; then + echo "Proxy (http) set successfully" + else + echo "Proxy (http) set failed" + exit 1 + fi + out=$(./proxycli config proxy https) + echo "Proxy (https): $out" + if [ "$out" = "my.proxy8.com:8008" ]; then + echo "Proxy (https) set successfully" + else + echo "Proxy (https) set failed" + exit 1 + fi + out=$(./proxycli config bypass_list) + echo "Proxy bypass: $out" + if [ "$out" = "hi.com,world.com" ]; then + echo "Proxy bypass set successfully" + else + echo "Proxy bypass set failed" + exit 1 + fi + working-directory: build/test/RelWithDebInfo + + - name: Set proxy auto config url setting (networksetup) + run: | + networksetup -setautoproxyurl Ethernet http://127.0.0.1:8080/pac.js + networksetup -setautoproxystate Ethernet on + + - name: Check proxy resolution (networksetup) + shell: bash + run: | + out=$(./proxycli config auto_config_url) + echo "Auto config url: $out" + if [ "$out" = "http://127.0.0.1:8080/pac.js" ]; then + echo "Auto config url set successfully" + else + echo "Auto config url set failed" + exit 1 + fi + out=$(./proxycli resolve https://google.com/) + echo "Proxy for https://google.com/: $out" + if [ "$out" = "direct://" ]; then + echo "Proxy for https://google.com/ set successfully" + else + echo "Proxy for https://google.com/ set failed" + exit 1 + fi + out=$(./proxycli resolve http://simple.com/) + echo "Proxy for http://simple.com/: $out" + if [ "$out" = "http://no-such-proxy:80" ]; then + echo "Proxy for http://simple.com/ set successfully" + else + echo "Proxy for http://simple.com/ set failed" + exit 1 + fi + out=$(./proxycli resolve https://simple.com/) + echo "Proxy for https://simple.com/: $out" + if [ "$out" = "http://no-such-proxy:80" ]; then + echo "Proxy for https://simple.com/ set successfully" + else + echo "Proxy for https://simple.com/ set failed" + exit 1 + fi + out=$(./proxycli resolve https://multi-legacy.com/) + echo "Proxy for https://multi-legacy.com/: $out" + if [ "$out" = "http://some-such-proxy:443,http://any-such-proxy:41" ]; then + echo "Proxy for https://multi-legacy.com/ set successfully" + else + echo "Proxy for https://multi-legacy.com/ set failed" + exit 1 + fi + working-directory: build/test/RelWithDebInfo + + - name: Reset proxy settings (networksetup) + run: | + networksetup -setautoproxystate Ethernet off + networksetup -setwebproxystate Ethernet off + networksetup -setsecurewebproxystate Ethernet off + + - name: Generate coverage report + if: always() && matrix.codecov + run: | + python3 -u -m pip install --user gcovr + python3 -m gcovr \ + --exclude-unreachable-branches \ + --gcov-ignore-parse-errors \ + --root . \ + --xml \ + --output coverage.xml \ + --verbose + + - name: Upload coverage report + uses: codecov/codecov-action@v2 + if: always() && matrix.codecov && env.CODECOV_TOKEN != '' + with: + token: ${{ secrets.CODECOV_TOKEN }} + flags: ${{ matrix.codecov }} + name: ${{ matrix.name }} + verbose: false + fail_ci_if_error: true + env: + CODECOV_TOKEN: "${{ secrets.CODECOV_TOKEN }}" + + - name: Upload build errors + uses: actions/upload-artifact@v2 + if: failure() + with: + name: Build Errors - ${{ matrix.name }} + path: | + **/CMakeFiles/CMakeOutput.log + **/CMakeFiles/CMakeError.log + **/Testing/Temporary/LastTest.log + **/*.log + retention-days: 3 diff --git a/.github/workflows/ubuntu.yaml b/.github/workflows/ubuntu.yaml index 9b5f67c..f322e64 100644 --- a/.github/workflows/ubuntu.yaml +++ b/.github/workflows/ubuntu.yaml @@ -1,282 +1,287 @@ -name: Build - Ubuntu -on: [workflow_dispatch, push, pull_request] -env: - TERM: xterm-256color - -jobs: - build: - name: ${{ matrix.name }} - runs-on: ${{ matrix.runs-on }} - strategy: - fail-fast: false - matrix: - include: - - name: Build - Ubuntu Clang - runs-on: ubuntu-latest - compiler: clang - cxx-compiler: clang++ - cmake-args: -G Ninja -D PROXYRES_CODE_COVERAGE=ON - gcov-exec: llvm-cov-14 gcov - codecov: ubuntu - - - name: Build - Ubuntu Clang (curl) - runs-on: ubuntu-latest - compiler: clang - cxx-compiler: clang++ - cmake-args: -G Ninja -D PROXYRES_CODE_COVERAGE=ON -D PROXYRES_CURL=ON - gcov-exec: llvm-cov-14 gcov - codecov: ubuntu_curl - - steps: - - name: Install dependencies - run: | - sudo apt update - sudo apt install -y llvm-14 ninja-build libgconf2-dev libjavascriptcoregtk-4.0-dev - - - name: Checkout repository - uses: actions/checkout@v3 - - - name: Generate project - run: | - cmake -S . -B build ${{ matrix.cmake-args }} \ - -D CMAKE_BUILD_TYPE=RelWithDebInfo \ - -D BUILD_SHARED_LIBS=OFF - env: - CC: ${{ matrix.compiler }} - CXX: ${{ matrix.cxx-compiler }} - - - name: Build project - run: cmake --build build --config RelWithDebInfo - - - name: Install test dependencies - run: | - corepack enable - yarn install - working-directory: test - - - name: Run test http server - run: | - npx pm2 start http_server_cmd.js --output http_server.log - sleep 15 - working-directory: test - - - name: Run test dhcp server - # Used by wpad.dhcp googletest - run: | - npx pm2 start dhcp_server_cmd.js --output dhcp_server.log - sleep 15 - working-directory: test - - # Run as sudo to be able to bind to DHCP client port, then reset - # permissions to code coverage files if necessary - - name: Run tests - run: | - sudo ctest --verbose -C RelWithDebInfo - sudo chmod -R a+rw . - working-directory: build - env: - WPAD: true - - - name: Download pac from http server - run: curl -v http://127.0.0.1:8080/pac.js - working-directory: test - - - name: Dump proxy info (gsettings) - run: | - gsettings get org.gnome.system.proxy autoconfig-url - gsettings get org.gnome.system.proxy mode - gsettings get org.gnome.system.proxy.http host - gsettings get org.gnome.system.proxy.http port - gsettings get org.gnome.system.proxy.https host - gsettings get org.gnome.system.proxy.https port - gsettings get org.gnome.system.proxy ignore-hosts - - - name: Set auto proxy settings (gsettings) - run: | - gsettings set org.gnome.system.proxy autoconfig-url 'http://127.0.0.1:8080/pac.js' - gsettings set org.gnome.system.proxy mode 'auto' - - - name: Check auto proxy settings (gsettings) - shell: bash - run: | - out=$(./proxycli config auto_discover) - echo "Auto discovery: $out" - if [ "$out" = "enabled" ]; then - echo "Auto discovery set successfully" - else - echo "Auto discovery set failed" - exit 1 - fi - out=$(./proxycli config auto_config_url) - echo "Auto config url: $out" - if [ "$out" = "http://127.0.0.1:8080/pac.js" ]; then - echo "Auto config url set successfully" - else - echo "Auto config url set failed" - exit 1 - fi - working-directory: build/test - env: - XDG_CURRENT_DESKTOP: GNOME - - - name: Check auto proxy resolution (gsettings) - run: | - out=$(./proxycli resolve https://google.com/) - echo "Proxy for https://google.com/: $out" - if [ "$out" = "direct://" ]; then - echo "Proxy for https://google.com/ set successfully" - else - echo "Proxy for https://google.com/ set failed" - exit 1 - fi - out=$(./proxycli resolve http://simple.com/) - echo "Proxy for http://simple.com/: $out" - if [ "$out" = "http://no-such-proxy:80" ]; then - echo "Proxy for http://simple.com/ set successfully" - else - echo "Proxy for http://simple.com/ set failed" - exit 1 - fi - out=$(./proxycli resolve https://simple.com/) - echo "Proxy for https://simple.com/: $out" - if [ "$out" = "https://no-such-proxy:80" ]; then - echo "Proxy for https://simple.com/ set successfully" - else - echo "Proxy for https://simple.com/ set failed" - exit 1 - fi - out=$(./proxycli resolve https://multi.com/) - echo "Proxy for https://multi.com/: $out" - if [ "$out" = "https://some-such-proxy:443,https://any-such-proxy:41" ]; then - echo "Proxy for https://multi.com/ set successfully" - else - echo "Proxy for https://multi.com/ set failed" - exit 1 - fi - working-directory: build/test - env: - XDG_CURRENT_DESKTOP: GNOME - - - name: Set manual proxy settings (gsettings) - run: | - gsettings set org.gnome.system.proxy mode 'manual' - gsettings set org.gnome.system.proxy.http host 'my.proxy1.com' - gsettings set org.gnome.system.proxy.http port 8001 - gsettings set org.gnome.system.proxy.https host 'my.proxy2.com' - gsettings set org.gnome.system.proxy.https port 8002 - gsettings set org.gnome.system.proxy ignore-hosts "['localhost', '127.0.0.0/8']" - gsettings set org.gnome.system.proxy use-same-proxy false - - - name: Check manual proxy settings (gsettings) - shell: bash - run: | - out=$(./proxycli config proxy http) - echo "Proxy (http): $out" - if [ "$out" = "my.proxy1.com:8001" ]; then - echo "Proxy (http) set successfully" - else - echo "Proxy (http) set failed" - exit 1 - fi - out=$(./proxycli config proxy https) - echo "Proxy (https): $out" - if [ "$out" = "my.proxy2.com:8002" ]; then - echo "Proxy (https) set successfully" - else - echo "Proxy (https) set failed" - exit 1 - fi - out=$(./proxycli config bypass_list) - echo "Proxy bypass: $out" - if [ "$out" = "localhost,127.0.0.0/8" ]; then - echo "Proxy bypass set successfully" - else - echo "Proxy bypass set failed" - exit 1 - fi - working-directory: build/test - env: - XDG_CURRENT_DESKTOP: GNOME - - - name: Reset proxy settings (gsettings) - run: gsettings set org.gnome.system.proxy mode 'none' - - # Run env tests after gsettings since environment variables are set for all - # subsequent steps. - - name: Set proxy settings (env) - run: | - echo "http_proxy=my.proxy3.com:8003" >> $GITHUB_ENV - echo "https_proxy=my.proxy4.com:8004" >> $GITHUB_ENV - echo "no_proxy=localhost,127.0.0.0/8" >> $GITHUB_ENV - - - name: Check proxy settings (env) - shell: bash - run: | - out=$(./proxycli config proxy http) - echo "Proxy (http): $out" - if [ "$out" = "my.proxy3.com:8003" ]; then - echo "Proxy (http) set successfully" - else - echo "Proxy (http) set failed" - exit 1 - fi - out=$(./proxycli config proxy https) - echo "Proxy (https): $out" - if [ "$out" = "my.proxy4.com:8004" ]; then - echo "Proxy (https) set successfully" - else - echo "Proxy (https) set failed" - exit 1 - fi - out=$(./proxycli config bypass_list) - echo "Proxy bypass: $out" - if [ "$out" = "localhost,127.0.0.0/8" ]; then - echo "Proxy bypass set successfully" - else - echo "Proxy bypass set failed" - exit 1 - fi - working-directory: build/test - - - name: Reset proxy settings (env) - run: | - echo "http_proxy=" >> $GITHUB_ENV - echo "https_proxy=" >> $GITHUB_ENV - echo "no_proxy=" >> $GITHUB_ENV - - - name: Generate coverage report - if: always() && matrix.codecov - run: | - python3 -u -m pip install --user gcovr - python3 -m gcovr \ - --exclude-unreachable-branches \ - --gcov-ignore-parse-errors \ - --gcov-executable "${{ matrix.gcov-exec || 'gcov' }}" \ - --root . \ - --xml \ - --output coverage.xml \ - --verbose - - - name: Upload coverage report - uses: codecov/codecov-action@v2 - if: always() && matrix.codecov && env.CODECOV_TOKEN != '' - with: - token: ${{ secrets.CODECOV_TOKEN }} - flags: ${{ matrix.codecov }} - name: ${{ matrix.name }} - verbose: false - fail_ci_if_error: true - env: - CODECOV_TOKEN: "${{ secrets.CODECOV_TOKEN }}" - - - name: Upload build errors - uses: actions/upload-artifact@v2 - if: failure() - with: - name: Build Errors - ${{ matrix.name }} - path: | - **/CMakeFiles/CMakeOutput.log - **/CMakeFiles/CMakeError.log - **/Testing/Temporary/LastTest.log - **/*.log - retention-days: 3 +name: Build - Ubuntu +on: [workflow_dispatch, push, pull_request] +env: + TERM: xterm-256color + +jobs: + build: + name: ${{ matrix.name }} + runs-on: ${{ matrix.runs-on }} + strategy: + fail-fast: false + matrix: + include: + - name: Build - Ubuntu Clang + runs-on: ubuntu-latest + compiler: clang + cxx-compiler: clang++ + cmake-args: -G Ninja -D PROXYRES_CODE_COVERAGE=ON + gcov-exec: llvm-cov-14 gcov + codecov: ubuntu + + - name: Build - Ubuntu Clang (curl) + runs-on: ubuntu-latest + compiler: clang + cxx-compiler: clang++ + cmake-args: -G Ninja -D PROXYRES_CODE_COVERAGE=ON -D PROXYRES_CURL=ON + gcov-exec: llvm-cov-14 gcov + codecov: ubuntu_curl + + steps: + - name: Install dependencies + run: | + sudo apt update + sudo apt install -y llvm-14 ninja-build libgconf2-dev libjavascriptcoregtk-4.0-dev + + - name: Checkout repository + uses: actions/checkout@v3 + + - name: Generate project + run: | + cmake -S . -B build ${{ matrix.cmake-args }} \ + -D CMAKE_BUILD_TYPE=RelWithDebInfo \ + -D BUILD_SHARED_LIBS=OFF + env: + CC: ${{ matrix.compiler }} + CXX: ${{ matrix.cxx-compiler }} + + - name: Build project + run: cmake --build build --config RelWithDebInfo + + - name: Setup node version + uses: actions/setup-node@v3 + with: + node-version: 18.18.0 + + - name: Install test dependencies + run: | + corepack enable + yarn install + working-directory: test + + - name: Run test http server + run: | + npx pm2 start http_server_cmd.js --output http_server.log + sleep 15 + working-directory: test + + - name: Run test dhcp server + # Used by wpad.dhcp googletest + run: | + npx pm2 start dhcp_server_cmd.js --output dhcp_server.log + sleep 15 + working-directory: test + + # Run as sudo to be able to bind to DHCP client port, then reset + # permissions to code coverage files if necessary + - name: Run tests + run: | + sudo ctest --verbose -C RelWithDebInfo + sudo chmod -R a+rw . + working-directory: build + env: + WPAD: true + + - name: Download pac from http server + run: curl -v http://127.0.0.1:8080/pac.js + working-directory: test + + - name: Dump proxy info (gsettings) + run: | + gsettings get org.gnome.system.proxy autoconfig-url + gsettings get org.gnome.system.proxy mode + gsettings get org.gnome.system.proxy.http host + gsettings get org.gnome.system.proxy.http port + gsettings get org.gnome.system.proxy.https host + gsettings get org.gnome.system.proxy.https port + gsettings get org.gnome.system.proxy ignore-hosts + + - name: Set auto proxy settings (gsettings) + run: | + gsettings set org.gnome.system.proxy autoconfig-url 'http://127.0.0.1:8080/pac.js' + gsettings set org.gnome.system.proxy mode 'auto' + + - name: Check auto proxy settings (gsettings) + shell: bash + run: | + out=$(./proxycli config auto_discover) + echo "Auto discovery: $out" + if [ "$out" = "enabled" ]; then + echo "Auto discovery set successfully" + else + echo "Auto discovery set failed" + exit 1 + fi + out=$(./proxycli config auto_config_url) + echo "Auto config url: $out" + if [ "$out" = "http://127.0.0.1:8080/pac.js" ]; then + echo "Auto config url set successfully" + else + echo "Auto config url set failed" + exit 1 + fi + working-directory: build/test + env: + XDG_CURRENT_DESKTOP: GNOME + + - name: Check auto proxy resolution (gsettings) + run: | + out=$(./proxycli resolve https://google.com/) + echo "Proxy for https://google.com/: $out" + if [ "$out" = "direct://" ]; then + echo "Proxy for https://google.com/ set successfully" + else + echo "Proxy for https://google.com/ set failed" + exit 1 + fi + out=$(./proxycli resolve http://simple.com/) + echo "Proxy for http://simple.com/: $out" + if [ "$out" = "http://no-such-proxy:80" ]; then + echo "Proxy for http://simple.com/ set successfully" + else + echo "Proxy for http://simple.com/ set failed" + exit 1 + fi + out=$(./proxycli resolve https://simple.com/) + echo "Proxy for https://simple.com/: $out" + if [ "$out" = "https://no-such-proxy:80" ]; then + echo "Proxy for https://simple.com/ set successfully" + else + echo "Proxy for https://simple.com/ set failed" + exit 1 + fi + out=$(./proxycli resolve https://multi.com/) + echo "Proxy for https://multi.com/: $out" + if [ "$out" = "https://some-such-proxy:443,https://any-such-proxy:41" ]; then + echo "Proxy for https://multi.com/ set successfully" + else + echo "Proxy for https://multi.com/ set failed" + exit 1 + fi + working-directory: build/test + env: + XDG_CURRENT_DESKTOP: GNOME + + - name: Set manual proxy settings (gsettings) + run: | + gsettings set org.gnome.system.proxy mode 'manual' + gsettings set org.gnome.system.proxy.http host 'my.proxy1.com' + gsettings set org.gnome.system.proxy.http port 8001 + gsettings set org.gnome.system.proxy.https host 'my.proxy2.com' + gsettings set org.gnome.system.proxy.https port 8002 + gsettings set org.gnome.system.proxy ignore-hosts "['localhost', '127.0.0.0/8']" + gsettings set org.gnome.system.proxy use-same-proxy false + + - name: Check manual proxy settings (gsettings) + shell: bash + run: | + out=$(./proxycli config proxy http) + echo "Proxy (http): $out" + if [ "$out" = "my.proxy1.com:8001" ]; then + echo "Proxy (http) set successfully" + else + echo "Proxy (http) set failed" + exit 1 + fi + out=$(./proxycli config proxy https) + echo "Proxy (https): $out" + if [ "$out" = "my.proxy2.com:8002" ]; then + echo "Proxy (https) set successfully" + else + echo "Proxy (https) set failed" + exit 1 + fi + out=$(./proxycli config bypass_list) + echo "Proxy bypass: $out" + if [ "$out" = "localhost,127.0.0.0/8" ]; then + echo "Proxy bypass set successfully" + else + echo "Proxy bypass set failed" + exit 1 + fi + working-directory: build/test + env: + XDG_CURRENT_DESKTOP: GNOME + + - name: Reset proxy settings (gsettings) + run: gsettings set org.gnome.system.proxy mode 'none' + + # Run env tests after gsettings since environment variables are set for all + # subsequent steps. + - name: Set proxy settings (env) + run: | + echo "http_proxy=my.proxy3.com:8003" >> $GITHUB_ENV + echo "https_proxy=my.proxy4.com:8004" >> $GITHUB_ENV + echo "no_proxy=localhost,127.0.0.0/8" >> $GITHUB_ENV + + - name: Check proxy settings (env) + shell: bash + run: | + out=$(./proxycli config proxy http) + echo "Proxy (http): $out" + if [ "$out" = "my.proxy3.com:8003" ]; then + echo "Proxy (http) set successfully" + else + echo "Proxy (http) set failed" + exit 1 + fi + out=$(./proxycli config proxy https) + echo "Proxy (https): $out" + if [ "$out" = "my.proxy4.com:8004" ]; then + echo "Proxy (https) set successfully" + else + echo "Proxy (https) set failed" + exit 1 + fi + out=$(./proxycli config bypass_list) + echo "Proxy bypass: $out" + if [ "$out" = "localhost,127.0.0.0/8" ]; then + echo "Proxy bypass set successfully" + else + echo "Proxy bypass set failed" + exit 1 + fi + working-directory: build/test + + - name: Reset proxy settings (env) + run: | + echo "http_proxy=" >> $GITHUB_ENV + echo "https_proxy=" >> $GITHUB_ENV + echo "no_proxy=" >> $GITHUB_ENV + + - name: Generate coverage report + if: always() && matrix.codecov + run: | + python3 -u -m pip install --user gcovr + python3 -m gcovr \ + --exclude-unreachable-branches \ + --gcov-ignore-parse-errors \ + --gcov-executable "${{ matrix.gcov-exec || 'gcov' }}" \ + --root . \ + --xml \ + --output coverage.xml \ + --verbose + + - name: Upload coverage report + uses: codecov/codecov-action@v2 + if: always() && matrix.codecov && env.CODECOV_TOKEN != '' + with: + token: ${{ secrets.CODECOV_TOKEN }} + flags: ${{ matrix.codecov }} + name: ${{ matrix.name }} + verbose: false + fail_ci_if_error: true + env: + CODECOV_TOKEN: "${{ secrets.CODECOV_TOKEN }}" + + - name: Upload build errors + uses: actions/upload-artifact@v2 + if: failure() + with: + name: Build Errors - ${{ matrix.name }} + path: | + **/CMakeFiles/CMakeOutput.log + **/CMakeFiles/CMakeError.log + **/Testing/Temporary/LastTest.log + **/*.log + retention-days: 3 diff --git a/.github/workflows/win32.yaml b/.github/workflows/win32.yaml index 1c5eded..3fa968b 100644 --- a/.github/workflows/win32.yaml +++ b/.github/workflows/win32.yaml @@ -1,221 +1,226 @@ -name: Build - Windows -on: [workflow_dispatch, push, pull_request] -env: - TERM: xterm-256color - -jobs: - build: - name: ${{ matrix.name }} - runs-on: ${{ matrix.runs-on }} - strategy: - fail-fast: false - matrix: - include: - - name: Build - Windows Win32 - runs-on: windows-latest - cmake-args: -A Win32 - - - name: Build - Windows Win64 - runs-on: windows-latest - - - name: Build - Windows GCC - runs-on: windows-latest - cmake-args: -G Ninja -D PROXYRES_CODE_COVERAGE=ON - compiler: gcc - cxx-compiler: g++ - codecov: windows - binary-dir: build/test - - steps: - - name: Install dependencies - run: choco install curl - - - name: Install gcc dependencies - if: matrix.compiler == 'gcc' - run: | - # strawberryperl installs incompatible libraries so remove it - choco uninstall --no-progress strawberryperl - choco install ninja --no-progress - - - name: Checkout repository - uses: actions/checkout@v3 - - - name: Generate project - shell: bash - run: | - cmake -S . -B build ${{ matrix.cmake-args }} \ - -D CMAKE_BUILD_TYPE=RelWithDebInfo \ - -D CMAKE_MSVC_RUNTIME_LIBRARY=MultiThreaded \ - -D BUILD_SHARED_LIBS=OFF - env: - CC: ${{ matrix.compiler }} - CXX: ${{ matrix.cxx-compiler }} - - - name: Build project - run: cmake --build build --config RelWithDebInfo - - - name: Install test dependencies - run: | - corepack enable - yarn install - working-directory: test - - - name: Run test http server - shell: bash - run: | - npx pm2 start http_server_cmd.js - sleep 15 - working-directory: test - - - name: Run test dhcp server - # Used by wpad.dhcp googletest - run: | - npx pm2 start dhcp_server_cmd.js --output dhcp_server.log - sleep 15 - working-directory: test - - - name: Run tests - run: ctest --verbose -C RelWithDebInfo - working-directory: build - env: - WPAD: true - - - name: Download pac from http server - run: curl -v http://127.0.0.1:8080/pac.js - working-directory: test - - - name: Dump proxy info - run: netsh winhttp show proxy - - - name: Set proxy settings (IE) - run: | - reg add "HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Internet Settings" /v AutoConfigURL /t REG_SZ /d "http://wpad/wpad2.dat" /f - reg add "HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Internet Settings" /v AutoDetect /t REG_DWORD /d 1 /f - reg add "HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Internet Settings" /v ProxyEnable /t REG_DWORD /d 1 /f - reg add "HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Internet Settings" /v ProxyServer /t REG_SZ /d "http=myproxy;https=sproxy:88" /f - reg add "HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Internet Settings" /v ProxyOverride /t REG_SZ /d "*.foo.com;" /f - - - name: Check proxy settings (IE) - shell: bash - run: | - out=$(./proxycli config auto_discover) - echo "Auto discovery: $out" - if [ "$out" = "enabled" ]; then - echo "Auto discovery set successfully" - else - echo "Auto discovery set failed" - exit 1 - fi - out=$(./proxycli config auto_config_url) - echo "Auto config url: $out" - if [ "$out" = "http://wpad/wpad2.dat" ]; then - echo "Auto config url set successfully" - else - echo "Auto config url set failed" - exit 1 - fi - out=$(./proxycli config proxy http) - echo "Proxy (http): $out" - if [ "$out" = "myproxy" ]; then - echo "Proxy (http) set successfully" - else - echo "Proxy (http) set failed" - exit 1 - fi - out=$(./proxycli config proxy https) - echo "Proxy (https): $out" - if [ "$out" = "sproxy:88" ]; then - echo "Proxy (https) set successfully" - else - echo "Proxy (https) set failed" - exit 1 - fi - out=$(./proxycli config bypass_list) - echo "Proxy bypass: $out" - if [ "$out" = "*.foo.com," ]; then - echo "Proxy bypass set successfully" - else - echo "Proxy bypass set failed" - exit 1 - fi - working-directory: ${{ matrix.binary-dir || 'build/test/RelWithDebInfo' }} - - - name: Turn off proxy settings (IE) - run: | - reg delete "HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Internet Settings" /v AutoConfigURL /f - reg add "HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Internet Settings" /v ProxyEnable /t REG_DWORD /d 0 /f - - - name: Set proxy auto config setting (IE) - run: | - reg add "HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Internet Settings" /v AutoConfigURL /t REG_SZ /d "http://127.0.0.1:8080/pac.js" /f - - - name: Check proxy resolution (IE) - shell: bash - run: | - out=$(./proxycli resolve https://google.com/) - echo "Proxy for https://google.com/: $out" - if [ "$out" = "direct://" ]; then - echo "Proxy for https://google.com/ set successfully" - else - echo "Proxy for https://google.com/ set failed" - exit 1 - fi - out=$(./proxycli resolve https://simple.com/) - echo "Proxy for https://simple.com/: $out" - if [ "$out" = "http://no-such-proxy:80" ]; then - echo "Proxy for https://simple.com/ set successfully" - else - echo "Proxy for https://simple.com/ set failed" - exit 1 - fi - out=$(./proxycli resolve https://multi.com/) - echo "Proxy for https://multi.com/: $out" - if [ "$out" = "https://some-such-proxy:443,https://any-such-proxy:41" ]; then - echo "Proxy for https://multi.com/ set successfully" - else - echo "Proxy for https://multi.com/ set failed" - exit 1 - fi - working-directory: ${{ matrix.binary-dir || 'build/test/RelWithDebInfo' }} - - - name: Reset proxy settings (IE) - run: | - reg delete "HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Internet Settings" /v AutoConfigURL /f - reg add "HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Internet Settings" /v ProxyEnable /t REG_DWORD /d 0 /f - - - name: Generate coverage report - shell: bash - if: always() && matrix.codecov - run: | - python3 -u -m pip install --user gcovr - python3 -m gcovr \ - --exclude-unreachable-branches \ - --gcov-ignore-parse-errors \ - --root . \ - --xml \ - --output coverage.xml \ - --verbose - - - name: Upload coverage report - uses: codecov/codecov-action@v2 - if: always() && matrix.codecov && env.CODECOV_TOKEN != '' - with: - token: ${{ secrets.CODECOV_TOKEN }} - flags: ${{ matrix.codecov }} - name: ${{ matrix.name }} - verbose: false - fail_ci_if_error: true - env: - CODECOV_TOKEN: "${{ secrets.CODECOV_TOKEN }}" - - - name: Upload build errors - uses: actions/upload-artifact@v2 - if: failure() - with: - name: Build Errors - ${{ matrix.name }} - path: | - **/CMakeFiles/CMakeOutput.log - **/CMakeFiles/CMakeError.log - **/Testing/Temporary/LastTest.log - **/*.log - retention-days: 3 +name: Build - Windows +on: [workflow_dispatch, push, pull_request] +env: + TERM: xterm-256color + +jobs: + build: + name: ${{ matrix.name }} + runs-on: ${{ matrix.runs-on }} + strategy: + fail-fast: false + matrix: + include: + - name: Build - Windows Win32 + runs-on: windows-latest + cmake-args: -A Win32 + + - name: Build - Windows Win64 + runs-on: windows-latest + + - name: Build - Windows GCC + runs-on: windows-latest + cmake-args: -G Ninja -D PROXYRES_CODE_COVERAGE=ON + compiler: gcc + cxx-compiler: g++ + codecov: windows + binary-dir: build/test + + steps: + - name: Install dependencies + run: choco install curl + + - name: Install gcc dependencies + if: matrix.compiler == 'gcc' + run: | + # strawberryperl installs incompatible libraries so remove it + choco uninstall --no-progress strawberryperl + choco install ninja --no-progress + + - name: Checkout repository + uses: actions/checkout@v3 + + - name: Generate project + shell: bash + run: | + cmake -S . -B build ${{ matrix.cmake-args }} \ + -D CMAKE_BUILD_TYPE=RelWithDebInfo \ + -D CMAKE_MSVC_RUNTIME_LIBRARY=MultiThreaded \ + -D BUILD_SHARED_LIBS=OFF + env: + CC: ${{ matrix.compiler }} + CXX: ${{ matrix.cxx-compiler }} + + - name: Build project + run: cmake --build build --config RelWithDebInfo + + - name: Setup node version + uses: actions/setup-node@v3 + with: + node-version: 18.18.0 + + - name: Install test dependencies + run: | + corepack enable + yarn install + working-directory: test + + - name: Run test http server + shell: bash + run: | + npx pm2 start http_server_cmd.js + sleep 15 + working-directory: test + + - name: Run test dhcp server + # Used by wpad.dhcp googletest + run: | + npx pm2 start dhcp_server_cmd.js --output dhcp_server.log + sleep 15 + working-directory: test + + - name: Run tests + run: ctest --verbose -C RelWithDebInfo + working-directory: build + env: + WPAD: true + + - name: Download pac from http server + run: curl -v http://127.0.0.1:8080/pac.js + working-directory: test + + - name: Dump proxy info + run: netsh winhttp show proxy + + - name: Set proxy settings (IE) + run: | + reg add "HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Internet Settings" /v AutoConfigURL /t REG_SZ /d "http://wpad/wpad2.dat" /f + reg add "HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Internet Settings" /v AutoDetect /t REG_DWORD /d 1 /f + reg add "HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Internet Settings" /v ProxyEnable /t REG_DWORD /d 1 /f + reg add "HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Internet Settings" /v ProxyServer /t REG_SZ /d "http=myproxy;https=sproxy:88" /f + reg add "HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Internet Settings" /v ProxyOverride /t REG_SZ /d "*.foo.com;" /f + + - name: Check proxy settings (IE) + shell: bash + run: | + out=$(./proxycli config auto_discover) + echo "Auto discovery: $out" + if [ "$out" = "enabled" ]; then + echo "Auto discovery set successfully" + else + echo "Auto discovery set failed" + exit 1 + fi + out=$(./proxycli config auto_config_url) + echo "Auto config url: $out" + if [ "$out" = "http://wpad/wpad2.dat" ]; then + echo "Auto config url set successfully" + else + echo "Auto config url set failed" + exit 1 + fi + out=$(./proxycli config proxy http) + echo "Proxy (http): $out" + if [ "$out" = "myproxy" ]; then + echo "Proxy (http) set successfully" + else + echo "Proxy (http) set failed" + exit 1 + fi + out=$(./proxycli config proxy https) + echo "Proxy (https): $out" + if [ "$out" = "sproxy:88" ]; then + echo "Proxy (https) set successfully" + else + echo "Proxy (https) set failed" + exit 1 + fi + out=$(./proxycli config bypass_list) + echo "Proxy bypass: $out" + if [ "$out" = "*.foo.com," ]; then + echo "Proxy bypass set successfully" + else + echo "Proxy bypass set failed" + exit 1 + fi + working-directory: ${{ matrix.binary-dir || 'build/test/RelWithDebInfo' }} + + - name: Turn off proxy settings (IE) + run: | + reg delete "HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Internet Settings" /v AutoConfigURL /f + reg add "HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Internet Settings" /v ProxyEnable /t REG_DWORD /d 0 /f + + - name: Set proxy auto config setting (IE) + run: | + reg add "HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Internet Settings" /v AutoConfigURL /t REG_SZ /d "http://127.0.0.1:8080/pac.js" /f + + - name: Check proxy resolution (IE) + shell: bash + run: | + out=$(./proxycli resolve https://google.com/) + echo "Proxy for https://google.com/: $out" + if [ "$out" = "direct://" ]; then + echo "Proxy for https://google.com/ set successfully" + else + echo "Proxy for https://google.com/ set failed" + exit 1 + fi + out=$(./proxycli resolve https://simple.com/) + echo "Proxy for https://simple.com/: $out" + if [ "$out" = "http://no-such-proxy:80" ]; then + echo "Proxy for https://simple.com/ set successfully" + else + echo "Proxy for https://simple.com/ set failed" + exit 1 + fi + out=$(./proxycli resolve https://multi.com/) + echo "Proxy for https://multi.com/: $out" + if [ "$out" = "https://some-such-proxy:443,https://any-such-proxy:41" ]; then + echo "Proxy for https://multi.com/ set successfully" + else + echo "Proxy for https://multi.com/ set failed" + exit 1 + fi + working-directory: ${{ matrix.binary-dir || 'build/test/RelWithDebInfo' }} + + - name: Reset proxy settings (IE) + run: | + reg delete "HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Internet Settings" /v AutoConfigURL /f + reg add "HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Internet Settings" /v ProxyEnable /t REG_DWORD /d 0 /f + + - name: Generate coverage report + shell: bash + if: always() && matrix.codecov + run: | + python3 -u -m pip install --user gcovr + python3 -m gcovr \ + --exclude-unreachable-branches \ + --gcov-ignore-parse-errors \ + --root . \ + --xml \ + --output coverage.xml \ + --verbose + + - name: Upload coverage report + uses: codecov/codecov-action@v2 + if: always() && matrix.codecov && env.CODECOV_TOKEN != '' + with: + token: ${{ secrets.CODECOV_TOKEN }} + flags: ${{ matrix.codecov }} + name: ${{ matrix.name }} + verbose: false + fail_ci_if_error: true + env: + CODECOV_TOKEN: "${{ secrets.CODECOV_TOKEN }}" + + - name: Upload build errors + uses: actions/upload-artifact@v2 + if: failure() + with: + name: Build Errors - ${{ matrix.name }} + path: | + **/CMakeFiles/CMakeOutput.log + **/CMakeFiles/CMakeError.log + **/Testing/Temporary/LastTest.log + **/*.log + retention-days: 3