blob: 9fb293825ff0d4b4a1ffd4a63dd91aad8a062d16 [file] [log] [blame]
// Licensed to the Apache Software Foundation (ASF) under one or more
// contributor license agreements. See the NOTICE file distributed with
// this work for additional information regarding copyright ownership.
// The ASF licenses this file to You under the Apache License, Version 2.0
// (the "License"); you may not use this file except in compliance with
// the License. You may obtain a copy of the License at
//
// http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.
package logger
import (
"fmt"
"io/ioutil"
"log"
"os"
"os/exec"
"path/filepath"
"strings"
"testing"
)
var preparedHandler testHandler
const (
codeFatal = "package main\n\nimport (\n\t\"beam.apache.org/playground/backend/internal/logger\"\n)\n\nfunc main() {\n\tlogger.AddHandler(logger.NewStdHandler())\n\tlogger.Fatal(\"%v\")\n}"
codeFatalf = "package main\n\nimport (\n\t\"beam.apache.org/playground/backend/internal/logger\"\n)\n\nfunc main() {\n\tlogger.AddHandler(logger.NewStdHandler())\n\tlogger.Fatalf(\"%v\",\"%s\")\n}"
testLoggerDir = "testLogger"
testFatalDir = "testFatal"
testFatalfDir = "testFatalf"
)
var testFatalPath, testFatalfPath string
type testHandler struct {
logs []string
}
func (t *testHandler) Info(args ...interface{}) {
t.logMessage(INFO, args...)
}
func (t *testHandler) Infof(format string, args ...interface{}) {
t.logMessage(INFO, fmt.Sprintf(format, args...))
}
func (t *testHandler) Warn(args ...interface{}) {
t.logMessage(WARN, args...)
}
func (t *testHandler) Warnf(format string, args ...interface{}) {
t.logMessage(WARN, fmt.Sprintf(format, args...))
}
func (t *testHandler) Error(args ...interface{}) {
t.logMessage(ERROR, args...)
}
func (t *testHandler) Errorf(format string, args ...interface{}) {
t.logMessage(ERROR, fmt.Sprintf(format, args...))
}
func (t *testHandler) Debug(args ...interface{}) {
t.logMessage(DEBUG, args...)
}
func (t *testHandler) Debugf(format string, args ...interface{}) {
t.logMessage(DEBUG, fmt.Sprintf(format, args...))
}
func (t *testHandler) Fatal(args ...interface{}) {
t.logMessage(FATAL, args...)
}
func (t *testHandler) Fatalf(format string, args ...interface{}) {
t.logMessage(FATAL, fmt.Sprintf(format, args...))
}
func (t *testHandler) logMessage(severity Severity, args ...interface{}) {
args = append([]interface{}{severity}, args...)
t.logs = append(t.logs, fmt.Sprint(args...))
}
func TestMain(m *testing.M) {
preparedHandler = testHandler{logs: []string{}}
handlersTest := []Handler{&preparedHandler}
SetHandlers(handlersTest)
err := preparedFolder()
if err != nil {
log.Fatal(err)
}
defer teardown()
m.Run()
}
func preparedFolder() error {
err := os.MkdirAll(filepath.Join(testLoggerDir, testFatalDir), 0755)
if err != nil {
return err
}
err = os.MkdirAll(filepath.Join(testLoggerDir, testFatalfDir), 0755)
if err != nil {
return err
}
testFatalPath = filepath.Join(testLoggerDir, testFatalDir, "test.go")
testFatalfPath = filepath.Join(testLoggerDir, testFatalfDir, "test.go")
_, err = os.Create(testFatalPath)
if err != nil {
return err
}
_, err = os.Create(testFatalfPath)
if err != nil {
return err
}
return nil
}
func teardown() {
err := os.RemoveAll(testLoggerDir)
if err != nil {
log.Fatal(err)
}
}
func TestInfo(t *testing.T) {
type args struct {
args []interface{}
}
var tests = []struct {
name string
args args
}{
{
name: "Info",
args: args{args: []interface{}{"TEST_VALUE"}},
},
}
for _, tt := range tests {
t.Run(tt.name, func(t *testing.T) {
Info(tt.args.args...)
value := append([]interface{}{INFO}, tt.args.args...)
expectedValue := preparedHandler.logs[len(preparedHandler.logs)-1]
if expectedValue != fmt.Sprint(value...) {
t.Errorf("Value %v not added in the logs", expectedValue)
}
})
}
}
func TestInfof(t *testing.T) {
type args struct {
format string
args []interface{}
}
tests := []struct {
name string
args args
}{
{
name: "Infof",
args: args{
format: "TEST FORMAT %s",
args: []interface{}{"TEST_VALUE"}},
},
}
for _, tt := range tests {
t.Run(tt.name, func(t *testing.T) {
Infof(tt.args.format, tt.args.args...)
value := append([]interface{}{INFO}, fmt.Sprintf(tt.args.format, tt.args.args...))
expectedValue := preparedHandler.logs[len(preparedHandler.logs)-1]
if expectedValue != fmt.Sprint(value...) {
t.Errorf("Value %v not added in the logs", expectedValue)
}
})
}
}
func TestWarn(t *testing.T) {
type args struct {
args []interface{}
}
tests := []struct {
name string
args args
}{
{
name: "Warn",
args: args{args: []interface{}{"TEST_VALUE"}},
},
}
for _, tt := range tests {
t.Run(tt.name, func(t *testing.T) {
Warn(tt.args.args...)
value := append([]interface{}{WARN}, tt.args.args...)
expectedValue := preparedHandler.logs[len(preparedHandler.logs)-1]
if expectedValue != fmt.Sprint(value...) {
t.Errorf("Value %v not added in the logs", expectedValue)
}
})
}
}
func TestWarnf(t *testing.T) {
type args struct {
format string
args []interface{}
}
tests := []struct {
name string
args args
}{
{
name: "Warnf",
args: args{
format: "TEST FORMAT %s",
args: []interface{}{"TEST_VALUE"}},
},
}
for _, tt := range tests {
t.Run(tt.name, func(t *testing.T) {
Warnf(tt.args.format, tt.args.args...)
value := append([]interface{}{WARN}, fmt.Sprintf(tt.args.format, tt.args.args...))
expectedValue := preparedHandler.logs[len(preparedHandler.logs)-1]
if expectedValue != fmt.Sprint(value...) {
t.Errorf("Value %v not added in the logs", expectedValue)
}
})
}
}
func TestError(t *testing.T) {
type args struct {
args []interface{}
}
tests := []struct {
name string
args args
}{
{
name: "Error",
args: args{args: []interface{}{"TEST_VALUE"}},
},
}
for _, tt := range tests {
t.Run(tt.name, func(t *testing.T) {
Error(tt.args.args...)
value := append([]interface{}{ERROR}, tt.args.args...)
expectedValue := preparedHandler.logs[len(preparedHandler.logs)-1]
if expectedValue != fmt.Sprint(value...) {
t.Errorf("Value %v not added in the logs", expectedValue)
}
})
}
}
func TestErrorf(t *testing.T) {
type args struct {
format string
args []interface{}
}
tests := []struct {
name string
args args
}{
{
name: "Errorf",
args: args{
format: "TEST FORMAT %s",
args: []interface{}{"TEST_VALUE"}},
},
}
for _, tt := range tests {
t.Run(tt.name, func(t *testing.T) {
Errorf(tt.args.format, tt.args.args...)
value := append([]interface{}{ERROR}, fmt.Sprintf(tt.args.format, tt.args.args...))
expectedValue := preparedHandler.logs[len(preparedHandler.logs)-1]
if expectedValue != fmt.Sprint(value...) {
t.Errorf("Value %v not added in the logs", expectedValue)
}
})
}
}
func TestDebug(t *testing.T) {
type args struct {
args []interface{}
}
tests := []struct {
name string
args args
}{
{
name: "Debug",
args: args{args: []interface{}{"TEST_VALUE"}},
},
}
for _, tt := range tests {
t.Run(tt.name, func(t *testing.T) {
Debug(tt.args.args...)
value := append([]interface{}{DEBUG}, tt.args.args...)
expectedValue := preparedHandler.logs[len(preparedHandler.logs)-1]
if expectedValue != fmt.Sprint(value...) {
t.Errorf("Value %v not added in the logs", expectedValue)
}
})
}
}
func TestDebugf(t *testing.T) {
type args struct {
format string
args []interface{}
}
tests := []struct {
name string
args args
}{
{
name: "Debugf",
args: args{
format: "TEST FORMAT %s",
args: []interface{}{"TEST_VALUE"}},
},
}
for _, tt := range tests {
t.Run(tt.name, func(t *testing.T) {
Debugf(tt.args.format, tt.args.args...)
value := append([]interface{}{DEBUG}, fmt.Sprintf(tt.args.format, tt.args.args...))
expectedValue := preparedHandler.logs[len(preparedHandler.logs)-1]
if expectedValue != fmt.Sprint(value...) {
t.Errorf("Value %v not added in the logs", expectedValue)
}
})
}
}
func TestFatal(t *testing.T) {
type args struct {
args []interface{}
}
tests := []struct {
name string
args args
}{
{
name: "Fatal",
args: args{args: []interface{}{"TEST_VALUE"}},
},
}
for _, tt := range tests {
t.Run(tt.name, func(t *testing.T) {
err := os.WriteFile(testFatalPath, []byte(fmt.Sprintf(codeFatal, tt.args.args[0])), 0755)
if err != nil {
t.Error(err)
}
cmd := exec.Command("go", "run", testFatalPath)
stdout, _ := cmd.StderrPipe()
if err := cmd.Start(); err != nil {
t.Error(err)
}
gotBytes, _ := ioutil.ReadAll(stdout)
got := strings.Split(string(gotBytes), "\n")
args := append([]interface{}{string(FATAL) + " "}, tt.args.args...)
expectedValue := fmt.Sprint(args...)
if !strings.HasSuffix(got[0], expectedValue) {
t.Errorf("Unexpected log message. Got '%s' but contain '%s'", got[:len(got)-1], expectedValue)
}
err = cmd.Wait()
if e, ok := err.(*exec.ExitError); !ok || e.Success() {
t.Errorf("Process ran with err %v, want exit status 1", err)
}
})
}
}
func TestFatalf(t *testing.T) {
type args struct {
format string
args []interface{}
}
tests := []struct {
name string
args args
}{
{
name: "Fatalf",
args: args{
format: "TEST FORMAT %s",
args: []interface{}{"TEST_VALUE"}},
},
}
for _, tt := range tests {
t.Run(tt.name, func(t *testing.T) {
err := os.WriteFile(testFatalfPath, []byte(fmt.Sprintf(codeFatalf, tt.args.format, tt.args.args[0])), 0755)
if err != nil {
t.Error(err)
}
cmd := exec.Command("go", "run", testFatalfPath)
stdout, _ := cmd.StderrPipe()
if err := cmd.Start(); err != nil {
t.Error(err)
}
gotBytes, _ := ioutil.ReadAll(stdout)
got := strings.Split(string(gotBytes), "\n")
args := append([]interface{}{string(FATAL) + " "}, fmt.Sprintf(tt.args.format, tt.args.args...))
expectedValue := fmt.Sprint(args...)
if !strings.HasSuffix(got[0], expectedValue) {
t.Errorf("Unexpected log message. Got '%s' but contain '%s'", got[:len(got)-1], expectedValue)
}
err = cmd.Wait()
if e, ok := err.(*exec.ExitError); !ok || e.Success() {
t.Errorf("Process ran with err %v, want exit status 1", err)
}
})
}
}