Skip to content

Commit

Permalink
Moved some of the unit tests from pkg/defragmentor_test to `pkg/etc…
Browse files Browse the repository at this point in the history
…dutiil_test` (#837)
  • Loading branch information
ishan16696 authored Feb 3, 2025
1 parent 4703c60 commit 0b18237
Show file tree
Hide file tree
Showing 4 changed files with 163 additions and 171 deletions.
166 changes: 0 additions & 166 deletions pkg/defragmentor/defrag_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -11,13 +11,10 @@ import (
"time"

"github.com/gardener/etcd-backup-restore/pkg/etcdutil"
mockfactory "github.com/gardener/etcd-backup-restore/pkg/mock/etcdutil/client"
brtypes "github.com/gardener/etcd-backup-restore/pkg/types"
"github.com/gardener/etcd-backup-restore/test/utils"
cron "github.com/robfig/cron/v3"
"go.etcd.io/etcd/clientv3"
"go.etcd.io/etcd/etcdserver/etcdserverpb"
"go.uber.org/mock/gomock"

. "github.com/gardener/etcd-backup-restore/pkg/defragmentor"
. "github.com/onsi/ginkgo/v2"
Expand All @@ -29,11 +26,6 @@ var _ = Describe("Defrag", func() {
etcdConnectionConfig *brtypes.EtcdConnectionConfig
keyPrefix = "/defrag/key-"
valuePrefix = "val"

ctrl *gomock.Controller
factory *mockfactory.MockFactory
cm *mockfactory.MockMaintenanceCloser
cl *mockfactory.MockClusterCloser
)

BeforeEach(func() {
Expand All @@ -43,164 +35,6 @@ var _ = Describe("Defrag", func() {
etcdConnectionConfig.SnapshotTimeout.Duration = 30 * time.Second
etcdConnectionConfig.DefragTimeout.Duration = 30 * time.Second

ctrl = gomock.NewController(GinkgoT())
factory = mockfactory.NewMockFactory(ctrl)
cm = mockfactory.NewMockMaintenanceCloser(ctrl)
cl = mockfactory.NewMockClusterCloser(ctrl)
})

Describe("With Etcd cluster", func() {
var (
dummyID = uint64(1111)
dummyClientEndpoints = []string{"http://127.0.0.1:2379", "http://127.0.0.1:9090"}
)
BeforeEach(func() {
factory.EXPECT().NewMaintenance().Return(cm, nil)
factory.EXPECT().NewCluster().Return(cl, nil)
})

Context("MemberList API call fails", func() {
It("should return error", func() {
clientMaintenance, err := factory.NewMaintenance()
Expect(err).ShouldNot(HaveOccurred())

client, err := factory.NewCluster()
Expect(err).ShouldNot(HaveOccurred())

cl.EXPECT().MemberList(gomock.Any()).Return(nil, fmt.Errorf("failed to connect with the dummy etcd")).AnyTimes()

leaderEtcdEndpoints, followerEtcdEndpoints, err := etcdutil.GetEtcdEndPointsSorted(testCtx, clientMaintenance, client, dummyClientEndpoints, logger)
Expect(err).Should(HaveOccurred())
Expect(leaderEtcdEndpoints).Should(BeNil())
Expect(followerEtcdEndpoints).Should(BeNil())

err = etcdutil.DefragmentData(testCtx, clientMaintenance, client, dummyClientEndpoints, mockTimeout, logger)
Expect(err).Should(HaveOccurred())
})
})

Context("MemberList API call succeeds and Status API call fails", func() {
It("should return error", func() {
clientMaintenance, err := factory.NewMaintenance()
Expect(err).ShouldNot(HaveOccurred())

client, err := factory.NewCluster()
Expect(err).ShouldNot(HaveOccurred())

cl.EXPECT().MemberList(gomock.Any()).DoAndReturn(func(_ context.Context) (*clientv3.MemberListResponse, error) {
response := new(clientv3.MemberListResponse)
dummyMember1 := &etcdserverpb.Member{
ID: dummyID,
ClientURLs: []string{dummyClientEndpoints[0]},
}
dummyMember2 := &etcdserverpb.Member{
ID: dummyID + 1,
ClientURLs: []string{dummyClientEndpoints[1]},
}
response.Members = []*etcdserverpb.Member{dummyMember1, dummyMember2}
return response, nil
}).AnyTimes()

cm.EXPECT().Status(gomock.Any(), gomock.Any()).Return(nil, fmt.Errorf("failed to connect to the dummy etcd")).AnyTimes()

leaderEtcdEndpoints, followerEtcdEndpoints, err := etcdutil.GetEtcdEndPointsSorted(testCtx, clientMaintenance, client, dummyClientEndpoints, logger)
Expect(err).Should(HaveOccurred())
Expect(leaderEtcdEndpoints).Should(BeNil())
Expect(followerEtcdEndpoints).Should(BeNil())

err = etcdutil.DefragmentData(testCtx, clientMaintenance, client, dummyClientEndpoints, mockTimeout, logger)
Expect(err).Should(HaveOccurred())
})
})

Context("Only Defragment API call fails", func() {
It("should return error and fail to perform defragmentation", func() {
clientMaintenance, err := factory.NewMaintenance()
Expect(err).ShouldNot(HaveOccurred())

client, err := factory.NewCluster()
Expect(err).ShouldNot(HaveOccurred())

cl.EXPECT().MemberList(gomock.Any()).DoAndReturn(func(_ context.Context) (*clientv3.MemberListResponse, error) {
response := new(clientv3.MemberListResponse)
// dummy etcd cluster leader
dummyMember1 := &etcdserverpb.Member{
ID: dummyID,
ClientURLs: []string{dummyClientEndpoints[0]},
}
// dummy etcd cluster follower
dummyMember2 := &etcdserverpb.Member{
ID: dummyID + 1,
ClientURLs: []string{dummyClientEndpoints[1]},
}
response.Members = []*etcdserverpb.Member{dummyMember1, dummyMember2}
return response, nil
}).AnyTimes()

cm.EXPECT().Status(gomock.Any(), gomock.Any()).DoAndReturn(func(_ context.Context, _ string) (*clientv3.StatusResponse, error) {
response := new(clientv3.StatusResponse)
response.Leader = dummyID
return response, nil
}).Times(2)

cm.EXPECT().Status(gomock.Any(), gomock.Any()).DoAndReturn(func(_ context.Context, _ string) (*clientv3.StatusResponse, error) {
response := new(clientv3.StatusResponse)
response.DbSize = 1
return response, nil
}).Times(1)

cm.EXPECT().Defragment(gomock.Any(), gomock.Any()).Return(nil, fmt.Errorf("failed to defrag the etcd")).AnyTimes()

leaderEtcdEndpoints, followerEtcdEndpoints, err := etcdutil.GetEtcdEndPointsSorted(testCtx, clientMaintenance, client, dummyClientEndpoints, logger)
Expect(err).ShouldNot(HaveOccurred())
Expect(leaderEtcdEndpoints).Should(Equal([]string{dummyClientEndpoints[0]}))
Expect(followerEtcdEndpoints).Should(Equal([]string{dummyClientEndpoints[1]}))

err = etcdutil.DefragmentData(testCtx, clientMaintenance, client, dummyClientEndpoints, mockTimeout, logger)
Expect(err).Should(HaveOccurred())
})
})

Context("All etcd client API call succeeds", func() {
It("should able to perform the defragmentation on etcd follower as well as on etcd leader", func() {
clientMaintenance, err := factory.NewMaintenance()
Expect(err).ShouldNot(HaveOccurred())

client, err := factory.NewCluster()
Expect(err).ShouldNot(HaveOccurred())

cl.EXPECT().MemberList(gomock.Any()).DoAndReturn(func(_ context.Context) (*clientv3.MemberListResponse, error) {
response := new(clientv3.MemberListResponse)
// etcd cluster leader
dummyMember1 := &etcdserverpb.Member{
ID: dummyID,
ClientURLs: []string{dummyClientEndpoints[0]},
}
// etcd cluster follower
dummyMember2 := &etcdserverpb.Member{
ID: dummyID + 1,
ClientURLs: []string{dummyClientEndpoints[1]},
}
response.Members = []*etcdserverpb.Member{dummyMember1, dummyMember2}
return response, nil
}).AnyTimes()

cm.EXPECT().Status(gomock.Any(), gomock.Any()).DoAndReturn(func(_ context.Context, _ string) (*clientv3.StatusResponse, error) {
response := new(clientv3.StatusResponse)
response.Leader = dummyID
response.DbSize = 10
return response, nil
}).AnyTimes()

cm.EXPECT().Defragment(gomock.Any(), gomock.Any()).DoAndReturn(func(_ context.Context, _ string) (*clientv3.DefragmentResponse, error) {
response := new(clientv3.DefragmentResponse)
return response, nil
}).AnyTimes()

err = etcdutil.DefragmentData(testCtx, clientMaintenance, client, dummyClientEndpoints, mockTimeout, logger)
Expect(err).ShouldNot(HaveOccurred())
})
})
})

Context("Defragmentation", func() {
Expand Down
1 change: 0 additions & 1 deletion pkg/defragmentor/defragmentor_suite_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -23,7 +23,6 @@ const (
etcdDir = outputDir + "/default.etcd"
etcdDialTimeout = time.Second * 30
embeddedEtcdPortNo = "9089"
mockTimeout = time.Second * 5
)

var (
Expand Down
10 changes: 6 additions & 4 deletions pkg/etcdutil/etcdutil_suite_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -8,6 +8,7 @@ import (
"context"
"os"
"testing"
"time"

"github.com/gardener/etcd-backup-restore/test/utils"
. "github.com/onsi/ginkgo/v2"
Expand All @@ -23,10 +24,11 @@ const (
)

var (
logger = logrus.New().WithField("suite", "etcdutil")
err error
testCtx = context.Background()
etcd *embed.Etcd
logger = logrus.New().WithField("suite", "etcdutil")
err error
testCtx = context.Background()
etcd *embed.Etcd
mockTimeout = time.Second * 5
)

func TestEtcdUtil(t *testing.T) {
Expand Down
Loading

0 comments on commit 0b18237

Please sign in to comment.