2 * Copyright (c) 2019 AT&T Intellectual Property.
3 * Copyright (c) 2018-2019 Nokia.
5 * Licensed under the Apache License, Version 2.0 (the "License");
6 * you may not use this file except in compliance with the License.
7 * You may obtain a copy of the License at
9 * http://www.apache.org/licenses/LICENSE-2.0
11 * Unless required by applicable law or agreed to in writing, software
12 * distributed under the License is distributed on an "AS IS" BASIS,
13 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14 * See the License for the specific language governing permissions and
15 * limitations under the License.
17 * This source code is part of the near-RT RIC (RAN Intelligent Controller)
18 * platform project (RICP).
30 "github.com/stretchr/testify/assert"
33 // getTestLogger returns a logger instance where
34 // the output is directed to a byte buffer instead
36 func getTestLogger(t *testing.T) (*MdcLogger, *bytes.Buffer) {
37 logbuffer := new(bytes.Buffer)
38 logger, err := initLogger("foo", logbuffer)
40 return logger, logbuffer
43 func TestLogInitDoesNotReturnAnError(t *testing.T) {
44 _, err := InitLogger("foo")
45 assert.Nil(t, err, "create failed")
48 func TestDebugFunctionLogsCorrectString(t *testing.T) {
49 logger, logbuffer := getTestLogger(t)
50 logger.Debug("test debug")
51 logstr := logbuffer.String()
52 assert.Contains(t, logstr, "crit\":\"DEBUG\",\"id\":\"foo\",\"mdc\":{},\"msg\":\"test debug\"}\n")
55 func TestInfoFunctionLogsCorrectString(t *testing.T) {
56 logger, logbuffer := getTestLogger(t)
57 logger.Info("test info")
58 logstr := logbuffer.String()
59 assert.Contains(t, logstr, "crit\":\"INFO\",\"id\":\"foo\",\"mdc\":{},\"msg\":\"test info\"}\n")
62 func TestWarningLogsCorrectString(t *testing.T) {
63 logger, logbuffer := getTestLogger(t)
64 logger.Warning("test warn")
65 logstr := logbuffer.String()
66 assert.Contains(t, logstr, "crit\":\"WARNING\",\"id\":\"foo\",\"mdc\":{},\"msg\":\"test warn\"}\n")
69 func TestErrorFunctionLogsCorrectString(t *testing.T) {
70 logger, logbuffer := getTestLogger(t)
71 logger.Error("test err")
72 logstr := logbuffer.String()
73 assert.Contains(t, logstr, "crit\":\"ERROR\",\"id\":\"foo\",\"mdc\":{},\"msg\":\"test err\"}\n")
76 func TestLogFunctionLogsCorrectString(t *testing.T) {
77 logger, logbuffer := getTestLogger(t)
78 logger.Log(ERR, "test err")
79 logstr := logbuffer.String()
80 assert.Contains(t, logstr, "crit\":\"ERROR\",\"id\":\"foo\",\"mdc\":{},\"msg\":\"test err\"}\n")
83 func TestFormatWithMdcReturnsJsonFormatedString(t *testing.T) {
84 logger, _ := InitLogger("foo")
85 logger.MdcAdd("foo", "bar")
86 logstr, err := logger.formatLog(INFO, "test2")
87 assert.Nil(t, err, "formatLog fails")
88 v := make(map[string]interface{})
89 err = json.Unmarshal(logstr, &v)
90 assert.Equal(t, "INFO", v["crit"])
91 assert.Equal(t, "test2", v["msg"])
92 assert.Equal(t, "foo", v["id"])
93 expectedmdc := map[string]interface{}{"foo": "bar"}
94 assert.Equal(t, expectedmdc, v["mdc"])
97 func TestMdcAddIsOk(t *testing.T) {
98 logger, _ := InitLogger("foo")
99 logger.MdcAdd("foo", "bar")
100 val, ok := logger.MdcGet("foo")
102 assert.Equal(t, "bar", val)
105 func TestMdcRemoveWorks(t *testing.T) {
106 logger, _ := InitLogger("foo")
107 logger.MdcAdd("foo", "bar")
108 val, ok := logger.MdcGet("foo")
110 assert.Equal(t, "bar", val)
111 logger.MdcRemove("foo")
112 val, ok = logger.MdcGet("foo")
117 func TestRemoveNonExistentMdcDoesNotCrash(t *testing.T) {
118 logger, _ := InitLogger("foo")
119 logger.MdcRemove("foo")
122 func TestMdcCleanRemovesAllMdcs(t *testing.T) {
123 logger, _ := InitLogger("foo")
124 logger.MdcAdd("foo1", "bar")
125 logger.MdcAdd("foo2", "bar")
126 logger.MdcAdd("foo3", "bar")
128 _, ok := logger.MdcGet("foo1")
130 _, ok = logger.MdcGet("foo2")
132 _, ok = logger.MdcGet("foo3")
136 func TestLevelStringsGetterWorks(t *testing.T) {
137 assert.Equal(t, "ERROR", levelString(ERR))
138 assert.Equal(t, "WARNING", levelString(WARN))
139 assert.Equal(t, "INFO", levelString(INFO))
140 assert.Equal(t, "DEBUG", levelString(DEBUG))
143 func TestDefaultLoggingLevelIsDebug(t *testing.T) {
144 logger, _ := InitLogger("foo")
145 assert.Equal(t, DEBUG, logger.LevelGet())
148 func TestLevelGetReturnsWhatWasSet(t *testing.T) {
149 logger, _ := InitLogger("foo")
151 assert.Equal(t, ERR, logger.LevelGet())
154 func TestDebugLogIsNotWrittenIfCurrentLevelIsInfo(t *testing.T) {
155 logger, logbuffer := getTestLogger(t)
156 logger.LevelSet(INFO)
158 assert.Empty(t, logbuffer.String())
161 func TestLogFormatWithMdcArray(t *testing.T) {
162 logger, _ := InitLogger("app")
164 logger.Mdclog_format_initialize(logFileMonitor)
165 logstr, err := logger.formatLog(INFO, "test")
166 assert.Nil(t, err, "formatLog fails")
167 v := make(map[string]interface{})
168 err = json.Unmarshal(logstr, &v)
169 assert.Equal(t, "INFO", v["crit"])
170 assert.Equal(t, "test", v["msg"])
171 assert.Equal(t, "app", v["id"])
172 _, ok := logger.MdcGet("SYSTEM_NAME")
174 _, ok = logger.MdcGet("HOST_NAME")
176 _, ok = logger.MdcGet("SERVICE_NAME")
178 _, ok = logger.MdcGet("CONTAINER_NAME")
180 _, ok = logger.MdcGet("POD_NAME")
184 func TestLogLevelConfigFileParse(t *testing.T) {
185 logger, _ := InitLogger("app")
186 d1 := []byte("log-level:WARN\n\n")
187 err := ioutil.WriteFile("/tmp/log-file", d1, 0644)
188 assert.Nil(t, err, "Failed to create tmp log-file")
189 os.Setenv("CONFIG_MAP_NAME", "/tmp/log-file")
191 logger.Mdclog_format_initialize(logFileMonitor)
192 assert.Equal(t, WARN, logger.LevelGet())
193 _, ok := logger.MdcGet("PID")
195 logger.Mdclog_format_initialize(logFileMonitor)