diff options
Diffstat (limited to 'internal/source/domains_test.go')
-rw-r--r-- | internal/source/domains_test.go | 205 |
1 files changed, 116 insertions, 89 deletions
diff --git a/internal/source/domains_test.go b/internal/source/domains_test.go index 173fc1d3..2382e756 100644 --- a/internal/source/domains_test.go +++ b/internal/source/domains_test.go @@ -1,6 +1,7 @@ package source import ( + "math/rand" "testing" "time" @@ -35,116 +36,77 @@ func (c sourceConfig) DomainConfigSource() string { return c.domainSource } -func TestNewDomains(t *testing.T) { - tests := []struct { - name string - sourceConfig sourceConfig - expectedErr string - expectGitlabNil bool - }{ - { - name: "no_source_config", - sourceConfig: sourceConfig{}, - expectedErr: "invalid option for -domain-config-source: \"\"", - }, - { - name: "invalid_source_config", - sourceConfig: sourceConfig{domainSource: "invalid"}, - expectedErr: "invalid option for -domain-config-source: \"invalid\"", - }, - { - name: "disk_source", - sourceConfig: sourceConfig{domainSource: "disk"}, - expectGitlabNil: true, - }, - { - name: "auto_without_api_config", - sourceConfig: sourceConfig{domainSource: "auto"}, - expectGitlabNil: true, - }, - { - name: "auto_with_api_config", - sourceConfig: sourceConfig{api: "https://gitlab.com", secret: "abc", domainSource: "auto"}, - expectGitlabNil: false, - }, - { - name: "gitlab_source_success", - sourceConfig: sourceConfig{api: "https://gitlab.com", secret: "abc", domainSource: "gitlab"}, - }, - { - name: "gitlab_source_no_url", - sourceConfig: sourceConfig{api: "", secret: "abc", domainSource: "gitlab"}, - expectedErr: "GitLab API URL or API secret has not been provided", - }, - { - name: "gitlab_source_no_secret", - sourceConfig: sourceConfig{api: "https://gitlab.com", secret: "", domainSource: "gitlab"}, - expectedErr: "GitLab API URL or API secret has not been provided", - }, - } +func TestDomainSources(t *testing.T) { + t.Run("when GitLab API URL has been provided", func(t *testing.T) { + domains, err := NewDomains(sourceConfig{api: "https://gitlab.com", secret: "abc"}) + require.NoError(t, err) - for _, tt := range tests { - t.Run(tt.name, func(t *testing.T) { - domains, err := NewDomains(tt.sourceConfig) - if tt.expectedErr != "" { - require.EqualError(t, err, tt.expectedErr) - return - } - require.NoError(t, err) + require.NotNil(t, domains.gitlab) + require.NotNil(t, domains.disk) + }) - require.Equal(t, tt.expectGitlabNil, domains.gitlab == nil) - require.NotNil(t, domains.disk) - }) - } + t.Run("when GitLab API has not been provided", func(t *testing.T) { + domains, err := NewDomains(sourceConfig{}) + require.NoError(t, err) + + require.Nil(t, domains.gitlab) + require.NotNil(t, domains.disk) + }) } func TestGetDomain(t *testing.T) { - t.Run("when requesting an existing domain for gitlab source", func(t *testing.T) { - testDomain := "new-source-test.gitlab.io" + gitlabSourceConfig.Domains.Enabled = []string{"new-source-test.gitlab.io"} + gitlabSourceConfig.Domains.Broken = "pages-broken-poc.gitlab.io" + + t.Run("when requesting a test domain", func(t *testing.T) { + testDomain := gitlabSourceConfig.Domains.Enabled[0] newSource := NewMockSource() newSource.On("GetDomain", testDomain). Return(&domain.Domain{Name: testDomain}, nil). Once() + newSource.On("IsReady").Return(true).Once() defer newSource.AssertExpectations(t) - domains := newTestDomains(t, newSource, sourceGitlab) + domains := newTestDomains(t, newSource) - domain, err := domains.GetDomain(testDomain) - require.NoError(t, err) - require.NotNil(t, domain) + domains.GetDomain(testDomain) }) - t.Run("when requesting an existing domain for auto source", func(t *testing.T) { - testDomain := "new-source-test.gitlab.io" - + t.Run("when requesting a non-test domain", func(t *testing.T) { newSource := NewMockSource() - newSource.On("GetDomain", testDomain). - Return(&domain.Domain{Name: testDomain}, nil). - Once() newSource.On("IsReady").Return(true).Once() + defer newSource.AssertExpectations(t) - domains := newTestDomains(t, newSource, sourceAuto) + domains := newTestDomains(t, newSource) + + domain, err := domains.GetDomain("domain.test.io") - domain, err := domains.GetDomain(testDomain) require.NoError(t, err) - require.NotNil(t, domain) + require.Nil(t, domain) }) - t.Run("when requesting a domain that doesn't exist for gitlab source", func(t *testing.T) { + t.Run("when requesting a broken test domain", func(t *testing.T) { newSource := NewMockSource() - newSource.On("GetDomain", "does-not-exist.test.io"). - Return(nil, nil). - Once() - defer newSource.AssertExpectations(t) - domains := newTestDomains(t, newSource, sourceGitlab) + domains := newTestDomains(t, newSource) + + domain, err := domains.GetDomain("pages-broken-poc.gitlab.io") - domain, err := domains.GetDomain("does-not-exist.test.io") + require.Nil(t, domain) + require.EqualError(t, err, "broken test domain used") + }) + + t.Run("when requesting a test domain in case of the source not being fully configured", func(t *testing.T) { + domains, err := NewDomains(sourceConfig{}) require.NoError(t, err) + + domain, err := domains.GetDomain("new-source-test.gitlab.io") + require.Nil(t, domain) + require.NoError(t, err) }) t.Run("when requesting a serverless domain", func(t *testing.T) { @@ -154,14 +116,13 @@ func TestGetDomain(t *testing.T) { newSource.On("GetDomain", testDomain). Return(&domain.Domain{Name: testDomain}, nil). Once() + newSource.On("IsReady").Return(true).Once() defer newSource.AssertExpectations(t) - domains := newTestDomains(t, newSource, sourceGitlab) + domains := newTestDomains(t, newSource) - domain, err := domains.GetDomain(testDomain) - require.NoError(t, err) - require.NotNil(t, domain) + domains.GetDomain(testDomain) }) } @@ -179,12 +140,78 @@ func TestIsServerlessDomain(t *testing.T) { }) } -func newTestDomains(t *testing.T, gitlabSource *MockSource, config configSource) *Domains { +func TestGetDomainWithIncrementalrolloutOfGitLabSource(t *testing.T) { + // This will produce the following pseudo-random sequence: 5, 87, 68 + rand.Seed(42) + + // Generates FNV hash 4091421005, 4091421005 % 100 = 5 + domain05 := "test-domain-a.com" + // Generates FNV 2643293380, 2643293380 % 100 = 80 + domain80 := "test-domain-b.com" + + gitlabSourceConfig.Domains.Rollout.Percentage = 80 + + type testDomain struct { + name string + source string + } + + tests := map[string]struct { + stickiness string + domains []testDomain + }{ + // domain05 should always use gitlab source, + // domain80 should use disk source + "default stickiness": { + stickiness: "", + domains: []testDomain{ + {name: domain05, source: "gitlab"}, + {name: domain80, source: "disk"}, + {name: domain05, source: "gitlab"}, + }, + }, + // Given that randSeed(42) will produce the following pseudo-random sequence: + // {5, 87, 68} the first and third call for domain05 should use gitlab source, + // while the second one should use disk source + "no stickiness": { + stickiness: "random", + domains: []testDomain{ + {name: domain05, source: "gitlab"}, + {name: domain05, source: "disk"}, + {name: domain05, source: "gitlab"}, + }}, + } + + for name, tc := range tests { + t.Run(name, func(t *testing.T) { + gitlabSource := NewMockSource() + for _, d := range tc.domains { + if d.source == "gitlab" { + gitlabSource.On("GetDomain", d.name). + Return(&domain.Domain{Name: d.name}, nil). + Once() + } + } + gitlabSource.On("IsReady").Return(true) + defer gitlabSource.AssertExpectations(t) + + domains := newTestDomains(t, gitlabSource) + + gitlabSourceConfig.Domains.Rollout.Stickiness = tc.stickiness + + for _, domain := range tc.domains { + _, err := domains.GetDomain(domain.name) + require.NoError(t, err) + } + }) + } +} + +func newTestDomains(t *testing.T, gitlabSource *MockSource) *Domains { t.Helper() return &Domains{ - configSource: config, - gitlab: gitlabSource, - disk: disk.New(), + disk: disk.New(), + gitlab: gitlabSource, } } |