-
Notifications
You must be signed in to change notification settings - Fork 1.6k
/
Copy pathclientcasfilereloader_test.go
115 lines (86 loc) · 2.5 KB
/
clientcasfilereloader_test.go
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
// Copyright The OpenTelemetry Authors
// SPDX-License-Identifier: Apache-2.0
package configtls
import (
"crypto/x509"
"fmt"
"os"
"path/filepath"
"sync/atomic"
"testing"
"time"
"github.com/stretchr/testify/assert"
"github.com/stretchr/testify/require"
)
func TestCannotShutdownIfNotWatching(t *testing.T) {
reloader, _, _ := createReloader(t)
err := reloader.shutdown()
assert.Error(t, err)
}
func TestCannotStartIfAlreadyWatching(t *testing.T) {
reloader, _, _ := createReloader(t)
err := reloader.startWatching()
require.NoError(t, err)
err = reloader.startWatching()
require.Error(t, err)
err = reloader.shutdown()
assert.NoError(t, err)
}
func TestClosingWatcherDoesntBreakReloader(t *testing.T) {
reloader, loader, _ := createReloader(t)
err := reloader.startWatching()
require.NoError(t, err)
assert.Equal(t, 1, loader.reloadNumber())
err = reloader.watcher.Close()
require.NoError(t, err)
err = reloader.shutdown()
assert.NoError(t, err)
}
func TestErrorRecordedIfFileDeleted(t *testing.T) {
reloader, loader, filePath := createReloader(t)
err := reloader.startWatching()
require.NoError(t, err)
assert.Equal(t, 1, loader.reloadNumber())
loader.returnErrorOnSubsequentCalls("test error on reload")
err = os.WriteFile(filePath, []byte("some_data"), 0o600)
require.NoError(t, err)
assert.Eventually(t, func() bool {
return loader.reloadNumber() > 1 && reloader.getLastError() != nil
}, 5*time.Second, 10*time.Millisecond)
lastErr := reloader.getLastError()
require.EqualError(t, lastErr, "test error on reload")
err = reloader.shutdown()
assert.NoError(t, err)
}
func createReloader(t *testing.T) (*clientCAsFileReloader, *testLoader, string) {
tmpClientCAsFilePath := createTempFile(t)
loader := &testLoader{}
reloader, _ := newClientCAsReloader(tmpClientCAsFilePath, loader)
return reloader, loader, tmpClientCAsFilePath
}
func createTempFile(t *testing.T) string {
tmpCa, err := os.CreateTemp("", "clientCAs.crt")
require.NoError(t, err)
tmpCaPath, err := filepath.Abs(tmpCa.Name())
assert.NoError(t, err)
assert.NoError(t, tmpCa.Close())
return tmpCaPath
}
type testLoader struct {
err atomic.Value
counter atomic.Uint32
}
func (r *testLoader) loadClientCAFile() (*x509.CertPool, error) {
r.counter.Add(1)
v := r.err.Load()
if v == nil {
return nil, nil
}
return nil, v.(error)
}
func (r *testLoader) returnErrorOnSubsequentCalls(msg string) {
r.err.Store(fmt.Errorf("%s", msg))
}
func (r *testLoader) reloadNumber() int {
return int(r.counter.Load())
}