2018-02-05 16:05:59 -05:00
package jsonlog // import "github.com/docker/docker/daemon/logger/jsonfilelog/jsonlog"
2015-06-27 09:18:52 +02:00
import (
"bytes"
2017-09-22 15:37:16 -04:00
"encoding/json"
2017-12-22 16:30:49 -05:00
"fmt"
2015-06-27 09:18:52 +02:00
"regexp"
"testing"
2017-09-22 15:37:16 -04:00
"time"
2018-06-11 15:32:11 +02:00
"gotest.tools/assert"
2015-06-27 09:18:52 +02:00
)
2015-08-08 11:28:22 +08:00
func TestJSONLogsMarshalJSONBuf ( t * testing . T ) {
logs := map [ * JSONLogs ] string {
2017-09-22 15:37:16 -04:00
{ Log : [ ] byte ( ` "A log line with \\" ` ) } : ` ^ { \"log\":\"\\\"A log line with \\\\\\\\\\\"\",\"time\": ` ,
{ Log : [ ] byte ( "A log line" ) } : ` ^ { \"log\":\"A log line\",\"time\": ` ,
{ Log : [ ] byte ( "A log line with \r" ) } : ` ^ { \"log\":\"A log line with \\r\",\"time\": ` ,
{ Log : [ ] byte ( "A log line with & < >" ) } : ` ^ { \"log\":\"A log line with \\u0026 \\u003c \\u003e\",\"time\": ` ,
{ Log : [ ] byte ( "A log line with utf8 : 🚀 ψ ω β" ) } : ` ^ { \"log\":\"A log line with utf8 : 🚀 ψ ω β\",\"time\": ` ,
{ Stream : "stdout" } : ` ^ { \"stream\":\"stdout\",\"time\": ` ,
{ Stream : "stdout" , Log : [ ] byte ( "A log line" ) } : ` ^ { \"log\":\"A log line\",\"stream\":\"stdout\",\"time\": ` ,
{ Created : time . Date ( 2017 , 9 , 1 , 1 , 1 , 1 , 1 , time . UTC ) } : ` ^ { \"time\":"2017-09-01T01:01:01.000000001Z"}$ ` ,
{ } : ` ^ { \"time\":"0001-01-01T00:00:00Z"}$ ` ,
2015-06-27 09:18:52 +02:00
// These ones are a little weird
2017-09-22 15:37:16 -04:00
{ Log : [ ] byte ( "\u2028 \u2029" ) } : ` ^ { \"log\":\"\\u2028 \\u2029\",\"time\": ` ,
{ Log : [ ] byte { 0xaF } } : ` ^ { \"log\":\"\\ufffd\",\"time\": ` ,
{ Log : [ ] byte { 0x7F } } : ` ^ { \"log\":\"\x7f\",\"time\": ` ,
2015-10-04 21:07:09 +00:00
// with raw attributes
2017-09-22 15:37:16 -04:00
{ Log : [ ] byte ( "A log line" ) , RawAttrs : [ ] byte ( ` { "hello":"world","value":1234} ` ) } : ` ^ { \"log\":\"A log line\",\"attrs\": { \"hello\":\"world\",\"value\":1234},\"time\": ` ,
2017-09-26 10:22:10 -04:00
// with Tag set
2018-01-08 00:54:58 +00:00
{ Log : [ ] byte ( "A log line with tag" ) , RawAttrs : [ ] byte ( ` { "hello":"world","value":1234} ` ) } : ` ^ { \"log\":\"A log line with tag\",\"attrs\": { \"hello\":\"world\",\"value\":1234},\"time\": ` ,
2015-06-27 09:18:52 +02:00
}
for jsonLog , expression := range logs {
var buf bytes . Buffer
2017-09-22 15:37:16 -04:00
err := jsonLog . MarshalJSONBuf ( & buf )
2018-03-13 15:28:34 -04:00
assert . NilError ( t , err )
2017-12-22 16:30:49 -05:00
assert . Assert ( t , regexP ( buf . String ( ) , expression ) )
assert . NilError ( t , json . Unmarshal ( buf . Bytes ( ) , & map [ string ] interface { } { } ) )
}
}
func regexP ( value string , pattern string ) func ( ) ( bool , string ) {
return func ( ) ( bool , string ) {
re := regexp . MustCompile ( pattern )
msg := fmt . Sprintf ( "%q did not match pattern %q" , value , pattern )
return re . MatchString ( value ) , msg
2015-06-27 09:18:52 +02:00
}
}