github.com/terramate-io/tf@v0.0.0-20230830114523-fce866b4dfcd/legacy/terraform/provisioner_mock.go (about)

     1  // Copyright (c) HashiCorp, Inc.
     2  // SPDX-License-Identifier: MPL-2.0
     3  
     4  package terraform
     5  
     6  import (
     7  	"sync"
     8  
     9  	"github.com/terramate-io/tf/provisioners"
    10  )
    11  
    12  var _ provisioners.Interface = (*MockProvisioner)(nil)
    13  
    14  // MockProvisioner implements provisioners.Interface but mocks out all the
    15  // calls for testing purposes.
    16  type MockProvisioner struct {
    17  	sync.Mutex
    18  	// Anything you want, in case you need to store extra data with the mock.
    19  	Meta interface{}
    20  
    21  	GetSchemaCalled   bool
    22  	GetSchemaResponse provisioners.GetSchemaResponse
    23  
    24  	ValidateProvisionerConfigCalled   bool
    25  	ValidateProvisionerConfigRequest  provisioners.ValidateProvisionerConfigRequest
    26  	ValidateProvisionerConfigResponse provisioners.ValidateProvisionerConfigResponse
    27  	ValidateProvisionerConfigFn       func(provisioners.ValidateProvisionerConfigRequest) provisioners.ValidateProvisionerConfigResponse
    28  
    29  	ProvisionResourceCalled   bool
    30  	ProvisionResourceRequest  provisioners.ProvisionResourceRequest
    31  	ProvisionResourceResponse provisioners.ProvisionResourceResponse
    32  	ProvisionResourceFn       func(provisioners.ProvisionResourceRequest) provisioners.ProvisionResourceResponse
    33  
    34  	StopCalled   bool
    35  	StopResponse error
    36  	StopFn       func() error
    37  
    38  	CloseCalled   bool
    39  	CloseResponse error
    40  	CloseFn       func() error
    41  }
    42  
    43  func (p *MockProvisioner) GetSchema() provisioners.GetSchemaResponse {
    44  	p.Lock()
    45  	defer p.Unlock()
    46  
    47  	p.GetSchemaCalled = true
    48  	return p.getSchema()
    49  }
    50  
    51  // getSchema is the implementation of GetSchema, which can be called from other
    52  // methods on MockProvisioner that may already be holding the lock.
    53  func (p *MockProvisioner) getSchema() provisioners.GetSchemaResponse {
    54  	return p.GetSchemaResponse
    55  }
    56  
    57  func (p *MockProvisioner) ValidateProvisionerConfig(r provisioners.ValidateProvisionerConfigRequest) provisioners.ValidateProvisionerConfigResponse {
    58  	p.Lock()
    59  	defer p.Unlock()
    60  
    61  	p.ValidateProvisionerConfigCalled = true
    62  	p.ValidateProvisionerConfigRequest = r
    63  	if p.ValidateProvisionerConfigFn != nil {
    64  		return p.ValidateProvisionerConfigFn(r)
    65  	}
    66  	return p.ValidateProvisionerConfigResponse
    67  }
    68  
    69  func (p *MockProvisioner) ProvisionResource(r provisioners.ProvisionResourceRequest) provisioners.ProvisionResourceResponse {
    70  	p.Lock()
    71  	defer p.Unlock()
    72  
    73  	p.ProvisionResourceCalled = true
    74  	p.ProvisionResourceRequest = r
    75  	if p.ProvisionResourceFn != nil {
    76  		fn := p.ProvisionResourceFn
    77  		return fn(r)
    78  	}
    79  
    80  	return p.ProvisionResourceResponse
    81  }
    82  
    83  func (p *MockProvisioner) Stop() error {
    84  	// We intentionally don't lock in this one because the whole point of this
    85  	// method is to be called concurrently with another operation that can
    86  	// be cancelled. The provisioner itself is responsible for handling
    87  	// any concurrency concerns in this case.
    88  
    89  	p.StopCalled = true
    90  	if p.StopFn != nil {
    91  		return p.StopFn()
    92  	}
    93  
    94  	return p.StopResponse
    95  }
    96  
    97  func (p *MockProvisioner) Close() error {
    98  	p.Lock()
    99  	defer p.Unlock()
   100  
   101  	p.CloseCalled = true
   102  	if p.CloseFn != nil {
   103  		return p.CloseFn()
   104  	}
   105  
   106  	return p.CloseResponse
   107  }