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  }