summaryrefslogtreecommitdiff
path: root/logging/log_test.go
blob: ac35412cb9b227657395707c629ad7b12bb52593 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
// Copyright (C) 2019-2024 Algorand, Inc.
// This file is part of go-algorand
//
// go-algorand is free software: you can redistribute it and/or modify
// it under the terms of the GNU Affero General Public License as
// published by the Free Software Foundation, either version 3 of the
// License, or (at your option) any later version.
//
// go-algorand is distributed in the hope that it will be useful,
// but WITHOUT ANY WARRANTY; without even the implied warranty of
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
// GNU Affero General Public License for more details.
//
// You should have received a copy of the GNU Affero General Public License
// along with go-algorand.  If not, see <https://www.gnu.org/licenses/>.

package logging

import (
	"bytes"
	"encoding/json"
	"sync/atomic"
	"testing"

	"github.com/algorand/go-algorand/test/partitiontest"
	"github.com/stretchr/testify/require"
)

/*
Since most of the functions are pure wrappers, we don't test them and trust the logrus testing coverage.

Things to test -

TestFileOutputNewLogger -- Tests the input change to Buffer works for a new Logger
TestSetLevelNewLogger -- Tests that the new level doesn't affect the base logger
TestWithFieldsNewLogger - Test functionality on a new Logger
TestSetJSONFormatter - Tests that the output results in JSON Format
*/

func isJSON(s string) bool {
	var js map[string]interface{}
	return json.Unmarshal([]byte(s), &js) == nil

}

func TestFileOutputNewLogger(t *testing.T) {
	partitiontest.PartitionTest(t)
	a := require.New(t)

	// Create a buffer (mimics a file) for the output
	var bufNewLogger bytes.Buffer

	// Create a new logger
	nl := NewLogger()
	nl.SetOutput(&bufNewLogger)

	nl.Info("Should show up in New logger but not in BaseLogger")

	a.NotContains(bufNewLogger.String(), "Should show up in base logger but not in NewLogger")
	a.Contains(bufNewLogger.String(), "Should show up in New logger but not in BaseLogger")

}

func TestSetGetLevel(t *testing.T) {
	partitiontest.PartitionTest(t)

	nl := NewLogger()
	require.Equal(t, Info, nl.GetLevel())
	nl.SetLevel(Error)
	require.Equal(t, Error, nl.GetLevel())
}

func TestSetLevelNewLogger(t *testing.T) {
	partitiontest.PartitionTest(t)
	a := require.New(t)

	//Create a buffer (mimics a file) for the output
	var bufNewLogger bytes.Buffer

	//Debug level is info by default
	nl := NewLogger()
	nl.SetOutput(&bufNewLogger)

	nl.Debug("ABC Should not show up")
	nl.Info("CDF Should show up")
	nl.Warn("GHI Should show up")

	// Check the new logger
	a.NotContains(bufNewLogger.String(), "ABC Should not show up")
	a.Contains(bufNewLogger.String(), "CDF Should show up")
	a.Contains(bufNewLogger.String(), "GHI Should show up")
}

func TestWithFieldsNewLogger(t *testing.T) {
	partitiontest.PartitionTest(t)
	a := require.New(t)

	// Create a buffer (mimics a file) for the output
	var bufNewLogger bytes.Buffer

	nl := NewLogger()
	nl.SetOutput(&bufNewLogger)

	nl.WithFields(Fields{"1": 4, "2": "testNew"}).Info("ABCDEFG")
	a.Regexp("time=\".*\" level=info msg=ABCDEFG 1=4 2=testNew file=log_test.go function=github.com/algorand/go-algorand/logging.TestWithFieldsNewLogger line=\\d+", bufNewLogger.String())
	a.NotRegexp("time=\".*\" level=info msg=ABCDEFG 1=4 2=test file=log_test.go function=github.com/algorand/go-algorand/logging.TestWithFieldsNewLogger line=\\d+", bufNewLogger.String())
}

func TestSetJSONFormatter(t *testing.T) {
	partitiontest.PartitionTest(t)
	a := require.New(t)

	// Create a buffer (mimics a file) for the output
	var bufNewLogger bytes.Buffer

	nl := NewLogger()
	nl.SetOutput(&bufNewLogger)
	nl.SetJSONFormatter()
	nl.WithFields(Fields{"1": 4, "2": "testNew"}).Info("ABCDEFG")
	a.True(isJSON(bufNewLogger.String()))

}

// This test ensures that handler functions registered to Fatal Logging trigger
// when Fatal logs are emitted. We attach graceful service shutdown to Fatal logging,
// and we want to notice if changes to our logging dependencies change how these handlers are called
func TestFatalExitHandler(t *testing.T) {
	partitiontest.PartitionTest(t)

	nl := TestingLogWithoutFatalExit(t)

	// Make an exit handler that sets a flag to demonstrate it was called
	var flag atomic.Bool
	RegisterExitHandler(func() {
		flag.Store(true)
	})
	nl.Fatal("OH NO")

	// Check that the exit handler was called
	require.True(t, flag.Load())

}