Validate namespace argument in 'sdlcli get keys' -command.
The command gets an unexpected error when namespace argument
contains '*' asterisk character:
sdlcli get keys '*' ...
panic: runtime error: index out of range [1] with length 1
Issue-Id: RIC-113
Change-Id: Ie8b292c4c40801bf9fbfe65274f86485c7085865
Signed-off-by: Petri Ovaska <petri.ovaska@nokia.com>
Args: cobra.RangeArgs(1, 2),
RunE: func(cmd *cobra.Command, args []string) error {
sdlgoredis.SetDbLogger(&buf)
- keysArgs := newKeysArgs(args[0], "*")
+ keysArgs := NewKeysArgs(args[0], "*")
if len(args) > 1 {
keysArgs.pattern = args[1]
}
+ if err := keysArgs.Validate(); err != nil {
+ return err
+ }
keys, err := runListKeys(sdlCb, keysArgs)
if err != nil {
fmt.Fprintf(os.Stderr, "%s", buf.String())
assert.Equal(t, expNokErr, err)
assert.Contains(t, result, expNokOut)
}
+
+func TestKeysCmdInvalidNamespaceArgument(t *testing.T) {
+ expNokErrNsAsterisk1 := errors.New("Invalid character (*) in given * namespace argument.")
+ expNokErrNsAsterisk2 := errors.New("Invalid character (*) in given foo* namespace argument.")
+ expHelp := "Usage:\n keys <namespace> [pattern|default '*'] [flags]"
+ tests := []struct {
+ args []string
+ expOut string
+ expErr error
+ }{
+ {args: []string{"*"}, expErr: expNokErrNsAsterisk1, expOut: expHelp},
+ {args: []string{"foo*"}, expErr: expNokErrNsAsterisk2, expOut: expHelp},
+ }
+
+ for _, test := range tests {
+ buf := new(bytes.Buffer)
+ cmd := cli.NewKeysCmdForTest(newMockSdlApi)
+ cmd.SetOut(buf)
+ cmd.SetErr(buf)
+ cmd.SetArgs(test.args)
+ err := cmd.Execute()
+ result := buf.String()
+
+ assert.Equal(t, test.expErr, err)
+ assert.Contains(t, result, test.expOut)
+ }
+}
package cli
-import "gerrit.o-ran-sc.org/r/ric-plt/sdlgo/internal/sdlgoredis"
+import (
+ "fmt"
+ "gerrit.o-ran-sc.org/r/ric-plt/sdlgo/internal/sdlgoredis"
+ "strings"
+)
//iDatabase is an interface towards database backend, for the time being
//sdlgoredis.DB implements this interface.
pattern string
}
-//newKeysArgs constructs a new keysArgs struct.
-func newKeysArgs(ns string, pattern string) keysArgs {
+//NewKeysArgs constructs a new keysArgs struct.
+func NewKeysArgs(ns string, pattern string) keysArgs {
return keysArgs{
ns: ns,
pattern: pattern,
}
}
+//Validate command arguments in keysArgs.
+func (k keysArgs) Validate() error {
+ if strings.Contains(k.ns, "*") {
+ return fmt.Errorf("Invalid character (*) in given %s namespace argument.", k.ns)
+ }
+ return nil
+}
+
//nsMap is a map having SDL DB cluster address as a key and namespace map of type nsKeyMap as a value
type nsMap map[string]nsKeyMap
--- /dev/null
+/*
+ Copyright (c) 2021 AT&T Intellectual Property.
+ Copyright (c) 2018-2021 Nokia.
+
+ Licensed 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.
+*/
+
+/*
+ * This source code is part of the near-RT RIC (RAN Intelligent Controller)
+ * platform project (RICP).
+ */
+
+package cli_test
+
+import (
+ "errors"
+ "gerrit.o-ran-sc.org/r/ric-plt/sdlgo/internal/cli"
+ "github.com/stretchr/testify/assert"
+ "testing"
+)
+
+func TestTypesKeysArgsValidate(t *testing.T) {
+ tests := []struct {
+ ns string
+ pattern string
+ expErr error
+ }{
+ {ns: "", pattern: "", expErr: nil},
+ {ns: "a", pattern: "", expErr: nil},
+ {ns: "aa", pattern: "b", expErr: nil},
+ {ns: "", pattern: "b", expErr: nil},
+ }
+ for _, test := range tests {
+ assert.Equal(t, test.expErr, cli.NewKeysArgs(test.ns, test.pattern).Validate())
+ }
+}
+
+func TestTypesKeysArgsValidateNsAsteriskError(t *testing.T) {
+ tests := []struct {
+ ns string
+ pattern string
+ expErr error
+ }{
+ {ns: "*", pattern: "", expErr: errors.New("Invalid character (*) in given * namespace argument.")},
+ {ns: "\\*", pattern: "", expErr: errors.New("Invalid character (*) in given \\* namespace argument.")},
+ {ns: "a*", pattern: "", expErr: errors.New("Invalid character (*) in given a* namespace argument.")},
+ }
+ for _, test := range tests {
+ assert.Equal(t, test.expErr, cli.NewKeysArgs(test.ns, test.pattern).Validate())
+ }
+}