version: 2.1

# A reusable "run" snippet which is ran before each test to setup the
# environment for user-limits, core-dumps, etc.
run_env_change: &run_env_change
  name: Environment Changes
  command: |
    # Make a place to core dumps to live.
    sudo mkdir -p /tmp/core_dumps
    sudo chmod a+rwx /tmp/core_dumps

    # Bake the locale we expect into the image.
    echo "en_US.UTF-8 UTF-8" | sudo tee /etc/locale.gen
    sudo locale-gen

    # The commands below don't work in Docker images, but might be worth
    # reenabling if we switch back to machine:true instead of Docker.

    # Set the pattern for core dumps, so we can find them.
    # echo kernel.core_pattern="/tmp/core_dumps/core.%e.%p.%h.%t" | \
    #     sudo tee -a /etc/sysctl.conf

    # Note that since every "run" command starts its own shell, and I wasn't
    # able to set this at a system wide level for all users, it's necessary to
    # run "ulimit -c unlimited" before each command which you want to (possibly)
    # output a core dump.

    # Raise inotify user watches up higher.
    # echo fs.inotify.max_user_watches=524288 | \
    #     sudo tee -a /etc/sysctl.conf

    # Reload sysctl so these are in effect.
    # sudo sysctl -p

log_env: &log_env
  name: Log Environment
  command: |
    echo "==> LBS Version"
    lsb_release -a
    echo "==> cat /etc/os-release"
    cat /etc/os-release
    echo "==> uname -srm"
    uname -srm
    echo "==> Node version: $(node --version)"
    echo "==> NPM version: $(npm --version)"
    echo "==> Meteor Node version: $(./meteor node --version)"
    echo "==> Meteor NPM version: $(./meteor npm --version)"
    echo "==> Dev bundle package.json:"
    cat ./dev_bundle/lib/package.json
    echo "==> Dev bundle node_modules:"
    ls -l ./dev_bundle/lib/node_modules

# A reusable "run" snippet which enables the continued logging of memoryusage
# to a file on disk which can be saved to build artifacts for later analysis.
run_log_mem_use: &run_log_mem_use
  background: true
  name: Setup Memory Logging
  command: |
    # Log memory usage throughout entire build.
    MEMUSELOG=/tmp/memuse.txt /bin/bash -c '\
        while true; do\
          ps -e -o user,%cpu,%mem,rss:10,vsz:10,command:20 \
            --sort=-%mem >> $MEMUSELOG; \
          echo "----------" >> $MEMUSELOG; \
          sleep 1; \
        done'

# A reusable "run" snippet for saving the Node binary if a core dump is present.
run_save_node_bin: &run_save_node_bin
  name: Save Node Binary
  when: on_fail
  command: |
    if compgen -G "/tmp/core_dumps/core.*" > /dev/null; then
      echo "Saving Node binary since Core dump is present..."
      cp dev_bundle/bin/node /tmp/core_dumps/node
    fi

# This environment is set to every job (and the initial build).
build_machine_environment:
  &build_machine_environment # Specify that we want an actual machine (ala Circle 1.0), not a Docker image.
  docker:
    - image: meteor/circleci:2025.07.8-android-35-node-22
  resource_class: large
  environment:
    # This multiplier scales the waitSecs for selftests.
    TIMEOUT_SCALE_FACTOR: 8

    # Retry failed tests additional times.
    METEOR_SELF_TEST_RETRIES: 2

    # These, mostly overlapping, flags ensure that CircleCI is as pretty as
    # possible for a non-interactive environment.  See also: --headless.
    METEOR_HEADLESS: true
    METEOR_PRETTY_OUTPUT: 0

    # In an effort to stop SIGSEGV, this just doesn't bother cleaning up
    # the mess of temp directories that Meteor makes.
    METEOR_SAVE_TMPDIRS: 1

    # Skip these tests on every test run.
    # If needed, for readability this should be a regex wrapped across
    # multiple lines in quotes.
    SELF_TEST_EXCLUDE: "add debugOnly and prodOnly packages"

    # These will be evaled before each command.
    PRE_TEST_COMMANDS: |-
      ulimit -c unlimited; # Set core dump size as Ubuntu 14.04 lacks prlimit.
      ulimit -a # Display all ulimit settings for transparency.

    # This is only to make Meteor self-test not remind us that we can set
    # this argument for self-tests.
    SELF_TEST_TOOL_NODE_FLAGS: " "

    # Variables for load-balancing
    NUM_GROUPS: 12
    RUNNING_AVG_LENGTH: 6

    # Force modern bundler test
    METEOR_MODERN: true

jobs:
  Get Ready:
    <<: *build_machine_environment
    steps:
      - run:
          <<: *run_log_mem_use
      - run:
          <<: *run_env_change
      - checkout
      - run:
          # https://discuss.circleci.com/t/git-submodule-url-isnt-playing-nice-with-the-cache/549/3
          name: Git Submodules.
          command: (git submodule sync && git submodule update --init --recursive) || (rm -fr .git/config .git/modules && git submodule deinit -f . && git submodule update --init --recursive)
      - restore_cache:
          keys:
            - v3-dev-bundle-cache-{{ checksum "meteor" }}
            - v3-dev-bundle-cache-
      - run:
          name: Combine NPM Shrinkwrap Files
          command: |
            for d in packages/*/.npm/package; do
              if [ -f $d/npm-shrinkwrap.json ]; then
              cat $d/npm-shrinkwrap.json >> shrinkwraps.txt;
              fi
            done
            for d in packages/*/.npm/plugin/*; do
              if [ -f $d/npm-shrinkwrap.json ]; then
              cat $d/npm-shrinkwrap.json >> shrinkwraps.txt;
              fi
            done
      - restore_cache:
          keys:
            - package-npm-deps-cache-group1-v3-{{ checksum "shrinkwraps.txt" }}
            - package-npm-deps-cache-group1-v3-
      - restore_cache:
          keys:
            - package-npm-deps-cache-group2-v6-{{ checksum "shrinkwraps.txt" }}
            - package-npm-deps-cache-group2-v6-
      - restore_cache:
          keys:
            - v7-other-deps-cache-{{ .Branch }}-{{ checksum "meteor" }}-{{ .Revision }}
            - v7-other-deps-cache-{{ .Branch }}-{{ checksum "meteor" }}-
            - v7-other-deps-cache-{{ .Branch }}-
      - restore_cache:
          keys:
            - v4-test-groups-{{ .Branch }}
            - v4-test-groups-
      - run:
          name: Create Test Results Directory
          command: |
            sudo mkdir -p ./tmp/results/junit
            sudo chmod a+rwx ./tmp/results/junit
      # Clear dev_bundle/.npm to ensure consistent test runs.
      - run:
          name: Clear npm cache
          command: ./meteor npm cache clear --force
      - run:
          <<: *log_env
      - run:
          name: Get Ready
          command: |
            eval $PRE_TEST_COMMANDS;
            cd dev_bundle/lib
            ../../meteor npm install @types/node@22.7.4 --save-dev
            # Ensure that meteor/tools has no TypeScript errors.
            ../../meteor npm install -g typescript
            cd ../../
            # tools/node_modules is a symlink, but starting on NPM 7, this symlinks are deleted https://github.com/npm/cli/issues/3669
            # so we are copying the node_modules to tools
            ./meteor --get-ready
          # shouldn't take longer than 60 minutes
          no_output_timeout: 60m
      - run:
          <<: *run_save_node_bin
      - persist_to_workspace:
          root: .
          paths: .
      - store_artifacts:
          path: /tmp/core_dumps
      - store_artifacts:
          path: /tmp/memuse.txt

  Isolated Tests:
    <<: *build_machine_environment
    steps:
      - run:
          <<: *run_log_mem_use
      - run:
          <<: *run_env_change
      - attach_workspace:
          at: .
      - run:
          name: "Print environment"
          command: printenv
      - run:
          name: "Running self-test ('package-tests: add debugOnly and prodOnly packages')"
          command: |
            eval $PRE_TEST_COMMANDS;
            ./meteor self-test \
              'add debugOnly and prodOnly packages' \
              --retries ${METEOR_SELF_TEST_RETRIES} \
              --headless \
          no_output_timeout: 20m
      - run:
          <<: *log_env
      - run:
          name: "Running self-test (Custom Warehouse Tests)"
          command: |
            eval $PRE_TEST_COMMANDS;
            ./meteor self-test \
              --retries ${METEOR_SELF_TEST_RETRIES} \
              --exclude "${SELF_TEST_EXCLUDE}" \
              --headless \
              --with-tag "custom-warehouse"
          no_output_timeout: 20m
      - run:
          <<: *run_save_node_bin
      - store_test_results:
          path: ./tmp/results
      - store_artifacts:
          path: ./tmp/results
      - store_artifacts:
          path: /tmp/core_dumps
      - store_artifacts:
          path: /tmp/memuse.txt

  Test Group 0:
    <<: *build_machine_environment
    steps:
      - run:
          <<: *run_log_mem_use
      - run:
          <<: *run_env_change
      - attach_workspace:
          at: .
      - run:
          name: "Print environment"
          command: printenv
      - run:
          <<: *log_env
      - run:
          name: "Running self-test (Test Group 0)"
          command: |
            if [ -f ./tmp/test-groups/0.txt ]; then TEST_GROUP=$(<./tmp/test-groups/0.txt); else TEST_GROUP='^[a-b]|^c[a-n]|^co[a-l]|^comm'; fi
            echo $TEST_GROUP;
            eval $PRE_TEST_COMMANDS;
            ./meteor self-test \
              "$TEST_GROUP" \
              --retries ${METEOR_SELF_TEST_RETRIES} \
              --exclude "${SELF_TEST_EXCLUDE}" \
              --headless \
              --junit ./tmp/results/junit/0.xml \
              --without-tag "custom-warehouse"
          no_output_timeout: 30m
      - run:
          <<: *run_save_node_bin
      - store_test_results:
          path: ./tmp/results
      - persist_to_workspace:
          root: .
          paths: ./tmp/results/junit
      - store_artifacts:
          path: ./tmp/results
      - store_artifacts:
          path: /tmp/core_dumps
      - store_artifacts:
          path: /tmp/memuse.txt

  Test Group 1:
    <<: *build_machine_environment
    steps:
      - run:
          <<: *run_log_mem_use
      - run:
          <<: *run_env_change
      - attach_workspace:
          at: .
      - run:
          name: "Print environment"
          command: printenv
      - run:
          <<: *log_env
      - run:
          name: "Running self-test (Test Group 1)"
          command: |
            if [ -f ./tmp/test-groups/1.txt ]; then TEST_GROUP=$(<./tmp/test-groups/1.txt); elif [ -f ./tmp/test-groups/0.txt ]; then TEST_GROUP=XXXXX; else TEST_GROUP='^com[n-z]'; fi
            echo $TEST_GROUP;
            eval $PRE_TEST_COMMANDS;
            ./meteor self-test \
              "$TEST_GROUP" \
              --retries ${METEOR_SELF_TEST_RETRIES} \
              --exclude "${SELF_TEST_EXCLUDE}" \
              --headless \
              --junit ./tmp/results/junit/1.xml \
              --without-tag "custom-warehouse"
          no_output_timeout: 20m
      - run:
          <<: *run_save_node_bin
      - store_test_results:
          path: ./tmp/results
      - persist_to_workspace:
          root: .
          paths: ./tmp/results/junit
      - store_artifacts:
          path: ./tmp/results
      - store_artifacts:
          path: /tmp/core_dumps
      - store_artifacts:
          path: /tmp/memuse.txt

  Test Group 2:
    <<: *build_machine_environment
    steps:
      - run:
          <<: *run_log_mem_use
      - run:
          <<: *run_env_change
      - attach_workspace:
          at: .
      - run:
          <<: *log_env
      - run:
          name: "Print environment"
          command: printenv
      - run:
          name: "Running self-test (Test Group 2)"
          command: |
            if [ -f ./tmp/test-groups/2.txt ]; then TEST_GROUP=$(<./tmp/test-groups/2.txt); elif [ -f ./tmp/test-groups/0.txt ]; then TEST_GROUP=XXXXX; else TEST_GROUP='^co[n-z]'; fi
            echo $TEST_GROUP;
            eval $PRE_TEST_COMMANDS;
            export PATH="/home/circleci/.sdkman/candidates/gradle/8.7/bin:${PATH}"
            java --version
            gradle --version
            ./meteor self-test \
              "$TEST_GROUP" \
              --retries ${METEOR_SELF_TEST_RETRIES} \
              --exclude "${SELF_TEST_EXCLUDE}" \
              --headless \
              --junit ./tmp/results/junit/2.xml \
              --without-tag "custom-warehouse"
          no_output_timeout: 20m
      - run:
          <<: *run_save_node_bin
      - store_test_results:
          path: ./tmp/results
      - persist_to_workspace:
          root: .
          paths: ./tmp/results/junit
      - store_artifacts:
          path: ./tmp/results
      - store_artifacts:
          path: /tmp/core_dumps
      - store_artifacts:
          path: /tmp/memuse.txt

  Test Group 3:
    <<: *build_machine_environment
    steps:
      - run:
          <<: *run_log_mem_use
      - run:
          <<: *run_env_change
      - attach_workspace:
          at: .
      - run:
          <<: *log_env
      - run:
          name: "Print environment"
          command: printenv
      - run:
          name: "Running self-test (Test Group 3)"
          command: |
            if [ -f ./tmp/test-groups/3.txt ]; then TEST_GROUP=$(<./tmp/test-groups/3.txt); elif [ -f ./tmp/test-groups/0.txt ]; then TEST_GROUP=XXXXX; else TEST_GROUP='^c[p-z]|^h[a-e]'; fi
            echo $TEST_GROUP;
            eval $PRE_TEST_COMMANDS;
            ./meteor self-test \
              "$TEST_GROUP" \
              --retries ${METEOR_SELF_TEST_RETRIES} \
              --exclude "${SELF_TEST_EXCLUDE}" \
              --headless \
              --junit ./tmp/results/junit/3.xml \
              --without-tag "custom-warehouse"
          no_output_timeout: 30m
      - run:
          <<: *run_save_node_bin
      - store_test_results:
          path: ./tmp/results
      - persist_to_workspace:
          root: .
          paths: ./tmp/results/junit
      - store_artifacts:
          path: ./tmp/results
      - store_artifacts:
          path: /tmp/core_dumps
      - store_artifacts:
          path: /tmp/memuse.txt

  Test Group 4:
    <<: *build_machine_environment
    steps:
      - run:
          <<: *run_log_mem_use
      - run:
          <<: *run_env_change
      - attach_workspace:
          at: .
      - run:
          name: "Print environment"
          command: printenv
      - run:
          <<: *log_env
      - run:
          name: "Running self-test (Test Group 4)"
          command: |
            if [ -f ./tmp/test-groups/4.txt ]; then TEST_GROUP=$(<./tmp/test-groups/4.txt); elif [ -f ./tmp/test-groups/0.txt ]; then TEST_GROUP=XXXXX; else TEST_GROUP='^h[f-z]|^[i-l]'; fi
            echo $TEST_GROUP;
            eval $PRE_TEST_COMMANDS;
            ./meteor self-test \
              "$TEST_GROUP" \
              --retries ${METEOR_SELF_TEST_RETRIES} \
              --exclude "${SELF_TEST_EXCLUDE}" \
              --headless \
              --junit ./tmp/results/junit/4.xml \
              --without-tag "custom-warehouse"
          no_output_timeout: 20m
      - run:
          <<: *run_save_node_bin
      - store_test_results:
          path: ./tmp/results
      - persist_to_workspace:
          root: .
          paths: ./tmp/results/junit
      - store_artifacts:
          path: ./tmp/results
      - store_artifacts:
          path: /tmp/core_dumps
      - store_artifacts:
          path: /tmp/memuse.txt

  Test Group 5:
    <<: *build_machine_environment
    steps:
      - run:
          <<: *run_log_mem_use
      - run:
          <<: *run_env_change
      - attach_workspace:
          at: .
      - run:
          name: "Print environment"
          command: printenv
      - run:
          <<: *log_env
      - run:
          name: "Running self-test (Test Group 5)"
          command: |
            if [ -f ./tmp/test-groups/5.txt ]; then TEST_GROUP=$(<./tmp/test-groups/5.txt); elif [ -f ./tmp/test-groups/0.txt ]; then TEST_GROUP=XXXXX; else TEST_GROUP='^m[a-n]|^mo[a-d]'; fi
            echo $TEST_GROUP;
            eval $PRE_TEST_COMMANDS;
            ./meteor self-test \
              "$TEST_GROUP" \
              --retries ${METEOR_SELF_TEST_RETRIES} \
              --exclude "${SELF_TEST_EXCLUDE}" \
              --headless \
              --junit ./tmp/results/junit/5.xml \
              --without-tag "custom-warehouse"
          no_output_timeout: 20m
      - run:
          <<: *run_save_node_bin
      - store_test_results:
          path: ./tmp/results
      - persist_to_workspace:
          root: .
          paths: ./tmp/results/junit
      - store_artifacts:
          path: ./tmp/results
      - store_artifacts:
          path: /tmp/core_dumps
      - store_artifacts:
          path: /tmp/memuse.txt

  Test Group 6:
    <<: *build_machine_environment
    steps:
      - run:
          <<: *run_log_mem_use
      - run:
          <<: *run_env_change
      - attach_workspace:
          at: .
      - run:
          name: "Print environment"
          command: printenv
      - run:
          <<: *log_env
      - run:
          name: "Running self-test (Test Group 6)"
          command: |
            if [ -f ./tmp/test-groups/6.txt ]; then TEST_GROUP=$(<./tmp/test-groups/6.txt); elif [ -f ./tmp/test-groups/0.txt ]; then TEST_GROUP=XXXXX; else TEST_GROUP='^mo[e-z]|^m[p-z]|^[n-o]'; fi
            echo $TEST_GROUP;
            eval $PRE_TEST_COMMANDS;
            ./meteor self-test \
              "$TEST_GROUP" \
              --retries ${METEOR_SELF_TEST_RETRIES} \
              --exclude "${SELF_TEST_EXCLUDE}" \
              --headless \
              --junit ./tmp/results/junit/6.xml \
              --without-tag "custom-warehouse"
          no_output_timeout: 20m
      - run:
          <<: *run_save_node_bin
      - store_test_results:
          path: ./tmp/results
      - persist_to_workspace:
          root: .
          paths: ./tmp/results/junit
      - store_artifacts:
          path: ./tmp/results
      - store_artifacts:
          path: /tmp/core_dumps
      - store_artifacts:
          path: /tmp/memuse.txt

  Test Group 7:
    <<: *build_machine_environment
    steps:
      - run:
          <<: *run_log_mem_use
      - run:
          <<: *run_env_change
      - attach_workspace:
          at: .
      - run:
          name: "Print environment"
          command: printenv
      - run:
          <<: *log_env
      - run:
          name: "Running self-test (Test Group 7)"
          command: |
            if [ -f ./tmp/test-groups/7.txt ]; then TEST_GROUP=$(<./tmp/test-groups/7.txt); elif [ -f ./tmp/test-groups/0.txt ]; then TEST_GROUP=XXXXX; else TEST_GROUP='^[p-q]|^r[a-e]'; fi
            echo $TEST_GROUP;
            eval $PRE_TEST_COMMANDS;
            ./meteor self-test \
              "$TEST_GROUP" \
              --retries ${METEOR_SELF_TEST_RETRIES} \
              --exclude "${SELF_TEST_EXCLUDE}" \
              --headless \
              --junit ./tmp/results/junit/7.xml \
              --without-tag "custom-warehouse"
          no_output_timeout: 20m
      - run:
          <<: *run_save_node_bin
      - store_test_results:
          path: ./tmp/results
      - persist_to_workspace:
          root: .
          paths: ./tmp/results/junit
      - store_artifacts:
          path: ./tmp/results
      - store_artifacts:
          path: /tmp/core_dumps
      - store_artifacts:
          path: /tmp/memuse.txt

  Test Group 8:
    <<: *build_machine_environment
    steps:
      - run:
          <<: *run_log_mem_use
      - run:
          <<: *run_env_change
      - attach_workspace:
          at: .
      - run:
          name: "Print environment"
          command: printenv
      - run:
          <<: *log_env
      - run:
          name: "Running self-test (Test Group 8)"
          command: |
            if [ -f ./tmp/test-groups/8.txt ]; then TEST_GROUP=$(<./tmp/test-groups/8.txt); elif [ -f ./tmp/test-groups/0.txt ]; then TEST_GROUP=XXXXX; else TEST_GROUP='^r[f-z]'; fi
            echo $TEST_GROUP;
            eval $PRE_TEST_COMMANDS;
            ./meteor self-test \
              "$TEST_GROUP" \
              --retries ${METEOR_SELF_TEST_RETRIES} \
              --exclude "${SELF_TEST_EXCLUDE}" \
              --headless \
              --junit ./tmp/results/junit/8.xml \
              --without-tag "custom-warehouse"
          no_output_timeout: 20m
      - run:
          <<: *run_save_node_bin
      - store_test_results:
          path: ./tmp/results
      - persist_to_workspace:
          root: .
          paths: ./tmp/results/junit
      - store_artifacts:
          path: ./tmp/results
      - store_artifacts:
          path: /tmp/core_dumps
      - store_artifacts:
          path: /tmp/memuse.txt

  Test Group 9:
    <<: *build_machine_environment
    steps:
      - run:
          <<: *run_log_mem_use
      - run:
          <<: *run_env_change
      - attach_workspace:
          at: .
      - run:
          name: "Print environment"
          command: printenv
      - run:
          <<: *log_env
      - run:
          name: "Running self-test (Test Group 9)"
          command: |
            if [ -f ./tmp/test-groups/9.txt ]; then TEST_GROUP=$(<./tmp/test-groups/9.txt); elif [ -f ./tmp/test-groups/0.txt ]; then TEST_GROUP=XXXXX; else TEST_GROUP='^s'; fi
            echo $TEST_GROUP;
            eval $PRE_TEST_COMMANDS;
            ./meteor self-test \
              "$TEST_GROUP" \
              --retries ${METEOR_SELF_TEST_RETRIES} \
              --exclude "${SELF_TEST_EXCLUDE}" \
              --headless \
              --junit ./tmp/results/junit/9.xml \
              --without-tag "custom-warehouse"
          no_output_timeout: 20m
      - run:
          <<: *run_save_node_bin
      - store_test_results:
          path: ./tmp/results
      - persist_to_workspace:
          root: .
          paths: ./tmp/results/junit
      - store_artifacts:
          path: ./tmp/results
      - store_artifacts:
          path: /tmp/core_dumps
      - store_artifacts:
          path: /tmp/memuse.txt

  Test Group 10:
    <<: *build_machine_environment
    steps:
      - run:
          <<: *run_log_mem_use
      - run:
          <<: *run_env_change
      - attach_workspace:
          at: .
      - run:
          name: "Print environment"
          command: printenv
      - run:
          <<: *log_env
      - run:
          name: "Running self-test (Test Group 10)"
          command: |
            if [ -f ./tmp/test-groups/10.txt ]; then TEST_GROUP=$(<./tmp/test-groups/10.txt); elif [ -f ./tmp/test-groups/0.txt ]; then TEST_GROUP=XXXXX; else TEST_GROUP='^[t-z]'; fi
            echo $TEST_GROUP;
            eval $PRE_TEST_COMMANDS;
            ./meteor self-test \
              "$TEST_GROUP" \
              --retries ${METEOR_SELF_TEST_RETRIES} \
              --exclude "${SELF_TEST_EXCLUDE}" \
              --headless \
              --junit ./tmp/results/junit/10.xml \
              --without-tag "custom-warehouse"
          no_output_timeout: 20m
      - run:
          <<: *run_save_node_bin
      - store_test_results:
          path: ./tmp/results
      - persist_to_workspace:
          root: .
          paths: ./tmp/results/junit
      - store_artifacts:
          path: ./tmp/results
      - store_artifacts:
          path: /tmp/core_dumps
      - store_artifacts:
          path: /tmp/memuse.txt

  Test Group 11:
    <<: *build_machine_environment
    steps:
      - run:
          <<: *run_log_mem_use
      - run:
          <<: *run_env_change
      - attach_workspace:
          at: .
      - run:
          name: "Print environment"
          command: printenv
      - run:
          <<: *log_env
      - run:
          name: "Running self-test (Test Group 11)"
          command: |
            if [ -f ./tmp/test-groups/11.txt ]; then TEST_GROUP=$(<./tmp/test-groups/11.txt); elif [ -f ./tmp/test-groups/0.txt ]; then TEST_GROUP=XXXXX; else TEST_GROUP='^[d-g]'; fi
            echo $TEST_GROUP;
            eval $PRE_TEST_COMMANDS;
            ./meteor self-test \
              "$TEST_GROUP" \
              --retries ${METEOR_SELF_TEST_RETRIES} \
              --exclude "${SELF_TEST_EXCLUDE}" \
              --headless \
              --junit ./tmp/results/junit/11.xml \
              --without-tag "custom-warehouse"
          no_output_timeout: 35m
      - run:
          <<: *run_save_node_bin
      - store_test_results:
          path: ./tmp/results
      - persist_to_workspace:
          root: .
          paths: ./tmp/results/junit
      - store_artifacts:
          path: ./tmp/results
      - store_artifacts:
          path: /tmp/core_dumps
      - store_artifacts:
          path: /tmp/memuse.txt

  # Test the JSDoc declarations which live within this codebase.
  # Now the docs live in this repo, we can test them here, every PR is tested.
  Docs:
    docker:
      # This Node version should match that in the meteor/docs CircleCI config.
      - image: meteor/circleci:2025.07.8-android-35-node-22
    resource_class: large
    environment:
      CHECKOUT_METEOR_DOCS: /home/circleci/test_docs
    <<: *build_machine_environment
    steps:
      - run:
          name: Cloning "meteor" Repository's current branch
          command: |
            if [[ -n "$CIRCLE_PULL_REQUEST" ]]; then
              PR_NUMBER=$(echo $CIRCLE_PULL_REQUEST | sed 's|.*/pull/\([0-9]*\)|\1|')
              PR_BRANCH=$(curl -s https://api.github.com/repos/meteor/meteor/pulls/$PR_NUMBER | jq -r .head.ref)
              git clone https://github.com/meteor/meteor.git ${CHECKOUT_METEOR_DOCS}
              cd ${CHECKOUT_METEOR_DOCS}
              git fetch origin pull/$PR_NUMBER/head:$PR_BRANCH
            else
              git clone --branch $CIRCLE_BRANCH https://github.com/meteor/meteor.git ${CHECKOUT_METEOR_DOCS}
            fi
      # Run almost the same steps the meteor/docs repository runs, minus deploy.
      - run:
          name: Generating Meteor documentation for JSDoc testing
          command: |
            cd ${CHECKOUT_METEOR_DOCS}/docs
            npm install
            npm test

  Clean Up:
    <<: *build_machine_environment
    steps:
      - attach_workspace:
          at: .
      - run:
          name: Create Test Groups Directory
          command: |
            sudo mkdir -p ./tmp/test-groups
            sudo chmod a+rwx ./tmp/test-groups
      - run:
          name: Calculate Balanced Test Groups
          command: |
            npm install --prefix ./scripts/test-balancer
            npm start --prefix ./scripts/test-balancer --num-groups ${NUM_GROUPS} --running-avg-length ${RUNNING_AVG_LENGTH}
      - save_cache:
          key: v1-test-groups-{{ .Branch }}-{{ .BuildNum }}
          paths:
            - ./tmp/test-groups
          when: on_success
      - save_cache:
          key: v3-dev-bundle-cache-{{ checksum "meteor" }}
          paths:
            - "dev_bundle"
      # The package npm dependencies are split into two caches to avoid an AWS
      # `MetadataTooLarge` error that consistently appears if we put all of
      # these folders in the same cache
      - save_cache:
          key: package-npm-deps-cache-group1-v3-{{ checksum "shrinkwraps.txt" }}
          paths:
            - packages/meteor/.npm/package/node_modules
            - packages/modules-runtime/.npm/package/node_modules
            - packages/modules/.npm/package/node_modules
            - packages/ecmascript-runtime-server/.npm/package/node_modules
            - packages/promise/.npm/package/node_modules
            - packages/babel-compiler/.npm/package/node_modules
            - packages/babel-runtime/.npm/package/node_modules
            - packages/http/.npm/package/node_modules
            - packages/socket-stream-client/.npm/package/node_modules
            - packages/ddp-client/.npm/package/node_modules
            - packages/npm-mongo/.npm/package/node_modules
            - packages/package-version-parser/.npm/package/node_modules
            - packages/boilerplate-generator/.npm/package/node_modules
      - save_cache:
          key: package-npm-deps-cache-group2-v5-{{ checksum "shrinkwraps.txt" }}
          paths:
            - packages/xmlbuilder/.npm/package/node_modules
            - packages/logging/.npm/package/node_modules
            - packages/webapp/.npm/package/node_modules
            - packages/ddp-server/.npm/package/node_modules
            - packages/mongo/.npm/package/node_modules
            - packages/npm-bcrypt/.npm/package/node_modules
            - packages/email/.npm/package/node_modules
            - packages/caching-compiler/.npm/package/node_modules
            - packages/less/.npm/plugin/compileLessBatch/node_modules
            - packages/non-core/blaze/packages/spacebars-compiler/.npm/package/node_modules
            - packages/boilerplate-generator-tests/.npm/package/node_modules
            - packages/non-core/bundle-visualizer/.npm/package/node_modules
            - packages/d3-hierarchy/.npm/package/node_modules
            - packages/non-core/coffeescript-compiler/.npm/package/node_modules
            - packages/server-render/.npm/package/node_modules
            - packages/es5-shim/.npm/package/node_modules
            - packages/force-ssl-common/.npm/package/node_modules
            - packages/jshint/.npm/plugin/lintJshint/node_modules
            - packages/minifier-css/.npm/package/node_modules
            - packages/minifier-js/.npm/package/node_modules
            - packages/standard-minifier-css/.npm/plugin/minifyStdCSS/node_modules
            - packages/inter-process-messaging/.npm/package/node_modules
            - packages/fetch/.npm/package/node_modules
            - packages/non-core/mongo-decimal/.npm/package/node_modules
      - save_cache:
          key: v7-other-deps-cache-{{ .Branch }}-{{ checksum "meteor" }}-{{ .Revision }}
          paths:
            - ".babel-cache"
            - ".meteor"

workflows:
  version: 2
  Build and Test:
    jobs:
      - Docs
      - Get Ready
      - Isolated Tests:
          requires:
            - Get Ready
      - Test Group 0:
          requires:
            - Get Ready
      - Test Group 1:
          requires:
            - Get Ready
      - Test Group 2:
          requires:
            - Get Ready
      - Test Group 3:
          requires:
            - Get Ready
      - Test Group 4:
          requires:
            - Get Ready
      - Test Group 5:
          requires:
            - Get Ready
      - Test Group 6:
          requires:
            - Get Ready
      - Test Group 7:
          requires:
            - Get Ready
      - Test Group 8:
          requires:
            - Get Ready
      - Test Group 9:
          requires:
            - Get Ready
      - Test Group 10:
          requires:
            - Get Ready
      - Test Group 11:
          requires:
            - Get Ready
      - Clean Up:
          requires:
            - Isolated Tests
            - Test Group 0
            - Test Group 1
            - Test Group 2
            - Test Group 3
            - Test Group 4
            - Test Group 5
            - Test Group 6
            - Test Group 7
            - Test Group 8
            - Test Group 9
            - Test Group 10
            - Test Group 11
