github.com/terramate-io/tf@v0.0.0-20230830114523-fce866b4dfcd/providercache/installer_events_test.go (about) 1 // Copyright (c) HashiCorp, Inc. 2 // SPDX-License-Identifier: MPL-2.0 3 4 package providercache 5 6 import ( 7 "github.com/terramate-io/tf/addrs" 8 "github.com/terramate-io/tf/getproviders" 9 ) 10 11 type testInstallerEventLogItem struct { 12 // The name of the event that occurred, using the same names as the 13 // fields of InstallerEvents. 14 Event string 15 16 // Most events relate to a specific provider. For the few event types 17 // that don't, this will be a zero-value Provider. 18 Provider addrs.Provider 19 20 // The type of Args will vary by event, but it should always be something 21 // that can be deterministically compared using the go-cmp package. 22 Args interface{} 23 } 24 25 // installerLogEventsForTests is a test helper that produces an InstallerEvents 26 // that writes event notifications (*testInstallerEventLogItem values) to 27 // the given channel as they occur. 28 // 29 // The caller must keep reading from the read side of the given channel 30 // throughout any installer operation using the returned InstallerEvents. 31 // It's the caller's responsibility to close the channel if needed and 32 // clean up any goroutines it started to process the events. 33 // 34 // The exact sequence of events emitted for an installer operation might 35 // change in future, if e.g. we introduce new event callbacks to the 36 // InstallerEvents struct. Tests using this mechanism may therefore need to 37 // be updated to reflect such changes. 38 // 39 // (The channel-based approach here is so that the control flow for event 40 // processing will belong to the caller and thus it can safely use its 41 // testing.T object(s) to emit log lines without non-test-case frames in the 42 // call stack.) 43 func installerLogEventsForTests(into chan<- *testInstallerEventLogItem) *InstallerEvents { 44 return &InstallerEvents{ 45 PendingProviders: func(reqs map[addrs.Provider]getproviders.VersionConstraints) { 46 into <- &testInstallerEventLogItem{ 47 Event: "PendingProviders", 48 Args: reqs, 49 } 50 }, 51 ProviderAlreadyInstalled: func(provider addrs.Provider, selectedVersion getproviders.Version) { 52 into <- &testInstallerEventLogItem{ 53 Event: "ProviderAlreadyInstalled", 54 Provider: provider, 55 Args: selectedVersion, 56 } 57 }, 58 BuiltInProviderAvailable: func(provider addrs.Provider) { 59 into <- &testInstallerEventLogItem{ 60 Event: "BuiltInProviderAvailable", 61 Provider: provider, 62 } 63 }, 64 BuiltInProviderFailure: func(provider addrs.Provider, err error) { 65 into <- &testInstallerEventLogItem{ 66 Event: "BuiltInProviderFailure", 67 Provider: provider, 68 Args: err.Error(), // stringified to guarantee cmp-ability 69 } 70 }, 71 QueryPackagesBegin: func(provider addrs.Provider, versionConstraints getproviders.VersionConstraints, locked bool) { 72 into <- &testInstallerEventLogItem{ 73 Event: "QueryPackagesBegin", 74 Provider: provider, 75 Args: struct { 76 Constraints string 77 Locked bool 78 }{getproviders.VersionConstraintsString(versionConstraints), locked}, 79 } 80 }, 81 QueryPackagesSuccess: func(provider addrs.Provider, selectedVersion getproviders.Version) { 82 into <- &testInstallerEventLogItem{ 83 Event: "QueryPackagesSuccess", 84 Provider: provider, 85 Args: selectedVersion.String(), 86 } 87 }, 88 QueryPackagesFailure: func(provider addrs.Provider, err error) { 89 into <- &testInstallerEventLogItem{ 90 Event: "QueryPackagesFailure", 91 Provider: provider, 92 Args: err.Error(), // stringified to guarantee cmp-ability 93 } 94 }, 95 QueryPackagesWarning: func(provider addrs.Provider, warns []string) { 96 into <- &testInstallerEventLogItem{ 97 Event: "QueryPackagesWarning", 98 Provider: provider, 99 Args: warns, 100 } 101 }, 102 LinkFromCacheBegin: func(provider addrs.Provider, version getproviders.Version, cacheRoot string) { 103 into <- &testInstallerEventLogItem{ 104 Event: "LinkFromCacheBegin", 105 Provider: provider, 106 Args: struct { 107 Version string 108 CacheRoot string 109 }{version.String(), cacheRoot}, 110 } 111 }, 112 LinkFromCacheSuccess: func(provider addrs.Provider, version getproviders.Version, localDir string) { 113 into <- &testInstallerEventLogItem{ 114 Event: "LinkFromCacheSuccess", 115 Provider: provider, 116 Args: struct { 117 Version string 118 LocalDir string 119 }{version.String(), localDir}, 120 } 121 }, 122 LinkFromCacheFailure: func(provider addrs.Provider, version getproviders.Version, err error) { 123 into <- &testInstallerEventLogItem{ 124 Event: "LinkFromCacheFailure", 125 Provider: provider, 126 Args: struct { 127 Version string 128 Error string 129 }{version.String(), err.Error()}, 130 } 131 }, 132 FetchPackageMeta: func(provider addrs.Provider, version getproviders.Version) { 133 into <- &testInstallerEventLogItem{ 134 Event: "FetchPackageMeta", 135 Provider: provider, 136 Args: version.String(), 137 } 138 }, 139 FetchPackageBegin: func(provider addrs.Provider, version getproviders.Version, location getproviders.PackageLocation) { 140 into <- &testInstallerEventLogItem{ 141 Event: "FetchPackageBegin", 142 Provider: provider, 143 Args: struct { 144 Version string 145 Location getproviders.PackageLocation 146 }{version.String(), location}, 147 } 148 }, 149 FetchPackageSuccess: func(provider addrs.Provider, version getproviders.Version, localDir string, authResult *getproviders.PackageAuthenticationResult) { 150 into <- &testInstallerEventLogItem{ 151 Event: "FetchPackageSuccess", 152 Provider: provider, 153 Args: struct { 154 Version string 155 LocalDir string 156 AuthResult string 157 }{version.String(), localDir, authResult.String()}, 158 } 159 }, 160 FetchPackageFailure: func(provider addrs.Provider, version getproviders.Version, err error) { 161 into <- &testInstallerEventLogItem{ 162 Event: "FetchPackageFailure", 163 Provider: provider, 164 Args: struct { 165 Version string 166 Error string 167 }{version.String(), err.Error()}, 168 } 169 }, 170 ProvidersLockUpdated: func(provider addrs.Provider, version getproviders.Version, localHashes []getproviders.Hash, signedHashes []getproviders.Hash, priorHashes []getproviders.Hash) { 171 into <- &testInstallerEventLogItem{ 172 Event: "ProvidersLockUpdated", 173 Provider: provider, 174 Args: struct { 175 Version string 176 Local []getproviders.Hash 177 Signed []getproviders.Hash 178 Prior []getproviders.Hash 179 }{version.String(), localHashes, signedHashes, priorHashes}, 180 } 181 }, 182 ProvidersFetched: func(authResults map[addrs.Provider]*getproviders.PackageAuthenticationResult) { 183 into <- &testInstallerEventLogItem{ 184 Event: "ProvidersFetched", 185 Args: authResults, 186 } 187 }, 188 } 189 }