1 // SPDX-License-Identifier: Apache-2.0
\r
2 // Copyright (c) 2020 Intel Corporation
\r
8 mvccpb "github.com/coreos/etcd/mvcc/mvccpb"
\r
9 pkgerrors "github.com/pkg/errors"
\r
10 "go.etcd.io/etcd/clientv3"
\r
20 // MockEtcdClient for mocking etcd
\r
21 type MockEtcdClient struct {
\r
22 Kvs []*mvccpb.KeyValue
\r
27 // Mocking only Single Value
\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
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
39 func (e *MockEtcdClient) Get(ctx context.Context, key string, opts ...clientv3.OpOption) (*clientv3.GetResponse, error) {
\r
40 var g clientv3.GetResponse
\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
51 type testStruct struct {
\r
52 Name string `json:"name"`
\r
53 Num int `json:"num"`
\r
57 func TestPut(t *testing.T) {
\r
58 testCases := []struct {
\r
60 mockEtcd *MockEtcdClient
\r
61 expectedError string
\r
66 label: "Success Case",
\r
67 mockEtcd: &MockEtcdClient{},
\r
69 value: &testStruct{Name: "test", Num: 5},
\r
72 label: "Key is null",
\r
73 mockEtcd: &MockEtcdClient{},
\r
75 expectedError: "Key is null",
\r
78 label: "Value is nil",
\r
79 mockEtcd: &MockEtcdClient{},
\r
82 expectedError: "Value is nil",
\r
85 label: "Error creating etcd entry",
\r
86 mockEtcd: &MockEtcdClient{Err: pkgerrors.New("DB Error")},
\r
88 value: &testStruct{Name: "test", Num: 5},
\r
89 expectedError: "Error creating etcd entry: DB Error",
\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
98 err := cli.Put(testCase.key, testCase.value)
\r
100 if testCase.expectedError == "" {
\r
101 t.Fatalf("Method returned an un-expected (%s)", err)
\r
103 if !strings.Contains(string(err.Error()), testCase.expectedError) {
\r
104 t.Fatalf("Method returned an error (%s)", err)
\r
112 func TestGet(t *testing.T) {
\r
113 testCases := []struct {
\r
115 mockEtcd *MockEtcdClient
\r
116 expectedError string
\r
121 label: "Key is null",
\r
122 mockEtcd: &MockEtcdClient{},
\r
125 expectedError: "Key is null",
\r
128 label: "Key doesn't exist",
\r
129 mockEtcd: &MockEtcdClient{},
\r
131 value: &testStruct{},
\r
132 expectedError: "Key doesn't exist",
\r
135 label: "Error getting etcd entry",
\r
136 mockEtcd: &MockEtcdClient{Err: pkgerrors.New("DB Error")},
\r
138 value: &testStruct{},
\r
139 expectedError: "Error getting etcd entry: DB Error",
\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
148 err := cli.Get(testCase.key, testCase.value)
\r
150 if testCase.expectedError == "" {
\r
151 t.Fatalf("Method returned an un-expected (%s)", err)
\r
153 if !strings.Contains(string(err.Error()), testCase.expectedError) {
\r
154 t.Fatalf("Method returned an error (%s)", err)
\r
162 func TestGetString(t *testing.T) {
\r
163 testCases := []struct {
\r
165 mockEtcd *MockEtcdClient
\r
166 expectedError string
\r
170 label: "Success Case",
\r
171 mockEtcd: &MockEtcdClient{},
\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
180 err := cli.Put("test", "test1")
\r
182 t.Error("Test failed", err)
\r
185 err = cli.Get("test", &s)
\r
187 t.Error("Test failed", err)
\r
190 t.Error("Get Failed")
\r
196 func TestDelete(t *testing.T) {
\r
197 testCases := []struct {
\r
199 mockEtcd *MockEtcdClient
\r
200 expectedError string
\r
203 label: "Success Case",
\r
204 mockEtcd: &MockEtcdClient{},
\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
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
218 err := cli.Delete("test")
\r
220 if testCase.expectedError == "" {
\r
221 t.Fatalf("Method returned an un-expected (%s)", err)
\r
223 if !strings.Contains(string(err.Error()), testCase.expectedError) {
\r
224 t.Fatalf("Method returned an error (%s)", err)
\r
232 func TestGetAll(t *testing.T) {
\r
233 testCases := []struct {
\r
235 mockEtcd *MockEtcdClient
\r
236 expectedError string
\r
239 label: "Key doesn't exist",
\r
240 mockEtcd: &MockEtcdClient{},
\r
241 expectedError: "Key doesn't exist",
\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
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
255 _, err := cli.GetAllKeys("test")
\r
257 if testCase.expectedError == "" {
\r
258 t.Fatalf("Method returned an un-expected (%s)", err)
\r
260 if !strings.Contains(string(err.Error()), testCase.expectedError) {
\r
261 t.Fatalf("Method returned an error (%s)", err)
\r