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  }