Skip to content

Commit

Permalink
调整测试覆盖率为100%
Browse files Browse the repository at this point in the history
  • Loading branch information
steden committed Mar 3, 2023
1 parent 34e6024 commit d4b94ff
Show file tree
Hide file tree
Showing 11 changed files with 133 additions and 43 deletions.
6 changes: 3 additions & 3 deletions container/container.go
Original file line number Diff line number Diff line change
Expand Up @@ -123,9 +123,9 @@ func (r *container) resolve(interfaceType reflect.Type, name string) any {

// 获取所有对象
func (r *container) resolveAll(interfaceType reflect.Type) []any {
if interfaceType.Kind() == reflect.Pointer {
interfaceType = interfaceType.Elem()
}
//if interfaceType.Kind() == reflect.Pointer {
// interfaceType = interfaceType.Elem()
//}
if interfaceType.Kind() != reflect.Interface {
_ = flog.Errorf("container:When resolve all objects,%s must is Interface type", interfaceType.String())
return nil
Expand Down
6 changes: 4 additions & 2 deletions flog/print.go
Original file line number Diff line number Diff line change
Expand Up @@ -162,11 +162,13 @@ func ComponentInfof(appName string, format string, a ...any) {

func fileWithLineNum() string {
// the second caller usually from internal, so set i start from 1
var fileLineNum string
for i := 2; i < 15; i++ {
_, file, line, ok := runtime.Caller(i)
if ok && (!strings.HasSuffix(file, "_test.go")) { // !strings.HasPrefix(file, gormSourceDir) ||
return file + ":" + strconv.FormatInt(int64(line), 10)
fileLineNum = file + ":" + strconv.FormatInt(int64(line), 10)
break
}
}
return ""
return fileLineNum
}
6 changes: 4 additions & 2 deletions initialize.go
Original file line number Diff line number Diff line change
Expand Up @@ -96,10 +96,12 @@ func Initialize[TModule modules.FarseerModule](appName string) {
isSuccess = false
}
}
flog.Println("---------------------------------------")

if !isSuccess {
os.Exit(-1)
//os.Exit(-1)
panic("健康检查失败")
}
flog.Println("---------------------------------------")
}
// 加载callbackFnList,启动后才执行的模块
if len(callbackFnList) > 0 {
Expand Down
3 changes: 2 additions & 1 deletion modules/farseerKernelModule.go
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,7 @@ import (
"github.com/farseer-go/fs/container"
"github.com/farseer-go/fs/flog"
"github.com/farseer-go/fs/timingWheel"
"time"
)

type FarseerKernelModule struct {
Expand All @@ -16,7 +17,7 @@ func (module FarseerKernelModule) DependsModule() []FarseerModule {
func (module FarseerKernelModule) PreInitialize() {
container.InitContainer()
flog.Init()
timingWheel.Init()
timingWheel.NewDefault(100*time.Millisecond, 60)
}

func (module FarseerKernelModule) Initialize() {
Expand Down
2 changes: 2 additions & 0 deletions test/container_single_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -12,6 +12,8 @@ func TestSingle(t *testing.T) {

assert.Equal(t, 0, len(container.ResolveAll[IDatabase]()))

assert.Nil(t, container.ResolveAll[mysql]())

// 注册单例
container.Register(func() IDatabase { return &mysql{} })

Expand Down
1 change: 0 additions & 1 deletion test/farseer.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -22,7 +22,6 @@ ElasticSearch:
WebApi:
Url: ":888"
Log:
LogLevel: "debug"
Component:
httpInvoke: true
task: true
Expand Down
29 changes: 29 additions & 0 deletions test/flog_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,7 @@ package test

import (
"github.com/farseer-go/fs/configure"
"github.com/farseer-go/fs/core/eumLogLevel"
"github.com/farseer-go/fs/flog"
"github.com/stretchr/testify/assert"
"testing"
Expand All @@ -27,11 +28,39 @@ func TestFlog(t *testing.T) {
flog.ComponentInfo("task", "")
flog.ComponentInfof("task", "")

flog.Red("")
flog.Blue("")
flog.Green("")
flog.Yellow("")
assert.Panics(t, func() {
flog.Panic("test error")
})

assert.Panics(t, func() {
flog.Panicf("test error:%s", "content")
})

configure.SetDefault("Log.LogLevel", "Trace")
flog.Init()
flog.Log(0, "aaa")

configure.SetDefault("Log.LogLevel", "debug")
flog.Init()
flog.Log(eumLogLevel.Trace, "aaa")

configure.SetDefault("Log.LogLevel", "Information")
flog.Init()
flog.Log(eumLogLevel.Debug, "aaa")

configure.SetDefault("Log.LogLevel", "Warning")
flog.Init()
flog.Log(eumLogLevel.Information, "aaa")

configure.SetDefault("Log.LogLevel", "Error")
flog.Init()
flog.Log(eumLogLevel.Warning, "aaa")

configure.SetDefault("Log.LogLevel", "Critical")
flog.Init()
flog.Log(eumLogLevel.Error, "aaa")
}
50 changes: 50 additions & 0 deletions test/healthCheck_test.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,50 @@
package test

import (
"fmt"
"github.com/farseer-go/fs"
"github.com/farseer-go/fs/container"
"github.com/farseer-go/fs/core"
"github.com/farseer-go/fs/modules"
"github.com/stretchr/testify/assert"
"testing"
)

type healthCheck1 struct {
name string
}

func (c *healthCheck1) Check() (string, error) {
return "healthCheck1", nil
}

type healthCheck2 struct {
name string
}

func (c *healthCheck2) Check() (string, error) {
return "healthCheck2", fmt.Errorf("test error")
}

type healthCheck1Module struct{}

func (t healthCheck1Module) DependsModule() []modules.FarseerModule {
return nil
}
func (t healthCheck1Module) PreInitialize() {}
func (t healthCheck1Module) Initialize() {}
func (t healthCheck1Module) PostInitialize() {
container.Register(func() core.IHealthCheck {
return &healthCheck1{}
}, "healthCheck1")
container.Register(func() core.IHealthCheck {
return &healthCheck2{}
}, "healthCheck2")
}
func (t healthCheck1Module) Shutdown() {}

func TestHealthCheck(t *testing.T) {
assert.Panics(t, func() {
fs.Initialize[healthCheck1Module]("unit test")
})
}
33 changes: 18 additions & 15 deletions test/timingWheel_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -11,32 +11,35 @@ import (

func TestTimingWheel(t *testing.T) {
fs.Initialize[modules.FarseerKernelModule]("unit test")
tw := timingWheel.New(10*time.Millisecond, 12)
/*
0: 10 * 12 = 120 ms 0.12s
1: 10 * 12 * 12 = 1440 ms 1.44s
2: 10 * 12 * 12 * 12 * 17280 ms 17.28
3: 10 * 12 * 12 * 12 * 12 * 207360 ms 207.36
0: 100 * 60 = 6000 ms 0.12s
1: 100 * 60 * 60 = 1440 ms 1.44s
2: 100 * 60 * 60 * 60 * 17280 ms 17.28
3: 100 * 60 * 60 * 60 * 60 * 207360 ms 207.36
第0层: 10 20 30 40 50 60 70 80 90 100 110 120
第1层: 120 240 360 480 600 720 840 960 1080 1200 1320 1440
0秒 123:第1层,第2格,3
78秒 123:第1层,第2格,3
201秒
*/
tw.Start()
timingWheel.NewDefault(10*time.Millisecond, 12)
timingWheel.Start()
<-timingWheel.AddPrecision(-1 * time.Millisecond).C
<-timingWheel.AddPrecision(1 * time.Millisecond).C
time.Sleep(131 * time.Millisecond)
timer4 := tw.AddPrecision(123 * time.Millisecond)
timer5 := tw.AddPrecision(1003 * time.Millisecond)
timer6 := tw.AddPrecision(1443 * time.Millisecond)
tw.AddPrecision(-35 * time.Millisecond).Stop()
tw.Add(102 * time.Millisecond)
tw.AddTime(time.Now().Add(1304 * time.Millisecond))
timer1 := tw.AddPrecision(12 * time.Millisecond)
timingWheel.AddPrecision(123 * time.Millisecond)
timer4 := timingWheel.AddPrecision(122 * time.Millisecond)
timer5 := timingWheel.AddPrecision(1003 * time.Millisecond)
timer6 := timingWheel.AddPrecision(1443 * time.Millisecond)
timingWheel.AddPrecision(-35 * time.Millisecond).Stop()
timingWheel.Add(102 * time.Millisecond)
timingWheel.AddTime(time.Now().Add(1304 * time.Millisecond))
timer1 := timingWheel.AddPrecision(12 * time.Millisecond)
assert.WithinDuration(t, timer1.PlanAt, <-timer1.C, time.Millisecond)

timer2 := tw.AddPrecision(1102 * time.Millisecond)
timer3 := tw.AddTimePrecision(time.Now().Add(1203 * time.Millisecond))
timer2 := timingWheel.AddPrecision(1102 * time.Millisecond)
timer3 := timingWheel.AddTimePrecision(time.Now().Add(1203 * time.Millisecond))
assert.WithinDuration(t, timer2.PlanAt, <-timer2.C, time.Millisecond)
assert.WithinDuration(t, timer3.PlanAt, <-timer3.C, time.Millisecond)
assert.WithinDuration(t, timer4.PlanAt, <-timer4.C, time.Millisecond)
Expand Down
4 changes: 2 additions & 2 deletions timingWheel/defaultTimingWheel.go
Original file line number Diff line number Diff line change
Expand Up @@ -7,8 +7,8 @@ import (
// defaultTimingWheel 在farseer.yaml配置时间轮大小、格数
var defaultTimingWheel *timingWheel

func Init() {
defaultTimingWheel = New(100*time.Millisecond, 60)
func NewDefault(interval time.Duration, bucketsNum int) {
defaultTimingWheel = New(interval, bucketsNum)
}

// Start 开始运行
Expand Down
36 changes: 19 additions & 17 deletions timingWheel/timingWheel.go
Original file line number Diff line number Diff line change
Expand Up @@ -54,7 +54,7 @@ func New(interval time.Duration, bucketsNum int) *timingWheel {
clockLock: &sync.RWMutex{},
timeHandTimer: []map[timeHand][]*Timer{make(map[timeHand][]*Timer)},
timerQueue: make(chan *Timer, 1000),
clock: []timeHand{0, 0, 0, 0, 0, 0, 0, 0, 0, 0},
clock: []timeHand{0},
}
}

Expand Down Expand Up @@ -89,13 +89,16 @@ func (receiver *timingWheel) Add(d time.Duration, opts ...OpOption) *Timer {
// 计算第几层第几格、剩余时长
level, curLevelTimeHand, remainingDuration := receiver.rewind(d)
receiver.clockLock.RLock()
defer receiver.clockLock.RUnlock()
curLevelTimeHand += receiver.clock[level]
receiver.clockLock.RUnlock()

// 超出了桶,则跳到下一级
for curLevelTimeHand >= receiver.bucketsNum {
remainingDuration += time.Duration(curLevelTimeHand-receiver.bucketsNum) * receiver.duration[level]
level++
if level >= len(receiver.clock) {
receiver.clock = append(receiver.clock, 0)
}
curLevelTimeHand = receiver.clock[level] + 1
}

Expand All @@ -108,7 +111,6 @@ func (receiver *timingWheel) Add(d time.Duration, opts ...OpOption) *Timer {
}

// 在同一格,说明需要立即执行
receiver.clockLock.RLock()
if level == 0 && curLevelTimeHand == receiver.clock[0] {
go receiver.popTimer(t)
return t
Expand All @@ -118,7 +120,6 @@ func (receiver *timingWheel) Add(d time.Duration, opts ...OpOption) *Timer {
for i := len(receiver.clock) - 1; i >= 0; i-- {
builder.WriteString(strconv.Itoa(receiver.clock[i]) + ".")
}
receiver.clockLock.RUnlock()
flog.Debugf("添加时间(%d):+%s %s 第%d层 第%d格 剩余%s,当前指针:%s", t.Id, t.duration.String(), t.PlanAt.Format("15:04:05.000"), level, curLevelTimeHand, t.remainingDuration.String(), builder.String())

// 初始化所在层的任务队列
Expand Down Expand Up @@ -155,27 +156,28 @@ func (receiver *timingWheel) AddTimePrecision(t time.Time) *Timer {
func (receiver *timingWheel) turning() {
//flog.Debugf("当前指针,%d.%d.%d", receiver.clock[2], receiver.clock[1], receiver.clock[0])
for {
go func(tHand timeHand) {
receiver.timerLock.Lock()
// 取出当前格子的任务
timers := receiver.timeHandTimer[0][tHand]
if len(timers) > 0 {
// 需要提前删除,否则会与降级任务冲突
delete(receiver.timeHandTimer[0], tHand)
}
receiver.timerLock.Unlock()
tHand := receiver.clock[0]
receiver.timerLock.Lock()
// 取出当前格子的任务
timers := receiver.timeHandTimer[0][tHand]
if len(timers) > 0 {
// 需要提前删除,否则会与降级任务冲突
delete(receiver.timeHandTimer[0], tHand)
}
receiver.timerLock.Unlock()

if len(timers) > 1 {
receiver.order(timers)
}
if len(timers) > 1 {
receiver.order(timers)
}

go func(timers []*Timer) {
for i := 0; i < len(timers); i++ {
if !timers[i].isStop {
flog.Debugf("休眠时间(%d):+%s %d us", timers[i].Id, timers[i].PlanAt.Format("15:04:05.000"), timers[i].PlanAt.Sub(time.Now()).Microseconds())
receiver.popTimer(timers[i])
}
}
}(receiver.clock[0])
}(timers)

// 每timingWheel.duration 转动一次
<-receiver.ticker.C
Expand Down

0 comments on commit d4b94ff

Please sign in to comment.