feat(write): warn about standalone CR characters in header lines (#109)

* feat(write): warn about standalone CR characters in header lines

* feat(write): add test for Windows CRLF line endings

* chore: improve warning message

Co-authored-by: Daniel Moran <danxmoran@gmail.com>

* chore: update test with a new warning message

Co-authored-by: Daniel Moran <danxmoran@gmail.com>
This commit is contained in:
Pavel Závora 2021-06-07 14:59:57 +02:00 committed by GitHub
parent a1cf15d971
commit 1c2f61f5ca
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
2 changed files with 70 additions and 0 deletions

View File

@ -3,6 +3,7 @@ package csv2lp
import (
"encoding/csv"
"errors"
"fmt"
"io"
"log"
@ -144,6 +145,17 @@ func (state *CsvToLineReader) Read(p []byte) (n int, err error) {
state.buffer = append(state.buffer, '\n')
break
} else {
// detect non-standard line endings in header lines #106
for _, col := range row {
if idx := strings.Index(col, "\r"); idx >= 0 && idx+1 < len(col) && col[idx+1] != '\n' {
log.Println(
fmt.Sprintf("WARNING: %v. Only CRLF and LF line endings are supported.",
CsvLineError{state.LineNumber, errors.New("standalone CR character found")},
),
)
break
}
}
state.dataRowAdded = false
}
}

View File

@ -424,3 +424,61 @@ cpu;3a
// 8 lines were read
require.Equal(t, 8, reader.LineNumber)
}
// Test_CsvToLineProtocol_LineEndingWarning checks correct logging of exotic line ending
func Test_CsvToLineProtocol_LineEndingWarning(t *testing.T) {
var buf bytes.Buffer
log.SetOutput(&buf)
oldFlags := log.Flags()
log.SetFlags(0)
oldPrefix := log.Prefix()
prefix := "::PREFIX::"
log.SetPrefix(prefix)
defer func() {
log.SetOutput(os.Stderr)
log.SetFlags(oldFlags)
log.SetPrefix(oldPrefix)
}()
csv := "#datatype dateTime:number,string,tag,double,measurement\r" +
"time,sensor_id,parent,average,m\r" +
"1549240000000000000,xx:xx:xx:xx:xx:xx,2nd Floor Open Plan DS,0,test"
reader := CsvToLineProtocol(strings.NewReader(csv))
bytes, _ := ioutil.ReadAll(reader)
out := buf.String()
messages := strings.Count(out, prefix)
require.Equal(t, messages, 1)
require.Contains(t, out, "line 1")
require.Contains(t, out, "standalone CR character found. Only CRLF and LF line endings are supported.")
require.Empty(t, bytes)
}
// Test_CsvToLineProtocol_WindowsLineEndings checks CRLF line endings
func Test_CsvToLineProtocol_WindowsLineEndings(t *testing.T) {
var buf bytes.Buffer
log.SetOutput(&buf)
oldFlags := log.Flags()
log.SetFlags(0)
oldPrefix := log.Prefix()
prefix := "::PREFIX::"
log.SetPrefix(prefix)
defer func() {
log.SetOutput(os.Stderr)
log.SetFlags(oldFlags)
log.SetPrefix(oldPrefix)
}()
csv := "#datatype dateTime:number,string,tag,double,measurement\r\n" +
"time,sensor_id,parent,average,m\r\n" +
"1549240000000000000,a,b,0,test"
reader := CsvToLineProtocol(strings.NewReader(csv))
bytes, _ := ioutil.ReadAll(reader)
out := buf.String()
messages := strings.Count(out, prefix)
require.Equal(t, messages, 0)
require.Equal(t, string(bytes), "test,parent=b sensor_id=\"a\",average=0 1549240000000000000\n")
}