name: CI

on:
  push:
    branches:
      - "master"
  pull_request:
    branches:
      - "*"

defaults:
  run:
    shell: bash

env:
  # go needs absolute directories, using the $HOME variable doesn't work here.
  GOCACHE: /home/runner/work/go/pkg/build
  GOPATH: /home/runner/work/go
  DOWNLOAD_CACHE: /home/runner/work/download_cache
  BITCOIN_VERSION: 0.20.1
  GO_VERSION: 1.15.2

jobs:
  ########################
  # RPC compilation check
  ########################
  rpc-check:
    name: RPC compilation check
    runs-on: ubuntu-latest
    steps:
      - name: git checkout
        uses: actions/checkout@v2

      - name: go cache
        uses: actions/cache@v1
        with:
          path: /home/runner/work/go
          key: lnd-${{ runner.os }}-go-${{ env.GO_VERSION }}-${{ github.job }}-${{ hashFiles('**/go.sum') }}
          restore-keys: |
            lnd-${{ runner.os }}-go-${{ env.GO_VERSION }}-${{ github.job }}-${{ hashFiles('**/go.sum') }}
            lnd-${{ runner.os }}-go-${{ env.GO_VERSION }}-${{ github.job }}-
            lnd-${{ runner.os }}-go-${{ env.GO_VERSION }}-
            lnd-${{ runner.os }}-go-

      - name: setup go ${{ env.GO_VERSION }}
        uses: actions/setup-go@v2
        with:
          go-version: '~${{ env.GO_VERSION }}'

      - name: download cache
        uses: actions/cache@v1
        with:
          path: /home/runner/work/download_cache
          key: lnd-${{ runner.os }}-download-${{ hashFiles('**/install_travis_proto.sh') }}
          restore-keys: |
            lnd-${{ runner.os }}-download-${{ hashFiles('**/install_travis_proto.sh') }}
            lnd-${{ runner.os }}-download-

      - name: install protoc and protobuf libraries
        run: ./scripts/install_travis_proto.sh

      - name: run check
        run: make rpc-check

  ########################
  # compile unit tests
  ########################
  unit-compile:
    name: compile unit tests
    runs-on: ubuntu-latest
    steps:
      - name: git checkout
        uses: actions/checkout@v2

      - name: go cache
        uses: actions/cache@v1
        with:
          path: /home/runner/work/go
          key: lnd-${{ runner.os }}-go-${{ env.GO_VERSION }}-${{ github.job }}-${{ hashFiles('**/go.sum') }}
          restore-keys: |
            lnd-${{ runner.os }}-go-${{ env.GO_VERSION }}-${{ github.job }}-${{ hashFiles('**/go.sum') }}
            lnd-${{ runner.os }}-go-${{ env.GO_VERSION }}-${{ github.job }}-
            lnd-${{ runner.os }}-go-${{ env.GO_VERSION }}-
            lnd-${{ runner.os }}-go-

      - name: setup go ${{ env.GO_VERSION }}
        uses: actions/setup-go@v2
        with:
          go-version: '~${{ env.GO_VERSION }}'

      - name: compile
        run: make unit pkg=... case=_NONE_

  ########################
  # lint code
  ########################
  lint:
    name: lint code
    runs-on: ubuntu-latest
    steps:
      - name: git checkout
        uses: actions/checkout@v2

      - name: Fetch all history for linter
        run: git fetch --prune --unshallow

      - name: go cache
        uses: actions/cache@v1
        with:
          path: /home/runner/work/go
          key: lnd-${{ runner.os }}-go-${{ env.GO_VERSION }}-${{ github.job }}-${{ hashFiles('**/go.sum') }}
          restore-keys: |
            lnd-${{ runner.os }}-go-${{ env.GO_VERSION }}-${{ github.job }}-${{ hashFiles('**/go.sum') }}
            lnd-${{ runner.os }}-go-${{ env.GO_VERSION }}-${{ github.job }}-
            lnd-${{ runner.os }}-go-${{ env.GO_VERSION }}-
            lnd-${{ runner.os }}-go-

      - name: setup go ${{ env.GO_VERSION }}
        uses: actions/setup-go@v2
        with:
          go-version: '~${{ env.GO_VERSION }}'

      - name: lint
        run: make lint

  ########################
  # cross compilation
  ########################
  cross-compile:
    name: cross compilation
    runs-on: ubuntu-latest
    strategy:
      matrix:
        build_sys:
          - windows-amd64
          - freebsd-amd64
          - solaris-amd64
    steps:
      - name: git checkout
        uses: actions/checkout@v2

      - name: go cache
        uses: actions/cache@v1
        with:
          path: /home/runner/work/go
          key: lnd-${{ runner.os }}-go-${{ env.GO_VERSION }}-${{ github.job }}-${{ hashFiles('**/go.sum') }}
          restore-keys: |
            lnd-${{ runner.os }}-go-${{ env.GO_VERSION }}-${{ github.job }}-${{ hashFiles('**/go.sum') }}
            lnd-${{ runner.os }}-go-${{ env.GO_VERSION }}-${{ github.job }}-
            lnd-${{ runner.os }}-go-${{ env.GO_VERSION }}-
            lnd-${{ runner.os }}-go-

      - name: setup go ${{ env.GO_VERSION }}
        uses: actions/setup-go@v2
        with:
          go-version: '~${{ env.GO_VERSION }}'

      - name: build release for architecture
        run: make release sys=${{ matrix.build_sys }}

  ########################
  # mobile compilation
  ########################
  mobile-compile:
    name: mobile compilation
    runs-on: ubuntu-latest
    steps:
      - name: git checkout
        uses: actions/checkout@v2

      - name: go cache
        uses: actions/cache@v1
        with:
          path: /home/runner/work/go
          key: lnd-${{ runner.os }}-go-${{ env.GO_VERSION }}-${{ github.job }}-${{ hashFiles('**/go.sum') }}
          restore-keys: |
            lnd-${{ runner.os }}-go-${{ env.GO_VERSION }}-${{ github.job }}-${{ hashFiles('**/go.sum') }}
            lnd-${{ runner.os }}-go-${{ env.GO_VERSION }}-${{ github.job }}-
            lnd-${{ runner.os }}-go-${{ env.GO_VERSION }}-
            lnd-${{ runner.os }}-go-

      - name: setup go ${{ env.GO_VERSION }}
        uses: actions/setup-go@v2
        with:
          go-version: '~${{ env.GO_VERSION }}'

      - name: download cache
        uses: actions/cache@v1
        with:
          path: /home/runner/work/download_cache
          key: lnd-${{ runner.os }}-download-${{ hashFiles('**/install_travis_proto.sh') }}
          restore-keys: |
            lnd-${{ runner.os }}-download-${{ hashFiles('**/install_travis_proto.sh') }}
            lnd-${{ runner.os }}-download-

      - name: install protoc and protobuf libraries
        run: ./scripts/install_travis_proto.sh

      - name: build mobile RPC bindings
        run: make mobile-rpc

      - name: build mobile specific code
        run: go build --tags="mobile" ./mobile

  ########################
  # sample configuration check
  ########################
  sample-conf-check:
    name: sample configuration check
    runs-on: ubuntu-latest
    steps:
      - name: git checkout
        uses: actions/checkout@v2

      - name: go cache
        uses: actions/cache@v1
        with:
          path: /home/runner/work/go
          key: lnd-${{ runner.os }}-go-${{ env.GO_VERSION }}-${{ github.job }}-${{ hashFiles('**/go.sum') }}
          restore-keys: |
            lnd-${{ runner.os }}-go-${{ env.GO_VERSION }}-${{ github.job }}-${{ hashFiles('**/go.sum') }}
            lnd-${{ runner.os }}-go-${{ env.GO_VERSION }}-${{ github.job }}-
            lnd-${{ runner.os }}-go-${{ env.GO_VERSION }}-
            lnd-${{ runner.os }}-go-

      - name: setup go ${{ env.GO_VERSION }}
        uses: actions/setup-go@v2
        with:
          go-version: '~${{ env.GO_VERSION }}'

      - name: download cache
        uses: actions/cache@v1
        with:
          path: /home/runner/work/download_cache
          key: lnd-${{ runner.os }}-download-${{ hashFiles('**/install_travis_proto.sh') }}
          restore-keys: |
            lnd-${{ runner.os }}-download-${{ hashFiles('**/install_travis_proto.sh') }}
            lnd-${{ runner.os }}-download-

      - name: check all command line flags exist in sample-lnd.conf file
        run: make sample-conf-check

  ########################
  # run unit tests
  ########################
  unit-test:
    name: run unit tests
    runs-on: ubuntu-latest
    strategy:
      # Allow other tests in the matrix to continue if one fails.
      fail-fast: false
      matrix:
        unit_type:
          - btcd unit-cover
          - unit tags=kvdb_etcd
          - travis-race
    steps:
      - name: git checkout
        uses: actions/checkout@v2

      - name: go cache
        uses: actions/cache@v1
        with:
          path: /home/runner/work/go
          key: lnd-${{ runner.os }}-go-${{ env.GO_VERSION }}-${{ github.job }}-${{ hashFiles('**/go.sum') }}
          restore-keys: |
            lnd-${{ runner.os }}-go-${{ env.GO_VERSION }}-${{ github.job }}-${{ hashFiles('**/go.sum') }}
            lnd-${{ runner.os }}-go-${{ env.GO_VERSION }}-${{ github.job }}-
            lnd-${{ runner.os }}-go-${{ env.GO_VERSION }}-
            lnd-${{ runner.os }}-go-

      - name: setup go ${{ env.GO_VERSION }}
        uses: actions/setup-go@v2
        with:
          go-version: '~${{ env.GO_VERSION }}'

      - name: install bitcoind
        run: ./scripts/install_bitcoind.sh

      - name: run ${{ matrix.unit_type }}
        run: make ${{ matrix.unit_type }}

      - name: Send coverage
        uses: shogo82148/actions-goveralls@v1
        if: matrix.unit_type == 'btcd unit-cover'
        with:
          path-to-profile: coverage.txt
          parallel: true
