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