/
installer_events_test.go
186 lines (181 loc) · 6.37 KB
/
installer_events_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
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
package providercache
import (
"github.com/hashicorp/terraform/internal/addrs"
"github.com/hashicorp/terraform/internal/getproviders"
)
type testInstallerEventLogItem struct {
// The name of the event that occurred, using the same names as the
// fields of InstallerEvents.
Event string
// Most events relate to a specific provider. For the few event types
// that don't, this will be a zero-value Provider.
Provider addrs.Provider
// The type of Args will vary by event, but it should always be something
// that can be deterministically compared using the go-cmp package.
Args interface{}
}
// installerLogEventsForTests is a test helper that produces an InstallerEvents
// that writes event notifications (*testInstallerEventLogItem values) to
// the given channel as they occur.
//
// The caller must keep reading from the read side of the given channel
// throughout any installer operation using the returned InstallerEvents.
// It's the caller's responsibility to close the channel if needed and
// clean up any goroutines it started to process the events.
//
// The exact sequence of events emitted for an installer operation might
// change in future, if e.g. we introduce new event callbacks to the
// InstallerEvents struct. Tests using this mechanism may therefore need to
// be updated to reflect such changes.
//
// (The channel-based approach here is so that the control flow for event
// processing will belong to the caller and thus it can safely use its
// testing.T object(s) to emit log lines without non-test-case frames in the
// call stack.)
func installerLogEventsForTests(into chan<- *testInstallerEventLogItem) *InstallerEvents {
return &InstallerEvents{
PendingProviders: func(reqs map[addrs.Provider]getproviders.VersionConstraints) {
into <- &testInstallerEventLogItem{
Event: "PendingProviders",
Args: reqs,
}
},
ProviderAlreadyInstalled: func(provider addrs.Provider, selectedVersion getproviders.Version) {
into <- &testInstallerEventLogItem{
Event: "ProviderAlreadyInstalled",
Provider: provider,
Args: selectedVersion,
}
},
BuiltInProviderAvailable: func(provider addrs.Provider) {
into <- &testInstallerEventLogItem{
Event: "BuiltInProviderAvailable",
Provider: provider,
}
},
BuiltInProviderFailure: func(provider addrs.Provider, err error) {
into <- &testInstallerEventLogItem{
Event: "BuiltInProviderFailure",
Provider: provider,
Args: err.Error(), // stringified to guarantee cmp-ability
}
},
QueryPackagesBegin: func(provider addrs.Provider, versionConstraints getproviders.VersionConstraints, locked bool) {
into <- &testInstallerEventLogItem{
Event: "QueryPackagesBegin",
Provider: provider,
Args: struct {
Constraints string
Locked bool
}{getproviders.VersionConstraintsString(versionConstraints), locked},
}
},
QueryPackagesSuccess: func(provider addrs.Provider, selectedVersion getproviders.Version) {
into <- &testInstallerEventLogItem{
Event: "QueryPackagesSuccess",
Provider: provider,
Args: selectedVersion.String(),
}
},
QueryPackagesFailure: func(provider addrs.Provider, err error) {
into <- &testInstallerEventLogItem{
Event: "QueryPackagesFailure",
Provider: provider,
Args: err.Error(), // stringified to guarantee cmp-ability
}
},
QueryPackagesWarning: func(provider addrs.Provider, warns []string) {
into <- &testInstallerEventLogItem{
Event: "QueryPackagesWarning",
Provider: provider,
Args: warns,
}
},
LinkFromCacheBegin: func(provider addrs.Provider, version getproviders.Version, cacheRoot string) {
into <- &testInstallerEventLogItem{
Event: "LinkFromCacheBegin",
Provider: provider,
Args: struct {
Version string
CacheRoot string
}{version.String(), cacheRoot},
}
},
LinkFromCacheSuccess: func(provider addrs.Provider, version getproviders.Version, localDir string) {
into <- &testInstallerEventLogItem{
Event: "LinkFromCacheSuccess",
Provider: provider,
Args: struct {
Version string
LocalDir string
}{version.String(), localDir},
}
},
LinkFromCacheFailure: func(provider addrs.Provider, version getproviders.Version, err error) {
into <- &testInstallerEventLogItem{
Event: "LinkFromCacheFailure",
Provider: provider,
Args: struct {
Version string
Error string
}{version.String(), err.Error()},
}
},
FetchPackageMeta: func(provider addrs.Provider, version getproviders.Version) {
into <- &testInstallerEventLogItem{
Event: "FetchPackageMeta",
Provider: provider,
Args: version.String(),
}
},
FetchPackageBegin: func(provider addrs.Provider, version getproviders.Version, location getproviders.PackageLocation) {
into <- &testInstallerEventLogItem{
Event: "FetchPackageBegin",
Provider: provider,
Args: struct {
Version string
Location getproviders.PackageLocation
}{version.String(), location},
}
},
FetchPackageSuccess: func(provider addrs.Provider, version getproviders.Version, localDir string, authResult *getproviders.PackageAuthenticationResult) {
into <- &testInstallerEventLogItem{
Event: "FetchPackageSuccess",
Provider: provider,
Args: struct {
Version string
LocalDir string
AuthResult string
}{version.String(), localDir, authResult.String()},
}
},
FetchPackageFailure: func(provider addrs.Provider, version getproviders.Version, err error) {
into <- &testInstallerEventLogItem{
Event: "FetchPackageFailure",
Provider: provider,
Args: struct {
Version string
Error string
}{version.String(), err.Error()},
}
},
ProvidersLockUpdated: func(provider addrs.Provider, version getproviders.Version, localHashes []getproviders.Hash, signedHashes []getproviders.Hash, priorHashes []getproviders.Hash) {
into <- &testInstallerEventLogItem{
Event: "ProvidersLockUpdated",
Provider: provider,
Args: struct {
Version string
Local []getproviders.Hash
Signed []getproviders.Hash
Prior []getproviders.Hash
}{version.String(), localHashes, signedHashes, priorHashes},
}
},
ProvidersFetched: func(authResults map[addrs.Provider]*getproviders.PackageAuthenticationResult) {
into <- &testInstallerEventLogItem{
Event: "ProvidersFetched",
Args: authResults,
}
},
}
}