1 package embed
2
3 import (
4 "fmt"
5 "net/url"
6 "strings"
7 "testing"
8
9 "github.com/stretchr/testify/assert"
10 "github.com/stretchr/testify/require"
11 "go.etcd.io/etcd/server/v3/embed"
12 )
13
14 func TestNewCluster(t *testing.T) {
15 testCases := map[string]struct {
16 input []*Member
17 expectError bool
18 }{
19 "Success": {
20 input: []*Member{
21 {
22 config: &Config{Name: "member-1"},
23 },
24 {
25 config: &Config{Name: "member-2"},
26 },
27 },
28 expectError: false,
29 },
30 "Failure_NoMembers": {
31 input: []*Member{},
32 expectError: true,
33 },
34 }
35
36 for name, tc := range testCases {
37 t.Run(name, func(t *testing.T) {
38 c, err := NewCluster(tc.input...)
39 if tc.expectError {
40 assert.Error(t, err)
41 return
42 }
43 require.NoError(t, err)
44 for _, key := range tc.input {
45 assert.True(t, memberExists(c, key), fmt.Sprintf("%s should exist in cluster member list", key.config.Name))
46 }
47 })
48 }
49 }
50
51 func TestCurrentCluster(t *testing.T) {
52 c := createCluster()
53
54 actualCluster := c.CurrentCluster()
55 assert.Contains(t, actualCluster, fmt.Sprintf("member-1=https://%s:1", DefaultHost))
56 assert.Contains(t, actualCluster, fmt.Sprintf("member-2=https://%s:2", DefaultHost))
57 assert.Len(t, strings.Split(actualCluster, ","), 2)
58 }
59
60 func TestAddMember(t *testing.T) {
61 c := createCluster()
62
63 m := &Member{
64 state: &defaultState{},
65 config: &Config{
66 Name: "member-3",
67 embed: &embed.Config{
68 AdvertisePeerUrls: []url.URL{
69 {
70 Scheme: "https",
71 Host: fmt.Sprintf("%s:3", DefaultHost),
72 },
73 },
74 },
75 },
76 }
77
78 _, err := c.AddMember(m)
79 require.NoError(t, err)
80
81 assert.True(t, memberExists(c, m), "new member should exist in the cluster struct")
82 }
83
84 func createCluster() *Cluster {
85 return &Cluster{
86 members: []*Member{
87 {
88 config: &Config{
89 Name: "member-1",
90 embed: &embed.Config{
91 AdvertisePeerUrls: []url.URL{
92 {
93 Scheme: "https",
94 Host: fmt.Sprintf("%s:1", DefaultHost),
95 },
96 },
97 },
98 },
99 },
100 {
101 config: &Config{
102 Name: "member-2",
103 embed: &embed.Config{
104 AdvertisePeerUrls: []url.URL{
105 {
106 Scheme: "https",
107 Host: fmt.Sprintf("%s:2", DefaultHost),
108 },
109 },
110 },
111 }},
112 },
113 }
114 }
115
116 func memberExists(cluster *Cluster, member *Member) bool {
117 for _, m := range cluster.members {
118 if member.config.Name == m.config.Name {
119 return true
120 }
121 }
122 return false
123 }
124
View as plain text