// Copyright (c) HashiCorp, Inc. // SPDX-License-Identifier: BUSL-1.1 package execclient // import ( // "bytes" // "io" // "io/ioutil" // "testing" // "github.com/stretchr/testify/assert" // "github.com/stretchr/testify/require" // ) // func TestEscape(t *testing.T) { // t.Run("closes the context when the escape sequence is seen", func(t *testing.T) { // var buf bytes.Buffer // buf.WriteByte('\n') // buf.WriteByte('~') // buf.WriteByte('.') // var ok bool // cancel := func() { // ok = true // } // ew := &EscapeWatcher{Cancel: cancel, Input: &buf} // io.Copy(ioutil.Discard, ew) // assert.True(t, ok, "context was not canceled") // }) // t.Run("can see the sequence within a buffer", func(t *testing.T) { // var buf bytes.Buffer // buf.WriteString("hello") // buf.WriteByte('\n') // buf.WriteByte('~') // buf.WriteByte('.') // buf.WriteString("bye") // var ok bool // cancel := func() { // ok = true // } // ew := &EscapeWatcher{Cancel: cancel, Input: &buf} // io.Copy(ioutil.Discard, ew) // assert.True(t, ok, "context was not canceled") // }) // t.Run("can see the sequence across reads", func(t *testing.T) { // r, w := io.Pipe() // var ok bool // cancel := func() { // ok = true // } // ew := &EscapeWatcher{Cancel: cancel, Input: r} // go w.Write([]byte("hello\n")) // junk := make([]byte, 1024) // n, err := ew.Read(junk) // require.NoError(t, err) // assert.Equal(t, 6, n) // go w.Write([]byte("~.")) // n, err = ew.Read(junk) // require.NoError(t, err) // assert.Equal(t, 2, n) // assert.True(t, ok, "context was not canceled") // }) // t.Run("can see the sequence across reads split on ~ and .", func(t *testing.T) { // r, w := io.Pipe() // var ok bool // cancel := func() { // ok = true // } // ew := &EscapeWatcher{Cancel: cancel, Input: r} // go w.Write([]byte("hello\n~")) // junk := make([]byte, 1024) // n, err := ew.Read(junk) // require.NoError(t, err) // assert.Equal(t, 7, n) // go w.Write([]byte(".")) // n, err = ew.Read(junk) // require.NoError(t, err) // assert.Equal(t, 1, n) // assert.True(t, ok, "context was not canceled") // }) // t.Run("resets track state after newline", func(t *testing.T) { // var buf bytes.Buffer // buf.WriteString("\nx~.") // var ok bool // cancel := func() { // ok = true // } // ew := &EscapeWatcher{Cancel: cancel, Input: &buf} // io.Copy(ioutil.Discard, ew) // assert.False(t, ok, "context was canceled") // assert.Equal(t, escNormal, ew.state) // }) // t.Run("resets track state after tilde", func(t *testing.T) { // var buf bytes.Buffer // buf.WriteString("\n~x.") // var ok bool // cancel := func() { // ok = true // } // ew := &EscapeWatcher{Cancel: cancel, Input: &buf} // io.Copy(ioutil.Discard, ew) // assert.False(t, ok, "context was canceled") // assert.Equal(t, escNormal, ew.state) // }) // t.Run("follows newlines into escape state", func(t *testing.T) { // var buf bytes.Buffer // buf.WriteString("\n\n~.") // var ok bool // cancel := func() { // ok = true // } // ew := &EscapeWatcher{Cancel: cancel, Input: &buf} // io.Copy(ioutil.Discard, ew) // assert.True(t, ok, "context was not canceled") // }) // }