ad0da1d620f10a0ea9f25a6575800c673a9fdb0a
[icn/sdwan.git] /
1 // SPDX-License-Identifier: Apache-2.0\r
2 // Copyright (c) 2020 Intel Corporation\r
3 \r
4 package contextdb\r
5 \r
6 import (\r
7         "context"\r
8         mvccpb "github.com/coreos/etcd/mvcc/mvccpb"\r
9         pkgerrors "github.com/pkg/errors"\r
10         "go.etcd.io/etcd/clientv3"\r
11         "strings"\r
12         "testing"\r
13 )\r
14 \r
15 type kv struct {\r
16         Key   []byte\r
17         Value []byte\r
18 }\r
19 \r
20 // MockEtcdClient for mocking etcd\r
21 type MockEtcdClient struct {\r
22         Kvs   []*mvccpb.KeyValue\r
23         Count int64\r
24         Err   error\r
25 }\r
26 \r
27 // Mocking only Single Value\r
28 // Put function\r
29 func (e *MockEtcdClient) Put(ctx context.Context, key, val string, opts ...clientv3.OpOption) (*clientv3.PutResponse, error) {\r
30         var m mvccpb.KeyValue\r
31         m.Key = []byte(key)\r
32         m.Value = []byte(val)\r
33         e.Count = e.Count + 1\r
34         e.Kvs = append(e.Kvs, &m)\r
35         return &clientv3.PutResponse{}, e.Err\r
36 }\r
37 \r
38 // Get function\r
39 func (e *MockEtcdClient) Get(ctx context.Context, key string, opts ...clientv3.OpOption) (*clientv3.GetResponse, error) {\r
40         var g clientv3.GetResponse\r
41         g.Kvs = e.Kvs\r
42         g.Count = e.Count\r
43         return &g, e.Err\r
44 }\r
45 \r
46 // Delete function\r
47 func (e *MockEtcdClient) Delete(ctx context.Context, key string, opts ...clientv3.OpOption) (*clientv3.DeleteResponse, error) {\r
48         return &clientv3.DeleteResponse{}, e.Err\r
49 }\r
50 \r
51 type testStruct struct {\r
52         Name string `json:"name"`\r
53         Num  int    `json:"num"`\r
54 }\r
55 \r
56 // TestPut test Put\r
57 func TestPut(t *testing.T) {\r
58         testCases := []struct {\r
59                 label         string\r
60                 mockEtcd      *MockEtcdClient\r
61                 expectedError string\r
62                 key           string\r
63                 value         *testStruct\r
64         }{\r
65                 {\r
66                         label:    "Success Case",\r
67                         mockEtcd: &MockEtcdClient{},\r
68                         key:      "test1",\r
69                         value:    &testStruct{Name: "test", Num: 5},\r
70                 },\r
71                 {\r
72                         label:         "Key is null",\r
73                         mockEtcd:      &MockEtcdClient{},\r
74                         key:           "",\r
75                         expectedError: "Key is null",\r
76                 },\r
77                 {\r
78                         label:         "Value is nil",\r
79                         mockEtcd:      &MockEtcdClient{},\r
80                         key:           "test1",\r
81                         value:         nil,\r
82                         expectedError: "Value is nil",\r
83                 },\r
84                 {\r
85                         label:         "Error creating etcd entry",\r
86                         mockEtcd:      &MockEtcdClient{Err: pkgerrors.New("DB Error")},\r
87                         key:           "test1",\r
88                         value:         &testStruct{Name: "test", Num: 5},\r
89                         expectedError: "Error creating etcd entry: DB Error",\r
90                 },\r
91         }\r
92         for _, testCase := range testCases {\r
93                 t.Run(testCase.label, func(t *testing.T) {\r
94                         cli, _ := NewEtcdClient(&clientv3.Client{}, EtcdConfig{})\r
95                         getEtcd = func(e *EtcdClient) Etcd {\r
96                                 return testCase.mockEtcd\r
97                         }\r
98                         err := cli.Put(testCase.key, testCase.value)\r
99                         if err != nil {\r
100                                 if testCase.expectedError == "" {\r
101                                         t.Fatalf("Method returned an un-expected (%s)", err)\r
102                                 }\r
103                                 if !strings.Contains(string(err.Error()), testCase.expectedError) {\r
104                                         t.Fatalf("Method returned an error (%s)", err)\r
105                                 }\r
106                         }\r
107 \r
108                 })\r
109         }\r
110 }\r
111 \r
112 func TestGet(t *testing.T) {\r
113         testCases := []struct {\r
114                 label         string\r
115                 mockEtcd      *MockEtcdClient\r
116                 expectedError string\r
117                 key           string\r
118                 value         *testStruct\r
119         }{\r
120                 {\r
121                         label:         "Key is null",\r
122                         mockEtcd:      &MockEtcdClient{},\r
123                         key:           "",\r
124                         value:         nil,\r
125                         expectedError: "Key is null",\r
126                 },\r
127                 {\r
128                         label:         "Key doesn't exist",\r
129                         mockEtcd:      &MockEtcdClient{},\r
130                         key:           "test1",\r
131                         value:         &testStruct{},\r
132                         expectedError: "Key doesn't exist",\r
133                 },\r
134                 {\r
135                         label:         "Error getting etcd entry",\r
136                         mockEtcd:      &MockEtcdClient{Err: pkgerrors.New("DB Error")},\r
137                         key:           "test1",\r
138                         value:         &testStruct{},\r
139                         expectedError: "Error getting etcd entry: DB Error",\r
140                 },\r
141         }\r
142         for _, testCase := range testCases {\r
143                 t.Run(testCase.label, func(t *testing.T) {\r
144                         cli, _ := NewEtcdClient(&clientv3.Client{}, EtcdConfig{})\r
145                         getEtcd = func(e *EtcdClient) Etcd {\r
146                                 return testCase.mockEtcd\r
147                         }\r
148                         err := cli.Get(testCase.key, testCase.value)\r
149                         if err != nil {\r
150                                 if testCase.expectedError == "" {\r
151                                         t.Fatalf("Method returned an un-expected (%s)", err)\r
152                                 }\r
153                                 if !strings.Contains(string(err.Error()), testCase.expectedError) {\r
154                                         t.Fatalf("Method returned an error (%s)", err)\r
155                                 }\r
156                         }\r
157 \r
158                 })\r
159         }\r
160 }\r
161 \r
162 func TestGetString(t *testing.T) {\r
163         testCases := []struct {\r
164                 label         string\r
165                 mockEtcd      *MockEtcdClient\r
166                 expectedError string\r
167                 value         string\r
168         }{\r
169                 {\r
170                         label:    "Success Case",\r
171                         mockEtcd: &MockEtcdClient{},\r
172                 },\r
173         }\r
174         for _, testCase := range testCases {\r
175                 t.Run(testCase.label, func(t *testing.T) {\r
176                         cli, _ := NewEtcdClient(&clientv3.Client{}, EtcdConfig{})\r
177                         getEtcd = func(e *EtcdClient) Etcd {\r
178                                 return testCase.mockEtcd\r
179                         }\r
180                         err := cli.Put("test", "test1")\r
181                         if err != nil {\r
182                                 t.Error("Test failed", err)\r
183                         }\r
184                         var s string\r
185                         err = cli.Get("test", &s)\r
186                         if err != nil {\r
187                                 t.Error("Test failed", err)\r
188                         }\r
189                         if "test1" != s {\r
190                                 t.Error("Get Failed")\r
191                         }\r
192                 })\r
193         }\r
194 }\r
195 \r
196 func TestDelete(t *testing.T) {\r
197         testCases := []struct {\r
198                 label         string\r
199                 mockEtcd      *MockEtcdClient\r
200                 expectedError string\r
201         }{\r
202                 {\r
203                         label:    "Success Case",\r
204                         mockEtcd: &MockEtcdClient{},\r
205                 },\r
206                 {\r
207                         label:         "Delete failed etcd entry",\r
208                         mockEtcd:      &MockEtcdClient{Err: pkgerrors.New("DB Error")},\r
209                         expectedError: "Delete failed etcd entry: DB Error",\r
210                 },\r
211         }\r
212         for _, testCase := range testCases {\r
213                 t.Run(testCase.label, func(t *testing.T) {\r
214                         cli, _ := NewEtcdClient(&clientv3.Client{}, EtcdConfig{})\r
215                         getEtcd = func(e *EtcdClient) Etcd {\r
216                                 return testCase.mockEtcd\r
217                         }\r
218                         err := cli.Delete("test")\r
219                         if err != nil {\r
220                                 if testCase.expectedError == "" {\r
221                                         t.Fatalf("Method returned an un-expected (%s)", err)\r
222                                 }\r
223                                 if !strings.Contains(string(err.Error()), testCase.expectedError) {\r
224                                         t.Fatalf("Method returned an error (%s)", err)\r
225                                 }\r
226                         }\r
227 \r
228                 })\r
229         }\r
230 }\r
231 \r
232 func TestGetAll(t *testing.T) {\r
233         testCases := []struct {\r
234                 label         string\r
235                 mockEtcd      *MockEtcdClient\r
236                 expectedError string\r
237         }{\r
238                 {\r
239                         label:         "Key doesn't exist",\r
240                         mockEtcd:      &MockEtcdClient{},\r
241                         expectedError: "Key doesn't exist",\r
242                 },\r
243                 {\r
244                         label:         "Error getting etcd entry",\r
245                         mockEtcd:      &MockEtcdClient{Err: pkgerrors.New("DB Error")},\r
246                         expectedError: "Error getting etcd entry: DB Error",\r
247                 },\r
248         }\r
249         for _, testCase := range testCases {\r
250                 t.Run(testCase.label, func(t *testing.T) {\r
251                         cli, _ := NewEtcdClient(&clientv3.Client{}, EtcdConfig{})\r
252                         getEtcd = func(e *EtcdClient) Etcd {\r
253                                 return testCase.mockEtcd\r
254                         }\r
255                         _, err := cli.GetAllKeys("test")\r
256                         if err != nil {\r
257                                 if testCase.expectedError == "" {\r
258                                         t.Fatalf("Method returned an un-expected (%s)", err)\r
259                                 }\r
260                                 if !strings.Contains(string(err.Error()), testCase.expectedError) {\r
261                                         t.Fatalf("Method returned an error (%s)", err)\r
262                                 }\r
263                         }\r
264                 })\r
265         }\r
266 }\r