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