summaryrefslogtreecommitdiff
path: root/vendor/github.com/hashicorp/terraform/vendor/github.com/mitchellh/cli/ui_mock.go
diff options
context:
space:
mode:
Diffstat (limited to 'vendor/github.com/hashicorp/terraform/vendor/github.com/mitchellh/cli/ui_mock.go')
-rw-r--r--vendor/github.com/hashicorp/terraform/vendor/github.com/mitchellh/cli/ui_mock.go59
1 files changed, 53 insertions, 6 deletions
diff --git a/vendor/github.com/hashicorp/terraform/vendor/github.com/mitchellh/cli/ui_mock.go b/vendor/github.com/hashicorp/terraform/vendor/github.com/mitchellh/cli/ui_mock.go
index c4677285..0bfe0a19 100644
--- a/vendor/github.com/hashicorp/terraform/vendor/github.com/mitchellh/cli/ui_mock.go
+++ b/vendor/github.com/hashicorp/terraform/vendor/github.com/mitchellh/cli/ui_mock.go
@@ -7,12 +7,25 @@ import (
"sync"
)
-// MockUi is a mock UI that is used for tests and is exported publicly for
-// use in external tests if needed as well.
+// NewMockUi returns a fully initialized MockUi instance
+// which is safe for concurrent use.
+func NewMockUi() *MockUi {
+ m := new(MockUi)
+ m.once.Do(m.init)
+ return m
+}
+
+// MockUi is a mock UI that is used for tests and is exported publicly
+// for use in external tests if needed as well. Do not instantite this
+// directly since the buffers will be initialized on the first write. If
+// there is no write then you will get a nil panic. Please use the
+// NewMockUi() constructor function instead. You can fix your code with
+//
+// sed -i -e 's/new(cli.MockUi)/cli.NewMockUi()/g' *_test.go
type MockUi struct {
InputReader io.Reader
- ErrorWriter *bytes.Buffer
- OutputWriter *bytes.Buffer
+ ErrorWriter *syncBuffer
+ OutputWriter *syncBuffer
once sync.Once
}
@@ -59,6 +72,40 @@ func (u *MockUi) Warn(message string) {
}
func (u *MockUi) init() {
- u.ErrorWriter = new(bytes.Buffer)
- u.OutputWriter = new(bytes.Buffer)
+ u.ErrorWriter = new(syncBuffer)
+ u.OutputWriter = new(syncBuffer)
+}
+
+type syncBuffer struct {
+ sync.RWMutex
+ b bytes.Buffer
+}
+
+func (b *syncBuffer) Write(data []byte) (int, error) {
+ b.Lock()
+ defer b.Unlock()
+ return b.b.Write(data)
+}
+
+func (b *syncBuffer) Read(data []byte) (int, error) {
+ b.RLock()
+ defer b.RUnlock()
+ return b.b.Read(data)
+}
+
+func (b *syncBuffer) Reset() {
+ b.Lock()
+ b.b.Reset()
+ b.Unlock()
+}
+
+func (b *syncBuffer) String() string {
+ return string(b.Bytes())
+}
+
+func (b *syncBuffer) Bytes() []byte {
+ b.RLock()
+ data := b.b.Bytes()
+ b.RUnlock()
+ return data
}