1package dependency
2
3import (
4	"fmt"
5	"testing"
6	"time"
7
8	"github.com/stretchr/testify/assert"
9)
10
11func init() {
12	CatalogDatacentersQuerySleepTime = 50 * time.Millisecond
13}
14
15func TestNewCatalogDatacentersQuery(t *testing.T) {
16	t.Parallel()
17
18	cases := []struct {
19		name string
20		exp  *CatalogDatacentersQuery
21		err  bool
22	}{
23		{
24			"empty",
25			&CatalogDatacentersQuery{},
26			false,
27		},
28	}
29
30	for i, tc := range cases {
31		t.Run(fmt.Sprintf("%d_%s", i, tc.name), func(t *testing.T) {
32			act, err := NewCatalogDatacentersQuery(false)
33			if (err != nil) != tc.err {
34				t.Fatal(err)
35			}
36
37			if act != nil {
38				act.stopCh = nil
39			}
40
41			assert.Equal(t, tc.exp, act)
42		})
43	}
44}
45
46func TestCatalogDatacentersQuery_Fetch(t *testing.T) {
47	t.Parallel()
48
49	cases := []struct {
50		name string
51		exp  []string
52	}{
53		{
54			"default",
55			[]string{"dc1"},
56		},
57	}
58
59	for i, tc := range cases {
60		t.Run(fmt.Sprintf("%d_%s", i, tc.name), func(t *testing.T) {
61			d, err := NewCatalogDatacentersQuery(false)
62			if err != nil {
63				t.Fatal(err)
64			}
65
66			act, _, err := d.Fetch(testClients, nil)
67			if err != nil {
68				t.Fatal(err)
69			}
70
71			assert.Equal(t, tc.exp, act)
72		})
73	}
74
75	t.Run("stops", func(t *testing.T) {
76		d, err := NewCatalogDatacentersQuery(false)
77		if err != nil {
78			t.Fatal(err)
79		}
80
81		dataCh := make(chan interface{}, 1)
82		errCh := make(chan error, 1)
83		go func() {
84			for {
85				data, _, err := d.Fetch(testClients, &QueryOptions{WaitIndex: 10})
86				if err != nil {
87					errCh <- err
88					return
89				}
90				dataCh <- data
91			}
92		}()
93
94		select {
95		case err := <-errCh:
96			t.Fatal(err)
97		case <-dataCh:
98		}
99
100		d.Stop()
101
102		select {
103		case err := <-errCh:
104			if err != ErrStopped {
105				t.Fatal(err)
106			}
107		case <-time.After(100 * time.Millisecond):
108			t.Errorf("did not stop")
109		}
110	})
111
112	t.Run("fires_changes", func(t *testing.T) {
113		d, err := NewCatalogDatacentersQuery(false)
114		if err != nil {
115			t.Fatal(err)
116		}
117
118		_, qm, err := d.Fetch(testClients, nil)
119		if err != nil {
120			t.Fatal(err)
121		}
122
123		dataCh := make(chan interface{}, 1)
124		errCh := make(chan error, 1)
125		go func() {
126			for {
127				data, _, err := d.Fetch(testClients, &QueryOptions{WaitIndex: qm.LastIndex})
128				if err != nil {
129					errCh <- err
130					return
131				}
132				dataCh <- data
133				return
134			}
135		}()
136
137		select {
138		case err := <-errCh:
139			t.Fatal(err)
140		case <-dataCh:
141		}
142	})
143}
144
145func TestCatalogDatacentersQuery_String(t *testing.T) {
146	t.Parallel()
147
148	cases := []struct {
149		name string
150		exp  string
151	}{
152		{
153			"empty",
154			"catalog.datacenters",
155		},
156	}
157
158	for i, tc := range cases {
159		t.Run(fmt.Sprintf("%d_%s", i, tc.name), func(t *testing.T) {
160			d, err := NewCatalogDatacentersQuery(false)
161			if err != nil {
162				t.Fatal(err)
163			}
164			assert.Equal(t, tc.exp, d.String())
165		})
166	}
167}
168