github.com/opentofu/opentofu@v1.7.1/internal/tofu/provisioner_mock.go (about)

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