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:
parent
a1cf15d971
commit
1c2f61f5ca
@ -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
|
||||
}
|
||||
}
|
||||
|
@ -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")
|
||||
}
|
||||
|
Loading…
x
Reference in New Issue
Block a user