blob: 02efd9a1297ea5ca9b6ceea6fe3c205862159298 [file] [log] [blame]
// +build unit
/*
* 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 parsers
import (
"github.com/stretchr/testify/assert"
"io/ioutil"
"os"
"testing"
)
func createTmpfile(data string, filename string) (f *os.File, err error) {
dir, _ := os.Getwd()
tmpfile, err := ioutil.TempFile(dir, filename)
if err != nil {
return nil, err
}
_, err = tmpfile.Write([]byte(data))
if err != nil {
return tmpfile, err
}
return tmpfile, nil
}
func TestInvalidKeyDeploymentYaml(t *testing.T) {
data := `project:
name: wskdeploy-samples
invalidKey: test`
tmpfile, err := createTmpfile(data, "deployment_parser_test_")
if err != nil {
assert.Fail(t, "Failed to create temp file")
}
defer func() {
tmpfile.Close()
os.Remove(tmpfile.Name())
}()
p := NewYAMLParser()
_, err = p.ParseDeployment(tmpfile.Name())
assert.NotNil(t, err)
// NOTE: go-yaml/yaml gets the line # wrong; testing only for the invalid key message
assert.Contains(t, err.Error(), "field invalidKey not found in struct parsers.Project")
}
func TestMappingValueDeploymentYaml(t *testing.T) {
data := `project:
name: wskdeploy-samples
packages: test`
tmpfile, err := createTmpfile(data, "deployment_parser_test_")
if err != nil {
assert.Fail(t, "Failed to create temp file")
}
defer func() {
tmpfile.Close()
os.Remove(tmpfile.Name())
}()
p := NewYAMLParser()
_, err = p.ParseDeployment(tmpfile.Name())
assert.NotNil(t, err)
// go-yaml/yaml prints the wrong line number for mapping values. It should be 3.
assert.Contains(t, err.Error(), "line 2: mapping values are not allowed in this context")
}
func TestMissingRootNodeDeploymentYaml(t *testing.T) {
data := `name: wskdeploy-samples`
tmpfile, err := createTmpfile(data, "deployment_parser_test_")
if err != nil {
assert.Fail(t, "Failed to create temp file")
}
defer func() {
tmpfile.Close()
os.Remove(tmpfile.Name())
}()
p := NewYAMLParser()
_, err = p.ParseDeployment(tmpfile.Name())
assert.NotNil(t, err)
// go-yaml/yaml prints the wrong line number for mapping values. It should be 3.
assert.Contains(t, err.Error(), "line 1: field name not found in struct parsers.YAML")
}
func TestParseDeploymentYAML_Project(t *testing.T) {
//var deployment utils.DeploymentYAML
mm := NewYAMLParser()
deployment, _ := mm.ParseDeployment("../tests/dat/deployment_data_project.yaml")
//get and verify project name
assert.Equal(t, "wskdeploy-samples", deployment.GetProject().Name, "Get project name failed.")
assert.Equal(t, "/wskdeploy/samples/", deployment.GetProject().Namespace, "Get project namespace failed.")
assert.Equal(t, "user-credential", deployment.GetProject().Credential, "Get project credential failed.")
assert.Equal(t, "172.17.0.1", deployment.GetProject().ApiHost, "Get project api host failed.")
}
func TestParseDeploymentYAML_Project_Package(t *testing.T) {
//var deployment utils.DeploymentYAML
mm := NewYAMLParser()
deployment, _ := mm.ParseDeployment("../tests/dat/deployment_data_project_package.yaml")
assert.Equal(t, 1, len(deployment.GetProject().Packages), "Get package list failed.")
for pkg_name := range deployment.GetProject().Packages {
assert.Equal(t, "test_package", pkg_name, "Get package name failed.")
var pkg = deployment.GetProject().Packages[pkg_name]
assert.Equal(t, "/wskdeploy/samples/test", pkg.Namespace, "Get package namespace failed.")
assert.Equal(t, "12345678ABCDEF", pkg.Credential, "Get package credential failed.")
assert.Equal(t, 1, len(pkg.Inputs), "Get package input list failed.")
//get and verify inputs
for param_name, param := range pkg.Inputs {
assert.Equal(t, "value", param.Value, "Get input value failed.")
assert.Equal(t, "param", param_name, "Get input param name failed.")
}
}
}
func TestParseDeploymentYAML_Packages(t *testing.T) {
//var deployment utils.DeploymentYAML
mm := NewYAMLParser()
deployment, _ := mm.ParseDeployment("../tests/dat/deployment_data_packages.yaml")
assert.Equal(t, 0, len(deployment.GetProject().Packages), "Packages under project are empty.")
assert.Equal(t, 1, len(deployment.Packages), "Packages are available.")
for pkg_name := range deployment.Packages {
assert.Equal(t, "test_package", pkg_name, "Get package name failed.")
var pkg = deployment.Packages[pkg_name]
assert.Equal(t, "/wskdeploy/samples/test", pkg.Namespace, "Get package namespace failed.")
assert.Equal(t, "12345678ABCDEF", pkg.Credential, "Get package credential failed.")
assert.Equal(t, 1, len(pkg.Inputs), "Get package input list failed.")
//get and verify inputs
for param_name, param := range pkg.Inputs {
assert.Equal(t, "value", param.Value, "Get input value failed.")
assert.Equal(t, "param", param_name, "Get input param name failed.")
}
}
}
func TestParseDeploymentYAML_Action(t *testing.T) {
mm := NewYAMLParser()
deployment, _ := mm.ParseDeployment("../tests/dat/deployment_data_project_package.yaml")
for pkg_name := range deployment.GetProject().Packages {
var pkg = deployment.GetProject().Packages[pkg_name]
for action_name := range pkg.Actions {
assert.Equal(t, "hello", action_name, "Get action name failed.")
var action = pkg.Actions[action_name]
assert.Equal(t, "/wskdeploy/samples/test/hello", action.Namespace, "Get action namespace failed.")
assert.Equal(t, "12345678ABCDEF", action.Credential, "Get action credential failed.")
assert.Equal(t, 1, len(action.Inputs), "Get package input list failed.")
//get and verify inputs
for param_name, param := range action.Inputs {
switch param.Value.(type) {
case string:
assert.Equal(t, "name", param_name, "Get input param name failed.")
assert.Equal(t, "Bernie", param.Value, "Get input value failed.")
default:
t.Error("Get input value type failed.")
}
}
}
}
}
func TestParseDeploymentYAML_Packages_Env(t *testing.T) {
testPackage := "test_package"
os.Setenv("package_name", testPackage)
assert.Equal(t, testPackage, os.Getenv("package_name"))
//var deployment utils.DeploymentYAML
mm := NewYAMLParser()
deployment, _ := mm.ParseDeployment("../tests/dat/deployment_data_packages_env_var.yaml")
assert.Equal(t, 0, len(deployment.GetProject().Packages), "Packages under project are empty.")
assert.Equal(t, 1, len(deployment.Packages), "Packages are available.")
for pkg_name := range deployment.Packages {
assert.Equal(t, testPackage, pkg_name, "Get package name failed.")
var pkg = deployment.Packages[pkg_name]
assert.Equal(t, "/wskdeploy/samples/test", pkg.Namespace, "Get package namespace failed.")
assert.Equal(t, "12345678ABCDEF", pkg.Credential, "Get package credential failed.")
assert.Equal(t, 1, len(pkg.Inputs), "Get package input list failed.")
//get and verify inputs
for param_name, param := range pkg.Inputs {
assert.Equal(t, "value", param.Value, "Get input value failed.")
assert.Equal(t, "param", param_name, "Get input param name failed.")
}
}
}
func TestParseDeploymentYAML_Project_Packages_Env(t *testing.T) {
testPackage := "test_package"
os.Setenv("package_name", testPackage)
testPackageSec := "test_package_second"
os.Setenv("package_name_second", testPackageSec)
assert.Equal(t, testPackage, os.Getenv("package_name"))
mm := NewYAMLParser()
deployment, _ := mm.ParseDeployment("../tests/dat/deployment_data_project_packages_env_var.yaml")
expectedPackages := [2]string{testPackage, testPackageSec}
dep := deployment.GetProject()
assert.Equal(t, 2, len(dep.Packages), "Get package list failed.")
for _, pkg_name := range expectedPackages {
var pkg = dep.Packages[pkg_name]
assert.Equal(t, pkg_name, pkg.Packagename, "Get package package name failed.")
assert.Equal(t, "/wskdeploy/samples/test", pkg.Namespace, "Get package namespace failed.")
assert.Equal(t, "12345678ABCDEF", pkg.Credential, "Get package credential failed.")
assert.Equal(t, 1, len(pkg.Inputs), "Get package input list failed.")
//get and verify inputs
for param_name, param := range pkg.Inputs {
assert.Equal(t, "value", param.Value, "Get input value failed.")
assert.Equal(t, "param", param_name, "Get input param name failed.")
}
}
// Verify the case of using concatenation.
expectedPackages = [2]string{testPackage + "suffix", testPackageSec + "suffix"}
deployment, _ = mm.ParseDeployment("../tests/dat/deployment_data_project_packages_env_var_con.yaml")
dep = deployment.GetProject()
assert.Equal(t, 2, len(dep.Packages), "Get package list failed.")
for _, pkg_name := range expectedPackages {
var pkg = dep.Packages[pkg_name]
assert.Equal(t, pkg_name, pkg.Packagename, "Get package package name failed.")
assert.Equal(t, "/wskdeploy/samples/test", pkg.Namespace, "Get package namespace failed.")
assert.Equal(t, "12345678ABCDEF", pkg.Credential, "Get package credential failed.")
assert.Equal(t, 1, len(pkg.Inputs), "Get package input list failed.")
//get and verify inputs
for param_name, param := range pkg.Inputs {
assert.Equal(t, "value", param.Value, "Get input value failed.")
assert.Equal(t, "param", param_name, "Get input param name failed.")
}
}
}