Create & Init Project...

This commit is contained in:
2019-04-22 18:49:16 +08:00
commit fc4fa37393
25440 changed files with 4054998 additions and 0 deletions

View File

@@ -0,0 +1,65 @@
package(default_visibility = ["//visibility:public"])
load(
"@io_bazel_rules_go//go:def.bzl",
"go_library",
"go_test",
)
go_library(
name = "go_default_library",
srcs = [
"cache.go",
"dao.cache.go",
"dao.go",
"hbase.go",
"hbase_scan.go",
"mc.cache.go",
],
importpath = "go-common/app/interface/main/activity/dao/timemachine",
tags = ["automanaged"],
visibility = ["//visibility:public"],
deps = [
"//app/interface/main/activity/conf:go_default_library",
"//app/interface/main/activity/model/timemachine:go_default_library",
"//library/cache/memcache:go_default_library",
"//library/database/hbase.v2:go_default_library",
"//library/log:go_default_library",
"//library/stat/prom:go_default_library",
"//library/sync/pipeline/fanout:go_default_library",
"//vendor/github.com/tsuna/gohbase/hrpc:go_default_library",
],
)
filegroup(
name = "package-srcs",
srcs = glob(["**"]),
tags = ["automanaged"],
visibility = ["//visibility:private"],
)
filegroup(
name = "all-srcs",
srcs = [":package-srcs"],
tags = ["automanaged"],
visibility = ["//visibility:public"],
)
go_test(
name = "go_default_test",
srcs = [
"cache_test.go",
"dao.cache_test.go",
"dao_test.go",
"hbase_test.go",
"mc.cache_test.go",
],
embed = [":go_default_library"],
tags = ["automanaged"],
deps = [
"//app/interface/main/activity/conf:go_default_library",
"//app/interface/main/activity/model/timemachine:go_default_library",
"//vendor/github.com/smartystreets/goconvey/convey:go_default_library",
"//vendor/github.com/tsuna/gohbase/hrpc:go_default_library",
],
)

View File

@@ -0,0 +1,26 @@
package timemachine
import (
"context"
"fmt"
"go-common/app/interface/main/activity/model/timemachine"
)
func timemachineKey(mid int64) string {
return fmt.Sprintf("tm_%d", mid)
}
//go:generate $GOPATH/src/go-common/app/tool/cache/gen
type _cache interface {
// cache
Timemachine(c context.Context, mid int64) (*timemachine.Item, error)
}
//go:generate $GOPATH/src/go-common/app/tool/cache/mc
type _mc interface {
// mc: -key=timemachineKey -expire=d.mcTmExpire -encode=pb
AddCacheTimemachine(c context.Context, mid int64, data *timemachine.Item) error
// mc: -key=timemachineKey
CacheTimemachine(c context.Context, mid int64) (*timemachine.Item, error)
}

View File

@@ -0,0 +1,21 @@
package timemachine
import (
"testing"
"github.com/smartystreets/goconvey/convey"
)
func TestTimemachinetimemachineKey(t *testing.T) {
convey.Convey("timemachineKey", t, func(ctx convey.C) {
var (
mid = int64(0)
)
ctx.Convey("When everything gose positive", func(ctx convey.C) {
p1 := timemachineKey(mid)
ctx.Convey("Then p1 should not be nil.", func(ctx convey.C) {
ctx.So(p1, convey.ShouldNotBeNil)
})
})
})
}

View File

@@ -0,0 +1,48 @@
// Code generated by $GOPATH/src/go-common/app/tool/cache/gen. DO NOT EDIT.
/*
Package timemachine is a generated cache proxy package.
It is generated from:
type _cache interface {
// cache
Timemachine(c context.Context, mid int64) (*timemachine.Item, error)
}
*/
package timemachine
import (
"context"
"go-common/app/interface/main/activity/model/timemachine"
"go-common/library/stat/prom"
)
var _ _cache
// Timemachine get data from cache if miss will call source method, then add to cache.
func (d *Dao) Timemachine(c context.Context, id int64) (res *timemachine.Item, err error) {
addCache := true
res, err = d.CacheTimemachine(c, id)
if err != nil {
addCache = false
err = nil
}
if res != nil {
prom.CacheHit.Incr("Timemachine")
return
}
prom.CacheMiss.Incr("Timemachine")
res, err = d.RawTimemachine(c, id)
if err != nil {
return
}
miss := res
if !addCache {
return
}
d.cache.Do(c, func(c context.Context) {
d.AddCacheTimemachine(c, id, miss)
})
return
}

View File

@@ -0,0 +1,24 @@
package timemachine
import (
"context"
"testing"
"github.com/smartystreets/goconvey/convey"
)
func TestTimemachineTimemachine(t *testing.T) {
convey.Convey("Timemachine", t, func(ctx convey.C) {
var (
c = context.Background()
id = int64(0)
)
ctx.Convey("When everything gose positive", func(ctx convey.C) {
res, err := d.Timemachine(c, id)
ctx.Convey("Then err should be nil.res should not be nil.", func(ctx convey.C) {
ctx.So(err, convey.ShouldNotBeNil)
ctx.Printf("%v", res)
})
})
})
}

View File

@@ -0,0 +1,76 @@
package timemachine
import (
"time"
"go-common/app/interface/main/activity/conf"
"go-common/library/cache/memcache"
"go-common/library/sync/pipeline/fanout"
"go-common/library/database/hbase.v2"
)
// Dao .
type Dao struct {
c *conf.Config
hbase *hbase.Client
mc *memcache.Pool
cache *fanout.Fanout
//limiter *rate.Limiter
mcTmExpire int32
//tmProcStart int64
//tmProcStop int64
}
// New .
func New(c *conf.Config) (d *Dao) {
d = &Dao{
c: c,
hbase: hbase.NewClient(c.Hbase),
mc: memcache.NewPool(c.TimeMc.Timemachine),
cache: fanout.New("timemachine", fanout.Worker(8), fanout.Buffer(10240)),
}
d.mcTmExpire = int32(time.Duration(c.TimeMc.TmExpire) / time.Second)
//d.limiter = rate.NewLimiter(1000, 100)
//go d.startTmproc(context.Background())
return d
}
// StartTmproc start time machine proc
//func (d *Dao) startTmproc(c context.Context) {
// if env.DeployEnv != env.DeployEnvPre {
// return
// }
// for {
// time.Sleep(time.Second)
// if d.tmProcStart != 0 {
// go func() {
// // scan key
// max := 10000000000
// step := max / 10000
// prefix := step - 1
// for i := 0; i < max; i += step {
// time.Sleep(10 * time.Millisecond)
// startRow := fmt.Sprintf("%0*d", 10, i)
// endRow := fmt.Sprintf("%0*d", 10, i+prefix)
// if err := d.timemachineScan(c, startRow, endRow); err != nil {
// log.Error("startTmproc timemachineScan startRow(%s) endRow(%s) error(%v)", startRow, endRow, err)
// continue
// }
// log.Info("startTmproc finish startRow(%s) endRow(%s)", startRow, endRow)
// }
// }()
// break
// }
// }
//}
// StartTmProc start time machine proc.
//func (d *Dao) StartTmProc(c context.Context) {
// atomic.StoreInt64(&d.tmProcStart, 1)
//}
// StopTmproc stop time machine proc.
//func (d *Dao) StopTmproc(c context.Context) {
// atomic.StoreInt64(&d.tmProcStop, 1)
//}

View File

@@ -0,0 +1,35 @@
package timemachine
import (
"flag"
"os"
"testing"
"go-common/app/interface/main/activity/conf"
)
var (
d *Dao
)
func TestMain(m *testing.M) {
if os.Getenv("DEPLOY_ENV") != "" {
flag.Set("app_id", "main.web-svr.activity")
flag.Set("conf_token", "22edc93e2998bf0cb0bbee661b03d41f")
flag.Set("tree_id", "2873")
flag.Set("conf_version", "docker-1")
flag.Set("deploy_env", "uat")
flag.Set("conf_host", "config.bilibili.co")
flag.Set("conf_path", "/tmp")
flag.Set("region", "sh")
flag.Set("zone", "sh001")
} else {
flag.Set("conf", "../../cmd/activity-test.toml")
}
flag.Parse()
if err := conf.Init(); err != nil {
panic(err)
}
d = New(conf.Conf)
os.Exit(m.Run())
}

View File

@@ -0,0 +1,154 @@
package timemachine
import (
"bytes"
"context"
"strconv"
"time"
"go-common/app/interface/main/activity/model/timemachine"
"go-common/library/log"
"github.com/tsuna/gohbase/hrpc"
)
const (
_hBaseUpItemTableName = "dw:mid_main_profile_y"
)
// reverse for string.
func hbaseRowKey(mid int64) string {
s := strconv.FormatInt(mid, 10)
rs := []rune(s)
l := len(rs)
for f, t := 0, l-1; f < t; f, t = f+1, t-1 {
rs[f], rs[t] = rs[t], rs[f]
}
ns := string(rs)
if l < 10 {
for i := 0; i < 10-l; i++ {
ns = ns + "0"
}
}
return ns
}
// RawTimemachine .
func (d *Dao) RawTimemachine(c context.Context, mid int64) (data *timemachine.Item, err error) {
var (
result *hrpc.Result
ctx, cancel = context.WithTimeout(c, time.Duration(d.c.Hbase.RegionReadTimeout))
key = hbaseRowKey(mid)
tableName = _hBaseUpItemTableName
)
defer cancel()
if result, err = d.hbase.GetStr(ctx, tableName, key); err != nil {
log.Error("UserItem d.hbase.GetStr tableName(%s)|mid(%d)|key(%v)|error(%v)", tableName, mid, key, err)
return
}
if result == nil {
return
}
data = &timemachine.Item{Mid: mid}
for _, c := range result.Cells {
if c == nil {
continue
}
if !bytes.Equal(c.Family, []byte("m")) {
continue
}
tmFillFields(data, c)
}
return
}
func tmFillFields(data *timemachine.Item, c *hrpc.Cell) {
var (
intVal int64
strVal string
)
strVal = string(c.Value[:])
if v, e := strconv.ParseInt(string(c.Value[:]), 10, 64); e == nil {
intVal = v
}
switch {
case bytes.Equal(c.Qualifier, []byte("is_up")):
data.IsUp = intVal
case bytes.Equal(c.Qualifier, []byte("dh")):
data.DurationHour = intVal
case bytes.Equal(c.Qualifier, []byte("adh")):
data.AvDurationHour = intVal
case bytes.Equal(c.Qualifier, []byte("a_vv")):
data.ArchiveVv = intVal
case bytes.Equal(c.Qualifier, []byte("tag_id")):
data.LikeTagID = intVal
case bytes.Equal(c.Qualifier, []byte("ls_vv")):
data.LikeSubtidVv = intVal
case bytes.Equal(c.Qualifier, []byte("ugc_avs")):
data.LikesUgc3Avids = strVal
case bytes.Equal(c.Qualifier, []byte("pgc_avs")):
data.LikePgc3Avids = strVal
case bytes.Equal(c.Qualifier, []byte("up")):
data.LikeBestUpID = intVal
case bytes.Equal(c.Qualifier, []byte("up_ad")):
data.LikeUpAvDuration = intVal
case bytes.Equal(c.Qualifier, []byte("up_ld")):
data.LikeUpLiveDuration = intVal
case bytes.Equal(c.Qualifier, []byte("up_avs")):
data.LikeUp3Avs = strVal
case bytes.Equal(c.Qualifier, []byte("up_st")):
data.LikeLiveUpSubTname = strVal
case bytes.Equal(c.Qualifier, []byte("cir_tm")):
data.BrainwashCirTime = strVal
case bytes.Equal(c.Qualifier, []byte("cir_av")):
data.BrainwashCirAvid = intVal
case bytes.Equal(c.Qualifier, []byte("cir_v")):
data.BrainwashCirVv = intVal
case bytes.Equal(c.Qualifier, []byte("fs_av")):
data.FirstSubmitAvid = intVal
case bytes.Equal(c.Qualifier, []byte("fs_tm")):
data.FirstSubmitTime = strVal
case bytes.Equal(c.Qualifier, []byte("fs_ty")):
data.FirstSubmitType = intVal
case bytes.Equal(c.Qualifier, []byte("s_av_rd")):
data.SubmitAvsRds = strVal
case bytes.Equal(c.Qualifier, []byte("bt_av")):
data.BestAvid = intVal
case bytes.Equal(c.Qualifier, []byte("bt_ty")):
data.BestAvidType = intVal
case bytes.Equal(c.Qualifier, []byte("bt_av_o")):
data.BestAvidOld = intVal
case bytes.Equal(c.Qualifier, []byte("bt_av_ty")):
data.BestAvidOldType = intVal
case bytes.Equal(c.Qualifier, []byte("o_vv")):
data.OldAvVv = intVal
case bytes.Equal(c.Qualifier, []byte("all_vv")):
data.AllVv = intVal
case bytes.Equal(c.Qualifier, []byte("live_d")):
data.UpLiveDuration = intVal
case bytes.Equal(c.Qualifier, []byte("is_live")):
data.IsLiveUp = intVal
case bytes.Equal(c.Qualifier, []byte("ld")):
data.ValidLiveDays = intVal
case bytes.Equal(c.Qualifier, []byte("md")):
data.MaxCdnNumDate = strVal
case bytes.Equal(c.Qualifier, []byte("mc")):
data.MaxCdnNum = intVal
case bytes.Equal(c.Qualifier, []byte("att")):
data.Attentions = intVal
case bytes.Equal(c.Qualifier, []byte("fan_vv")):
data.UpBestFanVv = strVal
case bytes.Equal(c.Qualifier, []byte("fan_live")):
data.UpBestFanLiveMinute = strVal
case bytes.Equal(c.Qualifier, []byte("like_tid")):
data.Like2Tids = strVal
case bytes.Equal(c.Qualifier, []byte("like_st")):
data.Like2SubTids = strVal
case bytes.Equal(c.Qualifier, []byte("wr")):
data.WinRatio = strVal
case bytes.Equal(c.Qualifier, []byte("pd_hr")):
data.PlayDurationHourRep = intVal
case bytes.Equal(c.Qualifier, []byte("lu_adr")):
data.LikeUpAvDurationRep = intVal
}
}

View File

@@ -0,0 +1,60 @@
package timemachine
//import (
// "bytes"
// "context"
// "go-common/app/interface/main/activity/model/timemachine"
// "go-common/library/log"
// "io"
//
// "github.com/tsuna/gohbase/hrpc"
//)
//
//func (d *Dao) timemachineScan(c context.Context, startRow, endRow string) (err error) {
// var scanner hrpc.Scanner
// if scanner, err = d.hbase.ScanRangeStr(c, _hBaseUpItemTableName, startRow, endRow); err != nil {
// log.Error("TimemachineScan d.hbase.Scan(%s) error(%v)", _hBaseUpItemTableName, err)
// return
// }
// for {
// if d.tmProcStop != 0 {
// err = scanner.Close()
// return
// }
// if result, e := scanner.Next(); e != nil {
// if e == io.EOF {
// return
// }
// log.Error("TimemachineScan scanner.Next error(%v)", e)
// continue
// } else {
// if result == nil {
// continue
// }
// item := &timemachine.Item{}
// for _, c := range result.Cells {
// if c == nil {
// continue
// }
// if !bytes.Equal(c.Family, []byte("m")) {
// continue
// }
// tmFillFields(item, c)
// }
// if item.Mid > 0 {
// for {
// if e := d.cache.Do(c, func(ctx context.Context) {
// if e := d.AddCacheTimemachine(ctx, item.Mid, item); e != nil {
// log.Error("timemachineScand.AddCacheTimemachine(%d) error(%v)", item.Mid, e)
// }
// }); e != nil {
// log.Warn("timemachineScan d.AddCacheTimemachine channel full(%v)", e)
// d.limiter.Wait(context.Background())
// } else {
// break
// }
// }
// }
// }
// }
//}

View File

@@ -0,0 +1,131 @@
package timemachine
import (
"context"
"testing"
"go-common/app/interface/main/activity/model/timemachine"
"github.com/smartystreets/goconvey/convey"
"github.com/tsuna/gohbase/hrpc"
)
func TestTimemachinehbaseRowKey(t *testing.T) {
convey.Convey("hbaseRowKey", t, func(ctx convey.C) {
var (
mid = int64(121212)
)
ctx.Convey("When everything gose positive", func(ctx convey.C) {
p1 := hbaseRowKey(mid)
ctx.Convey("Then p1 should not be nil.", func(ctx convey.C) {
ctx.So(p1, convey.ShouldNotBeNil)
})
})
})
}
func TestTimemachineRawTimemachine(t *testing.T) {
convey.Convey("RawTimemachine", t, func(ctx convey.C) {
var (
c = context.Background()
mid = int64(0)
)
ctx.Convey("When everything gose positive", func(ctx convey.C) {
data, err := d.RawTimemachine(c, mid)
ctx.Convey("Then err should be nil.data should not be nil.", func(ctx convey.C) {
ctx.So(err, convey.ShouldNotBeNil)
ctx.Printf("%+v", data)
})
})
})
}
func TestTimemachinetmFillFields(t *testing.T) {
convey.Convey("tmFillFields", t, func(ctx convey.C) {
var (
data = &timemachine.Item{}
c = &hrpc.Cell{Qualifier: []byte("is_up"), Value: []byte("1")}
)
ctx.Convey("When everything gose positive", func(ctx convey.C) {
tmFillFields(data, c)
c = &hrpc.Cell{Qualifier: []byte("is_up"), Value: []byte("1")}
tmFillFields(data, c)
c = &hrpc.Cell{Qualifier: []byte("dh"), Value: []byte("1")}
tmFillFields(data, c)
c = &hrpc.Cell{Qualifier: []byte("adh"), Value: []byte("1")}
tmFillFields(data, c)
c = &hrpc.Cell{Qualifier: []byte("a_vv"), Value: []byte("1")}
tmFillFields(data, c)
c = &hrpc.Cell{Qualifier: []byte("tag_id"), Value: []byte("1")}
tmFillFields(data, c)
c = &hrpc.Cell{Qualifier: []byte("ls_vv"), Value: []byte("1")}
tmFillFields(data, c)
c = &hrpc.Cell{Qualifier: []byte("ugc_avs"), Value: []byte("1")}
tmFillFields(data, c)
c = &hrpc.Cell{Qualifier: []byte("pgc_avs"), Value: []byte("1")}
tmFillFields(data, c)
c = &hrpc.Cell{Qualifier: []byte("up"), Value: []byte("1")}
tmFillFields(data, c)
c = &hrpc.Cell{Qualifier: []byte("up_ad"), Value: []byte("1")}
tmFillFields(data, c)
c = &hrpc.Cell{Qualifier: []byte("up_ld"), Value: []byte("1")}
tmFillFields(data, c)
c = &hrpc.Cell{Qualifier: []byte("up_avs"), Value: []byte("1")}
tmFillFields(data, c)
c = &hrpc.Cell{Qualifier: []byte("up_st"), Value: []byte("1")}
tmFillFields(data, c)
c = &hrpc.Cell{Qualifier: []byte("cir_tm"), Value: []byte("1")}
tmFillFields(data, c)
c = &hrpc.Cell{Qualifier: []byte("cir_av"), Value: []byte("1")}
tmFillFields(data, c)
c = &hrpc.Cell{Qualifier: []byte("cir_v"), Value: []byte("1")}
tmFillFields(data, c)
c = &hrpc.Cell{Qualifier: []byte("fs_av"), Value: []byte("1")}
tmFillFields(data, c)
c = &hrpc.Cell{Qualifier: []byte("fs_tm"), Value: []byte("1")}
tmFillFields(data, c)
c = &hrpc.Cell{Qualifier: []byte("fs_ty"), Value: []byte("1")}
tmFillFields(data, c)
c = &hrpc.Cell{Qualifier: []byte("s_av_rd"), Value: []byte("1")}
tmFillFields(data, c)
c = &hrpc.Cell{Qualifier: []byte("bt_av"), Value: []byte("1")}
tmFillFields(data, c)
c = &hrpc.Cell{Qualifier: []byte("bt_ty"), Value: []byte("1")}
tmFillFields(data, c)
c = &hrpc.Cell{Qualifier: []byte("bt_av_o"), Value: []byte("1")}
tmFillFields(data, c)
c = &hrpc.Cell{Qualifier: []byte("bt_av_ty"), Value: []byte("1")}
tmFillFields(data, c)
c = &hrpc.Cell{Qualifier: []byte("o_vv"), Value: []byte("1")}
tmFillFields(data, c)
c = &hrpc.Cell{Qualifier: []byte("all_vv"), Value: []byte("1")}
tmFillFields(data, c)
c = &hrpc.Cell{Qualifier: []byte("live_d"), Value: []byte("1")}
tmFillFields(data, c)
c = &hrpc.Cell{Qualifier: []byte("is_live"), Value: []byte("1")}
tmFillFields(data, c)
c = &hrpc.Cell{Qualifier: []byte("ld"), Value: []byte("1")}
tmFillFields(data, c)
c = &hrpc.Cell{Qualifier: []byte("md"), Value: []byte("1")}
tmFillFields(data, c)
c = &hrpc.Cell{Qualifier: []byte("mc"), Value: []byte("1")}
tmFillFields(data, c)
c = &hrpc.Cell{Qualifier: []byte("att"), Value: []byte("1")}
tmFillFields(data, c)
c = &hrpc.Cell{Qualifier: []byte("fan_vv"), Value: []byte("1")}
tmFillFields(data, c)
c = &hrpc.Cell{Qualifier: []byte("fan_live"), Value: []byte("1")}
tmFillFields(data, c)
c = &hrpc.Cell{Qualifier: []byte("like_tid"), Value: []byte("1")}
tmFillFields(data, c)
c = &hrpc.Cell{Qualifier: []byte("like_st"), Value: []byte("1")}
tmFillFields(data, c)
c = &hrpc.Cell{Qualifier: []byte("wr"), Value: []byte("1")}
tmFillFields(data, c)
c = &hrpc.Cell{Qualifier: []byte("pd_hr"), Value: []byte("1")}
tmFillFields(data, c)
c = &hrpc.Cell{Qualifier: []byte("lu_adr"), Value: []byte("1")}
tmFillFields(data, c)
})
})
}

View File

@@ -0,0 +1,68 @@
// Code generated by $GOPATH/src/go-common/app/tool/cache/mc. DO NOT EDIT.
/*
Package timemachine is a generated mc cache package.
It is generated from:
type _mc interface {
// mc: -key=timemachineKey -expire=d.mcTmExpire -encode=pb
AddCacheTimemachine(c context.Context, mid int64, data *timemachine.Item) error
// mc: -key=timemachineKey
CacheTimemachine(c context.Context, mid int64) (*timemachine.Item, error)
}
*/
package timemachine
import (
"context"
"fmt"
"go-common/app/interface/main/activity/model/timemachine"
"go-common/library/cache/memcache"
"go-common/library/log"
"go-common/library/stat/prom"
)
var _ _mc
// AddCacheTimemachine Set data to mc
func (d *Dao) AddCacheTimemachine(c context.Context, id int64, val *timemachine.Item) (err error) {
if val == nil {
return
}
conn := d.mc.Get(c)
defer conn.Close()
key := timemachineKey(id)
item := &memcache.Item{Key: key, Object: val, Expiration: d.mcTmExpire, Flags: memcache.FlagProtobuf}
if err = conn.Set(item); err != nil {
prom.BusinessErrCount.Incr("mc:AddCacheTimemachine")
log.Errorv(c, log.KV("AddCacheTimemachine", fmt.Sprintf("%+v", err)), log.KV("key", key))
return
}
return
}
// CacheTimemachine get data from mc
func (d *Dao) CacheTimemachine(c context.Context, id int64) (res *timemachine.Item, err error) {
conn := d.mc.Get(c)
defer conn.Close()
key := timemachineKey(id)
reply, err := conn.Get(key)
if err != nil {
if err == memcache.ErrNotFound {
err = nil
return
}
prom.BusinessErrCount.Incr("mc:CacheTimemachine")
log.Errorv(c, log.KV("CacheTimemachine", fmt.Sprintf("%+v", err)), log.KV("key", key))
return
}
res = &timemachine.Item{}
err = conn.Scan(reply, res)
if err != nil {
prom.BusinessErrCount.Incr("mc:CacheTimemachine")
log.Errorv(c, log.KV("CacheTimemachine", fmt.Sprintf("%+v", err)), log.KV("key", key))
return
}
return
}

View File

@@ -0,0 +1,41 @@
package timemachine
import (
"context"
"go-common/app/interface/main/activity/model/timemachine"
"testing"
"github.com/smartystreets/goconvey/convey"
)
func TestTimemachineAddCacheTimemachine(t *testing.T) {
convey.Convey("AddCacheTimemachine", t, func(ctx convey.C) {
var (
c = context.Background()
id = int64(0)
val = &timemachine.Item{}
)
ctx.Convey("When everything gose positive", func(ctx convey.C) {
err := d.AddCacheTimemachine(c, id, val)
ctx.Convey("Then err should be nil.", func(ctx convey.C) {
ctx.So(err, convey.ShouldBeNil)
})
})
})
}
func TestTimemachineCacheTimemachine(t *testing.T) {
convey.Convey("CacheTimemachine", t, func(ctx convey.C) {
var (
c = context.Background()
id = int64(0)
)
ctx.Convey("When everything gose positive", func(ctx convey.C) {
res, err := d.CacheTimemachine(c, id)
ctx.Convey("Then err should be nil.res should not be nil.", func(ctx convey.C) {
ctx.So(err, convey.ShouldBeNil)
ctx.So(res, convey.ShouldNotBeNil)
})
})
})
}