/*
 * 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.
 */

package org.apache.openwhisk.core.cli.test

import java.io.File
import java.io.BufferedWriter
import java.io.FileWriter
import org.junit.runner.RunWith
import org.scalatest.junit.JUnitRunner

import org.apache.commons.io.FileUtils

import common.WhiskProperties
import common.TestHelpers
import common.TestUtils._
import common.Wsk
import common.WskProps
import common.WskTestHelpers
import java.nio.charset.StandardCharsets

@RunWith(classOf[JUnitRunner])
class WskConfigTests extends TestHelpers with WskTestHelpers {

  implicit val wskprops = WskProps()
  val wsk = new Wsk

  behavior of "Wsk CLI config"

  it should "fail to show api build when setting apihost to bogus value" in {
    val tmpwskprops = File.createTempFile("wskprops", ".tmp")
    try {
      val env = Map("WSK_CONFIG_FILE" -> tmpwskprops.getAbsolutePath())
      wsk.cli(Seq("property", "set", "-i", "--apihost", "xxxx.yyyy"), env = env)
      val rr = wsk.cli(Seq("property", "get", "--apibuild", "-i"), env = env, expectedExitCode = NETWORK_ERROR_EXIT)
      rr.stdout should include regex ("""whisk API build\s*Unknown""")
      rr.stderr should include regex ("Unable to obtain API build information")
    } finally {
      tmpwskprops.delete()
    }
  }

  it should "use default cli configuration when an empty string WSK_CONFIG_FILE is supplied" in {
    val env = Map("WSK_CONFIG_FILE" -> "")
    val stderr = wsk.cli(Seq("property", "get", "-i"), env = env, expectedExitCode = ERROR_EXIT).stderr
    stderr should include("The API host is not valid: An API host must be provided.")
  }

  it should "validate default property values" in {
    val tmpwskprops = File.createTempFile("wskprops", ".tmp")
    val env = Map("WSK_CONFIG_FILE" -> tmpwskprops.getAbsolutePath())
    val stdout = wsk
      .cli(Seq("property", "unset", "--auth", "--cert", "--key", "--apihost", "--apiversion", "--namespace"), env = env)
      .stdout
    try {
      stdout should include regex ("ok: whisk auth unset")
      stdout should include regex ("ok: client cert unset")
      stdout should include regex ("ok: client key unset")
      stdout should include regex ("ok: whisk API host unset")
      stdout should include regex ("ok: whisk API version unset")
      stdout should include regex ("ok: whisk namespace unset")

      wsk
        .cli(Seq("property", "get", "--auth"), env = env)
        .stdout should include regex ("""(?i)whisk auth\s*$""") // default = empty string
      wsk
        .cli(Seq("property", "get", "--cert"), env = env)
        .stdout should include regex ("""(?i)client cert\s*$""") // default = empty string
      wsk
        .cli(Seq("property", "get", "--key"), env = env)
        .stdout should include regex ("""(?i)client key\s*$""") // default = empty string
      wsk
        .cli(Seq("property", "get", "--apihost"), env = env)
        .stdout should include regex ("""(?i)whisk API host\s*$""") // default = empty string
      wsk
        .cli(Seq("property", "get", "--namespace"), env = env)
        .stdout should include regex ("""(?i)whisk namespace\s*_$""") // default = _
    } finally {
      tmpwskprops.delete()
    }
  }

  it should "reject authenticated command when no auth key is given" in {
    // override wsk props file in case it exists
    val tmpwskprops = File.createTempFile("wskprops", ".tmp")
    val env = Map("WSK_CONFIG_FILE" -> tmpwskprops.getAbsolutePath())
    val stderr = wsk.cli(Seq("list") ++ wskprops.overrides, env = env, expectedExitCode = MISUSE_EXIT).stderr
    try {
      stderr should include regex (s"usage[:.]")
      stderr should include("--auth is required")
    } finally {
      tmpwskprops.delete()
    }
  }

  it should "reject a command when the API host is not set" in {
    val tmpwskprops = File.createTempFile("wskprops", ".tmp")
    try {
      val env = Map("WSK_CONFIG_FILE" -> tmpwskprops.getAbsolutePath())
      val stderr = wsk.cli(Seq("property", "get", "-i"), env = env, expectedExitCode = ERROR_EXIT).stderr
      stderr should include("The API host is not valid: An API host must be provided.")
    } finally {
      tmpwskprops.delete()
    }
  }

  it should "show api build details" in {
    val tmpProps = File.createTempFile("wskprops", ".tmp")
    try {
      val env = Map("WSK_CONFIG_FILE" -> tmpProps.getAbsolutePath())
      wsk.cli(Seq("property", "set", "-i") ++ wskprops.overrides, env = env)
      val rr = wsk.cli(Seq("property", "get", "--apibuild", "--apibuildno", "-i"), env = env)
      rr.stderr should not include ("https:///api/v1: http: no Host in request URL")
      rr.stdout should not include regex("Cannot determine API build")
      rr.stdout should include regex ("""(?i)whisk API build\s+201.*""")
      rr.stdout should include regex ("""(?i)whisk API build number\s+.*""")
    } finally {
      tmpProps.delete()
    }
  }

  it should "get apihost removing any trailing white spaces and line comments" in {
    val tmpwskprops = File.createTempFile("wskprops", ".tmp")
    try {
      val writer = new BufferedWriter(new FileWriter(tmpwskprops))
      writer.write(s"APIHOST=http://localhost:10001    # This is a comment!   ")
      writer.close()
      val env = Map("WSK_CONFIG_FILE" -> tmpwskprops.getAbsolutePath())
      val stdout = wsk.cli(Seq("property", "get", "-i", "--apihost"), env = env).stdout
      stdout should include regex ("whisk API host\\s+http://localhost:10001$")
    } finally {
      tmpwskprops.delete()
    }
  }

  it should "set apihost, auth, and namespace" in {
    val tmpwskprops = File.createTempFile("wskprops", ".tmp")
    try {
      val namespace = wsk.namespace.whois()
      val env = Map("WSK_CONFIG_FILE" -> tmpwskprops.getAbsolutePath())
      val stdout = wsk
        .cli(
          Seq(
            "property",
            "set",
            "-i",
            "--apihost",
            wskprops.apihost,
            "--auth",
            wskprops.authKey,
            "--namespace",
            namespace),
          env = env)
        .stdout
      stdout should include(s"ok: whisk auth set")
      stdout should include(s"ok: whisk API host set to ${wskprops.apihost}")
      stdout should include(s"ok: whisk namespace set to ${namespace}")
    } finally {
      tmpwskprops.delete()
    }
  }

  // If client certificate verification is off, should ingore run below tests.
  if (!WhiskProperties.getProperty("whisk.ssl.client.verification").equals("off")) {
    it should "set valid cert key to get expected success result for client certificate verification" in {
      val tmpwskprops = File.createTempFile("wskprops", ".tmp")
      try {
        val namespace = wsk.namespace.list().stdout.trim.split("\n").last
        val env = Map("WSK_CONFIG_FILE" -> tmpwskprops.getAbsolutePath())
        // Send request to https://<apihost>/api/v1/namespaces, wsk client passes client certificate to nginx, nginx will
        // verify it by client ca's openwhisk-client-ca-cert.pem
        val stdout = wsk
          .cli(
            Seq(
              "property",
              "set",
              "-i",
              "--apihost",
              wskprops.apihost,
              "--auth",
              wskprops.authKey,
              "--cert",
              wskprops.cert,
              "--key",
              wskprops.key,
              "--namespace",
              namespace),
            env = env)
          .stdout
        stdout should include(s"ok: client cert set")
        stdout should include(s"ok: client key set")
        stdout should include(s"ok: whisk auth set")
        stdout should include(s"ok: whisk API host set to ${wskprops.apihost}")
        stdout should include(s"ok: whisk namespace set to ${namespace}")
      } finally {
        tmpwskprops.delete()
      }
    }

    it should "set invalid cert key to get expected exception result for client certificate verification" in {
      val tmpwskprops = File.createTempFile("wskprops", ".tmp")
      try {
        val namespace = wsk.namespace.list().stdout.trim.split("\n").last
        val env = Map("WSK_CONFIG_FILE" -> tmpwskprops.getAbsolutePath())
        val thrown = the[Exception] thrownBy wsk.cli(
          Seq(
            "property",
            "set",
            "-i",
            "--apihost",
            wskprops.apihost,
            "--auth",
            wskprops.authKey,
            "--cert",
            "invalid-cert.pem",
            "--key",
            "invalid-key.pem",
            "--namespace",
            namespace),
          env = env)
        thrown.getMessage should include("cannot validate certificate")
      } finally {
        tmpwskprops.delete()
      }
    }
  }

  it should "ensure default namespace is used when a blank namespace is set" in {
    val tmpwskprops = File.createTempFile("wskprops", ".tmp")
    try {
      val writer = new BufferedWriter(new FileWriter(tmpwskprops))
      writer.write(s"NAMESPACE=")
      writer.close()
      val env = Map("WSK_CONFIG_FILE" -> tmpwskprops.getAbsolutePath())
      val stdout = wsk.cli(Seq("property", "get", "-i", "--namespace"), env = env).stdout
      stdout should include regex ("whisk namespace\\s+_")
    } finally {
      tmpwskprops.delete()
    }
  }

  it should "show api build version using property file" in {
    val tmpwskprops = File.createTempFile("wskprops", ".tmp")
    try {
      val env = Map("WSK_CONFIG_FILE" -> tmpwskprops.getAbsolutePath())
      wsk.cli(Seq("property", "set", "-i") ++ wskprops.overrides, env = env)
      val stdout = wsk.cli(Seq("property", "get", "--apibuild", "-i"), env = env).stdout
      stdout should include regex ("""(?i)whisk API build\s+201.*""")
    } finally {
      tmpwskprops.delete()
    }
  }

  it should "show api build using explicit protocol for apihost" in {
    val tmpwskprops = File.createTempFile("wskprops", ".tmp")
    try {
      val env = Map("WSK_CONFIG_FILE" -> tmpwskprops.getAbsolutePath())
      val controllerProtocol = WhiskProperties.getProperty("controller.protocol")
      val apihost =
        s"${controllerProtocol}://${WhiskProperties.getBaseControllerHost()}"
      wsk.cli(Seq("property", "set", "--apihost", apihost), env = env)
      val rr = wsk.cli(Seq("property", "get", "--apibuild", "-i"), env = env)
      rr.stdout should not include regex("""whisk API build\s*Unknown""")
      rr.stderr should not include regex("Unable to obtain API build information")
      rr.stdout should include regex ("""(?i)whisk API build\s+201.*""")
    } finally {
      tmpwskprops.delete()
    }
  }

  it should "return configure the missing Cert file" in {
    val tmpwskprops = File.createTempFile("wskprops", ".tmp")
    val keyFile = File.createTempFile("key", ".pem")
    try {
      val writer = new BufferedWriter(new FileWriter(tmpwskprops))
      writer.write(s"KEY=${keyFile.getAbsolutePath()}\n")
      writer.close()
      val env = Map("WSK_CONFIG_FILE" -> tmpwskprops.getAbsolutePath())
      val stderr = wsk
        .cli(
          Seq("property", "get", "--apibuild", "--apihost", wskprops.apihost, "--apiversion", wskprops.apiversion),
          env = env,
          expectedExitCode = ERROR_EXIT)
        .stderr
      stderr should include regex ("""The Cert file is not configured. Please configure the missing Cert file.""")
    } finally {
      tmpwskprops.delete()
      keyFile.delete()
    }
  }

  it should "return configure the missing Key file" in {
    val tmpwskprops = File.createTempFile("wskprops", ".tmp")
    val certFile = File.createTempFile("cert", ".pem")
    try {
      val writer = new BufferedWriter(new FileWriter(tmpwskprops))
      writer.write(s"CERT=${certFile.getAbsolutePath()}\n")
      writer.close()
      val env = Map("WSK_CONFIG_FILE" -> tmpwskprops.getAbsolutePath())
      val stderr = wsk
        .cli(
          Seq("property", "get", "--apibuild", "--apihost", wskprops.apihost, "--apiversion", wskprops.apiversion),
          env = env,
          expectedExitCode = ERROR_EXIT)
        .stderr
      stderr should include regex ("""The Key file is not configured. Please configure the missing Key file.""")
    } finally {
      tmpwskprops.delete()
      certFile.delete()
    }
  }

  it should "return unable to load the X509 key pair with both Cert and Key files missing" in {
    val tmpwskprops = File.createTempFile("wskprops", ".tmp")
    val certFile = File.createTempFile("cert", ".pem")
    val keyFile = File.createTempFile("key", ".pem")
    try {
      val writer = new BufferedWriter(new FileWriter(tmpwskprops))
      writer.write(s"CERT=${certFile.getAbsolutePath()}\n")
      writer.write(s"KEY=${keyFile.getAbsolutePath()}\n")
      writer.close()
      val env = Map("WSK_CONFIG_FILE" -> tmpwskprops.getAbsolutePath())
      val stderr = wsk
        .cli(
          Seq("property", "get", "--apibuild", "--apihost", wskprops.apihost, "--apiversion", wskprops.apiversion),
          env = env,
          expectedExitCode = ERROR_EXIT)
        .stderr
      stderr should include regex ("""Unable to load the X509 key pair due to the following reason""")
    } finally {
      tmpwskprops.delete()
      certFile.delete()
      keyFile.delete()
    }
  }

  it should "set api host with or without http prefix" in {
    val tmpwskprops = File.createTempFile("wskprops", ".tmp")
    try {
      val env = Map("WSK_CONFIG_FILE" -> tmpwskprops.getAbsolutePath())
      Seq("", "http://", "https://").foreach { prefix =>
        Seq("10", "10:123", "aaa", "aaa:123").foreach { host =>
          val apihost = s"$prefix$host"
          withClue(apihost) {
            val rr = wsk.cli(Seq("property", "set", "--apihost", apihost), env = env)
            rr.stdout.trim shouldBe s"ok: whisk API host set to $apihost"
            rr.stderr shouldBe 'empty
            val fileContent = FileUtils.readFileToString(tmpwskprops, StandardCharsets.UTF_8)
            fileContent should include(s"APIHOST=$apihost")
          }
        }
      }
    } finally {
      tmpwskprops.delete()
    }
  }

  it should "set auth in property file" in {
    val tmpwskprops = File.createTempFile("wskprops", ".tmp")
    val env = Map("WSK_CONFIG_FILE" -> tmpwskprops.getAbsolutePath())
    wsk.cli(Seq("property", "set", "--auth", "testKey"), env = env)
    try {
      val fileContent = FileUtils.readFileToString(tmpwskprops, StandardCharsets.UTF_8)
      fileContent should include("AUTH=testKey")
    } finally {
      tmpwskprops.delete()
    }
  }

  it should "set multiple property values with single command" in {
    val tmpwskprops = File.createTempFile("wskprops", ".tmp")
    val env = Map("WSK_CONFIG_FILE" -> tmpwskprops.getAbsolutePath())
    val stdout = wsk
      .cli(
        Seq(
          "property",
          "set",
          "--auth",
          "testKey",
          "--cert",
          wskprops.cert,
          "--key",
          wskprops.key,
          "--apihost",
          "openwhisk.ng.bluemix.net",
          "--apiversion",
          "v1"),
        env = env)
      .stdout
    try {
      stdout should include regex ("ok: whisk auth set")
      stdout should include regex ("ok: client cert set")
      stdout should include regex ("ok: client key set")
      stdout should include regex ("ok: whisk API host set")
      stdout should include regex ("ok: whisk API version set")
      val fileContent = FileUtils.readFileToString(tmpwskprops, StandardCharsets.UTF_8)
      fileContent should include("AUTH=testKey")
      fileContent should include("APIHOST=openwhisk.ng.bluemix.net")
      fileContent should include("APIVERSION=v1")
    } finally {
      tmpwskprops.delete()
    }
  }

  it should "create a trigger using property file" in withAssetCleaner(wskprops) { (wp, assetHelper) =>
    val name = "listTriggers"
    val tmpProps = File.createTempFile("wskprops", ".tmp")
    val env = Map("WSK_CONFIG_FILE" -> tmpProps.getAbsolutePath())
    wsk.cli(Seq("property", "set", "--auth", wp.authKey) ++ wskprops.overrides, env = env)
    assetHelper.withCleaner(wsk.trigger, name) { (trigger, _) =>
      wsk.cli(Seq("-i", "trigger", "create", name), env = env)
    }
    tmpProps.delete()
  }

  it should "return configure the missing Cert file for action" in {
    val tmpwskprops = File.createTempFile("wskprops", ".tmp")
    val keyFile = File.createTempFile("key", ".pem")
    try {
      val writer = new BufferedWriter(new FileWriter(tmpwskprops))
      writer.write(s"KEY=${keyFile.getAbsolutePath()}\n")
      writer.close()
      val env = Map("WSK_CONFIG_FILE" -> tmpwskprops.getAbsolutePath())
      val stderr = wsk
        .cli(
          Seq("action", "list", "--apihost", wskprops.apihost, "--apiversion", wskprops.apiversion),
          env = env,
          expectedExitCode = ERROR_EXIT)
        .stderr
      stderr should include regex ("""The Cert file is not configured. Please configure the missing Cert file.""")
    } finally {
      tmpwskprops.delete()
      keyFile.delete()
    }
  }

  it should "return configure the missing Key file for action" in {
    val tmpwskprops = File.createTempFile("wskprops", ".tmp")
    val certFile = File.createTempFile("cert", ".pem")
    try {
      val writer = new BufferedWriter(new FileWriter(tmpwskprops))
      writer.write(s"CERT=${certFile.getAbsolutePath()}\n")
      writer.close()
      val env = Map("WSK_CONFIG_FILE" -> tmpwskprops.getAbsolutePath())
      val stderr = wsk
        .cli(
          Seq("action", "list", "--apihost", wskprops.apihost, "--apiversion", wskprops.apiversion),
          env = env,
          expectedExitCode = ERROR_EXIT)
        .stderr
      stderr should include regex ("""The Key file is not configured. Please configure the missing Key file.""")
    } finally {
      tmpwskprops.delete()
      certFile.delete()
    }
  }

  it should "return unable to load the X509 key pair with both Cert and Key files missing for action" in {
    val tmpwskprops = File.createTempFile("wskprops", ".tmp")
    val certFile = File.createTempFile("cert", ".pem")
    val keyFile = File.createTempFile("key", ".pem")
    try {
      val writer = new BufferedWriter(new FileWriter(tmpwskprops))
      writer.write(s"CERT=${certFile.getAbsolutePath()}\n")
      writer.write(s"KEY=${keyFile.getAbsolutePath()}\n")
      writer.close()
      val env = Map("WSK_CONFIG_FILE" -> tmpwskprops.getAbsolutePath())
      val stderr = wsk
        .cli(
          Seq("action", "list", "--apihost", wskprops.apihost, "--apiversion", wskprops.apiversion),
          env = env,
          expectedExitCode = ERROR_EXIT)
        .stderr
      stderr should include regex ("""Unable to load the X509 key pair due to the following reason""")
    } finally {
      tmpwskprops.delete()
      certFile.delete()
      keyFile.delete()
    }
  }
}
