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  }