provisioner/shell: fix EOF detection
Fixes #507 The scanUnixLine function was erroneously returning empty lines when EOF was reached. This commit adds a test for the problem and changes the scanUnixLine function to elide the trailing \n if no content was read.
This commit is contained in:
parent
336d04cfbd
commit
104f5049a7
|
@ -54,5 +54,8 @@ func (r *UnixReader) Read(p []byte) (n int, err error) {
|
||||||
// token returned will be "one\n".
|
// token returned will be "one\n".
|
||||||
func scanUnixLine(data []byte, atEOF bool) (advance int, token []byte, err error) {
|
func scanUnixLine(data []byte, atEOF bool) (advance int, token []byte, err error) {
|
||||||
advance, token, err = bufio.ScanLines(data, atEOF)
|
advance, token, err = bufio.ScanLines(data, atEOF)
|
||||||
|
if advance == 0 {
|
||||||
|
return
|
||||||
|
}
|
||||||
return advance, append(token, "\n"...), err
|
return advance, append(token, "\n"...), err
|
||||||
}
|
}
|
||||||
|
|
|
@ -18,24 +18,24 @@ func TestUnixReader(t *testing.T) {
|
||||||
input := "one\r\ntwo\n\r\nthree\r\n"
|
input := "one\r\ntwo\n\r\nthree\r\n"
|
||||||
expected := "one\ntwo\n\nthree\n"
|
expected := "one\ntwo\n\nthree\n"
|
||||||
|
|
||||||
r := &UnixReader{
|
unixReaderTest(t, input, expected)
|
||||||
Reader: bytes.NewReader([]byte(input)),
|
|
||||||
}
|
|
||||||
|
|
||||||
result := new(bytes.Buffer)
|
|
||||||
if _, err := io.Copy(result, r); err != nil {
|
|
||||||
t.Fatalf("err: %s", err)
|
|
||||||
}
|
|
||||||
|
|
||||||
if result.String() != expected {
|
|
||||||
t.Fatalf("bad: %#v", result.String())
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
func TestUnixReader_unixOnly(t *testing.T) {
|
func TestUnixReader_unixOnly(t *testing.T) {
|
||||||
input := "\none\n\ntwo\nthree\n\n"
|
input := "\none\n\ntwo\nthree\n\n"
|
||||||
expected := "\none\n\ntwo\nthree\n\n"
|
expected := "\none\n\ntwo\nthree\n\n"
|
||||||
|
|
||||||
|
unixReaderTest(t, input, expected)
|
||||||
|
}
|
||||||
|
|
||||||
|
func TestUnixReader_readsLastLine(t *testing.T) {
|
||||||
|
input := "one\ntwo"
|
||||||
|
expected := "one\ntwo\n"
|
||||||
|
|
||||||
|
unixReaderTest(t, input, expected)
|
||||||
|
}
|
||||||
|
|
||||||
|
func unixReaderTest(t *testing.T, input string, expected string) {
|
||||||
r := &UnixReader{
|
r := &UnixReader{
|
||||||
Reader: bytes.NewReader([]byte(input)),
|
Reader: bytes.NewReader([]byte(input)),
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in New Issue