github.com/m-lab/locate@v0.17.6/cmd/heartbeat/registration/registration_test.go (about) 1 package registration 2 3 import ( 4 "context" 5 "net/url" 6 "testing" 7 8 "github.com/go-test/deep" 9 "github.com/m-lab/go/host" 10 "github.com/m-lab/go/memoryless" 11 "github.com/m-lab/go/testingx" 12 v2 "github.com/m-lab/locate/api/v2" 13 "github.com/m-lab/locate/static" 14 ) 15 16 var ( 17 validHostname = "ndt-mlab1-lga0t.mlab-sandbox.measurement-lab.org" 18 validHostnameWithSuffix = "ndt-mlab1-lga0t.mlab-sandbox.measurement-lab.org-t95j" 19 validAutojoinHostname = "ndt-lga12345-1a2b3c4d.mlab.sandbox.measurement-lab.org" 20 validURL = "file:./testdata/registration.json" 21 validMsg = &v2.Registration{ 22 City: "New York", 23 CountryCode: "US", 24 ContinentCode: "NA", 25 Experiment: "", 26 Hostname: "ndt-mlab1-lga0t.mlab-sandbox.measurement-lab.org", 27 Latitude: 40.7667, 28 Longitude: -73.8667, 29 Machine: "mlab1", 30 Metro: "lga", 31 Project: "mlab-sandbox", 32 Site: "lga0t", 33 Type: "physical", 34 Uplink: "10g", 35 } 36 validAutojoinMsg = &v2.Registration{ 37 City: "New York", 38 CountryCode: "US", 39 ContinentCode: "NA", 40 Hostname: "ndt-lga12345-1a2b3c4d.mlab.sandbox.measurement-lab.org", 41 Latitude: 40.775, 42 Longitude: -73.875, 43 Machine: "1a2b3c4d", 44 Metro: "lga", 45 Project: "mlab-sandbox", 46 Probability: 1, 47 Site: "lga12345", 48 Type: "unknown", 49 Uplink: "unknown", 50 } 51 ) 52 53 func Test_NewLoader(t *testing.T) { 54 ticker, err := memoryless.NewTicker(context.Background(), memoryless.Config{ 55 Min: static.RegistrationLoadMin, 56 Expected: static.RegistrationLoadExpected, 57 Max: static.RegistrationLoadMax, 58 }) 59 testingx.Must(t, err, "could not create ticker") 60 61 tests := []struct { 62 name string 63 url *url.URL 64 hostname string 65 config memoryless.Config 66 want *Loader 67 wantErr bool 68 }{ 69 { 70 name: "success", 71 url: &url.URL{ 72 Scheme: "file", 73 Opaque: "./testdata/registration.json", 74 }, 75 hostname: "ndt-mlab1-lga0t.mlab-sandbox.measurement-lab.org", 76 config: memoryless.Config{ 77 Min: static.RegistrationLoadMin, 78 Expected: static.RegistrationLoadExpected, 79 Max: static.RegistrationLoadMax, 80 }, 81 want: &Loader{ 82 url: &url.URL{ 83 Scheme: "file", 84 Opaque: "./testdata/registration.json", 85 }, 86 Ticker: ticker, 87 hostname: host.Name{ 88 Service: "ndt", 89 Machine: "mlab1", 90 Site: "lga0t", 91 Project: "mlab-sandbox", 92 Domain: "measurement-lab.org", 93 Suffix: "", 94 Version: "v2", 95 }, 96 }, 97 wantErr: false, 98 }, 99 { 100 name: "invalid-hostname", 101 url: &url.URL{ 102 Scheme: "file", 103 Opaque: "./testdata/registration.json", 104 }, 105 hostname: "foo", 106 config: memoryless.Config{ 107 Min: static.RegistrationLoadMin, 108 Expected: static.RegistrationLoadExpected, 109 Max: static.RegistrationLoadMax, 110 }, 111 want: nil, 112 wantErr: true, 113 }, 114 { 115 name: "nil-url", 116 url: nil, 117 hostname: "ndt-mlab1-lga0t.mlab-sandbox.measurement-lab.org", 118 config: memoryless.Config{ 119 Min: static.RegistrationLoadMin, 120 Expected: static.RegistrationLoadExpected, 121 Max: static.RegistrationLoadMax, 122 }, 123 want: nil, 124 wantErr: true, 125 }, 126 { 127 name: "invalid-config", 128 url: &url.URL{ 129 Scheme: "file", 130 Opaque: "./testdata/registration.json", 131 }, 132 hostname: "ndt-mlab1-lga0t.mlab-sandbox.measurement-lab.org", 133 config: memoryless.Config{ 134 Min: 1, 135 Max: -1, 136 }, 137 want: nil, 138 wantErr: true, 139 }, 140 } 141 for _, tt := range tests { 142 t.Run(tt.name, func(t *testing.T) { 143 144 got, err := NewLoader(context.Background(), tt.url, tt.hostname, "", map[string][]string{}, tt.config) 145 if (err != nil) != tt.wantErr { 146 t.Errorf("NewLoader() error = %v, wantErr %v", err, tt.wantErr) 147 return 148 } 149 if diff := deep.Equal(got, tt.want); diff != nil { 150 t.Errorf("NewLoader() = %v, want %v", got, tt.want) 151 } 152 }) 153 } 154 } 155 156 func Test_GetRegistration(t *testing.T) { 157 tests := []struct { 158 name string 159 hostname string 160 url string 161 savedReg v2.Registration 162 wantErr bool 163 wantMsg *v2.Registration 164 wantSavedReg v2.Registration 165 }{ 166 { 167 name: "valid-data", 168 url: validURL, 169 hostname: validHostname, 170 wantErr: false, 171 wantMsg: validMsg, 172 wantSavedReg: *validMsg, 173 }, 174 { 175 name: "valid-hostname-with-suffix", 176 url: validURL, 177 hostname: validHostname + "-t95j", 178 wantErr: false, 179 wantMsg: validMsg, 180 wantSavedReg: *validMsg, 181 }, 182 { 183 name: "empty-url", 184 hostname: validHostname, 185 wantErr: true, 186 wantMsg: nil, 187 wantSavedReg: v2.Registration{}, 188 }, 189 { 190 name: "invalid-url-scheme", 191 hostname: validHostname, 192 url: "foo:./testdata/registration.json", 193 wantErr: true, 194 wantMsg: nil, 195 wantSavedReg: v2.Registration{}, 196 }, 197 { 198 name: "invalid-registration", 199 hostname: validHostname, 200 url: "file:./testdata/invalid", 201 wantErr: true, 202 wantMsg: nil, 203 wantSavedReg: v2.Registration{}, 204 }, 205 { 206 name: "non-existent-file", 207 hostname: validHostname, 208 url: "file:./testdata/non-existent.json", 209 wantErr: true, 210 wantMsg: nil, 211 wantSavedReg: v2.Registration{}, 212 }, 213 { 214 name: "hostname-not-found", 215 hostname: "ndt-mlab1-pdx0t.mlab-sandbox.measurement-lab.org", 216 url: validURL, 217 wantErr: true, 218 wantMsg: nil, 219 wantSavedReg: v2.Registration{}, 220 }, 221 { 222 name: "priority-to-non-service-key", 223 url: validURL, 224 hostname: validHostname, 225 wantErr: false, 226 wantMsg: validMsg, 227 wantSavedReg: *validMsg, 228 }, 229 { 230 name: "valid-autojoin-hostname-data", 231 url: validURL, 232 hostname: validAutojoinHostname, 233 wantErr: false, 234 wantMsg: validAutojoinMsg, 235 wantSavedReg: *validAutojoinMsg, 236 }, 237 } 238 239 for _, tt := range tests { 240 t.Run(tt.name, func(t *testing.T) { 241 u, err := url.Parse(tt.url) 242 testingx.Must(t, err, "could not parse URL") 243 244 h, err := host.Parse(tt.hostname) 245 testingx.Must(t, err, "could not parse hostname") 246 247 ldr := &Loader{ 248 url: u, 249 hostname: h, 250 reg: tt.savedReg, 251 } 252 gotMsg, gotErr := ldr.GetRegistration(context.Background()) 253 254 if (gotErr != nil) != tt.wantErr { 255 t.Errorf("GetRegistration() error: %v, want: %v", gotErr, tt.wantErr) 256 } 257 258 if diff := deep.Equal(gotMsg, tt.wantMsg); diff != nil { 259 t.Errorf("GetRegistration() message did not match; got: \n%+v, want: \n%+v", gotMsg, tt.wantMsg) 260 } 261 262 if diff := deep.Equal(ldr.reg, tt.wantSavedReg); diff != nil { 263 t.Errorf("GetRegistration() saved registration did not match; got: %+v, want: %+v", ldr.reg, tt.wantSavedReg) 264 } 265 }) 266 } 267 }