# Licensed to the Apache Software Foundation (ASF) under one
# or more contributor license agreements.  See the NOTICE file
# distributed with this work for additional information
# regarding copyright ownership.  The ASF licenses this file
# to you under the Apache License, Version 2.0 (the
# "License"); you may not use this file except in compliance
# with the License.  You may obtain a copy of the License at
#
#  http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing,
# software distributed under the License is distributed on an
# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
# KIND, either express or implied.  See the License for the
# specific language governing permissions and limitations
# under the License.

language: go

dist: bionic

_addons: &addon_conf
  apt:
    sources:
      - ubuntu-toolchain-r-test
    packages:
      - gcc-7-multilib
      - linux-libc-dev:i386

go:
  - "1.12"

git:
  depth: false

matrix:
  include:
    # Style checking
    - os: linux
      language: python
      python:
        - "3.5"
      addons:
        apt:
          packages:
            - "python3-pip"
      env:
        - TEST=STYLE
        - DEBUG=1

    # RAT Report
    - os: linux
      language: python
      python:
        - "3.5"
      env:
        - TEST=RAT
        - DEBUG=1

    # newt build <targets>
    - os: linux
      env:
        - TEST=BUILD_TARGETS
        - VM_AMOUNT=4
        - TARGET_SET=1
    - os: linux
      env:
        - TEST=BUILD_TARGETS
        - VM_AMOUNT=4
        - TARGET_SET=2
    - os: linux
      env:
        - TEST=BUILD_TARGETS
        - VM_AMOUNT=4
        - TARGET_SET=3
    - os: linux
      env:
        - TEST=BUILD_TARGETS
        - VM_AMOUNT=4
        - TARGET_SET=4

    # newt build <blinky-for-BSP>
    - os: linux
      env:
        - TEST=BUILD_BLINKY
        - VM_AMOUNT=4
        - TARGET_SET=1
    - os: linux
      env:
        - TEST=BUILD_BLINKY
        - VM_AMOUNT=4
        - TARGET_SET=2
    - os: linux
      env:
        - TEST=BUILD_BLINKY
        - VM_AMOUNT=4
        - TARGET_SET=3
    - os: linux
      env:
        - TEST=BUILD_BLINKY
        - VM_AMOUNT=4
        - TARGET_SET=4

    # newt test all (Linux)
    - os: linux
      addons: *addon_conf
      env:
        - TEST=TEST_ALL
        - VM_AMOUNT=3
        - TARGET_SET=1
    - os: linux
      addons: *addon_conf
      env:
        - TEST=TEST_ALL
        - VM_AMOUNT=3
        - TARGET_SET=2
    - os: linux
      addons: *addon_conf
      env:
        - TEST=TEST_ALL
        - VM_AMOUNT=3
        - TARGET_SET=3

    # newt test all (osx)
    - os: osx
      osx_image: xcode9.2
      env:
        - TEST=TEST_ALL
        - VM_AMOUNT=3
        - TARGET_SET=1
    - os: osx
      osx_image: xcode9.2
      env:
        - TEST=TEST_ALL
        - VM_AMOUNT=3
        - TARGET_SET=2
    - os: osx
      osx_image: xcode9.2
      env:
        - TEST=TEST_ALL
        - VM_AMOUNT=3
        - TARGET_SET=3
    - os: windows
      env:
        - TEST=BUILD_TARGETS_WINDOWS
        - VM_AMOUNT=1
        - TARGET_SET=1

before_install:
  - printenv
  - export GOPATH=$HOME/gopath
  - if [ "${TEST}" != "RAT" && "${TEST}" != "STYLE" ]; then go version; fi

install:
  - git clone https://github.com/JuulLabs-OSS/mynewt-travis-ci $HOME/ci
  - chmod +x $HOME/ci/*.sh
  - |
    if [ "${TEST}" == "RAT" ]; then
      pip install requests
    elif [ "${TEST}" == "STYLE" ]; then
      pip3 install requests
    else
      $HOME/ci/${TRAVIS_OS_NAME}_travis_install.sh
    fi

before_script:
  - |
    if [ "${TEST}" == "STYLE" ]; then
      $HOME/ci/install_uncrustify.sh
    elif [ "${TEST}" != "RAT" ]; then
      newt version
      gcc --version
      if [ "${TEST}" != "TEST_ALL" ]; then arm-none-eabi-gcc --version; fi
      cp -R $HOME/ci/mynewt-core-project.yml project.yml
      mkdir -p targets
      cp -R $HOME/ci/mynewt-core-targets targets
      newt upgrade
      # pass in the number of target sets
      $HOME/ci/prepare_test.sh $VM_AMOUNT
    fi

script:
  # the following list of targets are known to fail building blinky, or
  # might have extra dependencies hard to provide, non-common toolchains, etc
  # NOTE: "native" is here to avoid having to install gcc-multilib
  - export IGNORED_BSPS="ci40 embarc_emsk hifive1 native-armv7 native-mips
                         pic32mx470_6lp_clicker pic32mz2048_wi-fire sensorhub
                         native dialog_cmac"
  - |
    if [ "${TEST}" == "STYLE" ]; then
      python3 $HOME/ci/check_style.py
    elif [ "${TEST}" == "RAT" ]; then
      python $HOME/ci/check_license.py
    else
      $HOME/ci/run_test.sh
    fi

cache:
  directories:
  - $HOME/TOOLCHAIN
  - $HOME/Library/Caches/Homebrew
