/*
 * 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 org.junit.runner.RunWith
import org.scalatest.junit.JUnitRunner
import common.WskActorSystem
import actionContainers.{ActionContainer, BasicActionRunnerTests}
import actionContainers.ActionContainer.withContainer
import actionContainers.ResourceHelpers.ZipBuilder
import spray.json._

@RunWith(classOf[JUnitRunner])
class Ruby25ActionContainerTests extends BasicActionRunnerTests with WskActorSystem {
  // note: "out" will not be empty as the Webrick outputs a message during the boot and after the boot
  val enforceEmptyOutputStream = false

  lazy val ruby25ContainerImageName = "action-ruby-v2.5"

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

  def withRuby25Container(code: ActionContainer => Unit) = withActionContainer()(code)

  behavior of ruby25ContainerImageName

  testEcho(Seq {
    (
      "RUBY",
      """
          |def main(args)
          |  puts 'hello stdout'
          |  warn 'hello stderr'
          |  args
          |end
          """.stripMargin)
  })

  testNotReturningJson("""
        |def main(args)
        |  "not a json object"
        |end
        """.stripMargin)

  testUnicode(Seq {
    (
      "RUBY",
      """
         |def main(args)
         |  str = args['delimiter'] + " ☃ " + args['delimiter']
         |  print str + "\n"
         |  {"winter" => str}
         |end
         """.stripMargin.trim)
  })

  testEnv(
    Seq {
      (
        "RUBY",
        """
         |def main(args)
         |  {
         |       "env" => ENV,
         |       "api_host" => ENV['__OW_API_HOST'],
         |       "api_key" => ENV['__OW_API_KEY'],
         |       "namespace" => ENV['__OW_NAMESPACE'],
         |       "action_name" => ENV['__OW_ACTION_NAME'],
         |       "activation_id" => ENV['__OW_ACTIVATION_ID'],
         |       "deadline" => ENV['__OW_DEADLINE']
         |  }
         |end
         """.stripMargin.trim)
    },
    enforceEmptyOutputStream)

  it should "fail to initialize with bad code" in {
    val (out, err) = withRuby25Container { c =>
      val code = """
                | 10 PRINT "Hello world!"
                | 20 GOTO 10
            """.stripMargin

      val (initCode, error) = c.init(initPayload(code))
      initCode should not be (200)
      error shouldBe a[Some[_]]
      error.get shouldBe a[JsObject]
      error.get.fields("error").toString should include("failed to parse the input code")
    }

    // Somewhere, the logs should mention an error occurred.
    checkStreams(out, err, {
      case (o, e) =>
        (o + e).toLowerCase should include("invalid")
        (o + e).toLowerCase should include("parse")
    })
  }

  it should "fail to initialize with no code" in {
    val (out, err) = withRuby25Container { c =>
      val code = ""

      val (initCode, error) = c.init(initPayload(code))

      initCode should not be (200)
      error shouldBe a[Some[_]]
      error.get shouldBe a[JsObject]
      error.get.fields("error").toString should include("method checking failed")
    }
  }

  it should "return some error on action error" in {
    val (out, err) = withRuby25Container { c =>
      val code = """
                | def main(args)
                |   raise Exception.new("nooooo")
                | end
            """.stripMargin

      val (initCode, _) = c.init(initPayload(code))
      initCode should be(200)

      val (runCode, runRes) = c.run(runPayload(JsObject()))
      runCode should not be (200)

      runRes shouldBe defined
      runRes.get.fields.get("error") shouldBe defined
    // runRes.get.fields("error").toString.toLowerCase should include("nooooo")
    }

    // Somewhere, the logs should be the error text
    checkStreams(out, err, {
      case (o, e) =>
        (o + e).toLowerCase should include("nooooo")
    })

  }

  it should "support application errors" in {
    withRuby25Container { c =>
      val code = """
                | def main(args)
                |   { "error" => "sorry" }
                | end
            """.stripMargin;

      val (initCode, error) = c.init(initPayload(code))
      initCode should be(200)

      val (runCode, runRes) = c.run(runPayload(JsObject()))
      runCode should be(200) // action writer returning an error is OK

      runRes shouldBe defined
      runRes.get.fields.get("error") shouldBe defined
      runRes.get.fields("error").toString.toLowerCase should include("sorry")
    }
  }

  it should "fail gracefully when an action has a TypeError exception" in {
    val (out, err) = withRuby25Container { c =>
      val code = """
                | def main(args)
                |   eval "class ENV\nend"
                |   { "hello" => "world" }
                | end
            """.stripMargin;

      val (initCode, _) = c.init(initPayload(code))
      initCode should be(200)

      val (runCode, runRes) = c.run(runPayload(JsObject()))
      runCode should be(502)

      runRes shouldBe defined
      runRes.get.fields.get("error") shouldBe defined
      runRes.get.fields("error").toString should include("An error occurred running the action")
    }

    // Somewhere, the logs should be the error text
    checkStreams(out, err, {
      case (o, e) =>
        (o + e).toLowerCase should include("typeerror")
    })
  }

  it should "support the documentation examples (1)" in {
    val (out, err) = withRuby25Container { c =>
      val code = """
                | def main(params)
                |   if (params['payload'] == 0) then
                |     return {}
                |   elsif params['payload'] == 1 then
                |     return {'payload' => 'Hello, World!'} # indicates normal completion
                |   elsif params['payload'] == 2 then
                |     return {'error' => 'payload must be 0 or 1'}  # indicates abnormal completion
                |   end
                | end
            """.stripMargin

      c.init(initPayload(code))._1 should be(200)

      val (c1, r1) = c.run(runPayload(JsObject("payload" -> JsNumber(0))))
      val (c2, r2) = c.run(runPayload(JsObject("payload" -> JsNumber(1))))
      val (c3, r3) = c.run(runPayload(JsObject("payload" -> JsNumber(2))))

      c1 should be(200)
      r1 should be(Some(JsObject()))

      c2 should be(200)
      r2 should be(Some(JsObject("payload" -> JsString("Hello, World!"))))

      c3 should be(200) // application error, not container or system
      r3.get.fields.get("error") shouldBe Some(JsString("payload must be 0 or 1"))
    }
  }

  it should "have mechanize and activesupport gems available" in {
    // GIVEN that it should "error when requiring a non-existent package" (see test above for this)
    val (out, err) = withRuby25Container { c =>
      val code = """
                | require 'mechanize'
                | require 'active_support'
                | def main(args)
                |   Mechanize.class
                |   ActiveSupport.class
                |   {}
                | end
            """.stripMargin

      val (initCode, _) = c.init(initPayload(code))

      initCode should be(200)

      // WHEN I run an action that calls a Guzzle & a Uuid method
      val (runCode, out) = c.run(runPayload(JsObject()))

      // THEN it should pass only when these packages are available
      runCode should be(200)
    }
  }

  it should "support large-ish actions" in {
    val thought = " I took the one less traveled by, and that has made all the difference."
    val assignment = "    x = \"" + thought + "\";\n"

    val code = """
            | def main(args)
            |   x = "hello"
            """.stripMargin + (assignment * 7000) + """
            |   x = "world"
            |   { "message" => x }
            | end
            """.stripMargin

    // Lest someone should make it too easy.
    code.length should be >= 500000

    val (out, err) = withRuby25Container { c =>
      c.init(initPayload(code))._1 should be(200)

      val (runCode, runRes) = c.run(runPayload(JsObject()))

      runCode should be(200)
      runRes.get.fields.get("message") shouldBe defined
      runRes.get.fields.get("message") shouldBe Some(JsString("world"))
    }
  }

  val exampleOutputDotRuby: String = """
        | def output(data)
        |   {'result' => data}
        | end
    """.stripMargin

  it should "support zip-encoded packages" in {
    val srcs = Seq(
      Seq("output.rb") -> exampleOutputDotRuby,
      Seq("main.rb") -> """
                | require __dir__ + '/output.rb'
                | def main(args)
                |   name = args['name'] || 'stranger'
                |   output(name)
                | end
            """.stripMargin)

    val code = ZipBuilder.mkBase64Zip(srcs)

    val (out, err) = withRuby25Container { c =>
      c.init(initPayload(code))._1 should be(200)

      val (runCode, runRes) = c.run(runPayload(JsObject()))

      runCode should be(200)
      runRes.get.fields.get("result") shouldBe defined
      runRes.get.fields.get("result") shouldBe Some(JsString("stranger"))
    }
  }

  it should "fail gracefully on invalid zip files" in {
    // Some text-file encoded to base64.
    val code = "Q2VjaSBuJ2VzdCBwYXMgdW4gemlwLgo="

    val (out, err) = withRuby25Container { c =>
      val (initCode, error) = c.init(initPayload(code))
      initCode should not be (200)
      error shouldBe a[Some[_]]
      error.get shouldBe a[JsObject]
      error.get.fields("error").toString should include("failed to open zip file")
    }

    // Somewhere, the logs should mention the failure
    checkStreams(out, err, {
      case (o, e) =>
        (o + e).toLowerCase should include("error")
        (o + e).toLowerCase should include("failed to open zip file")
    })
  }

  it should "fail gracefully on valid zip files that are not actions" in {
    val srcs = Seq(Seq("hello") -> """
                | Hello world!
            """.stripMargin)

    val code = ZipBuilder.mkBase64Zip(srcs)

    val (out, err) = withRuby25Container { c =>
      c.init(initPayload(code))._1 should not be (200)
    }

    checkStreams(out, err, {
      case (o, e) =>
        (o + e).toLowerCase should include("error")
        (o + e).toLowerCase should include("zipped actions must contain main.rb at the root.")
    })
  }

  it should "fail gracefully on valid zip files with invalid code in main.rb" in {
    val (out, err) = withRuby25Container { c =>
      val srcs = Seq(Seq("main.rb") -> """
                    | 10 PRINT "Hello world!"
                    | 20 GOTO 10
                """.stripMargin)

      val code = ZipBuilder.mkBase64Zip(srcs)

      val (initCode, error) = c.init(initPayload(code))
      initCode should not be (200)
      error shouldBe a[Some[_]]
      error.get shouldBe a[JsObject]
      error.get.fields("error").toString should include("failed to parse the input code")
    }

    // Somewhere, the logs should mention an error occurred.
    checkStreams(out, err, {
      case (o, e) =>
        (o + e).toLowerCase should include("invalid")
        (o + e).toLowerCase should include("parse")
    })
  }

  it should "support actions using non-default entry point" in {
    val (out, err) = withRuby25Container { c =>
      val code = """
            | def niam(args)
            |   { :result => "it works" }
            | end
            """.stripMargin

      c.init(initPayload(code, main = "niam"))._1 should be(200)
      val (runCode, runRes) = c.run(runPayload(JsObject()))
      runRes.get.fields.get("result") shouldBe Some(JsString("it works"))
    }
  }

  it should "support zipped actions using non-default entry point" in {
    val srcs = Seq(Seq("main.rb") -> """
                | def niam(args)
                |   { :result => "it works" }
                | end
            """.stripMargin)

    val code = ZipBuilder.mkBase64Zip(srcs)

    withRuby25Container { c =>
      c.init(initPayload(code, main = "niam"))._1 should be(200)

      val (runCode, runRes) = c.run(runPayload(JsObject()))
      runRes.get.fields.get("result") shouldBe Some(JsString("it works"))
    }
  }

}
