1 // SPDX-License-Identifier: Apache-2.0
\r
2 // Copyright (c) 2020 Intel Corporation
\r
7 "github.com/open-ness/EMCO/src/orchestrator/pkg/infra/contextdb"
\r
8 pkgerrors "github.com/pkg/errors"
\r
13 // MockContextDb for mocking contextdb
\r
14 type MockContextDb struct {
\r
15 Items map[string]interface{}
\r
20 func (c *MockContextDb) Put(key string, val interface{}) error {
\r
22 c.Items = make(map[string]interface{})
\r
29 func (c *MockContextDb) Get(key string, val interface{}) error {
\r
32 for kvKey, kvValue := range c.Items {
\r
34 *s = kvValue.(string)
\r
42 func (c *MockContextDb) Delete(key string) error {
\r
43 delete(c.Items, key)
\r
47 // Delete all function
\r
48 func (c *MockContextDb) DeleteAll(key string) error {
\r
49 for kvKey := range c.Items {
\r
50 delete(c.Items, kvKey)
\r
55 // GetAllKeys function
\r
56 func (c *MockContextDb) GetAllKeys(path string) ([]string, error) {
\r
59 for k := range c.Items {
\r
60 keys = append(keys, string(k))
\r
65 func (c *MockContextDb) HealthCheck() error {
\r
69 func TestRtcInit(t *testing.T) {
\r
70 var rtc = RunTimeContext{}
\r
71 testCases := []struct {
\r
73 mockContextDb *MockContextDb
\r
74 expectedError string
\r
77 label: "Success case",
\r
78 mockContextDb: &MockContextDb{},
\r
81 label: "Init returns error case",
\r
82 mockContextDb: &MockContextDb{Err: pkgerrors.Errorf("Client not intialized")},
\r
83 expectedError: "Error, context already initialized",
\r
87 for _, testCase := range testCases {
\r
88 t.Run(testCase.label, func(t *testing.T) {
\r
89 contextdb.Db = testCase.mockContextDb
\r
90 _, err := rtc.RtcInit()
\r
92 if !strings.Contains(string(err.Error()), testCase.expectedError) {
\r
93 t.Fatalf("Method returned an error (%s)", err)
\r
101 func TestRtcLoad(t *testing.T) {
\r
102 var rtc = RunTimeContext{"", ""}
\r
103 testCases := []struct {
\r
105 mockContextDb *MockContextDb
\r
107 expectedError string
\r
110 label: "Success case",
\r
111 id: "5345674458787728",
\r
112 mockContextDb: &MockContextDb{},
\r
115 label: "reinit returns error case",
\r
116 mockContextDb: &MockContextDb{Err: pkgerrors.Errorf("Client not intialized")},
\r
117 id: "8885674458787728",
\r
118 expectedError: "Error finding the context id:",
\r
122 for _, testCase := range testCases {
\r
123 t.Run(testCase.label, func(t *testing.T) {
\r
124 contextdb.Db = testCase.mockContextDb
\r
125 _, err := rtc.RtcLoad("5345674458787728")
\r
127 if !strings.Contains(string(err.Error()), testCase.expectedError) {
\r
128 t.Fatalf("Method returned an error (%s)", err)
\r
136 func TestRtcCreate(t *testing.T) {
\r
137 var rtc = RunTimeContext{"/context/5345674458787728/", ""}
\r
138 testCases := []struct {
\r
140 mockContextDb *MockContextDb
\r
141 expectedError string
\r
144 label: "Success case",
\r
145 mockContextDb: &MockContextDb{},
\r
148 label: "Create returns error case",
\r
149 mockContextDb: &MockContextDb{Err: pkgerrors.Errorf("Client not intialized")},
\r
150 expectedError: "Error creating run time context:",
\r
154 for _, testCase := range testCases {
\r
155 t.Run(testCase.label, func(t *testing.T) {
\r
156 contextdb.Db = testCase.mockContextDb
\r
157 _, err := rtc.RtcCreate()
\r
159 if !strings.Contains(string(err.Error()), testCase.expectedError) {
\r
160 t.Fatalf("Method returned an error (%s)", err)
\r
168 func TestRtcGet(t *testing.T) {
\r
169 var rtc = RunTimeContext{"/context/5345674458787728/", ""}
\r
170 testCases := []struct {
\r
172 mockContextDb *MockContextDb
\r
173 expectedError string
\r
176 label: "Success case",
\r
177 mockContextDb: &MockContextDb{},
\r
180 label: "Get returns error case",
\r
181 mockContextDb: &MockContextDb{Err: pkgerrors.Errorf("Client not intialized")},
\r
182 expectedError: "Error getting run time context metadata:",
\r
185 label: "Context handle does not match",
\r
186 mockContextDb: &MockContextDb{Err: nil},
\r
187 expectedError: "Error matching run time context metadata",
\r
191 for _, testCase := range testCases {
\r
192 t.Run(testCase.label, func(t *testing.T) {
\r
193 switch testCase.label {
\r
194 case "Success case":
\r
195 contextdb.Db = testCase.mockContextDb
\r
196 chandle, err := rtc.RtcCreate()
\r
198 t.Fatalf("Create returned an error (%s)", err)
\r
200 ghandle, err := rtc.RtcGet()
\r
202 t.Fatalf("Get returned an error (%s)", err)
\r
204 if chandle != ghandle {
\r
205 t.Fatalf("Create and Get does not match")
\r
207 case "Get returns error case":
\r
208 contextdb.Db = testCase.mockContextDb
\r
209 _, err := rtc.RtcGet()
\r
211 if !strings.Contains(string(err.Error()), testCase.expectedError) {
\r
212 t.Fatalf("Method returned an error (%s)", err)
\r
215 case "Context handle does not match":
\r
216 contextdb.Db = testCase.mockContextDb
\r
217 contextdb.Db.Put("/context/5345674458787728/", "6345674458787728")
\r
218 _, err := rtc.RtcGet()
\r
220 if !strings.Contains(string(err.Error()), testCase.expectedError) {
\r
221 t.Fatalf("Method returned an error (%s)", err)
\r
229 func TestRtcAddLevel(t *testing.T) {
\r
230 var rtc = RunTimeContext{"/context/3528435435454354/", ""}
\r
231 testCases := []struct {
\r
233 mockContextDb *MockContextDb
\r
237 expectedError string
\r
240 label: "Success case",
\r
241 mockContextDb: &MockContextDb{},
\r
242 handle: "/context/3528435435454354/",
\r
247 label: "Not a valid rtc handle",
\r
248 mockContextDb: &MockContextDb{},
\r
249 handle: "/context/9528435435454354/",
\r
252 expectedError: "Not a valid run time context handle",
\r
255 label: "Not a valid rtc level",
\r
256 mockContextDb: &MockContextDb{},
\r
257 handle: "/context/3528435435454354/",
\r
260 expectedError: "Not a valid run time context level",
\r
263 label: "Not a valid rtc value",
\r
264 mockContextDb: &MockContextDb{},
\r
265 handle: "/context/3528435435454354/",
\r
268 expectedError: "Not a valid run time context level value",
\r
271 label: "Put returns error",
\r
272 mockContextDb: &MockContextDb{Err: pkgerrors.Errorf("Client not intialized")},
\r
273 handle: "/context/3528435435454354/",
\r
276 expectedError: "Error adding run time context level:",
\r
280 for _, testCase := range testCases {
\r
281 t.Run(testCase.label, func(t *testing.T) {
\r
282 contextdb.Db = testCase.mockContextDb
\r
283 _, err := rtc.RtcAddLevel(testCase.handle, testCase.level, testCase.value)
\r
285 if !strings.Contains(string(err.Error()), testCase.expectedError) {
\r
286 t.Fatalf("Method returned an error (%s)", err)
\r
293 func TestRtcAddResource(t *testing.T) {
\r
294 var rtc = RunTimeContext{"/context/3528435435454354/", ""}
\r
295 testCases := []struct {
\r
297 mockContextDb *MockContextDb
\r
301 expectedError string
\r
304 label: "Success case",
\r
305 mockContextDb: &MockContextDb{},
\r
306 handle: "/context/3528435435454354/app/apptest1/cluster/cluster1/",
\r
311 label: "Not a valid rtc handle",
\r
312 mockContextDb: &MockContextDb{},
\r
313 handle: "/context/9528435435454354/app/apptest1/cluster/cluster1/",
\r
316 expectedError: "Not a valid run time context handle",
\r
319 label: "Not a valid rtc resource name",
\r
320 mockContextDb: &MockContextDb{},
\r
321 handle: "/context/3528435435454354/app/apptest1/cluster/cluster1/",
\r
324 expectedError: "Not a valid run time context resource name",
\r
327 label: "Not a valid rtc value",
\r
328 mockContextDb: &MockContextDb{},
\r
329 handle: "/context/3528435435454354/app/apptest1/cluster/cluster1/",
\r
332 expectedError: "Not a valid run time context resource value",
\r
335 label: "Put returns error",
\r
336 mockContextDb: &MockContextDb{Err: pkgerrors.Errorf("Client not intialized")},
\r
337 handle: "/context/3528435435454354/app/apptest1/cluster/cluster1/",
\r
340 expectedError: "Error adding run time context resource:",
\r
344 for _, testCase := range testCases {
\r
345 t.Run(testCase.label, func(t *testing.T) {
\r
346 contextdb.Db = testCase.mockContextDb
\r
347 _, err := rtc.RtcAddResource(testCase.handle, testCase.resname, testCase.value)
\r
349 if !strings.Contains(string(err.Error()), testCase.expectedError) {
\r
350 t.Fatalf("Method returned an error (%s)", err)
\r
357 func TestRtcAddInstruction(t *testing.T) {
\r
358 var rtc = RunTimeContext{"/context/3528435435454354/", ""}
\r
359 testCases := []struct {
\r
361 mockContextDb *MockContextDb
\r
366 expectedError string
\r
369 label: "Success case",
\r
370 mockContextDb: &MockContextDb{},
\r
371 handle: "/context/3528435435454354/app/apptest1/cluster/cluster1/",
\r
374 value: "{resorder: [R3, R1, R2]}",
\r
377 label: "Not a valid rtc handle",
\r
378 mockContextDb: &MockContextDb{},
\r
379 handle: "/context/9528435435454354/app/apptest1/cluster/cluster1/",
\r
382 value: "{resorder: [R3, R1, R2]}",
\r
383 expectedError: "Not a valid run time context handle",
\r
386 label: "Not a valid rtc level name",
\r
387 mockContextDb: &MockContextDb{},
\r
388 handle: "/context/3528435435454354/app/apptest1/cluster/cluster1/",
\r
391 value: "{resorder: [R3, R1, R2]}",
\r
392 expectedError: "Not a valid run time context level",
\r
395 label: "Not a valid rtc instruction type",
\r
396 mockContextDb: &MockContextDb{},
\r
397 handle: "/context/3528435435454354/app/apptest1/cluster/cluster1/",
\r
400 value: "{resorder: [R3, R1, R2]}",
\r
401 expectedError: "Not a valid run time context instruction type",
\r
404 label: "Not a valid rtc value",
\r
405 mockContextDb: &MockContextDb{},
\r
406 handle: "/context/3528435435454354/app/apptest1/cluster/cluster1/",
\r
410 expectedError: "Not a valid run time context instruction value",
\r
413 label: "Put returns error",
\r
414 mockContextDb: &MockContextDb{Err: pkgerrors.Errorf("Client not intialized")},
\r
415 handle: "/context/3528435435454354/app/apptest1/cluster/cluster1/",
\r
418 value: "{resorder: [R3, R1, R2]}",
\r
419 expectedError: "Error adding run time context instruction:",
\r
423 for _, testCase := range testCases {
\r
424 t.Run(testCase.label, func(t *testing.T) {
\r
425 contextdb.Db = testCase.mockContextDb
\r
426 _, err := rtc.RtcAddInstruction(testCase.handle, testCase.level, testCase.insttype, testCase.value)
\r
428 if !strings.Contains(string(err.Error()), testCase.expectedError) {
\r
429 t.Fatalf("Method returned an error (%s)", err)
\r
436 func TestRtcGetHandles(t *testing.T) {
\r
437 var rtc = RunTimeContext{"/context/5345674458787728/", ""}
\r
438 testCases := []struct {
\r
440 mockContextDb *MockContextDb
\r
442 expectedError string
\r
445 label: "Not valid input handle case",
\r
446 mockContextDb: &MockContextDb{},
\r
447 key: "/context/3528435435454354/",
\r
448 expectedError: "Not a valid run time context handle",
\r
451 label: "Contextdb call returns error case",
\r
452 mockContextDb: &MockContextDb{Err: pkgerrors.Errorf("Key does not exist")},
\r
453 key: "/context/5345674458787728/",
\r
454 expectedError: "Error getting run time context handles:",
\r
457 label: "Success case",
\r
458 mockContextDb: &MockContextDb{},
\r
459 key: "/context/5345674458787728/",
\r
463 for _, testCase := range testCases {
\r
464 t.Run(testCase.label, func(t *testing.T) {
\r
465 contextdb.Db = testCase.mockContextDb
\r
466 if testCase.label == "Success case" {
\r
467 contextdb.Db.Put("/context/5345674458787728/", 5345674458787728)
\r
469 _, err := rtc.RtcGetHandles(testCase.key)
\r
471 if !strings.Contains(string(err.Error()), testCase.expectedError) {
\r
472 t.Fatalf("Method returned an error (%s)", err)
\r
479 func TestRtcGetValue(t *testing.T) {
\r
480 var rtc = RunTimeContext{"/context/5345674458787728/", ""}
\r
481 testCases := []struct {
\r
483 mockContextDb *MockContextDb
\r
485 expectedError string
\r
488 label: "Not valid input handle case",
\r
489 mockContextDb: &MockContextDb{},
\r
490 key: "/context/3528435435454354/",
\r
491 expectedError: "Not a valid run time context handle",
\r
494 label: "Contextdb call returns error case",
\r
495 mockContextDb: &MockContextDb{Err: pkgerrors.Errorf("Key does not exist")},
\r
496 key: "/context/5345674458787728/",
\r
497 expectedError: "Error getting run time context value:",
\r
500 label: "Success case",
\r
501 mockContextDb: &MockContextDb{},
\r
502 key: "/context/5345674458787728/",
\r
506 for _, testCase := range testCases {
\r
507 t.Run(testCase.label, func(t *testing.T) {
\r
508 contextdb.Db = testCase.mockContextDb
\r
509 if testCase.label == "Success case" {
\r
510 contextdb.Db.Put("/context/5345674458787728/", "5345674458787728")
\r
513 err := rtc.RtcGetValue(testCase.key, &val)
\r
515 if !strings.Contains(string(err.Error()), testCase.expectedError) {
\r
516 t.Fatalf("Method returned an error (%s)", err)
\r
523 func TestRtcUpdateValue(t *testing.T) {
\r
524 var rtc = RunTimeContext{"/context/5345674458787728/", ""}
\r
525 testCases := []struct {
\r
527 mockContextDb *MockContextDb
\r
530 expectedError string
\r
533 label: "Not valid input handle case",
\r
534 mockContextDb: &MockContextDb{},
\r
535 key: "/context/3528435435454354/",
\r
536 value: "{apporder: [app1, app2, app3]}",
\r
537 expectedError: "Not a valid run time context handle",
\r
540 label: "Contextdb call returns error case",
\r
541 mockContextDb: &MockContextDb{Err: pkgerrors.Errorf("Key does not exist")},
\r
542 key: "/context/5345674458787728/",
\r
543 value: "{apporder: [app1, app2, app3]}",
\r
544 expectedError: "Error updating run time context value:",
\r
547 label: "Success case",
\r
548 mockContextDb: &MockContextDb{},
\r
549 key: "/context/5345674458787728/",
\r
550 value: "{apporder: [app2, app3, app1]}",
\r
554 for _, testCase := range testCases {
\r
555 t.Run(testCase.label, func(t *testing.T) {
\r
556 contextdb.Db = testCase.mockContextDb
\r
557 if testCase.label == "Success case" {
\r
558 contextdb.Db.Put("/context/5345674458787728/", "5345674458787728")
\r
560 err := rtc.RtcUpdateValue(testCase.key, testCase.value)
\r
562 if !strings.Contains(string(err.Error()), testCase.expectedError) {
\r
563 t.Fatalf("Method returned an error (%s)", err)
\r
570 func TestRtcDeletePair(t *testing.T) {
\r
571 var rtc = RunTimeContext{"/context/5345674458787728/", ""}
\r
572 testCases := []struct {
\r
574 mockContextDb *MockContextDb
\r
576 expectedError string
\r
579 label: "Not valid input handle case",
\r
580 mockContextDb: &MockContextDb{},
\r
581 key: "/context/3528435435454354/",
\r
582 expectedError: "Not a valid run time context handle",
\r
585 label: "Contextdb call returns error case",
\r
586 mockContextDb: &MockContextDb{Err: pkgerrors.Errorf("Key does not exist")},
\r
587 key: "/context/5345674458787728/",
\r
588 expectedError: "Error deleting run time context pair:",
\r
591 label: "Success case",
\r
592 mockContextDb: &MockContextDb{},
\r
593 key: "/context/5345674458787728/",
\r
597 for _, testCase := range testCases {
\r
598 t.Run(testCase.label, func(t *testing.T) {
\r
599 contextdb.Db = testCase.mockContextDb
\r
600 err := rtc.RtcDeletePair(testCase.key)
\r
602 if !strings.Contains(string(err.Error()), testCase.expectedError) {
\r
603 t.Fatalf("Method returned an error (%s)", err)
\r
610 func TestRtcDeletePrefix(t *testing.T) {
\r
611 var rtc = RunTimeContext{"/context/5345674458787728/", ""}
\r
612 testCases := []struct {
\r
614 mockContextDb *MockContextDb
\r
616 expectedError string
\r
619 label: "Not valid input handle case",
\r
620 mockContextDb: &MockContextDb{},
\r
621 key: "/context/3528435435454354/",
\r
622 expectedError: "Not a valid run time context handle",
\r
625 label: "Contextdb call returns error case",
\r
626 mockContextDb: &MockContextDb{Err: pkgerrors.Errorf("Key does not exist")},
\r
627 key: "/context/5345674458787728/",
\r
628 expectedError: "Error deleting run time context with prefix:",
\r
631 label: "Success case",
\r
632 mockContextDb: &MockContextDb{},
\r
633 key: "/context/5345674458787728/",
\r
637 for _, testCase := range testCases {
\r
638 t.Run(testCase.label, func(t *testing.T) {
\r
639 contextdb.Db = testCase.mockContextDb
\r
640 err := rtc.RtcDeletePrefix(testCase.key)
\r
642 if !strings.Contains(string(err.Error()), testCase.expectedError) {
\r
643 t.Fatalf("Method returned an error (%s)", err)
\r