github.com/sereiner/library@v0.0.0-20200518095232-1fa3e640cc5f/log/manager_test.go (about) 1 package log 2 3 import ( 4 "fmt" 5 "io/ioutil" 6 "os" 7 "strings" 8 "testing" 9 "time" 10 11 "github.com/sereiner/library/file" 12 ) 13 14 // TestLog 测试manager的Log方法可能遇到的情况 15 func TestLog(tx *testing.T) { 16 manager.isClose = true 17 t, err := time.Parse("2006/01/02 15:04:05", "2016/11/28 16:38:27") 18 if err != nil { 19 tx.Errorf("test fail, %+v", err) 20 } 21 manager.Log(&LogEvent{Level: "Info", Now: t, Name: "name1", Session: "12345678", Content: "content1", Output: "output1"}) 22 23 // 测试完成打开appender,否则影响其他测试 24 manager.isClose = false 25 26 // 写入一个类型不存在的日志,进入记录系统日志的方法 27 testCallBack = func(err error) { 28 tx.Logf("进入到回调函数:%v", err) 29 if !strings.EqualFold("不支持的日志类型:test", err.Error()) { 30 tx.Errorf("test fail:%v", err) 31 } 32 } 33 manager.Log(&LogEvent{Level: "test", Now: t, Name: "name1", Session: "12345678", Content: "content1", Output: "output1"}) 34 testCallBack = nil 35 } 36 37 // testclearUp 单独测试clearUp中的关键代码 38 func (a *loggerManager) testclearUp() { 39 count := a.appenders.RemoveIterCb(func(key string, v interface{}) bool { 40 apd := v.(*appenderEntity) 41 if time.Now().Sub(apd.last).Seconds() > 5 { 42 apd.appender.Close() 43 return true 44 } 45 return false 46 }) 47 if count > 0 { 48 sysLoggerInfo("已移除:", count) 49 } 50 } 51 52 // TestClearUp 测试testclearUp代码,就是manager中的clearUp, 只是时间减少了 53 func TestClearUp(tx *testing.T) { 54 // 保证至少有一个appender 55 t, err := time.Parse("2006/01/02 15:04:05", "2016/11/28 16:38:27") 56 if err != nil { 57 tx.Errorf("test fail, %+v", err) 58 } 59 manager.Log(&LogEvent{Level: "Info", Now: t, Name: "name1", Session: "12345678", Content: "content1", Output: "output1"}) 60 count := len(manager.appenders.Keys()) 61 62 // 休眠6秒 63 time.Sleep(time.Second * 6) 64 65 // 调用方法,判断是否被清理 66 manager.testclearUp() 67 if len(manager.appenders.Keys()) != 0 { 68 tx.Errorf("test fail before count:%d, now:%d", count, len(manager.appenders.Keys())) 69 } 70 } 71 72 // TestManagerClose 测试manager的Close方法 73 func TestManagerClose(tx *testing.T) { 74 t, err := time.Parse("2006/01/02 15:04:05", "2016/11/28 16:38:27") 75 if err != nil { 76 tx.Errorf("test fail, %+v", err) 77 } 78 manager.Log(&LogEvent{Level: "Info", Now: t, Name: "name1", Session: "12345678", Content: "content1", Output: "output1"}) 79 if len(manager.appenders.Keys()) == 0 { 80 tx.Error("test fail") 81 } 82 83 manager.Close() 84 if len(manager.appenders.Keys()) != 0 { 85 tx.Errorf("test fail:manager appenders have:%d", len(manager.appenders.Keys())) 86 } 87 } 88 89 // TestLogToFile 测试通过Log方法写入到文件之后的顺序是否和预期的一致,使用map,可以使顺序不一致,最后读取文件进行校验 90 func TestLogToFile(tx *testing.T) { 91 // 写入日志到文件 92 manager, _ = newLoggerManager() 93 t, err := time.Parse("2006/01/02 15:04:05", "2016/11/28 16:38:27") 94 if err != nil { 95 tx.Errorf("test fail, %+v", err) 96 } 97 98 // 构建要测试的数据和预期数据 99 data := map[*LogEvent][]string{ 100 &LogEvent{Level: "Debug", Now: t, Name: "tofile", Session: "12345678", Content: "content1", Output: "output1"}: []string{"[d]", "content1"}, 101 &LogEvent{Level: "Debug", Now: t, Name: "tofile", Session: "12345678", Content: "content2", Output: "output2"}: []string{"[d]", "content2"}, 102 &LogEvent{Level: "Info", Now: t, Name: "tofile", Session: "12345678", Content: "content3", Output: "output3"}: []string{"[i]", "content3"}, 103 &LogEvent{Level: "Fatal", Now: t, Name: "tofile", Session: "12345678", Content: "content4", Output: "output4"}: []string{"[f]", "content4"}, 104 &LogEvent{Level: "Error", Now: t, Name: "tofile", Session: "12345678", Content: "content5", Output: "output5"}: []string{"[e]", "content5"}, 105 &LogEvent{Level: "Error", Now: t, Name: "tofile", Session: "12345678", Content: "content6", Output: "output6"}: []string{"[e]", "content6"}, 106 &LogEvent{Level: "Test", Now: t, Name: "tofile", Session: "12345678", Content: "content7", Output: "output6"}: []string{"[t]", "content7"}, 107 } 108 109 // 获取日志文件的绝对路径 110 filePath, _ := file.GetAbs("../logs/tofile/20161128.log") 111 112 // 删除文件,多次测试前面的测试会覆盖掉结果 113 os.Remove(filePath) 114 115 excepts := []string{} 116 for event, except := range data { 117 // 写内容到buffer 118 manager.Log(event) 119 // 添加预期的结果【测试的时候map顺序不确定】 120 excepts = append(excepts, fmt.Sprintf(`[2016/11/28 16:38:27]%s[12345678] %s`, except[0], except[1])) 121 } 122 time.Sleep(time.Second * 11) 123 124 // 读取文件中的类容 125 126 // 当前读取文件的行数 127 lineNow := 0 128 129 // 记录匹配的行数 130 actual := []int{} 131 132 // 循环预期结果 133 for _, except := range excepts { 134 fileData, err := ioutil.ReadFile(filePath) 135 if err != nil { 136 tx.Errorf("test fail : %v", err) 137 } 138 for line, lineData := range strings.Split(string(fileData), "\n") { 139 // 记录开始位置 140 if strings.Contains(lineData, "begin") && lineNow == 0 { 141 lineNow = line 142 } 143 144 // 有开始位置,开始匹配 145 if line > lineNow { 146 if strings.Contains(lineData, except) { 147 lineNow = line 148 actual = append(actual, line) 149 } 150 } 151 } 152 } 153 154 if len(actual) != len(excepts) { 155 tx.Errorf("test fail except: %d, actual: %d", len(excepts), len(actual)) 156 } 157 158 tx.Log(actual) 159 160 // 判断预期结果是否是连续的 161 for i := 0; i < len(actual); i++ { 162 if i != 0 { 163 if actual[i-1]+1 != actual[i] { 164 tx.Errorf("test fail, %+v", actual) 165 return 166 } 167 } 168 } 169 }