package io_writer_to_logger import ( "fmt" "io" "strings" "testing" "time" ) func TestLogger1(t *testing.T) { tc := []string{ "hello", "gensoukyo", "satori", "koishi", "cirno", "reimu", } lines := make([]string, 0) lw := NewWriterLogWrapper(func(msg string) { t.Log("[OUT] new line: ", msg) lines = append(lines, msg) }) waitCh := make(chan int) go func() { lw.Run() waitCh <- 0 }() t.Log("[LOG] writing...") for _, v := range tc { writeLineTest(t, lw, v) } t.Log("[LOG] closing...") _ = lw.Close() t.Log("[LOG] verifying...") verifyStringArray(t, tc, lines) t.Log("[LOG] wait for routine exit...") <-waitCh t.Log("[LOG] done.") } func writeLineTest(t *testing.T, w io.Writer, a ...interface{}) { t.Log("[LOG] write line") _, err := fmt.Fprintln(w, a...) if err != nil { t.Fatalf("[ERR] failed to write line: %v", err) } } func writeTest(t *testing.T, w io.Writer, a ...interface{}) { t.Log("[LOG] write") _, err := fmt.Fprint(w, a...) if err != nil { t.Fatalf("[ERR] failed to write line: %v", err) } } func verifyStringArray(t *testing.T, ref, data []string) { if len(ref) != len(data) { t.Fatalf("[ERR] len(ref) != len(data), ref: %d, data: %d", len(ref), len(data)) } for i, v := range ref { if v != data[i] { t.Fatalf("[ERR] ref[%d] != data[%d], ref: %s, data: %s", i, i, ref, data) } } } func TestLogger2(t *testing.T) { tc := [][]string{ {"hello"}, {"gensou", "kyo"}, {"sat", "ori"}, {"koishi"}, {"cirn", "o"}, {"r", "eimu"}, } lines := make([]string, 0) lw := NewWriterLogWrapper(func(msg string) { t.Log("[OUT] new line: ", msg) lines = append(lines, msg) }) waitCh := make(chan int) go func() { lw.Run() waitCh <- 0 }() t.Log("[LOG] writing...") for _, v1 := range tc { l := len(v1) for i, v2 := range v1 { if i == l-1 { writeLineTest(t, lw, v2) } else { writeTest(t, lw, v2) } } } t.Log("[LOG] closing...") _ = lw.Close() t.Log("[LOG] verifying...") verifyString2DArray(t, tc, lines) t.Log("[LOG] wait for routine exit...") <-waitCh t.Log("[LOG] done.") } func verifyString2DArray(t *testing.T, ref [][]string, data []string) { if len(ref) != len(data) { t.Fatalf("[ERR] len(ref) != len(data), ref: %d, data: %d", len(ref), len(data)) } for i, v := range ref { na := strings.Join(v, "") if na != data[i] { t.Fatalf("[ERR] ref[%d] != data[%d], ref: %s, data: %s", i, i, ref, data) } } } func TestLogger3(t *testing.T) { verify := []string{ "hello", "test", "foo", "bar", } lines := make([]string, 0) lw := NewWriterLogWrapper(func(msg string) { t.Log("[OUT] new line: ", msg) lines = append(lines, msg) }) waitCh := make(chan int) go func() { lw.Run() waitCh <- 0 }() t.Log("[LOG] writing...") writeTest(t, lw, "hel") writeLineTest(t, lw, "lo") writeLineTest(t, lw, "test") writeLineTest(t, lw, "foo") writeTest(t, lw, "bar") time.Sleep(time.Second) t.Log("[LOG] closing...") _ = lw.Close() time.Sleep(time.Second) t.Log("[LOG] verifying...") verifyStringArray(t, verify, lines) t.Log("[LOG] wait for routine exit...") <-waitCh t.Log("[LOG] done.") }