# Okay so maybe everyone else already knows all this, but it took some time
# for Michael and I [Han] to really see how everything fits together.
#
# Basically, what we're doing here is automated browser testing, so CircleCI
# handles the automation, and Sauce Labs handles the browser testing.
# Specifically, Sauce Labs offers a REST API to run tests in browsers in VMs,
# and CircleCI can be configured to listen for git pushes and run local
# servers and call out to REST APIs to test against these local servers.
#
# The flow goes like this:
#   - CircleCI notices/is notified of a git push
#   - they pull and checkout and magically know to install dependencies and shit
#       + https://circleci.com/docs/manually/
#   - their magic works fine for MathQuill's dependencies but to run the tests,
#     it foolishly runs `make test`, what an inconceivable mistake
#   - that's where we come in: `circle.yml` lets us override the test script.
#       + https://circleci.com/docs/configuration/
#   - our `circle.yml` first installs and runs a tunnel to Sauce Labs
#   - and runs `make server`
#   - then it calls out to Sauce Labs' REST API to open browsers that reach
#     back through the tunnel to access test pages on the local server
#       + > Sauce Connect allows you to run a test server within the CircleCI
#         > build container and expose it it (using a URL like `localhost:8080`)
#         > to Sauce Labs’ browsers.
#
#         https://circleci.com/docs/browser-testing-with-sauce-labs/
#
#   - boom testing boom


# this file is based on https://github.com/circleci/sauce-connect/blob/a65e41c91e02550ce56c75740a422bebc4acbf6f/circle.yml
# via https://circleci.com/docs/browser-testing-with-sauce-labs/

dependencies:
  cache_directories:
    - ~/sauce-connect
  pre:
    - ? |-
        # SauceConnect: download if not cached, and launch with retry
        test $SAUCE_USERNAME && test $SAUCE_ACCESS_KEY || {
          echo 'Sauce Labs credentials required. Sign up here: https://saucelabs.com/opensauce/'
          exit 1
        }

        mkdir -p ~/sauce-connect
        cd ~/sauce-connect
        if [ -x sc-*-linux/bin/sc ]; then
          echo Using cached sc-*-linux/bin/sc
        else
          time wget https://saucelabs.com/downloads/sc-latest-linux.tar.gz
          time tar -xzf sc-latest-linux.tar.gz
        fi
        # Sauce Connect randomly fails so try twice https://git.io/vPN8v
        time sc-*-linux/bin/sc --user $SAUCE_USERNAME --api-key $SAUCE_ACCESS_KEY \
          --readyfile ~/sauce_is_ready
        test -e ~/sauce_was_ready && exit
        time sc-*-linux/bin/sc --user $SAUCE_USERNAME --api-key $SAUCE_ACCESS_KEY \
          --readyfile ~/sauce_is_ready
        test -e ~/sauce_was_ready && exit
        echo 'ERROR: Exited twice without creating readyfile' \
          | tee /dev/stderr > ~/sauce_is_ready
        exit 1
      :
        background: true

test:
  pre:
    - |-
      # Generate link to Many-Worlds build and add to GitHub Commit Status
      curl -i -X POST https://api.github.com/repos/mathquill/mathquill/statuses/$CIRCLE_SHA1 \
           -u MathQuillBot:$GITHUB_STATUS_API_KEY \
           -d '{
                 "context": "ci/many-worlds",
                 "state": "success",
                 "description": "Try the tests on the Many-Worlds build of this commit:",
                 "target_url": "http://many-worlds.gomix.me/mathquill/mathquill/commit/'$CIRCLE_SHA1'/test/"
               }'

    # Safari on Sauce can only connect to port 3000, 4000, 7000, or 8000. Edge needs port 7000 or 8000.
    # https://david263a.wordpress.com/2015/04/18/fixing-safari-cant-connect-to-localhost-issue-when-using-sauce-labs-connect-tunnel/
    # https://support.saucelabs.com/customer/portal/questions/14368823-requests-to-localhost-on-microsoft-edge-are-failing-over-sauce-connect
    - PORT=8000 make server:
        background: true

    # Wait for tunnel to be ready (`make server` is much faster, no need to wait for it)
    - while [ ! -e ~/sauce_is_ready ]; do sleep 1; done; touch ~/sauce_was_ready; test -z "$(<~/sauce_is_ready)"

  override:
    - ? |-
        # Screenshots: capture in the background while running unit tests
        mkdir -p $CIRCLE_TEST_REPORTS/mocha

        # CircleCI expects test results to be reported in an JUnit/xUnit-style XML file:
        #   https://circleci.com/docs/test-metadata/#a-namemochajsamocha-for-nodejs
        # Our unit tests are in a browser, so they can't write to a file, and Sauce
        # apparently truncates custom data in their test result reports, so instead we
        # POST to this trivial Node server on localhost:9000 that writes the body of
        # any POST request to $CIRCLE_TEST_REPORTS/junit/test-results.xml
        node -e '
          require("http").createServer(function(req, res) {
            res.setHeader("Access-Control-Allow-Origin", "*");
            req.pipe(process.stdout);
            req.on("end", res.end.bind(res));
          })
          .listen(9000);
          console.error("listening on http://0.0.0.0:9000/");
        ' 2>&1 >$CIRCLE_TEST_REPORTS/junit/test-results.xml | {
          # ^ note: `2>&1` must precede `>$CIRCLE_TEST_REPORTS/...` because
          # shell redirect is like assignment; if it came after, then both
          # stdout and stderr would be written to `xunit.xml` and nothing
          # would be  piped into here

          head -1 # wait for "listening on ..." to be logged

          # https://circleci.com/docs/environment-variables/
          build_name="CircleCI build #$CIRCLE_BUILD_NUM"
          if [ $CIRCLE_PR_NUMBER ]; then
            build_name="$build_name: PR #$CIRCLE_PR_NUMBER"
            [ "$CIRCLE_BRANCH" ] && build_name="$build_name ($CIRCLE_BRANCH)"
          else
            build_name="$build_name: $CIRCLE_BRANCH"
          fi
          build_name="$build_name @ ${CIRCLE_SHA1:0:7}"
          export MQ_CI_BUILD_NAME="$build_name"

          time { test -d node_modules/wd || npm install wd; }
          time node script/screenshots.js http://localhost:8000/test/visual.html \
            && touch ~/screenshots_are_ready || echo EXIT STATUS $? | tee /dev/stderr > ~/screenshots_are_ready:
        }
      :
        background: true

    - |-
      # Unit tests in the browser

      echo '1. Launch tests'
      echo

      # https://circleci.com/docs/environment-variables/
      build_name="CircleCI build #$CIRCLE_BUILD_NUM"
      if [ $CIRCLE_PR_NUMBER ]; then
        build_name="$build_name: PR #$CIRCLE_PR_NUMBER"
        [ "$CIRCLE_BRANCH" ] && build_name="$build_name ($CIRCLE_BRANCH)"
      else
        build_name="$build_name: $CIRCLE_BRANCH"
      fi
      build_name="$build_name @ ${CIRCLE_SHA1:0:7}"

      # "build" and "customData" parameters from:
      #   https://wiki.saucelabs.com/display/DOCS/Test+Configuration+Options#TestConfigurationOptions-TestAnnotation
      set -o pipefail
      curl -i -X POST https://saucelabs.com/rest/v1/$SAUCE_USERNAME/js-tests \
           -u $SAUCE_USERNAME:$SAUCE_ACCESS_KEY \
           -H 'Content-Type: application/json' \
           -d '{
                 "name": "Unit tests, Mocha",
                 "build": "'"$build_name"'",
                 "customData": {"build_url": "'"$CIRCLE_BUILD_URL"'"},
                 "framework": "mocha",
                 "url": "http://localhost:8000/test/unit.html?post_xunit_to=http://localhost:9000",
                 "platforms": [["", "Chrome", ""]]
               }' \
      | tee /dev/stderr | tail -1 > js-tests.json

      echo '2. Wait for tests to finish:'
      echo
      #   > Make the request multiple times as the tests run until the response
      #   > contains `completed: true` to the get the final results.
      # https://wiki.saucelabs.com/display/DOCS/JavaScript+Unit+Testing+Methods
      while true  # Bash has no do...while >:(
      do
        sleep 5
        curl -i -X POST https://saucelabs.com/rest/v1/$SAUCE_USERNAME/js-tests/status \
             -u $SAUCE_USERNAME:$SAUCE_ACCESS_KEY \
             -H 'Content-Type: application/json' \
             -d @js-tests.json \
        | tee /dev/stderr | tail -1 > status.json

        # deliberately do `... != false` rather than `... == true`
        # because unexpected values should break rather than infinite loop
        [ "$(jq .completed <status.json)" != false ] && break
      done

      echo '3. Exit with non-zero status code if any unit tests failed'
      exit "$(jq '.["js tests"][0].result.failures' <status.json)"

    - |-
      # Stitch together screenshots and diff against master

      echo '0. Wait for screenshots to be ready'
      while [ ! -e ~/screenshots_are_ready ]; do sleep 1; done
      test -z "$(<~/screenshots_are_ready)" || exit 1

      echo '1. Stitch together pieces'
      for img in $(ls $CIRCLE_ARTIFACTS/imgs/pieces/); do
        convert $(ls -1 $CIRCLE_ARTIFACTS/imgs/pieces/$img/*.png | sort -n) -append $CIRCLE_ARTIFACTS/imgs/$img.png
      done

      echo '2. Download the latest screenshots from master'
      echo

      artifacts_json="$(curl https://circleci.com/api/v1/project/mathquill/mathquill/latest/artifacts?branch=master)"
      echo
      echo '/latest/artifacts?branch=master:'
      echo
      echo "$artifacts_json"
      echo

      mkdir $CIRCLE_ARTIFACTS/imgs/baseline/
      baseline_imgs="$(echo "$artifacts_json" \
                    | jq -r '.[] | .url + " -o " + .pretty_path' \
                    | grep '\.png$' \
                    | grep -v '_DIFF\.png$' \
                    | grep -vF '/pieces/' \
                    | grep -vF '/baseline/' \
                    | sed "s:\$CIRCLE_ARTIFACTS/imgs/:$CIRCLE_ARTIFACTS/imgs/baseline/:")"
      echo 'Baseline image URLs and files:'
      echo
      echo "$baseline_imgs"
      echo

      test -z "$baseline_imgs" && { echo 'No baseline images to download'; exit; }
      curl $baseline_imgs
      echo

      echo '3.  Generate image diffs'
      echo
      cd $CIRCLE_ARTIFACTS/imgs/
      for file in $(ls *.png); do
        # if evergreen browser, browser version of previous screenshot may not match,
        # so replace previous browser version with glob
        baseline="$(echo baseline/$(echo $file | sed 's/[^_]*_(evergreen)/*/; s/OS_X_.*/OS_X_*.png/' | tee /dev/stderr) | tee /dev/stderr)"
        echo "Number of different pixels from baseline in $file:"
        compare -metric AE $baseline $file ${file/%.png/_DIFF.png}
        echo
      done
      true  # ignore errors like "image widths or heights differ"

  post:
    - killall --wait sc; true  # wait for Sauce Connect to close the tunnel; ignore errors since it's just cleanup
