#
# Copyright (c) 2019, 2021 Oracle and/or its affiliates. All rights reserved.
#
# This program and the accompanying materials are made available under the
# terms of the Eclipse Public License v. 2.0 which is available at
# http://www.eclipse.org/legal/epl-2.0,
# or the Eclipse Distribution License v. 1.0 which is available at
# http://www.eclipse.org/org/documents/edl-v10.php.
#
# SPDX-License-Identifier: EPL-2.0 OR BSD-3-Clause
#

language: java
sudo: required
dist: focal

branches:
  except:
    - /^[12].[0-6].*/

services:
  - mysql
  - mongodb

env:
  global:
    - MAVEN_OPTS="-Dorg.slf4j.simpleLogger.log.org.apache.maven.cli.transfer.Slf4jMavenTransferListener=warn"
  matrix:
    - MAVEN_TEST=core-lrg-mysql
    - MAVEN_TEST=jpa-lrg-mysql
    - MAVEN_TEST=moxy-lrg
    - MAVEN_TEST=sdo-lrg
    - MAVEN_TEST=nosql-lrg
    - MAVEN_TEST="jpa-modelgen jpa-jse ext jpql wdf jpars dbws dbws-builder distribution"
    - MAVEN_TEST=javadoc
    - MAVEN_TEST=corba
#    - MAVEN_TEST=jpa-lrg-server1-mysql
#    - MAVEN_TEST=jpa-lrg-server2-mysql

jobs:
  allow_failures:
    - env: MAVEN_TEST=jpa-lrg-server1-mysql
    - env: MAVEN_TEST=jpa-lrg-server2-mysql
    - jdk: openjdk-ea

jdk:
  - openjdk11
  - openjdk15
  - openjdk-ea

cache:
  directories:
    - .autoconf
    - $HOME/.m2
    - $HOME/lib.external

before_install:
  - sudo mysql -u root -e "use mysql; ALTER USER 'root'@'localhost' IDENTIFIED BY 'root'; FLUSH PRIVILEGES;CREATE DATABASE IF NOT EXISTS ecltests;"
  - sudo service mysql restart
  - sudo mysql -u root -proot -e "SET GLOBAL log_bin_trust_function_creators = 1;"

install:
  - mkdir $HOME/lib.external || true
  - wget -nc https://download.jboss.org/wildfly/18.0.0.Final/wildfly-18.0.0.Final.tar.gz -O $HOME/lib.external/wildfly-18.0.0.Final.tar.gz || true
  - cp etc/el-test.derby.properties ~
  - cp etc/el-test.mysql.properties ~
  - cp etc/el-test.mongodb.properties ~
  - cp etc/el-testjee.wildfly.properties ~
  - sed -i -e 's+skip.jee.server.installation=false+skip.jee.server.installation=true+g' ~/el-testjee.wildfly.properties
  - sed -i -e 's+${user.home}/.eclipselinktests/wildfly-18.0.0.Final+'$HOME'/wildfly-18.0.0.Final+g' ~/el-testjee.wildfly.properties


before_script:
  - mvn -Dorg.slf4j.simpleLogger.log.org.apache.maven.cli.transfer.Slf4jMavenTransferListener=warn -B clean install -pl '!:eclipselink,!:org.eclipse.persistence.bundles.other,!:org.eclipse.persistence.distribution.tests,!:p2site' -DskipTests

script:
  - echo 'RUNNING TESTS, BE PATIENT...'
  - echo 'ENVIRONMENT:'
  - env
  - set -o pipefail
  - if [ "$MAVEN_TEST" == "core-lrg-mysql" ]; then mvn verify -pl :org.eclipse.persistence.core.test -P test-core-lrg,mysql; fi
  - if [ "$MAVEN_TEST" == "jpa-lrg-mysql" ]; then mvn verify -pl :org.eclipse.persistence.jpa.test -P test-jpa-lrg,mysql; fi
  - if [ "$MAVEN_TEST" == "moxy-lrg" ]; then mvn test -pl :org.eclipse.persistence.moxy -P test-moxy-lrg; fi
  - if [ "$MAVEN_TEST" == "sdo-lrg" ]; then mvn verify -pl :org.eclipse.persistence.sdo -Ptest-sdo; fi
  - if [ "$MAVEN_TEST" == "nosql-lrg" ]; then mvn verify -pl :org.eclipse.persistence.nosql -P mongodb; fi
  - if [ "$MAVEN_TEST" == "jpa-modelgen jpa-jse ext jpql wdf jpars dbws dbws-builder distribution" ]; then
      mvn clean install -pl :eclipselink;
      mvn verify -pl :org.eclipse.persistence.jpa.modelgen.processor,:org.eclipse.persistence.jpa.jse.test,:org.eclipse.persistence.extension,:org.eclipse.persistence.jpa.jpql,:org.eclipse.persistence.jpa.wdf.test,:org.eclipse.persistence.jpars,:org.eclipse.persistence.dbws,:org.eclipse.persistence.dbws.builder,:eclipselink,:org.eclipse.persistence.distribution.tests -P mysql;
    fi
  - if [ "$MAVEN_TEST" == "corba" ]; then mvn verify -pl :org.eclipse.persistence.corba -P mysql; fi
  - if [ "$MAVEN_TEST" == "jpa-lrg-server1-mysql" ]; then
      tar -x -z -C $HOME -f $HOME/lib.external/wildfly-18.0.0.Final.tar.gz;
      mvn verify -pl :org.eclipse.persistence.jpa.test -P server-test-jpa-lrg1,mysql;
    fi
  - if [ "$MAVEN_TEST" == "jpa-lrg-server2-mysql" ]; then
      tar -x -z -C $HOME -f $HOME/lib.external/wildfly-18.0.0.Final.tar.gz;
      mvn verify -pl :org.eclipse.persistence.jpa.test -P server-test-jpa-lrg2,mysql;
    fi
  - if [ "$MAVEN_TEST" == "javadoc" ]; then mvn package -DskipTests -Poss-release; fi
