# 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

_addons: &addon_conf
  apt:
    sources:
      - ubuntu-toolchain-r-test
    packages:
      - gcc-multilib
      - gcc-7-multilib

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

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

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

    # ports
    - os: linux
      addons: *addon_conf
      env:
        - TEST=BUILD_PORTS
        - VM_AMOUNT=1
        - TARGET_SET=1

    # newt test all
    - 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
  - go version

install:
  - git clone https://github.com/JuulLabs-OSS/mynewt-travis-ci $HOME/ci
  - chmod +x $HOME/ci/*.sh
  - |
    if [ "${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
    else
      newt version
      gcc --version
      if [ "${TEST}" != "TEST_ALL" ]; then arm-none-eabi-gcc --version; fi
      cp -R $HOME/ci/mynewt-nimble-project.yml project.yml
      mkdir -p targets
      cp -R $HOME/ci/mynewt-nimble-targets targets
      $HOME/ci/prepare_test.sh $VM_AMOUNT
      mkdir -p repos && pushd repos/
      git clone --depth=1 https://github.com/apache/mynewt-core apache-mynewt-core
      git clone --depth=1 https://github.com/JuulLabs-OSS/mcuboot mcuboot
      git clone --depth=1 https://github.com/apache/mynewt-mcumgr apache-mynewt-mcumgr
      popd
    fi

script:
  - |
    if [ "${TEST}" == "STYLE" ]; then
      python3 $HOME/ci/check_style.py
    else
      $HOME/ci/run_test.sh
    fi

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