github.com/abolfazlbeh/zhycan@v0.0.0-20230819144214-24cf38237387/internal/logger/zhycan_wrapper_test.go (about) 1 package logger 2 3 import ( 4 "fmt" 5 "github.com/abolfazlbeh/zhycan/internal/config" 6 "io" 7 "os" 8 "reflect" 9 "strings" 10 "testing" 11 "time" 12 ) 13 14 func Test_ZhycanConsoleLogger(t *testing.T) { 15 path := "../.." 16 initialMode := "test" 17 prefix := "ZHYCAN" 18 19 err := config.CreateManager(path, initialMode, prefix) 20 if err != nil { 21 t.Errorf("Initializig Config without error, but got %v", err) 22 return 23 } 24 25 //old := os.Stdout // keep backup of the real stdout 26 //r, w, _ := os.Pipe() 27 //os.Stdout = w 28 29 done := capture() 30 31 logg := &LogMeWrapper{} 32 err = logg.Constructor("logger") 33 if err != nil { 34 t.Errorf("Initializing the Zhycan Wrapper, Expected to don't have error, but got %v", err) 35 } 36 37 expectedFlag := true 38 if !logg.IsInitialized() { 39 t.Errorf("Zhycan Wrapper Must Be Initilaized, Expected to get: %v, but got %v", expectedFlag, logg.IsInitialized()) 40 } 41 42 logTime := time.Now().UTC() 43 logg.Log(NewLogObject( 44 DEBUG, "tester", FuncMaintenanceType, logTime, "TEST", nil)) 45 logg.Sync() 46 47 time.Sleep(time.Second * 5) 48 out, err := done() 49 //outC := make(chan string) 50 //// copy the output in a separate goroutine so printing can't block indefinitely 51 //go func() { 52 // var buf bytes.Buffer 53 // io.Copy(&buf, r) 54 // outC <- buf.String() 55 //}() 56 57 // back to normal state 58 //w.Close() 59 //os.Stdout = old // restoring the real stdout 60 //out := <-outC 61 62 // Check the output 63 expectedLog := fmt.Sprintf("\\e[37mzhycan %v >>> DEBUG >>> (FUNC_MAINT/tester) - tester ... <nil>\\e[0m\n", logTime.UnixNano()) 64 if !reflect.DeepEqual(out, expectedLog) { 65 t.Errorf("Expected Log must be: %v, but got: %v", expectedLog, out) 66 } 67 } 68 69 // capture replaces os.Stdout with a writer that buffers any data written 70 // to os.Stdout. Call the returned function to cleanup and get the data 71 // as a string. 72 func capture() func() (string, error) { 73 r, w, err := os.Pipe() 74 if err != nil { 75 panic(err) 76 } 77 78 done := make(chan error, 1) 79 80 save := os.Stdout 81 os.Stdout = w 82 83 var buf strings.Builder 84 85 go func() { 86 _, err := io.Copy(&buf, r) 87 r.Close() 88 done <- err 89 }() 90 91 return func() (string, error) { 92 os.Stdout = save 93 w.Close() 94 err := <-done 95 return buf.String(), err 96 } 97 }