From 199c9b1dab05acbb89125be6372bcf780deaf850 Mon Sep 17 00:00:00 2001 From: klzgrad Date: Fri, 26 Apr 2019 01:40:46 +0800 Subject: [PATCH] Add continuous integration and tests --- .github/workflows/build.yml | 435 ++++++++++++++++++++++++++++++++++++ src/get-android-sys.sh | 18 ++ tests/basic.sh | 135 +++++++++++ 3 files changed, 588 insertions(+) create mode 100644 .github/workflows/build.yml create mode 100755 src/get-android-sys.sh create mode 100755 tests/basic.sh diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml new file mode 100644 index 0000000000..e8947ebc55 --- /dev/null +++ b/.github/workflows/build.yml @@ -0,0 +1,435 @@ +name: Build +on: + push: + branches: [master] + paths-ignore: [README.md] + release: + types: [published] +defaults: + run: + shell: bash + working-directory: src +env: + CACHE_EPOCH: 1 + CCACHE_MAXSIZE: 200M + CCACHE_MAXFILES: 0 + SCCACHE_CACHE_SIZE: 200M +jobs: + cache-toolchains-posix: + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v2 + - name: Cache toolchains (Linux, OpenWrt, Android) + uses: actions/cache@v2 + with: + path: | + src/third_party/llvm-build/Release+Asserts/ + src/gn/ + key: toolchains-posix-${{ hashFiles('CHROMIUM_VERSION') }}-v${{ env.CACHE_EPOCH }} + - name: Cache PGO (Linux, OpenWrt) + uses: actions/cache@v2 + with: + path: src/chrome/build/pgo_profiles/ + key: pgo-linux-openwrt-${{ hashFiles('CHROMIUM_VERSION') }}-v${{ env.CACHE_EPOCH }} + - name: Cache AFDO (Android) + uses: actions/cache@v2 + with: + path: src/chrome/android/profiles/ + key: afdo-${{ hashFiles('CHROMIUM_VERSION') }}-v${{ env.CACHE_EPOCH }} + - name: Cache Android NDK (Android) + uses: actions/cache@v2 + with: + path: src/third_party/android_ndk/ + key: android-ndk-${{ hashFiles('CHROMIUM_VERSION') }}-v${{ env.CACHE_EPOCH }} + - run: ./get-clang.sh + - run: EXTRA_FLAGS='target_os="android"' ./get-clang.sh + cache-toolchains-win: + runs-on: windows-latest + steps: + - uses: actions/checkout@v2 + - name: Cache toolchains + uses: actions/cache@v2 + with: + path: | + src/third_party/llvm-build/Release+Asserts/ + src/gn/ + ~/.cargo/bin/ + ~/bin/ninja.exe + key: toolchains-win-${{ hashFiles('CHROMIUM_VERSION') }}-v${{ env.CACHE_EPOCH }} + - name: Cache PGO (win64) + uses: actions/cache@v2 + with: + path: src/chrome/build/pgo_profiles/chrome-win64-* + key: pgo-win64-${{ hashFiles('CHROMIUM_VERSION') }}-v${{ env.CACHE_EPOCH }} + - name: Cache PGO (win32) + uses: actions/cache@v2 + with: + path: src/chrome/build/pgo_profiles/chrome-win32-* + key: pgo-win32-arm64-${{ hashFiles('CHROMIUM_VERSION') }}-v${{ env.CACHE_EPOCH }} + - run: EXTRA_FLAGS='target_cpu="x64"' ./get-clang.sh + - run: EXTRA_FLAGS='target_cpu="x86"' ./get-clang.sh + - run: | + if [ ! -f ~/bin/ninja.exe ]; then + curl -LO https://github.com/ninja-build/ninja/releases/download/v1.10.2/ninja-win.zip + unzip ninja-win.zip -d ~/bin + fi + cache-toolchains-mac: + runs-on: macos-latest + steps: + - uses: actions/checkout@v2 + - uses: actions/cache@v2 + with: + path: | + src/third_party/llvm-build/Release+Asserts/ + src/chrome/build/pgo_profiles/chrome-mac-* + src/gn/ + src/tools/clang/dsymutil/ + key: toolchains-pgo-mac-${{ hashFiles('CHROMIUM_VERSION') }}-v${{ env.CACHE_EPOCH }} + - run: ./get-clang.sh + linux: + needs: cache-toolchains-posix + runs-on: ubuntu-latest + strategy: + fail-fast: false + matrix: + arch: [x64, x86, arm64, arm, mipsel, mips64el] + env: + EXTRA_FLAGS: 'target_cpu="${{ matrix.arch }}"' + BUNDLE: 'naiveproxy-${{ github.event.release.tag_name }}-${{ github.job }}-${{ matrix.arch }}' + steps: + - uses: actions/checkout@v2 + - name: Cache toolchains (Linux, OpenWrt, Android) + uses: actions/cache@v2 + with: + path: | + src/third_party/llvm-build/Release+Asserts/ + src/gn/ + key: toolchains-posix-${{ hashFiles('CHROMIUM_VERSION') }}-v${{ env.CACHE_EPOCH }} + - name: Cache PGO (Linux, OpenWrt) + uses: actions/cache@v2 + with: + path: src/chrome/build/pgo_profiles/ + key: pgo-linux-openwrt-${{ hashFiles('CHROMIUM_VERSION') }}-v${{ env.CACHE_EPOCH }} + - name: Cache sysroot + uses: actions/cache@v2 + with: + path: src/out/sysroot-build/sid/sid_* + key: sysroot-linux-${{ matrix.arch }}-${{ hashFiles('CHROMIUM_VERSION') }}-v${{ env.CACHE_EPOCH }} + - id: ccache-timestamp + run: echo "::set-output name=date::$(date +%s)" + - name: Cache ccache files + uses: actions/cache@v2 + with: + path: ~/.ccache + key: ccache-linux-${{ matrix.arch }}-${{ hashFiles('CHROMIUM_VERSION') }}-${{ steps.ccache-timestamp.outputs.date }} + restore-keys: ccache-linux-${{ matrix.arch }}-${{ hashFiles('CHROMIUM_VERSION') }}- + - run: sudo apt update + - run: sudo apt install ninja-build pkg-config qemu-user ccache + # libc6-i386 interferes with x86 build + - run: sudo apt remove libc6-i386 + - run: ./get-clang.sh + - run: ccache -s + - run: ./build.sh + - run: ccache -s + - run: ../tests/basic.sh out/Release/naive + - run: mkdir ${{ env.BUNDLE }} && cp out/Release/naive config.json ../LICENSE ../USAGE.txt ${{ env.BUNDLE }} + - run: tar cJf ${{ env.BUNDLE }}.tar.xz ${{ env.BUNDLE }} + - uses: actions/upload-release-asset@v1 + if: ${{ github.event_name == 'release' }} + env: + GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} + with: + upload_url: ${{ github.event.release.upload_url }} + asset_path: src/${{ env.BUNDLE }}.tar.xz + asset_name: ${{ env.BUNDLE }}.tar.xz + asset_content_type: application/octet-stream + android: + needs: cache-toolchains-posix + runs-on: ubuntu-latest + strategy: + fail-fast: false + matrix: + arch: [x64, x86, arm64, arm] + env: + EXTRA_FLAGS: 'target_cpu="${{ matrix.arch }}" target_os="android"' + BUNDLE: 'naiveproxy-${{ github.event.release.tag_name }}-${{ github.job }}-${{ matrix.arch }}' + steps: + - uses: actions/checkout@v2 + - name: Cache toolchains (Linux, OpenWrt, Android) + uses: actions/cache@v2 + with: + path: | + src/third_party/llvm-build/Release+Asserts/ + src/gn/ + key: toolchains-posix-${{ hashFiles('CHROMIUM_VERSION') }}-v${{ env.CACHE_EPOCH }} + - name: Cache AFDO (Android) + uses: actions/cache@v2 + with: + path: src/chrome/android/profiles/ + key: afdo-${{ hashFiles('CHROMIUM_VERSION') }}-v${{ env.CACHE_EPOCH }} + - name: Cache Android NDK (Android) + uses: actions/cache@v2 + with: + path: src/third_party/android_ndk/ + key: android-ndk-${{ hashFiles('CHROMIUM_VERSION') }}-v${{ env.CACHE_EPOCH }} + - name: Cache sysroot + uses: actions/cache@v2 + with: + path: src/out/sysroot-build/android/ + key: sysroot-android-${{ matrix.arch }}-${{ hashFiles('CHROMIUM_VERSION') }}-v${{ env.CACHE_EPOCH }} + - id: ccache-timestamp + run: echo "::set-output name=date::$(date +%s)" + - name: Cache ccache files + uses: actions/cache@v2 + with: + path: ~/.ccache + key: ccache-android-${{ matrix.arch }}-${{ hashFiles('CHROMIUM_VERSION') }}-${{ steps.ccache-timestamp.outputs.date }} + restore-keys: ccache-android-${{ matrix.arch }}-${{ hashFiles('CHROMIUM_VERSION') }}- + - run: sudo apt update + - run: sudo apt install ninja-build pkg-config qemu-user ccache + # libc6-i386 interferes with x86 build + - run: sudo apt remove libc6-i386 + - run: ./get-clang.sh + - run: ccache -s + - run: ./build.sh + - run: ccache -s + - run: ./get-android-sys.sh && ../tests/basic.sh out/Release/naive + # qemu-user segfaults with x64 or x86 android builds here. + if: ${{ matrix.arch != 'x64' && matrix.arch != 'x86' }} + - run: mkdir ${{ env.BUNDLE }} && cp out/Release/naive config.json ../LICENSE ../USAGE.txt ${{ env.BUNDLE }} + - run: tar cJf ${{ env.BUNDLE }}.tar.xz ${{ env.BUNDLE }} + - uses: actions/upload-release-asset@v1 + if: ${{ github.event_name == 'release' }} + env: + GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} + with: + upload_url: ${{ github.event.release.upload_url }} + asset_path: src/${{ env.BUNDLE }}.tar.xz + asset_name: ${{ env.BUNDLE }}.tar.xz + asset_content_type: application/octet-stream + win: + needs: cache-toolchains-win + runs-on: windows-latest + strategy: + fail-fast: false + matrix: + arch: [x64, x86, arm64] + env: + EXTRA_FLAGS: 'target_cpu="${{ matrix.arch }}"' + BUNDLE: 'naiveproxy-${{ github.event.release.tag_name }}-${{ github.job }}-${{ matrix.arch }}' + steps: + - uses: actions/checkout@v2 + - name: Cache toolchains + uses: actions/cache@v2 + with: + path: | + src/third_party/llvm-build/Release+Asserts/ + src/gn/ + ~/.cargo/bin/ + ~/bin/ninja.exe + key: toolchains-win-${{ hashFiles('CHROMIUM_VERSION') }}-v${{ env.CACHE_EPOCH }} + - name: Cache PGO (win64) + if: ${{ matrix.arch == 'x64' }} + uses: actions/cache@v2 + with: + path: src/chrome/build/pgo_profiles/chrome-win64-* + key: pgo-win64-${{ hashFiles('CHROMIUM_VERSION') }}-v${{ env.CACHE_EPOCH }} + - name: Cache PGO (win32) + if: ${{ matrix.arch != 'x64' }} + uses: actions/cache@v2 + with: + path: src/chrome/build/pgo_profiles/chrome-win32-* + key: pgo-win32-arm64-${{ hashFiles('CHROMIUM_VERSION') }}-v${{ env.CACHE_EPOCH }} + - id: ccache-timestamp + run: echo "::set-output name=date::$(date +%s)" + - name: Cache ccache files + uses: actions/cache@v2 + with: + path: ~/AppData/Local/Mozilla/sccache + key: ccache-win-${{ matrix.arch }}-${{ hashFiles('CHROMIUM_VERSION') }}-${{ steps.ccache-timestamp.outputs.date }} + restore-keys: ccache-win-${{ matrix.arch }}-${{ hashFiles('CHROMIUM_VERSION') }}- + - run: ./get-clang.sh + - run: ~/.cargo/bin/sccache -s + - run: ./build.sh + - run: ~/.cargo/bin/sccache -s + - run: ../tests/basic.sh out/Release/naive + # No real or emulated environment is available to test this. + if: ${{ matrix.arch != 'arm64' }} + - run: mkdir ${{ env.BUNDLE }} && cp out/Release/naive.exe config.json ../LICENSE ../USAGE.txt ${{ env.BUNDLE }} + - run: 7z a ${{ env.BUNDLE }}.zip ${{ env.BUNDLE }} + - uses: actions/upload-release-asset@v1 + if: ${{ github.event_name == 'release' }} + env: + GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} + with: + upload_url: ${{ github.event.release.upload_url }} + asset_path: src/${{ env.BUNDLE }}.zip + asset_name: ${{ env.BUNDLE }}.zip + asset_content_type: application/octet-stream + mac: + needs: cache-toolchains-mac + runs-on: macos-latest + strategy: + fail-fast: false + matrix: + arch: [x64, arm64] + env: + EXTRA_FLAGS: 'target_cpu="${{ matrix.arch }}"' + BUNDLE: 'naiveproxy-${{ github.event.release.tag_name }}-${{ github.job }}-${{ matrix.arch }}' + steps: + - uses: actions/checkout@v2 + - name: Cache toolchains and PGO + uses: actions/cache@v2 + with: + path: | + src/third_party/llvm-build/Release+Asserts/ + src/chrome/build/pgo_profiles/chrome-mac-* + src/gn/ + src/tools/clang/dsymutil/ + key: toolchains-pgo-mac-${{ hashFiles('CHROMIUM_VERSION') }}-v${{ env.CACHE_EPOCH }} + - id: ccache-timestamp + run: echo "::set-output name=date::$(date +%s)" + - name: Cache ccache files + uses: actions/cache@v2 + with: + path: ~/Library/Caches/ccache + key: ccache-mac-${{ matrix.arch }}-${{ hashFiles('CHROMIUM_VERSION') }}-${{ steps.ccache-timestamp.outputs.date }} + restore-keys: ccache-mac-${{ matrix.arch }}-${{ hashFiles('CHROMIUM_VERSION') }}- + - run: brew install ninja ccache + - run: ./get-clang.sh + - run: ccache -s + - run: ./build.sh + - run: ccache -s + - run: ../tests/basic.sh out/Release/naive + # No real or emulated environment is available to test this. + if: ${{ matrix.arch != 'arm64' }} + - run: mkdir ${{ env.BUNDLE }} && cp out/Release/naive config.json ../LICENSE ../USAGE.txt ${{ env.BUNDLE }} + - run: tar cJf ${{ env.BUNDLE }}.tar.xz ${{ env.BUNDLE }} + - uses: actions/upload-release-asset@v1 + if: ${{ github.event_name == 'release' }} + env: + GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} + with: + upload_url: ${{ github.event.release.upload_url }} + asset_path: src/${{ env.BUNDLE }}.tar.xz + asset_name: ${{ env.BUNDLE }}.tar.xz + asset_content_type: application/octet-stream + openwrt: + needs: cache-toolchains-posix + runs-on: ubuntu-latest + strategy: + fail-fast: false + matrix: + include: + - arch: x86_64 + openwrt: 'target=x86 subtarget=64' + target_cpu: x64 + - arch: x86 + openwrt: 'target=x86 subtarget=generic' + target_cpu: x86 + - arch: aarch64_cortex-a53 + openwrt: 'target=sunxi subtarget=cortexa53' + target_cpu: arm64 + extra: 'arm_version=0 arm_cpu="cortex-a53"' + - arch: aarch64_cortex-a72 + openwrt: 'target=mvebu subtarget=cortexa72' + target_cpu: arm64 + extra: 'arm_version=0 arm_cpu="cortex-a72"' + - arch: aarch64_generic + openwrt: 'target=armvirt subtarget=64' + target_cpu: arm64 + - arch: arm_cortex-a5_vfpv4 + openwrt: 'target=at91 subtarget=sama5' + target_cpu: arm + extra: 'arm_version=0 arm_cpu="cortex-a5" arm_fpu="vfpv4" arm_float_abi="hard" arm_use_neon=false' + - arch: arm_cortex-a7_neon-vfpv4 + openwrt: 'target=sunxi subtarget=cortexa7' + target_cpu: arm + extra: 'arm_version=0 arm_cpu="cortex-a7" arm_fpu="neon-vfpv4" arm_float_abi="hard" arm_use_neon=true' + - arch: arm_cortex-a8_neon + openwrt: 'target=samsung subtarget=s5pv210' + target_cpu: arm + extra: 'arm_version=0 arm_cpu="cortex-a8" arm_fpu="neon" arm_float_abi="hard" arm_use_neon=true' + - arch: arm_cortex-a8_vfpv3 + openwrt: 'target=sunxi subtarget=cortexa8' + target_cpu: arm + extra: 'arm_version=0 arm_cpu="cortex-a8" arm_fpu="vfpv3" arm_float_abi="hard" arm_use_neon=false' + - arch: arm_cortex-a9 + openwrt: 'target=bcm53xx' + target_cpu: arm + extra: 'arm_version=0 arm_cpu="cortex-a9" arm_float_abi="soft" arm_use_neon=false' + - arch: arm_cortex-a9_neon + openwrt: 'target=imx6' + target_cpu: arm + extra: 'arm_version=0 arm_cpu="cortex-a9" arm_fpu="neon" arm_float_abi="hard" arm_use_neon=true' + - arch: arm_cortex-a9_vfpv3-d16 + openwrt: 'target=tegra' + target_cpu: arm + extra: 'arm_version=0 arm_cpu="cortex-a9" arm_fpu="vfpv3-d16" arm_float_abi="hard" arm_use_neon=false' + - arch: arm_cortex-a15_neon-vfpv4 + openwrt: 'target=armvirt subtarget=32' + target_cpu: arm + extra: 'arm_version=0 arm_cpu="cortex-a15" arm_fpu="neon-vfpv4" arm_float_abi="hard" arm_use_neon=true' + - arch: mipsel_24kc + openwrt: 'target=ramips subtarget=rt305x' + target_cpu: mipsel + extra: 'mips_arch_variant="r2" mips_float_abi="soft" mips_tune="24kc" use_lld=false use_gold=false' + - arch: mipsel_74kc + openwrt: 'target=ramips subtarget=rt3883' + target_cpu: mipsel + extra: 'mips_arch_variant="r2" mips_float_abi="soft" mips_tune="74kc" use_lld=false use_gold=false' + - arch: mipsel_mips32 + openwrt: 'target=rb532' + target_cpu: mipsel + extra: 'mips_arch_variant="r1" mips_float_abi="soft" use_lld=false use_gold=false' + env: + EXTRA_FLAGS: target_cpu="${{ matrix.target_cpu }}" target_os="openwrt" use_allocator="none" use_allocator_shim=false ${{ matrix.extra }} + OPENWRT_FLAGS: arch=${{ matrix.arch }} release=19.07.7 gcc_ver=7.5.0 ${{ matrix.openwrt }} + BUNDLE: naiveproxy-${{ github.event.release.tag_name }}-${{ github.job }}-${{ matrix.arch }} + steps: + - uses: actions/checkout@v2 + - name: Cache toolchains (Linux, OpenWrt, Android) + uses: actions/cache@v2 + with: + path: | + src/third_party/llvm-build/Release+Asserts/ + src/gn/ + key: toolchains-posix-${{ hashFiles('CHROMIUM_VERSION') }}-v${{ env.CACHE_EPOCH }} + - name: Cache PGO (Linux, OpenWrt) + uses: actions/cache@v2 + with: + path: src/chrome/build/pgo_profiles/ + key: pgo-linux-openwrt-${{ hashFiles('CHROMIUM_VERSION') }}-v${{ env.CACHE_EPOCH }} + - name: Cache sysroot + uses: actions/cache@v2 + with: + path: src/out/sysroot-build/openwrt + key: sysroot-openwrt-19.07.7-${{ matrix.arch }}-v${{ env.CACHE_EPOCH }} + - id: ccache-timestamp + run: echo "::set-output name=date::$(date +%s)" + - name: Cache ccache files + uses: actions/cache@v2 + with: + path: ~/.ccache + key: ccache-openwrt-${{ matrix.arch }}-${{ hashFiles('CHROMIUM_VERSION') }}-${{ steps.ccache-timestamp.outputs.date }} + restore-keys: ccache-openwrt-${{ matrix.arch }}-${{ hashFiles('CHROMIUM_VERSION') }}- + - run: sudo apt update + - run: sudo apt install ninja-build pkg-config qemu-user ccache + # libc6-i386 interferes with x86 build + - run: sudo apt remove libc6-i386 + - run: ./get-clang.sh + - run: ccache -s + - run: ./build.sh + - run: ccache -s + - run: ../tests/basic.sh out/Release/naive + - run: mkdir ${{ env.BUNDLE }} && cp out/Release/naive config.json ../LICENSE ../USAGE.txt ${{ env.BUNDLE }} + - run: tar cJf ${{ env.BUNDLE }}.tar.xz ${{ env.BUNDLE }} + - uses: actions/upload-release-asset@v1 + if: ${{ github.event_name == 'release' }} + env: + GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} + with: + upload_url: ${{ github.event.release.upload_url }} + asset_path: src/${{ env.BUNDLE }}.tar.xz + asset_name: ${{ env.BUNDLE }}.tar.xz + asset_content_type: application/octet-stream diff --git a/src/get-android-sys.sh b/src/get-android-sys.sh new file mode 100755 index 0000000000..3913b70229 --- /dev/null +++ b/src/get-android-sys.sh @@ -0,0 +1,18 @@ +#!/bin/sh +set -ex + +. ./get-sysroot.sh + +if [ "$WITH_ANDROID_IMG" -a ! -d out/sysroot-build/android/"$WITH_ANDROID_IMG"/system ]; then + curl -O https://dl.google.com/android/repository/sys-img/android/$WITH_ANDROID_IMG.zip + mkdir -p $WITH_ANDROID_IMG/mount + unzip $WITH_ANDROID_IMG.zip '*/system.img' -d $WITH_ANDROID_IMG + sudo mount $WITH_ANDROID_IMG/*/system.img $WITH_ANDROID_IMG/mount + rootfs=out/sysroot-build/android/$WITH_ANDROID_IMG + mkdir -p $rootfs/system/bin $rootfs/system/etc + cp $WITH_ANDROID_IMG/mount/bin/linker* $rootfs/system/bin + cp $WITH_ANDROID_IMG/mount/etc/hosts $rootfs/system/etc + cp -r $WITH_ANDROID_IMG/mount/lib* $rootfs/system + sudo umount $WITH_ANDROID_IMG/mount + rm -rf $WITH_ANDROID_IMG $WITH_ANDROID_IMG.zip +fi diff --git a/tests/basic.sh b/tests/basic.sh new file mode 100755 index 0000000000..ba354540df --- /dev/null +++ b/tests/basic.sh @@ -0,0 +1,135 @@ +#!/bin/sh + +set -ex + +[ "$1" ] || exit 1 +naive="$PWD/$1" + +. ./get-sysroot.sh + +if [ "$WITH_SYSROOT" -a "$WITH_QEMU" ]; then + naive="qemu-$WITH_QEMU -L $PWD/$WITH_SYSROOT $naive" +fi +if [ "$WITH_ANDROID_IMG" -a "$WITH_QEMU" ]; then + naive="qemu-$WITH_QEMU -L $PWD/out/sysroot-build/android/$WITH_ANDROID_IMG $naive" +fi + +cd /tmp + +MSYS_NO_PATHCONV=1 openssl req -new -x509 -keyout server.pem -out server.pem -days 1 -nodes -subj '/C=XX' +cat >server.py <hello.txt +python3=$(which python3 2>/dev/null || which python 2>/dev/null) +$python3 server.py & +trap "rm -f server.py server.pem hello.txt; kill $!" EXIT + +alias curl='curl -v --retry-connrefused --retry-delay 1 --retry 5' +curl -k https://127.0.0.1:60443/hello.txt + +test_proxy() { + curl --proxy "$1" -k https://127.0.0.1:60443/hello.txt | grep 'Hello' +} + +test_naive() { + test_name="$1" + proxy="$2" + echo "TEST '$test_name':" + shift 2 + if ( + trap 'kill $pid' EXIT + pid= + for arg in "$@"; do + name=naive$(echo "$arg" | tr -c 0-9a-z _) + $naive $arg 2>$name.log & pid="$pid $!" + tail -f $name.log & pid="$pid $!" + while ! grep -q 'Listening on' $name.log; do sleep 1; done + done + test_proxy "$proxy" + ); then + echo "TEST '$test_name': PASS" + true + else + echo "TEST '$test_name': FAIL" + false + fi +} + +test_naive 'Default config' socks5h://127.0.0.1:1080 '--log' + +echo '{"listen":"socks://127.0.0.1:60101","log":""}' >config.json +test_naive 'Default config file' socks5h://127.0.0.1:60101 '' +rm -f config.json + +echo '{"listen":"socks://127.0.0.1:60201","log":""}' >/tmp/config.json +test_naive 'Config file' socks5h://127.0.0.1:60201 '/tmp/config.json' +rm -f /tmp/config.json + +test_naive 'Trivial - listen scheme only' socks5h://127.0.0.1:1080 \ + '--log --listen=socks://' + +test_naive 'Trivial - listen no host' socks5h://127.0.0.1:60301 \ + '--log --listen=socks://:60301' + +test_naive 'Trivial - listen no port' socks5h://127.0.0.1:1080 \ + '--log --listen=socks://127.0.0.1' + +test_naive 'Trivial - auth' socks5h://user:pass@127.0.0.1:60311 \ + '--log --listen=socks://user:pass@127.0.0.1:60311' + +test_naive 'Trivial - auth with special chars' socks5h://user:^@127.0.0.1:60312 \ + '--log --listen=socks://user:^@127.0.0.1:60312' + +test_naive 'Trivial - auth with special chars' socks5h://^:^@127.0.0.1:60313 \ + '--log --listen=socks://^:^@127.0.0.1:60313' + +test_naive 'Trivial - auth with empty pass' socks5h://user:@127.0.0.1:60314 \ + '--log --listen=socks://user:@127.0.0.1:60314' + +test_naive 'SOCKS-SOCKS' socks5h://127.0.0.1:60401 \ + '--log --listen=socks://:60401 --proxy=socks://127.0.0.1:60402' \ + '--log --listen=socks://:60402' + +test_naive 'SOCKS-SOCKS - proxy no port' socks5h://127.0.0.1:60501 \ + '--log --listen=socks://:60501 --proxy=socks://127.0.0.1' \ + '--log --listen=socks://:1080' + +test_naive 'SOCKS-HTTP' socks5h://127.0.0.1:60601 \ + '--log --listen=socks://:60601 --proxy=http://127.0.0.1:60602' \ + '--log --listen=http://:60602' + +test_naive 'HTTP-HTTP' http://127.0.0.1:60701 \ + '--log --listen=http://:60701 --proxy=http://127.0.0.1:60702' \ + '--log --listen=http://:60702' + +test_naive 'HTTP-SOCKS' http://127.0.0.1:60801 \ + '--log --listen=http://:60801 --proxy=socks://127.0.0.1:60802' \ + '--log --listen=socks://:60802' + +test_naive 'SOCKS-HTTP padded' socks5h://127.0.0.1:60901 \ + '--log --listen=socks://:60901 --proxy=http://127.0.0.1:60902 --padding' \ + '--log --listen=http://:60902 --padding' + +test_naive 'SOCKS-SOCKS-SOCKS' socks5h://127.0.0.1:61001 \ + '--log --listen=socks://:61001 --proxy=socks://127.0.0.1:61002' \ + '--log --listen=socks://:61002 --proxy=socks://127.0.0.1:61003' \ + '--log --listen=socks://:61003' + +test_naive 'SOCKS-HTTP-SOCKS' socks5h://127.0.0.1:61101 \ + '--log --listen=socks://:61101 --proxy=http://127.0.0.1:61102' \ + '--log --listen=http://:61102 --proxy=socks://127.0.0.1:61103' \ + '--log --listen=socks://:61103' + +test_naive 'HTTP-SOCKS-HTTP' http://127.0.0.1:61201 \ + '--log --listen=http://:61201 --proxy=socks://127.0.0.1:61202' \ + '--log --listen=socks://:61202 --proxy=http://127.0.0.1:61203' \ + '--log --listen=http://:61203' + +test_naive 'HTTP-HTTP-HTTP' http://127.0.0.1:61301 \ + '--log --listen=http://:61301 --proxy=http://127.0.0.1:61302' \ + '--log --listen=http://:61302 --proxy=http://127.0.0.1:61303' \ + '--log --listen=http://:61303'