You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@openwhisk.apache.org by cs...@apache.org on 2017/09/18 14:55:37 UTC

[incubator-openwhisk-cli] 09/16: API gw test cleanup (#2493)

This is an automated email from the ASF dual-hosted git repository.

csantanapr pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/incubator-openwhisk-cli.git

commit 6101281af08d0f3dcbf5a1fad35026b996a94f4a
Author: rodric rabbah <ro...@gmail.com>
AuthorDate: Tue Sep 5 15:05:21 2017 -0400

    API gw test cleanup (#2493)
    
    * Replace unnecessary vars.
    Refactor check throttle.
    
    * Review comments.
---
 .../apigw/healthtests/ApiGwEndToEndTests.scala     |  22 +-
 .../scala/whisk/core/cli/test/ApiGwTests.scala     | 341 ++++++++++-----------
 2 files changed, 173 insertions(+), 190 deletions(-)

diff --git a/tests/src/test/scala/apigw/healthtests/ApiGwEndToEndTests.scala b/tests/src/test/scala/apigw/healthtests/ApiGwEndToEndTests.scala
index dd70b6d..332a5ca 100644
--- a/tests/src/test/scala/apigw/healthtests/ApiGwEndToEndTests.scala
+++ b/tests/src/test/scala/apigw/healthtests/ApiGwEndToEndTests.scala
@@ -97,11 +97,10 @@ class ApiGwEndToEndTests
                 action = Some(actionName),
                 apiname = Some(testapiname),
                 responsetype = Some("http"),
-                cliCfgFile = Some(cliWskPropsFile.getCanonicalPath())
-            )
+                cliCfgFile = Some(cliWskPropsFile.getCanonicalPath()))
             rr.stdout should include("ok: created API")
             val apiurl = rr.stdout.split("\n")(1)
-            println(s"apiurl: '${apiurl}'")
+            println(s"apiurl: '$apiurl'")
 
             // Validate the API was successfully created
             // List result will look like:
@@ -112,17 +111,15 @@ class ApiGwEndToEndTests
                 basepathOrApiName = Some(testbasepath),
                 relpath = Some(testrelpath),
                 operation = Some(testurlop),
-                cliCfgFile = Some(cliWskPropsFile.getCanonicalPath())
-            )
+                cliCfgFile = Some(cliWskPropsFile.getCanonicalPath()))
             rr.stdout should include("ok: APIs")
-            rr.stdout should include regex (s"${actionName}\\s+${testurlop}\\s+${testapiname}\\s+")
+            rr.stdout should include regex (s"$actionName\\s+$testurlop\\s+$testapiname\\s+")
             rr.stdout should include(testbasepath + testrelpath)
 
             // Recreate the API using a JSON swagger file
             rr = wsk.api.get(
                 basepathOrApiName = Some(testbasepath),
-                cliCfgFile = Some(cliWskPropsFile.getCanonicalPath())
-            )
+                cliCfgFile = Some(cliWskPropsFile.getCanonicalPath()))
             val swaggerfile = File.createTempFile("api", ".json")
             swaggerfile.deleteOnExit()
             val bw = new BufferedWriter(new FileWriter(swaggerfile))
@@ -133,14 +130,12 @@ class ApiGwEndToEndTests
             val deleteApiResult = wsk.api.delete(
                 basepathOrApiName = testbasepath,
                 expectedExitCode = DONTCARE_EXIT,
-                cliCfgFile = Some(cliWskPropsFile.getCanonicalPath())
-            )
+                cliCfgFile = Some(cliWskPropsFile.getCanonicalPath()))
 
             // Create the API again, but use the swagger file this time
             rr = wsk.api.create(
                 swagger = Some(swaggerfile.getAbsolutePath()),
-                cliCfgFile = Some(cliWskPropsFile.getCanonicalPath())
-            )
+                cliCfgFile = Some(cliWskPropsFile.getCanonicalPath()))
             rr.stdout should include("ok: created API")
             val swaggerapiurl = rr.stdout.split("\n")(1)
             println(s"Returned api url: '${swaggerapiurl}'")
@@ -169,8 +164,7 @@ class ApiGwEndToEndTests
             val finallydeleteApiResult = wsk.api.delete(
                 basepathOrApiName = testbasepath,
                 expectedExitCode = DONTCARE_EXIT,
-                cliCfgFile = Some(cliWskPropsFile.getCanonicalPath())
-            )
+                cliCfgFile = Some(cliWskPropsFile.getCanonicalPath()))
         }
     }
 }
diff --git a/tests/src/test/scala/whisk/core/cli/test/ApiGwTests.scala b/tests/src/test/scala/whisk/core/cli/test/ApiGwTests.scala
index e99c88f..77943c5 100644
--- a/tests/src/test/scala/whisk/core/cli/test/ApiGwTests.scala
+++ b/tests/src/test/scala/whisk/core/cli/test/ApiGwTests.scala
@@ -21,11 +21,16 @@ import java.io.File
 import java.io.BufferedWriter
 import java.io.FileWriter
 import java.time.Instant
+
 import scala.collection.mutable.ArrayBuffer
 import scala.concurrent.duration._
+
 import org.junit.runner.RunWith
+
 import org.scalatest.BeforeAndAfterAll
+import org.scalatest.BeforeAndAfterEach
 import org.scalatest.junit.JUnitRunner
+
 import common.TestHelpers
 import common.TestUtils._
 import common.TestCLIUtils
@@ -41,9 +46,10 @@ import common.WskTestHelpers
 class ApiGwTests
     extends TestHelpers
     with WskTestHelpers
+    with BeforeAndAfterEach
     with BeforeAndAfterAll {
 
-    implicit var wskprops = WskProps()
+    implicit val wskprops = WskProps()
     val wsk = new Wsk
     val clinamespace = wsk.namespace.whois()
 
@@ -58,23 +64,23 @@ class ApiGwTests
     val cliWskPropsFile = File.createTempFile("wskprops", ".tmp")
 
     /**
-      * Expected to be called before or after each CLI invocation
-      * If number of CLI invocations in this suite have reached the throttle limit
-      * then pause the test for enough time so that the throttle restriction is gone
-      */
-    def checkThrottle(maxInvocationsBeforeThrottle: Int = maxActionsPerMin) = {
-        var t = Instant.now
-        var tminus60 = t.minusSeconds(60)
-        var invocationsLast60Seconds = invocationTimes.filter(_.isAfter(tminus60)).sorted
-        var invocationCount = invocationsLast60Seconds.length
+     * Expected to be called before each test.
+     * Assumes that each test will not invoke more than 5 actions and
+     * settle the throttle when there isn't enough capacity to handle the test.
+     */
+    def checkThrottle(maxInvocationsBeforeThrottle: Int = maxActionsPerMin, expectedActivationsPerTest: Int = 5) = {
+        val t = Instant.now
+        val tminus60 = t.minusSeconds(60)
+        val invocationsLast60Seconds = invocationTimes.filter(_.isAfter(tminus60)).sorted
+        val invocationCount = invocationsLast60Seconds.length
         println(s"Action invokes within last minute: ${invocationCount}")
 
-        if (invocationCount >= maxInvocationsBeforeThrottle) {
+        if (invocationCount + expectedActivationsPerTest >= maxInvocationsBeforeThrottle) {
             // Instead of waiting a fixed 60 seconds to settle the throttle,
             // calculate a wait time that will clear out about half of the
             // current invocations (assuming even distribution) from the
             // next 60 second period.
-            var oldestInvocationInLast60Seconds = invocationsLast60Seconds.head
+            val oldestInvocationInLast60Seconds = invocationsLast60Seconds.head
 
             // Take the oldest invocation time in this 60 second period.  To clear
             // this invocation from the next 60 second period, the wait time will be
@@ -82,18 +88,22 @@ class ApiGwTests
             // This will clear all of the invocations from the next period at the
             // expense of potentially waiting uncessarily long. Instead, this calculation
             // halves the delta time as a compromise.
-            var throttleTime =  60.seconds.toMillis - ((t.toEpochMilli - oldestInvocationInLast60Seconds.toEpochMilli) /2)
+            val throttleTime = 60.seconds.toMillis - ((t.toEpochMilli - oldestInvocationInLast60Seconds.toEpochMilli) / 2)
             println(s"Waiting ${throttleTime} milliseconds to settle the throttle")
             Thread.sleep(throttleTime)
         }
+
         invocationTimes += Instant.now
     }
 
+    override def beforeEach() = {
+        checkThrottle()
+    }
+
     /*
      * Create a CLI properties file for use by the tests
      */
     override def beforeAll() = {
-        //cliWskPropsFile = File.createTempFile("wskprops", ".tmp")
         cliWskPropsFile.deleteOnExit()
         val wskprops = WskProps(token = "SOME TOKEN")
         wskprops.writeFile(cliWskPropsFile)
@@ -118,10 +128,8 @@ class ApiGwTests
         swagger: Option[String] = None,
         responsetype: Option[String] = None,
         expectedExitCode: Int = SUCCESS_EXIT,
-        cliCfgFile: Option[String] = Some(cliWskPropsFile.getCanonicalPath())): RunResult = {
-
-        checkThrottle()
-        wsk.api.create(basepath, relpath, operation, action, apiname, swagger, responsetype, expectedExitCode, cliCfgFile)
+        cliCfgFile: Option[String] = Some(cliWskPropsFile.getCanonicalPath()))(implicit wskpropsOverride: WskProps): RunResult = {
+        wsk.api.create(basepath, relpath, operation, action, apiname, swagger, responsetype, expectedExitCode, cliCfgFile)(wskpropsOverride)
     }
 
     def apiList(
@@ -134,8 +142,6 @@ class ApiGwTests
         nameSort: Option[Boolean] = None,
         expectedExitCode: Int = SUCCESS_EXIT,
         cliCfgFile: Option[String] = Some(cliWskPropsFile.getCanonicalPath())): RunResult = {
-
-        checkThrottle()
         wsk.api.list(basepathOrApiName, relpath, operation, limit, since, full, nameSort, expectedExitCode, cliCfgFile)
     }
 
@@ -145,8 +151,6 @@ class ApiGwTests
         expectedExitCode: Int = SUCCESS_EXIT,
         cliCfgFile: Option[String] = Some(cliWskPropsFile.getCanonicalPath()),
         format: Option[String] = None): RunResult = {
-
-        checkThrottle()
         wsk.api.get(basepathOrApiName, full, expectedExitCode, cliCfgFile, format)
     }
 
@@ -156,8 +160,6 @@ class ApiGwTests
         operation: Option[String] = None,
         expectedExitCode: Int = SUCCESS_EXIT,
         cliCfgFile: Option[String] = Some(cliWskPropsFile.getCanonicalPath())): RunResult = {
-
-        checkThrottle()
         wsk.api.delete(basepathOrApiName, relpath, operation, expectedExitCode, cliCfgFile)
     }
 
@@ -167,13 +169,13 @@ class ApiGwTests
         val badpath = "badpath"
 
         var rr = apiCreate(basepath = Some("/basepath"), relpath = Some(badpath), operation = Some("GET"), action = Some("action"), expectedExitCode = ANY_ERROR_EXIT)
-        rr.stderr should include (s"'${badpath}' must begin with '/'")
+        rr.stderr should include(s"'${badpath}' must begin with '/'")
 
         rr = apiDelete(basepathOrApiName = "/basepath", relpath = Some(badpath), operation = Some("GET"), expectedExitCode = ANY_ERROR_EXIT)
-        rr.stderr should include (s"'${badpath}' must begin with '/'")
+        rr.stderr should include(s"'${badpath}' must begin with '/'")
 
         rr = apiList(basepathOrApiName = Some("/basepath"), relpath = Some(badpath), operation = Some("GET"), expectedExitCode = ANY_ERROR_EXIT)
-        rr.stderr should include (s"'${badpath}' must begin with '/'")
+        rr.stderr should include(s"'${badpath}' must begin with '/'")
     }
 
     it should "reject an api commands with an invalid verb parameter" in {
@@ -192,7 +194,7 @@ class ApiGwTests
     it should "reject an api create command that specifies a nonexistent configuration file" in {
         val configfile = "/nonexistent/file"
 
-        var rr = apiCreate(swagger = Some(configfile), expectedExitCode = ANY_ERROR_EXIT)
+        val rr = apiCreate(swagger = Some(configfile), expectedExitCode = ANY_ERROR_EXIT)
         rr.stderr should include(s"Error reading swagger file '${configfile}':")
     }
 
@@ -205,7 +207,7 @@ class ApiGwTests
         bw.write("a=A")
         bw.close()
 
-        var rr = apiCreate(swagger = Some(filename), expectedExitCode = ANY_ERROR_EXIT)
+        val rr = apiCreate(swagger = Some(filename), expectedExitCode = ANY_ERROR_EXIT)
         rr.stderr should include(s"Error parsing swagger file '${filename}':")
     }
 
@@ -230,7 +232,7 @@ class ApiGwTests
                     |}""".stripMargin)
         bw.close()
 
-        var rr = apiCreate(swagger = Some(filename), expectedExitCode = ANY_ERROR_EXIT)
+        val rr = apiCreate(swagger = Some(filename), expectedExitCode = ANY_ERROR_EXIT)
         rr.stderr should include(s"Swagger file is invalid (missing basePath, info, paths, or swagger fields")
     }
 
@@ -261,23 +263,22 @@ class ApiGwTests
             rr.stdout should include regex (s"API Name:\\s+${testapiname}\n")
             rr.stdout should include regex (s"URL:\\s+")
             rr.stdout should include(testbasepath + testrelpath)
-        }
-        finally {
-            val finallydeleteActionResult = wsk.action.delete(name = actionName, expectedExitCode = DONTCARE_EXIT)
-            val deleteresult = apiDelete(basepathOrApiName = testbasepath)
+        } finally {
+            wsk.action.delete(name = actionName, expectedExitCode = DONTCARE_EXIT)
+            apiDelete(basepathOrApiName = testbasepath)
         }
     }
 
     it should "verify successful creation and deletion of a new API" in {
         val testName = "CLI_APIGWTEST1"
-        val testbasepath = "/"+testName+"_bp"
+        val testbasepath = "/" + testName + "_bp"
         val testrelpath = "/path/with/sub_paths/in/it"
         val testnewrelpath = "/path_new"
         val testurlop = "get"
-        val testapiname = testName+" API Name"
-        val actionName = testName+"_action"
+        val testapiname = testName + " API Name"
+        val actionName = testName + "_action"
         try {
-            println("cli namespace: "+clinamespace)
+            println("cli namespace: " + clinamespace)
 
             // Create the action for the API.  It must be a "web-action" action.
             val file = TestCLIUtils.getTestActionFilename(s"echo.js")
@@ -293,21 +294,20 @@ class ApiGwTests
             rr.stdout should include regex (s""""operationId":\\s+"getPathWithSub_pathsInIt"""")
             val deleteresult = apiDelete(basepathOrApiName = testbasepath)
             deleteresult.stdout should include("ok: deleted API")
-        }
-        finally {
-            val finallydeleteActionResult = wsk.action.delete(name = actionName, expectedExitCode = DONTCARE_EXIT)
-            val deleteresult = apiDelete(basepathOrApiName = testbasepath, expectedExitCode = DONTCARE_EXIT)
+        } finally {
+            wsk.action.delete(name = actionName, expectedExitCode = DONTCARE_EXIT)
+            apiDelete(basepathOrApiName = testbasepath, expectedExitCode = DONTCARE_EXIT)
         }
     }
 
     it should "verify get API name " in {
         val testName = "CLI_APIGWTEST3"
-        val testbasepath = "/"+testName+"_bp"
+        val testbasepath = "/" + testName + "_bp"
         val testrelpath = "/path"
         val testnewrelpath = "/path_new"
         val testurlop = "get"
-        val testapiname = testName+" API Name"
-        val actionName = testName+"_action"
+        val testapiname = testName + " API Name"
+        val actionName = testName + "_action"
         try {
             // Create the action for the API.  It must be a "web-action" action.
             val file = TestCLIUtils.getTestActionFilename(s"echo.js")
@@ -320,21 +320,20 @@ class ApiGwTests
             rr.stdout should include(s"${actionName}")
             rr.stdout should include regex (""""cors":\s*\{\s*\n\s*"enabled":\s*true""")
             rr.stdout should include regex (s""""target-url":\\s+.*${actionName}.json""")
-        }
-        finally {
-            val finallydeleteActionResult = wsk.action.delete(name = actionName, expectedExitCode = DONTCARE_EXIT)
-            val deleteresult = apiDelete(basepathOrApiName = testbasepath, expectedExitCode = DONTCARE_EXIT)
+        } finally {
+            wsk.action.delete(name = actionName, expectedExitCode = DONTCARE_EXIT)
+            apiDelete(basepathOrApiName = testbasepath, expectedExitCode = DONTCARE_EXIT)
         }
     }
 
     it should "verify delete API name " in {
         val testName = "CLI_APIGWTEST4"
-        val testbasepath = "/"+testName+"_bp"
+        val testbasepath = "/" + testName + "_bp"
         val testrelpath = "/path"
         val testnewrelpath = "/path_new"
         val testurlop = "get"
-        val testapiname = testName+" API Name"
-        val actionName = testName+"_action"
+        val testapiname = testName + " API Name"
+        val actionName = testName + "_action"
         try {
             // Create the action for the API.  It must be a "web-action" action.
             val file = TestCLIUtils.getTestActionFilename(s"echo.js")
@@ -344,21 +343,20 @@ class ApiGwTests
             rr.stdout should include("ok: created API")
             rr = apiDelete(basepathOrApiName = testapiname)
             rr.stdout should include("ok: deleted API")
-        }
-        finally {
-            val finallydeleteActionResult = wsk.action.delete(name = actionName, expectedExitCode = DONTCARE_EXIT)
-            val deleteresult = apiDelete(basepathOrApiName = testbasepath, expectedExitCode = DONTCARE_EXIT)
+        } finally {
+            wsk.action.delete(name = actionName, expectedExitCode = DONTCARE_EXIT)
+            apiDelete(basepathOrApiName = testbasepath, expectedExitCode = DONTCARE_EXIT)
         }
     }
 
     it should "verify delete API basepath " in {
         val testName = "CLI_APIGWTEST5"
-        val testbasepath = "/"+testName+"_bp"
+        val testbasepath = "/" + testName + "_bp"
         val testrelpath = "/path"
         val testnewrelpath = "/path_new"
         val testurlop = "get"
-        val testapiname = testName+" API Name"
-        val actionName = testName+"_action"
+        val testapiname = testName + " API Name"
+        val actionName = testName + "_action"
         try {
             // Create the action for the API.  It must be a "web-action" action.
             val file = TestCLIUtils.getTestActionFilename(s"echo.js")
@@ -368,21 +366,20 @@ class ApiGwTests
             rr.stdout should include("ok: created API")
             rr = apiDelete(basepathOrApiName = testbasepath)
             rr.stdout should include("ok: deleted API")
-        }
-        finally {
-            val finallydeleteActionResult = wsk.action.delete(name = actionName, expectedExitCode = DONTCARE_EXIT)
-            val deleteresult = apiDelete(basepathOrApiName = testbasepath, expectedExitCode = DONTCARE_EXIT)
+        } finally {
+            wsk.action.delete(name = actionName, expectedExitCode = DONTCARE_EXIT)
+            apiDelete(basepathOrApiName = testbasepath, expectedExitCode = DONTCARE_EXIT)
         }
     }
 
     it should "verify adding endpoints to existing api" in {
         val testName = "CLI_APIGWTEST6"
-        val testbasepath = "/"+testName+"_bp"
+        val testbasepath = "/" + testName + "_bp"
         val testrelpath = "/path2"
         val testnewrelpath = "/path_new"
         val testurlop = "get"
-        val testapiname = testName+" API Name"
-        val actionName = testName+"_action"
+        val testapiname = testName + " API Name"
+        val actionName = testName + "_action"
         val newEndpoint = "/newEndpoint"
         try {
             // Create the action for the API.  It must be a "web-action" action.
@@ -398,48 +395,46 @@ class ApiGwTests
             rr.stdout should include regex (s"/${clinamespace}/${actionName}\\s+${testurlop}\\s+${testapiname}\\s+")
             rr.stdout should include(testbasepath + testrelpath)
             rr.stdout should include(testbasepath + newEndpoint)
-        }
-        finally {
-            val finallydeleteActionResult = wsk.action.delete(name = actionName, expectedExitCode = DONTCARE_EXIT)
-            val deleteresult = apiDelete(basepathOrApiName = testbasepath, expectedExitCode = DONTCARE_EXIT)
+        } finally {
+            wsk.action.delete(name = actionName, expectedExitCode = DONTCARE_EXIT)
+            apiDelete(basepathOrApiName = testbasepath, expectedExitCode = DONTCARE_EXIT)
         }
     }
 
     it should "verify successful creation with swagger doc as input" in {
         // NOTE: These values must match the swagger file contents
         val testName = "CLI_APIGWTEST7"
-        val testbasepath = "/"+testName+"_bp"
+        val testbasepath = "/" + testName + "_bp"
         val testrelpath = "/path"
         val testurlop = "get"
-        val testapiname = testName+" API Name"
-        val actionName = testName+"_action"
+        val testapiname = testName + " API Name"
+        val actionName = testName + "_action"
         val swaggerPath = TestCLIUtils.getTestApiGwFilename("testswaggerdoc1")
         try {
             var rr = apiCreate(swagger = Some(swaggerPath))
             rr.stdout should include("ok: created API")
             rr = apiList(basepathOrApiName = Some(testbasepath), relpath = Some(testrelpath), operation = Some(testurlop))
-            println("list stdout: "+rr.stdout)
-            println("list stderr: "+rr.stderr)
+            println("list stdout: " + rr.stdout)
+            println("list stderr: " + rr.stderr)
             rr.stdout should include("ok: APIs")
             // Actual CLI namespace will vary from local dev to automated test environments, so don't check
             rr.stdout should include regex (s"/[@\\w._\\-]+/${actionName}\\s+${testurlop}\\s+${testapiname}\\s+")
             rr.stdout should include(testbasepath + testrelpath)
-        }
-        finally {
-            val deleteresult = apiDelete(basepathOrApiName = testbasepath, expectedExitCode = DONTCARE_EXIT)
+        } finally {
+            apiDelete(basepathOrApiName = testbasepath, expectedExitCode = DONTCARE_EXIT)
         }
     }
 
     it should "verify adding endpoints to two existing apis" in {
         val testName = "CLI_APIGWTEST8"
-        val testbasepath = "/"+testName+"_bp"
-        val testbasepath2 = "/"+testName+"_bp2"
+        val testbasepath = "/" + testName + "_bp"
+        val testbasepath2 = "/" + testName + "_bp2"
         val testrelpath = "/path2"
         val testnewrelpath = "/path_new"
         val testurlop = "get"
-        val testapiname = testName+" API Name"
-        val testapiname2 = testName+" API Name 2"
-        val actionName = testName+"_action"
+        val testapiname = testName + " API Name"
+        val testapiname2 = testName + " API Name 2"
+        val actionName = testName + "_action"
         val newEndpoint = "/newEndpoint"
         try {
             // Create the action for the API.  It must be a "web-action" action.
@@ -468,11 +463,10 @@ class ApiGwTests
             rr.stdout should include regex (s"/${clinamespace}/${actionName}\\s+${testurlop}\\s+${testapiname}\\s+")
             rr.stdout should include(testbasepath2 + testrelpath)
             rr.stdout should include(testbasepath2 + newEndpoint)
-        }
-        finally {
-            val finallydeleteActionResult = wsk.action.delete(name = actionName, expectedExitCode = DONTCARE_EXIT)
-            var deleteresult = apiDelete(basepathOrApiName = testbasepath, expectedExitCode = DONTCARE_EXIT)
-            deleteresult = apiDelete(basepathOrApiName = testbasepath2, expectedExitCode = DONTCARE_EXIT)
+        } finally {
+            wsk.action.delete(name = actionName, expectedExitCode = DONTCARE_EXIT)
+            apiDelete(basepathOrApiName = testbasepath, expectedExitCode = DONTCARE_EXIT)
+            apiDelete(basepathOrApiName = testbasepath2, expectedExitCode = DONTCARE_EXIT)
         }
     }
 
@@ -484,10 +478,11 @@ class ApiGwTests
         val testrelpath = "/path"
         val testnewrelpath = "/path_new"
         val testurlop = "get"
-        val testapiname = testName+" API Name"
-        val actionName = testName+"a-c@t ion"
+        val testapiname = testName + " API Name"
+        val actionName = testName + "a-c@t ion"
         try {
-            println("cli namespace: "+clinamespace)
+            println("cli namespace: " + clinamespace)
+
             // Create the action for the API.  It must be a "web-action" action.
             val file = TestCLIUtils.getTestActionFilename(s"echo.js")
             wsk.action.create(name = actionName, artifact = Some(file), expectedExitCode = SUCCESS_EXIT, web = Some("true"))
@@ -500,10 +495,9 @@ class ApiGwTests
             rr.stdout should include(testbasepath + testrelpath)
             val deleteresult = apiDelete(basepathOrApiName = testbasepath)
             deleteresult.stdout should include("ok: deleted API")
-        }
-        finally {
-            val finallydeleteActionResult = wsk.action.delete(name = actionName, expectedExitCode = DONTCARE_EXIT)
-            val deleteresult = apiDelete(basepathOrApiName = testbasepath, expectedExitCode = DONTCARE_EXIT)
+        } finally {
+            wsk.action.delete(name = actionName, expectedExitCode = DONTCARE_EXIT)
+            apiDelete(basepathOrApiName = testbasepath, expectedExitCode = DONTCARE_EXIT)
         }
     }
 
@@ -517,12 +511,12 @@ class ApiGwTests
         val actionName = testName + "_action"
         val swaggerPath = TestCLIUtils.getTestApiGwFilename(s"testswaggerdocinvalid")
         try {
-            var rr = apiCreate(swagger = Some(swaggerPath), expectedExitCode = ANY_ERROR_EXIT)
+            val rr = apiCreate(swagger = Some(swaggerPath), expectedExitCode = ANY_ERROR_EXIT)
             println("api create stdout: " + rr.stdout)
             println("api create stderr: " + rr.stderr)
             rr.stderr should include(s"Swagger file is invalid")
         } finally {
-            val deleteresult = apiDelete(basepathOrApiName = testbasepath, expectedExitCode = DONTCARE_EXIT)
+            apiDelete(basepathOrApiName = testbasepath, expectedExitCode = DONTCARE_EXIT)
         }
     }
 
@@ -544,14 +538,14 @@ class ApiGwTests
             var rr2 = apiCreate(basepath = Some(testbasepath), relpath = Some(testnewrelpath), operation = Some(testurlop), action = Some(actionName), apiname = Some(testapiname))
             rr2.stdout should include("ok: created API")
             rr = apiDelete(basepathOrApiName = testbasepath, relpath = Some(testrelpath))
-            rr.stdout should include("ok: deleted " + testrelpath +" from "+ testbasepath)
+            rr.stdout should include("ok: deleted " + testrelpath + " from " + testbasepath)
             rr2 = apiList(basepathOrApiName = Some(testbasepath), relpath = Some(testnewrelpath))
             rr2.stdout should include("ok: APIs")
             rr2.stdout should include regex (s"/${clinamespace}/${actionName}\\s+${testurlop}\\s+${testapiname}\\s+")
             rr2.stdout should include(testbasepath + testnewrelpath)
         } finally {
-            val finallydeleteActionResult = wsk.action.delete(name = actionName, expectedExitCode = DONTCARE_EXIT)
-            val deleteresult = apiDelete(basepathOrApiName = testbasepath, expectedExitCode = DONTCARE_EXIT)
+            wsk.action.delete(name = actionName, expectedExitCode = DONTCARE_EXIT)
+            apiDelete(basepathOrApiName = testbasepath, expectedExitCode = DONTCARE_EXIT)
         }
     }
 
@@ -577,13 +571,13 @@ class ApiGwTests
             rr.stdout should include("ok: APIs")
             rr.stdout should include regex (s"/${clinamespace}/${actionName}\\s+${testurlop}\\s+${testapiname}\\s+")
             rr.stdout should include(testbasepath + testrelpath)
-            rr = apiDelete(basepathOrApiName = testbasepath,relpath = Some(testrelpath), operation = Some(testurlop2))
-            rr.stdout should include("ok: deleted " + testrelpath + " " + "POST" +" from "+ testbasepath)
+            rr = apiDelete(basepathOrApiName = testbasepath, relpath = Some(testrelpath), operation = Some(testurlop2))
+            rr.stdout should include("ok: deleted " + testrelpath + " " + "POST" + " from " + testbasepath)
             rr = apiList(basepathOrApiName = Some(testbasepath))
             rr.stdout should include regex (s"/${clinamespace}/${actionName}\\s+${testurlop}\\s+${testapiname}\\s+")
         } finally {
-            val finallydeleteActionResult = wsk.action.delete(name = actionName, expectedExitCode = DONTCARE_EXIT)
-            val deleteresult = apiDelete(basepathOrApiName = testbasepath, expectedExitCode = DONTCARE_EXIT)
+            wsk.action.delete(name = actionName, expectedExitCode = DONTCARE_EXIT)
+            apiDelete(basepathOrApiName = testbasepath, expectedExitCode = DONTCARE_EXIT)
         }
     }
 
@@ -608,7 +602,7 @@ class ApiGwTests
             rr.stdout should include(testbasepath + testrelpath)
             rr.stdout should include(testbasepath + testrelpath2)
         } finally {
-            val deleteresult = apiDelete(basepathOrApiName = testbasepath, expectedExitCode = DONTCARE_EXIT)
+            apiDelete(basepathOrApiName = testbasepath, expectedExitCode = DONTCARE_EXIT)
         }
     }
 
@@ -648,26 +642,25 @@ class ApiGwTests
             rr = apiDelete(basepathOrApiName = testbasepath)
             rr.stdout should include("ok: deleted API")
         } finally {
-            val finallydeleteActionResult = wsk.action.delete(name = actionName, expectedExitCode = DONTCARE_EXIT)
-            var deleteresult = apiDelete(basepathOrApiName = testbasepath, expectedExitCode = DONTCARE_EXIT)
-            deleteresult = apiDelete(basepathOrApiName = testbasepath2, expectedExitCode = DONTCARE_EXIT)
+            wsk.action.delete(name = actionName, expectedExitCode = DONTCARE_EXIT)
+            apiDelete(basepathOrApiName = testbasepath, expectedExitCode = DONTCARE_EXIT)
+            apiDelete(basepathOrApiName = testbasepath2, expectedExitCode = DONTCARE_EXIT)
         }
     }
 
     it should "reject an API created with a non-existent action" in {
         val testName = "CLI_APIGWTEST15"
-        val testbasepath = "/"+testName+"_bp"
+        val testbasepath = "/" + testName + "_bp"
         val testrelpath = "/path"
         val testnewrelpath = "/path_new"
         val testurlop = "get"
-        val testapiname = testName+" API Name"
-        val actionName = testName+"_action"
+        val testapiname = testName + " API Name"
+        val actionName = testName + "_action"
         try {
-            var rr = apiCreate(basepath = Some(testbasepath), relpath = Some(testrelpath), operation = Some(testurlop), action = Some(actionName), apiname = Some(testapiname), expectedExitCode = ANY_ERROR_EXIT)
+            val rr = apiCreate(basepath = Some(testbasepath), relpath = Some(testrelpath), operation = Some(testurlop), action = Some(actionName), apiname = Some(testapiname), expectedExitCode = ANY_ERROR_EXIT)
             rr.stderr should include("does not exist")
-        }
-        finally {
-            val deleteresult = apiDelete(basepathOrApiName = testbasepath, expectedExitCode = DONTCARE_EXIT)
+        } finally {
+            apiDelete(basepathOrApiName = testbasepath, expectedExitCode = DONTCARE_EXIT)
         }
     }
 
@@ -684,119 +677,116 @@ class ApiGwTests
             val file = TestCLIUtils.getTestActionFilename(s"echo.js")
             wsk.action.create(name = actionName, artifact = Some(file), expectedExitCode = SUCCESS_EXIT)
 
-            var rr = apiCreate(basepath = Some(testbasepath), relpath = Some(testrelpath), operation = Some(testurlop), action = Some(actionName), apiname = Some(testapiname), expectedExitCode = ANY_ERROR_EXIT)
+            val rr = apiCreate(basepath = Some(testbasepath), relpath = Some(testrelpath), operation = Some(testurlop), action = Some(actionName), apiname = Some(testapiname), expectedExitCode = ANY_ERROR_EXIT)
             rr.stderr should include("is not a web action")
         } finally {
-            val finallydeleteActionResult = wsk.action.delete(name = actionName, expectedExitCode = DONTCARE_EXIT)
-            var deleteresult = apiDelete(basepathOrApiName = testbasepath, expectedExitCode = DONTCARE_EXIT)
+            wsk.action.delete(name = actionName, expectedExitCode = DONTCARE_EXIT)
+            apiDelete(basepathOrApiName = testbasepath, expectedExitCode = DONTCARE_EXIT)
         }
     }
 
     it should "verify API with http response type " in {
         val testName = "CLI_APIGWTEST17"
-        val testbasepath = "/"+testName+"_bp"
+        val testbasepath = "/" + testName + "_bp"
         val testrelpath = "/path"
         val testnewrelpath = "/path_new"
         val testurlop = "get"
-        val testapiname = testName+" API Name"
-        val actionName = testName+"_action"
+        val testapiname = testName + " API Name"
+        val actionName = testName + "_action"
         val responseType = "http"
         try {
             // Create the action for the API.  It must be a "web-action" action.
             val file = TestCLIUtils.getTestActionFilename(s"echo.js")
             wsk.action.create(name = actionName, artifact = Some(file), expectedExitCode = SUCCESS_EXIT, web = Some("true"))
 
-            var rr = apiCreate(
+            apiCreate(
                 basepath = Some(testbasepath),
                 relpath = Some(testrelpath),
                 operation = Some(testurlop),
                 action = Some(actionName),
                 apiname = Some(testapiname),
-                responsetype = Some(responseType)
-            )
-            rr.stdout should include("ok: created API")
-            rr = apiGet(basepathOrApiName = Some(testapiname))
+                responsetype = Some(responseType))
+                .stdout should include("ok: created API")
+
+            val rr = apiGet(basepathOrApiName = Some(testapiname))
             rr.stdout should include(testbasepath)
             rr.stdout should include(s"${actionName}")
             rr.stdout should include regex (s""""target-url":\\s+.*${actionName}.${responseType}""")
-        }
-        finally {
-            val finallydeleteActionResult = wsk.action.delete(name = actionName, expectedExitCode = DONTCARE_EXIT)
-            val deleteresult = apiDelete(basepathOrApiName = testbasepath, expectedExitCode = DONTCARE_EXIT)
+        } finally {
+            wsk.action.delete(name = actionName, expectedExitCode = DONTCARE_EXIT)
+            apiDelete(basepathOrApiName = testbasepath, expectedExitCode = DONTCARE_EXIT)
         }
     }
 
     it should "reject API export when export type is invalid" in {
         val testName = "CLI_APIGWTEST18"
-        val testbasepath = "/"+testName+"_bp"
+        val testbasepath = "/" + testName + "_bp"
 
-        var rr = apiGet(basepathOrApiName = Some(testbasepath), format = Some("BadType"), expectedExitCode = ANY_ERROR_EXIT)
+        val rr = apiGet(basepathOrApiName = Some(testbasepath), format = Some("BadType"), expectedExitCode = ANY_ERROR_EXIT)
         rr.stderr should include("Invalid format type")
     }
 
     it should "successfully export an API in YAML format" in {
         val testName = "CLI_APIGWTEST19"
-        val testbasepath = "/"+testName+"_bp"
+        val testbasepath = "/" + testName + "_bp"
         val testrelpath = "/path"
         val testnewrelpath = "/path_new"
         val testurlop = "get"
-        val testapiname = testName+" API Name"
-        val actionName = testName+"_action"
+        val testapiname = testName + " API Name"
+        val actionName = testName + "_action"
         val responseType = "http"
         try {
             // Create the action for the API.  It must be a "web-action" action.
             val file = TestCLIUtils.getTestActionFilename(s"echo.js")
             wsk.action.create(name = actionName, artifact = Some(file), expectedExitCode = SUCCESS_EXIT, web = Some("true"))
 
-            var rr = apiCreate(
+            apiCreate(
                 basepath = Some(testbasepath),
                 relpath = Some(testrelpath),
                 operation = Some(testurlop),
                 action = Some(actionName),
                 apiname = Some(testapiname),
-                responsetype = Some(responseType)
-            )
-            rr.stdout should include("ok: created API")
-            rr = apiGet(basepathOrApiName = Some(testapiname), format = Some("yaml"))
-            rr.stdout should include (s"basePath: ${testbasepath}")
-        }
-        finally {
-            val finallydeleteActionResult = wsk.action.delete(name = actionName, expectedExitCode = DONTCARE_EXIT)
-            val deleteresult = apiDelete(basepathOrApiName = testbasepath, expectedExitCode = DONTCARE_EXIT)
+                responsetype = Some(responseType))
+                .stdout should include("ok: created API")
+
+            val rr = apiGet(basepathOrApiName = Some(testapiname), format = Some("yaml"))
+            rr.stdout should include(s"basePath: ${testbasepath}")
+        } finally {
+            wsk.action.delete(name = actionName, expectedExitCode = DONTCARE_EXIT)
+            apiDelete(basepathOrApiName = testbasepath, expectedExitCode = DONTCARE_EXIT)
         }
     }
 
     it should "successfully export an API when JSON format is explcitly specified" in {
         val testName = "CLI_APIGWTEST20"
-        val testbasepath = "/"+testName+"_bp"
+        val testbasepath = "/" + testName + "_bp"
         val testrelpath = "/path"
         val testnewrelpath = "/path_new"
         val testurlop = "get"
-        val testapiname = testName+" API Name"
-        val actionName = testName+"_action"
+        val testapiname = testName + " API Name"
+        val actionName = testName + "_action"
         val responseType = "http"
         try {
             // Create the action for the API.  It must be a "web-action" action.
             val file = TestCLIUtils.getTestActionFilename(s"echo.js")
             wsk.action.create(name = actionName, artifact = Some(file), expectedExitCode = SUCCESS_EXIT, web = Some("true"))
 
-            var rr = apiCreate(
+            apiCreate(
                 basepath = Some(testbasepath),
                 relpath = Some(testrelpath),
                 operation = Some(testurlop),
                 action = Some(actionName),
                 apiname = Some(testapiname),
-                responsetype = Some(responseType)
-            )
-            rr.stdout should include("ok: created API")
-            rr = apiGet(basepathOrApiName = Some(testapiname), format = Some("json"))
+                responsetype = Some(responseType))
+                .stdout should include("ok: created API")
+
+            val rr = apiGet(basepathOrApiName = Some(testapiname), format = Some("json"))
             rr.stdout should include(testbasepath)
             rr.stdout should include(s"${actionName}")
             rr.stdout should include regex (s""""target-url":\\s+.*${actionName}.${responseType}""")
-        }
-        finally {
-            val finallydeleteActionResult = wsk.action.delete(name = actionName, expectedExitCode = DONTCARE_EXIT)
-            val deleteresult = apiDelete(basepathOrApiName = testbasepath, expectedExitCode = DONTCARE_EXIT)
+        } finally {
+            wsk.action.delete(name = actionName, expectedExitCode = DONTCARE_EXIT)
+            apiDelete(basepathOrApiName = testbasepath, expectedExitCode = DONTCARE_EXIT)
         }
     }
 
@@ -819,34 +809,34 @@ class ApiGwTests
             rr.stdout should include regex (s"/[@\\w._\\-]+/${actionName}\\s+${testurlop}\\s+${testapiname}\\s+")
             rr.stdout should include(testbasepath + testrelpath)
         } finally {
-            val deleteresult = apiDelete(basepathOrApiName = testbasepath, expectedExitCode = DONTCARE_EXIT)
+            apiDelete(basepathOrApiName = testbasepath, expectedExitCode = DONTCARE_EXIT)
         }
     }
 
     it should "reject creation of an API from invalid YAML formatted API configuration file" in {
         val testName = "CLI_APIGWTEST22"
-        val testbasepath = "/"+testName+"_bp"
+        val testbasepath = "/" + testName + "_bp"
         val swaggerPath = TestCLIUtils.getTestApiGwFilename(s"local.api.bad.yaml")
         try {
-            var rr = apiCreate(swagger = Some(swaggerPath), expectedExitCode = ANY_ERROR_EXIT)
+            val rr = apiCreate(swagger = Some(swaggerPath), expectedExitCode = ANY_ERROR_EXIT)
             println("api create stdout: " + rr.stdout)
             println("api create stderror: " + rr.stderr)
             rr.stderr should include("Unable to parse YAML configuration file")
         } finally {
-            val deleteresult = apiDelete(basepathOrApiName = testbasepath, expectedExitCode = DONTCARE_EXIT)
+            apiDelete(basepathOrApiName = testbasepath, expectedExitCode = DONTCARE_EXIT)
         }
     }
 
     it should "reject deletion of a non-existent api" in {
         val nonexistentApi = "/not-there"
 
-        var rr = apiDelete(basepathOrApiName = nonexistentApi, expectedExitCode = ANY_ERROR_EXIT)
-        rr.stderr should include (s"API '${nonexistentApi}' does not exist")
+        val rr = apiDelete(basepathOrApiName = nonexistentApi, expectedExitCode = ANY_ERROR_EXIT)
+        rr.stderr should include(s"API '${nonexistentApi}' does not exist")
     }
 
     it should "successfully list an API whose endpoints are not mapped to actions" in {
         val testName = "CLI_APIGWTEST23"
-        var testapiname = "A descriptive name"
+        val testapiname = "A descriptive name"
         val testbasepath = "/NoActions"
         val testrelpath = "/"
         val testops: Seq[String] = Seq("put", "delete", "get", "head", "options", "patch", "post")
@@ -873,7 +863,7 @@ class ApiGwTests
             rr.stdout should include(testbasepath + testrelpath)
 
         } finally {
-            val deleteresult = apiDelete(basepathOrApiName = testbasepath, expectedExitCode = DONTCARE_EXIT)
+            apiDelete(basepathOrApiName = testbasepath, expectedExitCode = DONTCARE_EXIT)
         }
     }
 
@@ -884,27 +874,26 @@ class ApiGwTests
         val testurlop = "get"
         val testapiname = testName + " API Name"
         val actionName = testName + "_action"
-        val wskpropsBackup = wskprops
+
         try {
             // Create the action for the API.
             val file = TestCLIUtils.getTestActionFilename(s"echo.js")
             wsk.action.create(name = actionName, artifact = Some(file), expectedExitCode = SUCCESS_EXIT, web = Some("true"))
 
             // Set an invalid auth key
-            wskprops = WskProps(authKey = "bad-auth-key")
+            val badWskProps = WskProps(authKey = "bad-auth-key")
 
-            var rr = apiCreate(
+            apiCreate(
                 basepath = Some(testbasepath),
                 relpath = Some(testrelpath),
                 operation = Some(testurlop),
                 action = Some(actionName),
                 apiname = Some(testapiname),
-                expectedExitCode = ANY_ERROR_EXIT)
-            rr.stderr should include("The supplied authentication is invalid")
+                expectedExitCode = ANY_ERROR_EXIT)(badWskProps)
+                .stderr should include("The supplied authentication is invalid")
         } finally {
-            wskprops = wskpropsBackup
-            val finallydeleteActionResult = wsk.action.delete(name = actionName, expectedExitCode = DONTCARE_EXIT)
-            var deleteresult = apiDelete(basepathOrApiName = testbasepath, expectedExitCode = DONTCARE_EXIT)
+            wsk.action.delete(name = actionName, expectedExitCode = DONTCARE_EXIT)
+            apiDelete(basepathOrApiName = testbasepath, expectedExitCode = DONTCARE_EXIT)
         }
     }
 
@@ -930,7 +919,7 @@ class ApiGwTests
             val originalFull = apiList(full = Some(true), nameSort = Some(true)).stdout
             val scalaSorted = List(s"${baseName}1" + "/", s"${baseName}2" + "/", s"${baseName}3" + "/")
             val regex = s"${baseName}[1-3]/".r
-            val list  = (regex.findAllMatchIn(original)).toList
+            val list = (regex.findAllMatchIn(original)).toList
             val listFull = (regex.findAllMatchIn(originalFull)).toList
 
             scalaSorted.toString shouldEqual list.toString
@@ -938,9 +927,9 @@ class ApiGwTests
         } finally {
             // Clean up Apis
             for (i <- 1 to 3) {
-                val deleteApis = apiDelete(basepathOrApiName = s"${baseName}$i", expectedExitCode = DONTCARE_EXIT)
+                apiDelete(basepathOrApiName = s"${baseName}$i", expectedExitCode = DONTCARE_EXIT)
             }
-            val deleteAction = wsk.action.delete(name = actionName, expectedExitCode = DONTCARE_EXIT)
+            wsk.action.delete(name = actionName, expectedExitCode = DONTCARE_EXIT)
         }
     }
 }

-- 
To stop receiving notification emails like this one, please contact
"commits@openwhisk.apache.org" <co...@openwhisk.apache.org>.