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

dist: trusty
sudo: required

env:
  - TEST_TYPE=default

install: true
language: java
jdk:
  - oraclejdk8
before_install:
  - wget https://archive.apache.org/dist/maven/maven-3/3.3.9/binaries/apache-maven-3.3.9-bin.zip
  - unzip -qq apache-maven-3.3.9-bin.zip
  - export M2_HOME=$PWD/apache-maven-3.3.9
  - export PATH=$M2_HOME/bin:$PATH
  - npm config set cache $HOME/.npm-cache --global
  - npm config set prefix $HOME/.npm-prefix --global

install:
  - time mvn -q -T 2C -DskipTests clean install

script:
  - time mvn -q -T 2C surefire:test@unit-tests && time mvn -q surefire:test@integration-tests && time mvn -q test --projects metron-interface/metron-config && time dev-utilities/build-utils/verify_licenses.sh

before_cache:
  - rm -rf $HOME/.m2/repository/org/apache/metron

cache:
  timeout: 1000
  directories:
  - $HOME/.npm-cache
  - $HOME/.npm-prefix
  - metron-interface/metron-config/node_modules
  - $HOME/.m2
  - $HOME/.npm
