1 // SPDX-License-Identifier: Apache-2.0
2 // Copyright (c) 2020 Intel Corporation
8 pkgerrors "github.com/pkg/errors"
9 "go.etcd.io/etcd/clientv3"
10 mvccpb "go.etcd.io/etcd/mvcc/mvccpb"
20 // MockEtcdClient for mocking etcd
21 type MockEtcdClient struct {
22 Kvs []*mvccpb.KeyValue
27 // Mocking only Single Value
29 func (e *MockEtcdClient) Put(ctx context.Context, key, val string, opts ...clientv3.OpOption) (*clientv3.PutResponse, error) {
34 e.Kvs = append(e.Kvs, &m)
35 return &clientv3.PutResponse{}, e.Err
39 func (e *MockEtcdClient) Get(ctx context.Context, key string, opts ...clientv3.OpOption) (*clientv3.GetResponse, error) {
40 var g clientv3.GetResponse
47 func (e *MockEtcdClient) Delete(ctx context.Context, key string, opts ...clientv3.OpOption) (*clientv3.DeleteResponse, error) {
48 return &clientv3.DeleteResponse{}, e.Err
51 type testStruct struct {
52 Name string `json:"name"`
57 func TestPut(t *testing.T) {
58 testCases := []struct {
60 mockEtcd *MockEtcdClient
66 label: "Success Case",
67 mockEtcd: &MockEtcdClient{},
69 value: &testStruct{Name: "test", Num: 5},
73 mockEtcd: &MockEtcdClient{},
75 expectedError: "Key is null",
78 label: "Value is nil",
79 mockEtcd: &MockEtcdClient{},
82 expectedError: "Value is nil",
85 label: "Error creating etcd entry",
86 mockEtcd: &MockEtcdClient{Err: pkgerrors.New("DB Error")},
88 value: &testStruct{Name: "test", Num: 5},
89 expectedError: "Error creating etcd entry: DB Error",
92 for _, testCase := range testCases {
93 t.Run(testCase.label, func(t *testing.T) {
94 cli, _ := NewEtcdClient(&clientv3.Client{}, EtcdConfig{})
95 getEtcd = func(e *EtcdClient) Etcd {
96 return testCase.mockEtcd
98 err := cli.Put(testCase.key, testCase.value)
100 if testCase.expectedError == "" {
101 t.Fatalf("Method returned an un-expected (%s)", err)
103 if !strings.Contains(string(err.Error()), testCase.expectedError) {
104 t.Fatalf("Method returned an error (%s)", err)
112 func TestGet(t *testing.T) {
113 testCases := []struct {
115 mockEtcd *MockEtcdClient
121 label: "Key is null",
122 mockEtcd: &MockEtcdClient{},
125 expectedError: "Key is null",
128 label: "Key doesn't exist",
129 mockEtcd: &MockEtcdClient{},
131 value: &testStruct{},
132 expectedError: "Key doesn't exist",
135 label: "Error getting etcd entry",
136 mockEtcd: &MockEtcdClient{Err: pkgerrors.New("DB Error")},
138 value: &testStruct{},
139 expectedError: "Error getting etcd entry: DB Error",
142 for _, testCase := range testCases {
143 t.Run(testCase.label, func(t *testing.T) {
144 cli, _ := NewEtcdClient(&clientv3.Client{}, EtcdConfig{})
145 getEtcd = func(e *EtcdClient) Etcd {
146 return testCase.mockEtcd
148 err := cli.Get(testCase.key, testCase.value)
150 if testCase.expectedError == "" {
151 t.Fatalf("Method returned an un-expected (%s)", err)
153 if !strings.Contains(string(err.Error()), testCase.expectedError) {
154 t.Fatalf("Method returned an error (%s)", err)
162 func TestGetString(t *testing.T) {
163 testCases := []struct {
165 mockEtcd *MockEtcdClient
170 label: "Success Case",
171 mockEtcd: &MockEtcdClient{},
174 for _, testCase := range testCases {
175 t.Run(testCase.label, func(t *testing.T) {
176 cli, _ := NewEtcdClient(&clientv3.Client{}, EtcdConfig{})
177 getEtcd = func(e *EtcdClient) Etcd {
178 return testCase.mockEtcd
180 err := cli.Put("test", "test1")
182 t.Error("Test failed", err)
185 err = cli.Get("test", &s)
187 t.Error("Test failed", err)
190 t.Error("Get Failed")
196 func TestDelete(t *testing.T) {
197 testCases := []struct {
199 mockEtcd *MockEtcdClient
203 label: "Success Case",
204 mockEtcd: &MockEtcdClient{},
207 label: "Delete failed etcd entry",
208 mockEtcd: &MockEtcdClient{Err: pkgerrors.New("DB Error")},
209 expectedError: "Delete failed etcd entry: DB Error",
212 for _, testCase := range testCases {
213 t.Run(testCase.label, func(t *testing.T) {
214 cli, _ := NewEtcdClient(&clientv3.Client{}, EtcdConfig{})
215 getEtcd = func(e *EtcdClient) Etcd {
216 return testCase.mockEtcd
218 err := cli.Delete("test")
220 if testCase.expectedError == "" {
221 t.Fatalf("Method returned an un-expected (%s)", err)
223 if !strings.Contains(string(err.Error()), testCase.expectedError) {
224 t.Fatalf("Method returned an error (%s)", err)
232 func TestGetAll(t *testing.T) {
233 testCases := []struct {
235 mockEtcd *MockEtcdClient
239 label: "Key doesn't exist",
240 mockEtcd: &MockEtcdClient{},
241 expectedError: "Key doesn't exist",
244 label: "Error getting etcd entry",
245 mockEtcd: &MockEtcdClient{Err: pkgerrors.New("DB Error")},
246 expectedError: "Error getting etcd entry: DB Error",
249 for _, testCase := range testCases {
250 t.Run(testCase.label, func(t *testing.T) {
251 cli, _ := NewEtcdClient(&clientv3.Client{}, EtcdConfig{})
252 getEtcd = func(e *EtcdClient) Etcd {
253 return testCase.mockEtcd
255 _, err := cli.GetAllKeys("test")
257 if testCase.expectedError == "" {
258 t.Fatalf("Method returned an un-expected (%s)", err)
260 if !strings.Contains(string(err.Error()), testCase.expectedError) {
261 t.Fatalf("Method returned an error (%s)", err)