github.com/opentofu/opentofu@v1.7.1/internal/legacy/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 }