Welcome to mirror list, hosted at ThFree Co, Russian Federation.

gitlab.com/gitlab-org/gitlab-pages.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
Diffstat (limited to 'internal/source/domains_test.go')
-rw-r--r--internal/source/domains_test.go205
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,
}
}