name: JerryScript CI

on: [push, pull_request]

env:
  RUNNER: tools/run-tests.py

jobs:
  Checks:
    runs-on: ubuntu-18.04 # needed for checker version stability
    steps:
      - uses: actions/checkout@v2
        with:
          fetch-depth: 0
      - run: sudo apt update
      - run: sudo apt install doxygen vera++ cppcheck pylint python-serial
      - run: $RUNNER --check-signed-off=gh-actions
      - run: $RUNNER --check-doxygen
      - run: $RUNNER --check-vera
      - run: $RUNNER --check-license
      - run: $RUNNER --check-magic-strings
      - run: $RUNNER --check-pylint
      - run: $RUNNER --check-cppcheck

  Linux_x86-64_Build_Correctness_Debugger_Tests:
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@v2
      - uses: actions/setup-python@v2
        with:
          python-version: '2.7' # needed by jerry-debugger
      - run: $RUNNER -q --jerry-tests
      - run: $RUNNER -q --jerry-debugger

  Linux_x86_cpointer-32bit_Build_Correctness_Tests:
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@v2
      - run: sudo apt update
      - run: sudo apt install gcc-multilib
      - run: $RUNNER -q --jerry-tests --buildoptions=--compile-flag=-m32,--cpointer-32bit=on

  OSX_x86-64_Build_Correctness_Unit_Tests:
    runs-on: macos-latest
    steps:
      - uses: actions/checkout@v2
      - run: $RUNNER -q --jerry-tests
      - run: $RUNNER -q --unittests

  Linux_x86-64_Build_Option_Tests:
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@v2
      - run: sudo apt update
      - run: sudo apt install gcc-multilib
      - run: $RUNNER --buildoption-test

  Conformance_Tests_ES5_1:
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@v2
      - run: $RUNNER --test262

  Conformance_Tests_ES2015:
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@v2
      - run: $RUNNER --test262-es2015=update
      - uses: actions/upload-artifact@v2
        if: success() || failure()
        with:
          name: Test262-ES2015-results
          path: build/tests/test262_tests_es2015/local/bin/test262.report

  Conformance_Tests_ESNext_A:
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@v2
      - run: $RUNNER --test262-esnext=update --test262-test-list=built-ins,annexB,harness,intl402
      - uses: actions/upload-artifact@v2
        if: success() || failure()
        with:
          name: Test262-ESNext-results-A
          path: build/tests/test262_tests_esnext/local/bin/test262.report

  Conformance_Tests_ESNext_B:
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@v2
      - run: $RUNNER --test262-esnext=update --test262-test-list=language
      - uses: actions/upload-artifact@v2
        if: success() || failure()
        with:
          name: Test262-ESNext-results-B
          path: build/tests/test262_tests_esnext/local/bin/test262.report

  Unit_Tests:
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@v2
      - run: $RUNNER -q --unittests

  ASAN_Tests:
    runs-on: ubuntu-latest
    env:
      ASAN_OPTIONS: detect_stack_use_after_return=1:check_initialization_order=true:strict_init_order=true
    steps:
      - uses: actions/checkout@v2
      - run: sudo apt update
      - run: sudo apt install gcc-multilib
      - run: >-
          $RUNNER -q --jerry-tests
          --buildoptions=--stack-limit=0,--compile-flag=-fsanitize=address,--compile-flag=-m32,--compile-flag=-fno-omit-frame-pointer,--compile-flag=-fno-common,--compile-flag=-O2,--debug,--system-allocator=on,--linker-flag=-fuse-ld=gold
          --skip-list=parser-oom.js,parser-oom2.js,stack-limit.js,regression-test-issue-2190.js,regression-test-issue-2258-2963.js,regression-test-issue-2448.js,regression-test-issue-2905.js,regression-test-issue-3785.js

  UBSAN_Tests:
    runs-on: ubuntu-latest
    env:
      UBSAN_OPTIONS: print_stacktrace=1
    steps:
      - uses: actions/checkout@v2
      - run: sudo apt update
      - run: sudo apt install gcc-multilib
      - run: >-
          $RUNNER -q --jerry-tests
          --buildoptions=--compile-flag=-fsanitize=undefined,--compile-flag=-m32,--compile-flag=-fno-omit-frame-pointer,--compile-flag=-fno-common,--debug,--system-allocator=on,--linker-flag=-fuse-ld=gold
          --skip-list=parser-oom.js,parser-oom2.js

  Linux_ARMv7l_Tests:
    runs-on: ubuntu-latest
    env:
      RUNTIME: qemu-arm-static
      TIMEOUT: 300
    steps:
      - uses: actions/checkout@v2
      - run: sudo apt update
      - run: sudo apt install gcc-arm-linux-gnueabihf libc6-dev-armhf-cross qemu-user-static
      - run: >-
          $RUNNER -q --jerry-tests
          --buildoptions=--toolchain=cmake/toolchain_linux_armv7l.cmake,--linker-flag=-static

  Linux_AArch64_Tests:
    runs-on: ubuntu-latest
    env:
      RUNTIME: qemu-aarch64-static
      TIMEOUT: 300
    steps:
      - uses: actions/checkout@v2
      - run: sudo apt update
      - run: sudo apt install gcc-aarch64-linux-gnu libc6-dev-armhf-cross qemu-user-static
      - run: >-
          $RUNNER -q --jerry-tests
          --buildoptions=--toolchain=cmake/toolchain_linux_aarch64.cmake,--linker-flag=-static

  MbedOS5_K64F_Build_Test:
    runs-on: ubuntu-18.04 # needed due to ppa:team-gcc-arm-embedded/ppa
    steps:
      - uses: actions/checkout@v2
      - uses: actions/setup-python@v2
        with:
          python-version: '3.8' # needed due to 'intelhex' module
      - run: sudo add-apt-repository ppa:team-gcc-arm-embedded/ppa
      - run: sudo apt update
      - run: sudo apt install gcc-arm-embedded python3-setuptools
      - run: make -f ./targets/mbedos5/Makefile.travis install
      - run: make -f ./targets/mbedos5/Makefile.travis script

  Zephyr_Arduino_101_Build_Test:
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@v2
      - uses: actions/setup-python@v2
        with:
          python-version: '3.x'
      - run: sudo apt update
      - run: sudo apt install gperf dfu-util device-tree-compiler
      - run: make -f ./targets/zephyr/Makefile.travis install
      - run: make -f ./targets/zephyr/Makefile.travis script

  NuttX_STM32F4_Build_Test:
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@v2
      - run: sudo apt update
      - run: sudo apt install gcc-arm-none-eabi libnewlib-arm-none-eabi gperf
      - run: make -f ./targets/nuttx-stm32f4/Makefile.travis install-noapt
      - run: make -f ./targets/nuttx-stm32f4/Makefile.travis script

  RIOT_STM32F4_Build_Test:
    runs-on: ubuntu-18.04 # needed due to ppa:team-gcc-arm-embedded/ppa
    env:
      CC: clang
    steps:
      - uses: actions/checkout@v2
      - run: sudo add-apt-repository ppa:team-gcc-arm-embedded/ppa
      - run: sudo apt update
      - run: sudo apt install clang gcc-arm-embedded gcc-multilib
      - run: make -f ./targets/riot-stm32f4/Makefile.travis install-noapt
      - run: make -f ./targets/riot-stm32f4/Makefile.travis script

  ESP8266_Build_Test:
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@v2
      - uses: actions/setup-python@v2
        with:
          python-version: '2.7' # needed due to ESP8266_RTOS_SDK/tools/gen_appbin.py
      - run: make -f ./targets/esp8266/Makefile.travis install-noapt
      - run: make -f ./targets/esp8266/Makefile.travis script

  Notification:
    runs-on: ubuntu-latest
    if: github.event_name == 'push' && github.repository == 'jerryscript-project/jerryscript'
    steps:
      - uses: rectalogic/notify-irc@v1
        with:
          channel: '#jerryscript'
          nickname: jerryscript-notification
          message: |
            @${{ github.actor }}: ${{ github.repository }} (${{ github.ref }}#${{ github.sha }})
            ${{ join(github.event.commits.*.message) }}
            ${{ github.event.compare }}
