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

import actionContainers.ActionContainer.withContainer
import actionContainers.{ActionContainer, BasicActionRunnerTests}
import common.WskActorSystem
import org.junit.runner.RunWith
import org.scalatest.junit.JUnitRunner

@RunWith(classOf[JUnitRunner])
class ActionLoopBasicTests extends BasicActionRunnerTests with WskActorSystem {

  val image = "actionloop"

  override def withActionContainer(env: Map[String, String] = Map.empty)(
      code: ActionContainer => Unit) = {
    withContainer(image, env)(code)
  }

  def withActionLoopContainer(code: ActionContainer => Unit) =
    withContainer(image)(code)

  behavior of image

  override val testNoSourceOrExec = TestConfig("")

  override val testNotReturningJson = TestConfig("""#!/bin/bash
      |read line
      |echo '"not json"' >&3
      |read line
      |""".stripMargin)

  override val testEcho = TestConfig("""|#!/bin/bash
       |while read line
       |do
       |    echo "hello stdout"
       |    echo "hello stderr" >&2
       |    echo "$line" | jq -c .value >&3
       |done
    """.stripMargin)

  override val testUnicode = TestConfig(
    """|#!/bin/bash
       |while read line
       |do
       |   delimiter="$(echo "$line" | jq -r ".value.delimiter")"
       |   msg="$delimiter ☃ $delimiter"
       |   echo "$msg"
       |   echo "{\"winter\": \"$msg\"}" >&3
       |done
    """.stripMargin)

  override val testEnv = TestConfig(
    """#!/bin/bash
      |while read line
      |do
      |  __OW_API_HOST="$(echo "$line"      | jq -r .api_host)"
      |  __OW_API_KEY="$(echo "$line"       | jq -r .api_key)"
      |  __OW_NAMESPACE="$(echo "$line"     | jq -r .namespace)"
      |  __OW_ACTIVATION_ID="$(echo "$line" | jq -r .activation_id)"
      |  __OW_ACTION_NAME="$(echo "$line"   | jq -r .action_name)"
      |  __OW_DEADLINE="$(echo "$line"      | jq -r .deadline)"
      |  echo >&3 "{ \
      |   \"api_host\": \"$__OW_API_HOST\", \
      |   \"api_key\": \"$__OW_API_KEY\", \
      |   \"namespace\": \"$__OW_NAMESPACE\", \
      |   \"activation_id\": \"$__OW_ACTIVATION_ID\", \
      |   \"action_name\": \"$__OW_ACTION_NAME\", \
      |   \"deadline\": \"$__OW_DEADLINE\" }"
      | done
    """.stripMargin)

  val echoSh =
    """|#!/bin/bash
       |while read line
       |do echo "$line" | jq -c .value  >&3
       |done
    """.stripMargin

  override val testInitCannotBeCalledMoreThanOnce = TestConfig(echoSh)

  override val testEntryPointOtherThanMain = TestConfig(echoSh, main = "niam")

  override val testLargeInput = TestConfig(echoSh)
}
