library 'status-jenkins-lib@v1.5.1'

/* Options section can't access functions in objects. */
def isPRBuild = utils.isPRBuild()

pipeline {
  agent { label 'linux' }

  parameters {
    booleanParam(
      name: 'RELEASE',
      description: 'Decides whether binaries are built with debug symbols.',
      defaultValue: params.RELEASE ?: false
    )
    choice(
      name: 'VERBOSE',
      description: 'Level of verbosity based on nimbus-build-system setup.',
      choices: ['0', '1', '2']
    )
  }
  
  options {
    timestamps()
    /* Prevent Jenkins jobs from running forever */
    timeout(time: 60, unit: 'MINUTES')
    /* manage how many builds we keep */
    buildDiscarder(logRotator(
      numToKeepStr: '10',
      daysToKeepStr: '30',
      artifactNumToKeepStr: '3',
    ))
    /* Throttle number of concurrent builds. */
    throttleJobProperty(
      throttleEnabled: true,
      throttleOption: 'category',
      categories: ['status-desktop-e2e-tests'],
      maxConcurrentPerNode: 1,
      maxConcurrentTotal: 1
    )
    /* Abort old PR builds. */
    disableConcurrentBuilds(
      abortPrevious: isPRBuild
    )
  }

  environment {
    TARGET = 'e2e'
    /* Improve make performance */
    MAKEFLAGS = "-j4 V=${params.VERBOSE}"
    /* Disable colors in Nim compiler logs */
    NIMFLAGS = '--colors:off'
    /* Makefile assumes the compiler folder is included */
    QTDIR = "/opt/qt/5.14.2/gcc_64"
    /* Control output the filename */
    STATUS_CLIENT_APPIMAGE = "pkg/${utils.pkgFilename(ext: 'AppImage')}"
    STATUS_CLIENT_TARBALL = "pkg/${utils.pkgFilename(ext: 'tar.gz')}"
    /* Include library in order to compile the project */
    LD_LIBRARY_PATH = "$QTDIR/lib:$WORKSPACE/vendor/status-go/build/bin:$WORKSPACE/vendor/status-keycard-go/build/libkeycard/"
    INFURA_TOKEN = "cd313fedd0dd4699b194d72b5184be06"
  }

  stages {
    stage('Deps') {
      steps {
        /* trigger fetching of git submodules */
        sh 'make check-pkg-target-linux'
        /* TODO: Re-add caching of Nim compiler. */
        sh 'make deps'
      }
    }

    stage('status-go') {
      steps { sh 'make status-go' }
    }

    stage('build') {
      steps { sh 'make' }

    }

    stage('Tests') {
      steps {
       script {
          def goerli_rpc_port = 8577
          def mnemonic = "pelican chief sudden oval media rare swamp elephant lawsuit wheat knife initial"
          def goerli_db_path = "$WORKSPACE/test/ui-test/fixtures/ganache-dbs/goerli"
          docker.image('trufflesuite/ganache:v7.4.1').withRun(
            "-p 127.0.0.1:8577:8545 -v ${goerli_db_path}:/goerli-db",
            "-e 10 -m='${mnemonic}' --chain.chainId 5 --database.dbPath /goerli-db"
          ) { c ->
            sh "docker logs ${c.id}"
            withEnv(["GOERLI_NETWORK_RPC_URL=http://0.0.0.0:${goerli_rpc_port}"]){
              wrap([
                $class: 'Xvfb',
                autoDisplayName: true,
                parallelBuild: true,
                screen: '2560x1440x24',
              ]) {
                script {
                  def res = squish([
                    extraOptions: '''
                      --retry
                      2

                      --tags
                      ~mayfail
                      
                      --config
                      addAUT
                      nim_status_client
                      ${WORKSPACE}/bin
                    ''',
                    squishPackageName: 'squish-6.7.2-qt514x-linux64',
                    testSuite: '${WORKSPACE}/test/ui-test/testSuites/*',
                  ])
                  if ( res != "SUCCESS" ) {
                    throw new Exception("squish test didn't end with success")
                  }
                }
              }
            }
          }
        }
      }
    }
  }

  post {
    success { script { github.notifyPR(true) } }
    failure { script { github.notifyPR(false) } }
    always { cleanWs() }
  }
}