blob: 78038b68f7756ea6011956921c6a052e495c4030 [file] [log] [blame]
// +build integration
/*
* 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 tests
import (
"fmt"
"os"
"strings"
"testing"
"github.com/apache/incubator-openwhisk-cli/tests/src/integration/common"
"github.com/stretchr/testify/assert"
)
var invalidArgs []common.InvalidArg
var invalidArgsMsg = "error: Invalid argument(s)"
var tooFewArgsMsg = invalidArgsMsg + "."
var tooManyArgsMsg = invalidArgsMsg + ": "
var actionNameActionReqMsg = "An action name and code artifact are required."
var actionNameReqMsg = "An action name is required."
var actionOptMsg = "A code artifact is optional."
var packageNameReqMsg = "A package name is required."
var packageNameBindingReqMsg = "A package name and binding name are required."
var ruleNameReqMsg = "A rule name is required."
var ruleTriggerActionReqMsg = "A rule, trigger and action name are required."
var activationIdReq = "An activation ID is required."
var triggerNameReqMsg = "A trigger name is required."
var optNamespaceMsg = "An optional namespace is the only valid argument."
var noArgsReqMsg = "No arguments are required."
var invalidArg = "invalidArg"
var apiCreateReqMsg = "Specify a swagger file or specify an API base path with an API path, an API verb, and an action name."
var apiGetReqMsg = "An API base path or API name is required."
var apiDeleteReqMsg = "An API base path or API name is required. An optional API relative path and operation may also be provided."
var apiListReqMsg = "Optional parameters are: API base path (or API name), API relative path and operation."
var invalidShared = "Cannot use value '" + invalidArg + "' for shared"
func initInvalidArgs() {
invalidArgs = []common.InvalidArg{
{
Cmd: []string{"action", "create"},
Err: tooFewArgsMsg + " " + actionNameActionReqMsg,
},
{
Cmd: []string{"action", "create", "someAction"},
Err: tooFewArgsMsg + " " + actionNameActionReqMsg,
},
{
Cmd: []string{"action", "create", "actionName", "artifactName", invalidArg},
Err: tooManyArgsMsg + invalidArg + ".",
},
{
Cmd: []string{"action", "update"},
Err: tooFewArgsMsg + " " + actionNameReqMsg + " " + actionOptMsg,
},
{
Cmd: []string{"action", "update", "actionName", "artifactName", invalidArg},
Err: tooManyArgsMsg + invalidArg + ". " + actionNameReqMsg + " " + actionOptMsg,
},
{
Cmd: []string{"action", "delete"},
Err: tooFewArgsMsg + " " + actionNameReqMsg,
},
{
Cmd: []string{"action", "delete", "actionName", invalidArg},
Err: tooManyArgsMsg + invalidArg + ".",
},
{
Cmd: []string{"action", "get"},
Err: tooFewArgsMsg + " " + actionNameReqMsg,
},
{
Cmd: []string{"action", "get", "actionName", "namespace", invalidArg},
Err: tooManyArgsMsg + invalidArg + ".",
},
{
Cmd: []string{"action", "list", "namespace", invalidArg},
Err: tooManyArgsMsg + invalidArg + ". " + optNamespaceMsg,
},
{
Cmd: []string{"action", "invoke"},
Err: tooFewArgsMsg + " " + actionNameReqMsg,
},
{
Cmd: []string{"action", "invoke", "actionName", invalidArg},
Err: tooManyArgsMsg + invalidArg + ".",
},
{
Cmd: []string{"activation", "list", "namespace", invalidArg},
Err: tooManyArgsMsg + invalidArg + ". " + optNamespaceMsg,
},
{
Cmd: []string{"activation", "get"},
Err: tooFewArgsMsg + " " + activationIdReq,
},
{
Cmd: []string{"activation", "get", "activationID", "namespace", invalidArg},
Err: tooManyArgsMsg + invalidArg + ".",
},
{
Cmd: []string{"activation", "logs"},
Err: tooFewArgsMsg + " " + activationIdReq,
},
{
Cmd: []string{"activation", "logs", "activationID", invalidArg},
Err: tooManyArgsMsg + invalidArg + ".",
},
{
Cmd: []string{"activation", "result"},
Err: tooFewArgsMsg + " " + activationIdReq,
},
{
Cmd: []string{"activation", "result", "activationID", invalidArg},
Err: tooManyArgsMsg + invalidArg + ".",
},
{
Cmd: []string{"activation", "poll", "activationID", invalidArg},
Err: tooManyArgsMsg + invalidArg + ". " + optNamespaceMsg,
},
{
Cmd: []string{"namespace", "list", invalidArg},
Err: tooManyArgsMsg + invalidArg + ". " + noArgsReqMsg,
},
{
Cmd: []string{"namespace", "get", invalidArg},
Err: tooManyArgsMsg + invalidArg + ". " + noArgsReqMsg,
},
{
Cmd: []string{"package", "create"},
Err: tooFewArgsMsg + " " + packageNameReqMsg,
},
{
Cmd: []string{"package", "create", "packageName", invalidArg},
Err: tooManyArgsMsg + invalidArg + ".",
},
{
Cmd: []string{"package", "create", "packageName", "--shared", invalidArg},
Err: invalidShared,
},
{
Cmd: []string{"package", "update"},
Err: tooFewArgsMsg + " " + packageNameReqMsg,
},
{
Cmd: []string{"package", "update", "packageName", invalidArg},
Err: tooManyArgsMsg + invalidArg + ".",
},
{
Cmd: []string{"package", "update", "packageName", "--shared", invalidArg},
Err: invalidShared,
},
{
Cmd: []string{"package", "get"},
Err: tooFewArgsMsg + " " + packageNameReqMsg,
},
{
Cmd: []string{"package", "get", "packageName", "namespace", invalidArg},
Err: tooManyArgsMsg + invalidArg + ".",
},
{
Cmd: []string{"package", "bind"},
Err: tooFewArgsMsg + " " + packageNameBindingReqMsg,
},
{
Cmd: []string{"package", "bind", "packageName"},
Err: tooFewArgsMsg + " " + packageNameBindingReqMsg,
},
{
Cmd: []string{"package", "bind", "packageName", "bindingName", invalidArg},
Err: tooManyArgsMsg + invalidArg + ".",
},
{
Cmd: []string{"package", "list", "namespace", invalidArg},
Err: tooManyArgsMsg + invalidArg + ". " + optNamespaceMsg,
},
{
Cmd: []string{"package", "delete"},
Err: tooFewArgsMsg + " " + packageNameReqMsg,
},
{
Cmd: []string{"package", "delete", "namespace", invalidArg},
Err: tooManyArgsMsg + invalidArg + ".",
},
{
Cmd: []string{"package", "refresh", "namespace", invalidArg},
Err: tooManyArgsMsg + invalidArg + ". " + optNamespaceMsg,
},
{
Cmd: []string{"rule", "enable"},
Err: tooFewArgsMsg + " " + ruleNameReqMsg,
},
{
Cmd: []string{"rule", "enable", "ruleName", invalidArg},
Err: tooManyArgsMsg + invalidArg + ".",
},
{
Cmd: []string{"rule", "disable"},
Err: tooFewArgsMsg + " " + ruleNameReqMsg,
},
{
Cmd: []string{"rule", "disable", "ruleName", invalidArg},
Err: tooManyArgsMsg + invalidArg + ".",
},
{
Cmd: []string{"rule", "status"},
Err: tooFewArgsMsg + " " + ruleNameReqMsg,
},
{
Cmd: []string{"rule", "status", "ruleName", invalidArg},
Err: tooManyArgsMsg + invalidArg + ".",
},
{
Cmd: []string{"rule", "create"},
Err: tooFewArgsMsg + " " + ruleTriggerActionReqMsg,
},
{
Cmd: []string{"rule", "create", "ruleName"},
Err: tooFewArgsMsg + " " + ruleTriggerActionReqMsg,
},
{
Cmd: []string{"rule", "create", "ruleName", "triggerName"},
Err: tooFewArgsMsg + " " + ruleTriggerActionReqMsg,
},
{
Cmd: []string{"rule", "create", "ruleName", "triggerName", "actionName", invalidArg},
Err: tooManyArgsMsg + invalidArg + ".",
},
{
Cmd: []string{"rule", "update"},
Err: tooFewArgsMsg + " " + ruleTriggerActionReqMsg,
},
{
Cmd: []string{"rule", "update", "ruleName"},
Err: tooFewArgsMsg + " " + ruleTriggerActionReqMsg,
},
{
Cmd: []string{"rule", "update", "ruleName", "triggerName"},
Err: tooFewArgsMsg + " " + ruleTriggerActionReqMsg,
},
{
Cmd: []string{"rule", "update", "ruleName", "triggerName", "actionName", invalidArg},
Err: tooManyArgsMsg + invalidArg + ".",
},
{
Cmd: []string{"rule", "get"},
Err: tooFewArgsMsg + " " + ruleNameReqMsg,
},
{
Cmd: []string{"rule", "get", "ruleName", "namespace", invalidArg},
Err: tooManyArgsMsg + invalidArg + ".",
},
{
Cmd: []string{"rule", "delete"},
Err: tooFewArgsMsg + " " + ruleNameReqMsg,
},
{
Cmd: []string{"rule", "delete", "ruleName", invalidArg},
Err: tooManyArgsMsg + invalidArg + ".",
},
{
Cmd: []string{"rule", "list", "namespace", invalidArg},
Err: tooManyArgsMsg + invalidArg + ". " + optNamespaceMsg,
},
{
Cmd: []string{"trigger", "fire"},
Err: tooFewArgsMsg + " " + triggerNameReqMsg,
},
{
Cmd: []string{"trigger", "fire", "triggerName", invalidArg},
Err: tooManyArgsMsg + invalidArg + ". " + triggerNameReqMsg,
},
{
Cmd: []string{"trigger", "create"},
Err: tooFewArgsMsg + " " + triggerNameReqMsg,
},
{
Cmd: []string{"trigger", "create", "triggerName", invalidArg},
Err: tooManyArgsMsg + invalidArg + ".",
},
{
Cmd: []string{"trigger", "update"},
Err: tooFewArgsMsg + " " + triggerNameReqMsg,
},
{
Cmd: []string{"trigger", "update", "triggerName", invalidArg},
Err: tooManyArgsMsg + invalidArg + ".",
},
{
Cmd: []string{"trigger", "get"},
Err: tooFewArgsMsg + " " + triggerNameReqMsg,
},
{
Cmd: []string{"trigger", "get", "triggerName", "namespace", invalidArg},
Err: tooManyArgsMsg + invalidArg + ".",
},
{
Cmd: []string{"trigger", "delete"},
Err: tooFewArgsMsg + " " + triggerNameReqMsg,
},
{
Cmd: []string{"trigger", "delete", "triggerName", invalidArg},
Err: tooManyArgsMsg + invalidArg + ".",
},
{
Cmd: []string{"trigger", "list", "namespace", invalidArg},
Err: tooManyArgsMsg + invalidArg + ". " + optNamespaceMsg,
},
}
}
var wsk *common.Wsk = common.NewWsk()
var tmpProp = common.GetRepoPath() + "/wskprops.tmp"
// Test case to set apihost, auth, and namespace.
func TestSetAPIHostAuthNamespace(t *testing.T) {
common.CreateFile(tmpProp)
common.WriteFile(tmpProp, []string{})
os.Setenv("WSK_CONFIG_FILE", tmpProp)
assert.Equal(t, os.Getenv("WSK_CONFIG_FILE"), tmpProp, "The environment variable WSK_CONFIG_FILE has not been set.")
namespace, _ := wsk.ListNamespaces()
namespaces := strings.Split(strings.TrimSpace(string(namespace)), "\n")
expectedNamespace := string(namespaces[len(namespaces)-1])
fmt.Println(wsk.Wskprops.APIHost)
if wsk.Wskprops.APIHost != "" && wsk.Wskprops.AuthKey != "" {
stdout, err := wsk.RunCommand("property", "set", "--apihost", wsk.Wskprops.APIHost,
"--auth", wsk.Wskprops.AuthKey, "--namespace", expectedNamespace)
ouputString := string(stdout)
assert.Equal(t, nil, err, "The command property set --apihost --auth --namespace failed to run.")
assert.Contains(t, ouputString, "ok: whisk auth set. Run 'wsk property get --auth' to see the new value.",
"The output of the command property set --apihost --auth --namespace does not contain \"whisk auth set\".")
assert.Contains(t, ouputString, "ok: whisk API host set to "+wsk.Wskprops.APIHost,
"The output of the command property set --apihost --auth --namespace does not contain \"whisk API host set\".")
assert.Contains(t, ouputString, "ok: whisk namespace set to "+expectedNamespace,
"The output of the command property set --apihost --auth --namespace does not contain \"whisk namespace set\".")
}
common.DeleteFile(tmpProp)
}
// Test case to show api build version using property file.
func TestShowAPIBuildVersion(t *testing.T) {
common.CreateFile(tmpProp)
os.Setenv("WSK_CONFIG_FILE", tmpProp)
assert.Equal(t, os.Getenv("WSK_CONFIG_FILE"), tmpProp, "The environment variable WSK_CONFIG_FILE has not been set.")
stdout, err := wsk.RunCommand("property", "set", "--apihost", wsk.Wskprops.APIHost,
"--apiversion", wsk.Wskprops.Apiversion)
assert.Equal(t, nil, err, "The command property set --apihost --apiversion failed to run.")
stdout, err = wsk.RunCommand("property", "get", "-i", "--apibuild")
assert.Equal(t, nil, err, "The command property get -i --apibuild failed to run.")
println(common.RemoveRedundentSpaces(string(stdout)))
assert.NotContains(t, common.RemoveRedundentSpaces(string(stdout)), common.PropDisplayAPIBuild+" Unknown",
"The output of the command property get --apibuild does not contain "+common.PropDisplayAPIBuild+" Unknown")
assert.NotContains(t, common.RemoveRedundentSpaces(string(stdout)), "Unable to obtain API build information",
"The output of the command property get --apibuild does not contain \"Unable to obtain API build information\".")
assert.Contains(t, common.RemoveRedundentSpaces(string(stdout)), common.PropDisplayAPIBuild+" 20",
"The output of the command property get --apibuild does not contain"+common.PropDisplayAPIBuild+" 20")
common.DeleteFile(tmpProp)
}
// Test case to fail to show api build when setting apihost to bogus value.
func TestFailShowAPIBuildVersion(t *testing.T) {
common.CreateFile(tmpProp)
os.Setenv("WSK_CONFIG_FILE", tmpProp)
assert.Equal(t, os.Getenv("WSK_CONFIG_FILE"), tmpProp, "The environment variable WSK_CONFIG_FILE has not been set.")
_, err := wsk.RunCommand("property", "set", "--apihost", "xxxx.yyyy")
assert.Equal(t, nil, err, "The command property set --apihost failed to run.")
stdout, err := wsk.RunCommand("property", "get", "-i", "--apibuild")
assert.NotEqual(t, nil, err, "The command property get -i --apibuild does not raise any error.")
assert.Contains(t, common.RemoveRedundentSpaces(string(stdout)), common.PropDisplayAPIBuild+" Unknown",
"The output of the command property get --apibuild does not contain"+common.PropDisplayAPIBuild+" Unknown")
assert.Contains(t, common.RemoveRedundentSpaces(string(stdout)), "Unable to obtain API build information",
"The output of the command property get --apibuild does not contain \"Unable to obtain API build information\".")
}
// Test case to show api build using http apihost.
func TestShowAPIBuildVersionHTTP(t *testing.T) {
common.CreateFile(tmpProp)
os.Setenv("WSK_CONFIG_FILE", tmpProp)
assert.Equal(t, os.Getenv("WSK_CONFIG_FILE"), tmpProp, "The environment variable WSK_CONFIG_FILE has not been set.")
apihost := wsk.Wskprops.APIHost
stdout, err := wsk.RunCommand("property", "set", "--apihost", apihost)
assert.Equal(t, nil, err, "The command property set --apihost failed to run.")
stdout, err = wsk.RunCommand("property", "get", "-i", "--apibuild")
println(common.RemoveRedundentSpaces(string(stdout)))
//assert.Equal(t, nil, err, "The command property get -i --apibuild failed to run.")
assert.NotContains(t, common.RemoveRedundentSpaces(string(stdout)), common.PropDisplayAPIBuild+" Unknown",
"The output of the command property get --apibuild does not contain "+common.PropDisplayAPIBuild+" Unknown")
assert.NotContains(t, common.RemoveRedundentSpaces(string(stdout)), "Unable to obtain API build information",
"The output of the command property get --apibuild does not contain \"Unable to obtain API build information\".")
assert.Contains(t, common.RemoveRedundentSpaces(string(stdout)), common.PropDisplayAPIBuild+" 20",
"The output of the command property get --apibuild does not contain "+common.PropDisplayAPIBuild+" 20")
common.DeleteFile(tmpProp)
}
// Test case to reject bad command.
func TestRejectAuthCommNoKey(t *testing.T) {
common.CreateFile(tmpProp)
os.Setenv("WSK_CONFIG_FILE", tmpProp)
assert.Equal(t, os.Getenv("WSK_CONFIG_FILE"), tmpProp, "The environment variable WSK_CONFIG_FILE has not been set.")
stdout, err := wsk.RunCommand("list", "--apihost", wsk.Wskprops.APIHost,
"--apiversion", wsk.Wskprops.Apiversion)
assert.NotEqual(t, nil, err, "The command list should fail to run.")
assert.Contains(t, common.RemoveRedundentSpaces(string(stdout)), "usage.",
"The output of the command does not contain \"usage.\".")
assert.Contains(t, common.RemoveRedundentSpaces(string(stdout)), "--auth is required",
"The output of the command does not contain \"--auth is required\".")
common.DeleteFile(tmpProp)
}
// Test case to reject commands that are executed with invalid arguments.
func TestRejectCommInvalidArgs(t *testing.T) {
initInvalidArgs()
for _, invalidArg := range invalidArgs {
cs := invalidArg.Cmd
cs = append(cs, "--apihost", wsk.Wskprops.APIHost)
stdout, err := wsk.RunCommand(cs...)
outputString := string(stdout)
assert.NotEqual(t, nil, err, "The command should fail to run.")
if err.Error() == "exit status 1" {
assert.Equal(t, "exit status 1", err.Error(), "The error should be exit status 1 or 2.")
} else {
assert.Equal(t, "exit status 2", err.Error(), "The error should be exit status 1 or 2.")
}
assert.Contains(t, outputString, invalidArg.Err,
"The output of the command does not contain "+invalidArg.Err)
assert.Contains(t, outputString, "Run 'wsk --help' for usage",
"The output of the command does not contain \"Run 'wsk --help' for usage\".")
}
}
// Test case to reject commands that are executed with invalid JSON for annotations and parameters.
func TestRejectCommInvalidJSON(t *testing.T) {
helloFile := common.GetTestActionFilename("hello.js")
var invalidJSONInputs = []string{
"{\"invalid1\": }",
"{\"invalid2\": bogus}",
"{\"invalid1\": \"aKey\"",
"invalid \"string\"",
"{\"invalid1\": [1, 2, \"invalid\"\"arr\"]}",
}
var invalidJSONFiles = []string{
common.GetTestActionFilename("malformed.js"),
common.GetTestActionFilename("invalidInput1.json"),
common.GetTestActionFilename("invalidInput2.json"),
common.GetTestActionFilename("invalidInput3.json"),
common.GetTestActionFilename("invalidInput4.json"),
}
var invalidParamArg = "Invalid parameter argument"
var invalidAnnoArg = "Invalid annotation argument"
var paramCmds = []common.InvalidArg{
{
Cmd: []string{"action", "create", "actionName", helloFile},
Err: invalidParamArg,
},
{
Cmd: []string{"action", "update", "actionName", helloFile},
Err: invalidParamArg,
},
{
Cmd: []string{"action", "invoke", "actionName"},
Err: invalidParamArg,
},
{
Cmd: []string{"package", "create", "packageName"},
Err: invalidParamArg,
},
{
Cmd: []string{"package", "update", "packageName"},
Err: invalidParamArg,
},
{
Cmd: []string{"package", "bind", "packageName", "boundPackageName"},
Err: invalidParamArg,
},
{
Cmd: []string{"trigger", "create", "triggerName"},
Err: invalidParamArg,
},
{
Cmd: []string{"trigger", "update", "triggerName"},
Err: invalidParamArg,
},
{
Cmd: []string{"trigger", "fire", "triggerName"},
Err: invalidParamArg,
},
}
var annotCmds = []common.InvalidArg{
{
Cmd: []string{"action", "create", "actionName", helloFile},
Err: invalidAnnoArg,
},
{
Cmd: []string{"action", "update", "actionName", helloFile},
Err: invalidAnnoArg,
},
{
Cmd: []string{"package", "create", "packageName"},
Err: invalidAnnoArg,
},
{
Cmd: []string{"package", "update", "packageName"},
Err: invalidAnnoArg,
},
{
Cmd: []string{"package", "bind", "packageName", "boundPackageName"},
Err: invalidAnnoArg,
},
{
Cmd: []string{"trigger", "create", "triggerName"},
Err: invalidAnnoArg,
},
{
Cmd: []string{"trigger", "update", "triggerName"},
Err: invalidAnnoArg,
},
}
for _, cmd := range paramCmds {
for _, invalid := range invalidJSONInputs {
cs := cmd.Cmd
cs = append(cs, "-p", "key", invalid, "--apihost", wsk.Wskprops.APIHost)
stdout, err := wsk.RunCommand(cs...)
outputString := string(stdout)
assert.NotEqual(t, nil, err, "The command should fail to run.")
assert.Equal(t, "exit status 1", err.Error(), "The error should be exit status 1.")
assert.Contains(t, outputString, cmd.Err,
"The output of the command does not contain "+cmd.Err+" .")
}
for _, invalid := range invalidJSONFiles {
cs := cmd.Cmd
cs = append(cs, "-P", invalid, "--apihost", wsk.Wskprops.APIHost)
stdout, err := wsk.RunCommand(cs...)
outputString := string(stdout)
assert.NotEqual(t, nil, err, "The command should fail to run.")
assert.Equal(t, "exit status 1", err.Error(), "The error should be exit status 1.")
assert.Contains(t, outputString, cmd.Err,
"The output of the command does not contain "+cmd.Err+" .")
}
}
for _, cmd := range annotCmds {
for _, invalid := range invalidJSONInputs {
cs := cmd.Cmd
cs = append(cs, "-a", "key", invalid, "--apihost", wsk.Wskprops.APIHost)
stdout, err := wsk.RunCommand(cs...)
outputString := string(stdout)
assert.NotEqual(t, nil, err, "The command should fail to run.")
assert.Equal(t, "exit status 1", err.Error(), "The error should be exit status 1.")
assert.Contains(t, outputString, cmd.Err,
"The output of the command does not contain "+cmd.Err+" .")
}
for _, invalid := range invalidJSONFiles {
cs := cmd.Cmd
cs = append(cs, "-A", invalid, "--apihost", wsk.Wskprops.APIHost)
stdout, err := wsk.RunCommand(cs...)
outputString := string(stdout)
assert.NotEqual(t, nil, err, "The command should fail to run.")
assert.Equal(t, "exit status 1", err.Error(), "The error should be exit status 1.")
assert.Contains(t, outputString, cmd.Err,
"The output of the command does not contain "+cmd.Err+" .")
}
}
}