# 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-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
