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  }