summaryrefslogtreecommitdiff
path: root/workhorse/internal/config/url_openers_test.go
blob: 6a851cacbb8866a00d1f0e0ac50ee11ba3412e4a (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
package config

import (
	"context"
	"net/url"
	"testing"

	"github.com/stretchr/testify/require"
	"gocloud.dev/blob/azureblob"
)

func TestURLOpeners(t *testing.T) {
	cfg, err := LoadConfig(azureConfig)
	require.NoError(t, err)

	require.NotNil(t, cfg.ObjectStorageCredentials, "Expected object storage credentials")

	require.NoError(t, cfg.RegisterGoCloudURLOpeners())
	require.NotNil(t, cfg.ObjectStorageConfig.URLMux)

	tests := []struct {
		url   string
		valid bool
	}{

		{
			url:   "azblob://container/object",
			valid: true,
		},
		{
			url:   "azblob://container/object?domain=core.windows.net",
			valid: true,
		},
		{
			url:   "azblob://container/object?domain=core.windows.net&domain=test",
			valid: false,
		},
		{
			url:   "azblob://container/object?param=value",
			valid: false,
		},
		{
			url:   "s3://bucket/object",
			valid: false,
		},
	}

	for _, test := range tests {
		t.Run(test.url, func(t *testing.T) {
			ctx := context.Background()
			url, err := url.Parse(test.url)
			require.NoError(t, err)

			bucket, err := cfg.ObjectStorageConfig.URLMux.OpenBucketURL(ctx, url)
			if bucket != nil {
				defer bucket.Close()
			}

			if test.valid {
				require.NotNil(t, bucket)
				require.NoError(t, err)
			} else {
				require.Error(t, err)
			}
		})
	}
}

func TestTestURLOpenersForParams(t *testing.T) {
	tests := []struct {
		name     string
		currOpts azureblob.Options
		query    url.Values
		wantOpts azureblob.Options
		wantErr  bool
	}{
		{
			name: "InvalidParam",
			query: url.Values{
				"foo": {"bar"},
			},
			wantErr: true,
		},
		{
			name: "StorageDomain",
			query: url.Values{
				"domain": {"blob.core.usgovcloudapi.net"},
			},
			wantOpts: azureblob.Options{StorageDomain: "blob.core.usgovcloudapi.net"},
		},
		{
			name: "duplicate StorageDomain",
			query: url.Values{
				"domain": {"blob.core.usgovcloudapi.net", "blob.core.windows.net"},
			},
			wantErr: true,
		},
	}

	for _, test := range tests {
		t.Run(test.name, func(t *testing.T) {
			o := &azureURLOpener{
				URLOpener: &azureblob.URLOpener{
					Options: test.currOpts,
				},
			}
			err := setOptionsFromURLParams(test.query, &o.Options)

			if test.wantErr {
				require.NotNil(t, err)
			} else {
				require.Nil(t, err)
				require.Equal(t, test.wantOpts, o.Options)
			}
		})
	}
}