Add coverage tests for engine

This commit is contained in:
arberkatellari
2023-03-10 11:04:02 -05:00
committed by Dan Christian Bogos
parent 95d2ebb2d6
commit b1d696fcd7
3 changed files with 419 additions and 18 deletions

View File

@@ -7732,3 +7732,404 @@ func TestDMRemoveRateProfileReplicate(t *testing.T) {
dm.RemoveRateProfile(context.Background(), rpp.Tenant, rpp.ID, false)
}
func TestDMRemoveActionProfileNilOldActErr(t *testing.T) {
Cache.Clear(nil)
cfg := config.NewDefaultCGRConfig()
data := NewInternalDB(nil, nil, cfg.DataDbCfg().Items)
cM := NewConnManager(cfg)
dm := NewDataManager(data, cfg.CacheCfg(), cM)
var Id string
var tnt string
err := dm.RemoveActionProfile(context.Background(), tnt, Id, false)
if err != utils.ErrNotFound {
t.Errorf("\nExpected error <%+v>, \nReceived error <%+v>", utils.ErrNotFound, err)
}
}
func TestDMRemoveActionProfileRmvItemFromFiltrIndexErr(t *testing.T) {
Cache.Clear(nil)
cfg := config.NewDefaultCGRConfig()
data := &DataDBMock{
GetActionProfileDrvF: func(ctx *context.Context, tenant, ID string) (*ActionProfile, error) { return &ActionProfile{}, nil },
RemoveActionProfileDrvF: func(ctx *context.Context, tenant, ID string) error { return nil },
}
cM := NewConnManager(cfg)
dm := NewDataManager(data, cfg.CacheCfg(), cM)
ap := &ActionProfile{
Tenant: "cgrates.org",
ID: "AP1",
FilterIDs: []string{"fltr1"},
Weights: utils.DynamicWeights{
{
Weight: 65,
},
},
Schedule: "* * * * *",
Targets: map[string]utils.StringSet{utils.MetaAccounts: {"1001": {}}},
Actions: []*APAction{{}},
}
err := dm.RemoveActionProfile(context.Background(), ap.Tenant, ap.ID, true)
if err != utils.ErrNotImplemented {
t.Errorf("\nExpected error <%+v>, \nReceived error <%+v>", utils.ErrNotImplemented, err)
}
}
func TestDMRemoveActionProfileRmvIndexFiltersItemErr(t *testing.T) {
Cache.Clear(nil)
ap := &ActionProfile{
Tenant: "cgrates.org",
ID: "AP1",
FilterIDs: []string{"fltr1"},
Weights: utils.DynamicWeights{
{
Weight: 65,
},
},
Schedule: "* * * * *",
Targets: map[string]utils.StringSet{utils.MetaAccounts: {"1001": {}}},
Actions: []*APAction{{}},
}
cfg := config.NewDefaultCGRConfig()
data := &DataDBMock{
GetActionProfileDrvF: func(ctx *context.Context, tenant, ID string) (*ActionProfile, error) { return ap, nil },
RemoveActionProfileDrvF: func(ctx *context.Context, tenant, ID string) error { return nil },
}
cM := NewConnManager(cfg)
dm := NewDataManager(data, cfg.CacheCfg(), cM)
err := dm.RemoveActionProfile(context.Background(), ap.Tenant, ap.ID, true)
if err != utils.ErrNotImplemented {
t.Errorf("\nExpected error <%+v>, \nReceived error <%+v>", utils.ErrNotImplemented, err)
}
}
func TestDMRemoveActionProfileReplicate(t *testing.T) {
cfgtmp := config.CgrConfig()
defer func() {
config.SetCgrConfig(cfgtmp)
}()
Cache.Clear(nil)
ap := &ActionProfile{
Tenant: "cgrates.org",
ID: "AP1",
FilterIDs: []string{"fltr1"},
Weights: utils.DynamicWeights{
{
Weight: 65,
},
},
Schedule: "* * * * *",
Targets: map[string]utils.StringSet{utils.MetaAccounts: {"1001": {}}},
Actions: []*APAction{{}},
}
cfg := config.NewDefaultCGRConfig()
cfg.DataDbCfg().Items[utils.MetaActionProfiles].Replicate = true
cfg.DataDbCfg().RplConns = []string{utils.ConcatenatedKey(utils.MetaInternal, utils.MetaReplicator)}
config.SetCgrConfig(cfg)
cc := make(chan birpc.ClientConnector, 1)
cc <- &ccMock{
calls: map[string]func(ctx *context.Context, args interface{}, reply interface{}) error{
utils.ReplicatorSv1RemoveActionProfile: func(ctx *context.Context, args, reply interface{}) error { return utils.ErrNotImplemented },
},
}
cM := NewConnManager(cfg)
cM.AddInternalConn(utils.ConcatenatedKey(utils.MetaInternal, utils.MetaReplicator), utils.ReplicatorSv1, cc)
data := &DataDBMock{
GetActionProfileDrvF: func(ctx *context.Context, tenant, ID string) (*ActionProfile, error) { return ap, nil },
RemoveActionProfileDrvF: func(ctx *context.Context, tenant, ID string) error { return nil },
}
dm := NewDataManager(data, cfg.CacheCfg(), cM)
// tests replicate
dm.RemoveActionProfile(context.Background(), ap.Tenant, ap.ID, false)
}
func TestDMSetAttributeProfileNoDMErr(t *testing.T) {
var dm *DataManager
err := dm.SetAttributeProfile(context.Background(), &AttributeProfile{}, false)
if err != utils.ErrNoDatabaseConn {
t.Errorf("\nExpected error <%+v>, \nReceived error <%+v>", utils.ErrNoDatabaseConn, err)
}
}
func TestDMSetAttributeProfileCheckFiltersErr(t *testing.T) {
cfg := config.NewDefaultCGRConfig()
data := NewInternalDB(nil, nil, cfg.DataDbCfg().Items)
cM := NewConnManager(cfg)
dm := NewDataManager(data, cfg.CacheCfg(), cM)
attrPrfl := &AttributeProfile{
Tenant: "cgrates.org",
ID: "ATTR_ID",
FilterIDs: []string{":::"},
Attributes: []*Attribute{
{
Path: utils.MetaReq + utils.NestingSep + "Account",
Value: config.NewRSRParsersMustCompile("1001", utils.InfieldSep),
},
},
Weights: make(utils.DynamicWeights, 1),
}
expErr := "broken reference to filter: <:::> for item with ID: cgrates.org:ATTR_ID"
if err := dm.SetAttributeProfile(context.Background(), attrPrfl, true); err == nil || err.Error() != expErr {
t.Errorf("Expected error <%v>, received error <%v>", expErr, err)
}
}
func TestDMSetAttributeProfileGetAttributeProfileErr(t *testing.T) {
cfg := config.NewDefaultCGRConfig()
data := &DataDBMock{
GetAttributeProfileDrvF: func(ctx *context.Context, str1, str2 string) (*AttributeProfile, error) {
return &AttributeProfile{}, utils.ErrNotImplemented
},
}
cM := NewConnManager(cfg)
dm := NewDataManager(data, cfg.CacheCfg(), cM)
attrPrfl := &AttributeProfile{
Tenant: "cgrates.org",
ID: "ATTR_ID",
FilterIDs: []string{"filtrId1"},
Attributes: []*Attribute{
{
Path: utils.MetaReq + utils.NestingSep + "Account",
Value: config.NewRSRParsersMustCompile("1001", utils.InfieldSep),
},
},
Weights: make(utils.DynamicWeights, 1),
}
if err := dm.SetAttributeProfile(context.Background(), attrPrfl, false); err == nil || err != utils.ErrNotImplemented {
t.Errorf("Expected error <%v>, received error <%v>", utils.ErrNotImplemented, err)
}
}
func TestDMSetAttributeProfileSetAttributeProfileDrvErr(t *testing.T) {
cfg := config.NewDefaultCGRConfig()
data := &DataDBMock{
GetAttributeProfileDrvF: func(ctx *context.Context, str1, str2 string) (*AttributeProfile, error) {
return &AttributeProfile{}, nil
},
SetAttributeProfileDrvF: func(ctx *context.Context, attr *AttributeProfile) error { return utils.ErrNotImplemented },
}
cM := NewConnManager(cfg)
dm := NewDataManager(data, cfg.CacheCfg(), cM)
attrPrfl := &AttributeProfile{
Tenant: "cgrates.org",
ID: "ATTR_ID",
FilterIDs: []string{"filtrId1"},
Attributes: []*Attribute{
{
Path: utils.MetaReq + utils.NestingSep + "Account",
Value: config.NewRSRParsersMustCompile("1001", utils.InfieldSep),
},
},
Weights: make(utils.DynamicWeights, 1),
}
if err := dm.SetAttributeProfile(context.Background(), attrPrfl, false); err == nil || err != utils.ErrNotImplemented {
t.Errorf("Expected error <%v>, received error <%v>", utils.ErrNotImplemented, err)
}
}
func TestDMSetAttributeProfileUpdatedIndexesErr(t *testing.T) {
Cache.Clear(nil)
cfg := config.NewDefaultCGRConfig()
data := &DataDBMock{
GetAttributeProfileDrvF: func(ctx *context.Context, str1, str2 string) (*AttributeProfile, error) {
return &AttributeProfile{}, nil
},
SetAttributeProfileDrvF: func(ctx *context.Context, attr *AttributeProfile) error { return nil },
}
cM := NewConnManager(cfg)
dm := NewDataManager(data, cfg.CacheCfg(), cM)
attrPrfl := &AttributeProfile{
Tenant: "cgrates.org",
ID: "ATTR_ID",
FilterIDs: []string{"*string:~*req.Account:1001"},
Attributes: []*Attribute{
{
Path: utils.MetaReq + utils.NestingSep + "Account",
Value: config.NewRSRParsersMustCompile("1001", utils.InfieldSep),
},
},
Weights: make(utils.DynamicWeights, 1),
}
if err := dm.SetAttributeProfile(context.Background(), attrPrfl, true); err != utils.ErrNotImplemented {
t.Errorf("Expected error <%v>, received error <%v>", utils.ErrNotImplemented, err)
}
}
func TestDMSetAttributeProfileReplicate(t *testing.T) {
cfgtmp := config.CgrConfig()
defer func() {
config.SetCgrConfig(cfgtmp)
}()
Cache.Clear(nil)
attrPrfl := &AttributeProfile{
Tenant: "cgrates.org",
ID: "ATTR_ID",
FilterIDs: []string{"filtrId1"},
Attributes: []*Attribute{
{
Path: utils.MetaReq + utils.NestingSep + "Account",
Value: config.NewRSRParsersMustCompile("1001", utils.InfieldSep),
},
},
Weights: make(utils.DynamicWeights, 1),
}
cfg := config.NewDefaultCGRConfig()
cfg.DataDbCfg().Items[utils.MetaAttributeProfiles].Replicate = true
cfg.DataDbCfg().RplConns = []string{utils.ConcatenatedKey(utils.MetaInternal, utils.MetaReplicator)}
config.SetCgrConfig(cfg)
cc := make(chan birpc.ClientConnector, 1)
cc <- &ccMock{
calls: map[string]func(ctx *context.Context, args interface{}, reply interface{}) error{
utils.ReplicatorSv1SetAttributeProfile: func(ctx *context.Context, args, reply interface{}) error { return utils.ErrNotImplemented },
},
}
cM := NewConnManager(cfg)
cM.AddInternalConn(utils.ConcatenatedKey(utils.MetaInternal, utils.MetaReplicator), utils.ReplicatorSv1, cc)
data := &DataDBMock{
GetAttributeProfileDrvF: func(ctx *context.Context, str1, str2 string) (*AttributeProfile, error) {
return attrPrfl, nil
},
SetAttributeProfileDrvF: func(ctx *context.Context, attr *AttributeProfile) error { return nil },
}
dm := NewDataManager(data, cfg.CacheCfg(), cM)
// tests replicate
if err := dm.SetAttributeProfile(context.Background(), attrPrfl, false); err != utils.ErrNotImplemented {
t.Errorf("Expected error <%v>, received error <%v>", utils.ErrNotImplemented, err)
}
}
func TestDMGetAttributeProfileNilDmErr(t *testing.T) {
var dm *DataManager
_, err := dm.GetAttributeProfile(context.Background(), utils.CGRateSorg, "ap_1", false, false, utils.NonTransactional)
if err != utils.ErrNoDatabaseConn {
t.Errorf("Expected error <%v>, received error <%v>", utils.ErrNoDatabaseConn, err)
}
}
func TestDMGetAttributeProfileSetAttributeProfileDrvErr(t *testing.T) {
cfgtmp := config.CgrConfig()
defer func() {
config.SetCgrConfig(cfgtmp)
}()
Cache.Clear(nil)
attrPrfl := &AttributeProfile{
Tenant: "cgrates.org",
ID: "ATTR_ID",
FilterIDs: []string{"filtrId1"},
Attributes: []*Attribute{
{
Path: utils.MetaReq + utils.NestingSep + "Account",
Value: config.NewRSRParsersMustCompile("1001", utils.InfieldSep),
},
},
Weights: make(utils.DynamicWeights, 1),
}
cfg := config.NewDefaultCGRConfig()
cfg.DataDbCfg().Items[utils.MetaAttributeProfiles].Remote = true
cfg.DataDbCfg().RmtConns = []string{utils.ConcatenatedKey(utils.MetaInternal, utils.RemoteConnsCfg)}
config.SetCgrConfig(cfg)
cc := make(chan birpc.ClientConnector, 1)
cc <- &ccMock{
calls: map[string]func(ctx *context.Context, args interface{}, reply interface{}) error{
utils.ReplicatorSv1GetAttributeProfile: func(ctx *context.Context, args, reply interface{}) error { return nil },
},
}
cM := NewConnManager(cfg)
cM.AddInternalConn(utils.ConcatenatedKey(utils.MetaInternal, utils.RemoteConnsCfg), utils.ReplicatorSv1, cc)
data := &DataDBMock{
GetAttributeProfileDrvF: func(ctx *context.Context, str1, str2 string) (*AttributeProfile, error) {
return attrPrfl, utils.ErrNotFound
},
SetAttributeProfileDrvF: func(ctx *context.Context, attr *AttributeProfile) error { return utils.ErrNotImplemented },
}
dm := NewDataManager(data, cfg.CacheCfg(), cM)
_, err := dm.GetAttributeProfile(context.Background(), utils.CGRateSorg, attrPrfl.ID, false, false, utils.NonTransactional)
if err != utils.ErrNotImplemented {
t.Errorf("Expected error <%v>, received error <%v>", utils.ErrNotImplemented, err)
}
}
func TestDMSetAttributeProfileComputeHashErr(t *testing.T) {
cfg := config.NewDefaultCGRConfig()
data := &DataDBMock{
GetAttributeProfileDrvF: func(ctx *context.Context, str1, str2 string) (*AttributeProfile, error) {
return &AttributeProfile{}, nil
},
}
cM := NewConnManager(cfg)
dm := NewDataManager(data, cfg.CacheCfg(), cM)
value := config.NewRSRParsersMustCompile("31 0a 0a 32 0a 0a 33 0a 0a 34 0a 0a 35 0a 0a 36 0a 0a 37 0a 0a 38 0a 0a 39 0a 0a 31 30 0a 0a 31", config.CgrConfig().GeneralCfg().RSRSep)
attrPrfl := &AttributeProfile{
Tenant: "cgrates.org",
ID: "ATTR_ID",
FilterIDs: []string{"filtrId1"},
Attributes: []*Attribute{
{
Type: utils.MetaPassword,
Value: value,
},
},
Weights: make(utils.DynamicWeights, 1),
}
expErr := "bcrypt: password length exceeds 72 bytes"
if err := dm.SetAttributeProfile(context.Background(), attrPrfl, false); err == nil || err.Error() != expErr {
t.Errorf("Expected error <%v>, received error <%v>", expErr, err)
}
}

12
go.mod
View File

@@ -38,9 +38,9 @@ require (
github.com/rabbitmq/amqp091-go v1.5.0
github.com/segmentio/kafka-go v0.4.32
go.mongodb.org/mongo-driver v1.11.0
golang.org/x/crypto v0.1.0
golang.org/x/crypto v0.7.0
golang.org/x/exp v0.0.0-20230213192124-5e25df0256eb
golang.org/x/net v0.1.0
golang.org/x/net v0.8.0
golang.org/x/oauth2 v0.0.0-20220622183110-fd043fe589d2
google.golang.org/api v0.85.0
gorm.io/driver/mysql v1.3.4
@@ -97,11 +97,11 @@ require (
github.com/xdg/stringprep v1.0.3 // indirect
go.etcd.io/bbolt v1.3.6 // indirect
go.opencensus.io v0.23.0 // indirect
golang.org/x/mod v0.6.0 // indirect
golang.org/x/mod v0.8.0 // indirect
golang.org/x/sync v0.1.0 // indirect
golang.org/x/sys v0.1.0 // indirect
golang.org/x/text v0.4.0 // indirect
golang.org/x/tools v0.2.0 // indirect
golang.org/x/sys v0.6.0 // indirect
golang.org/x/text v0.8.0 // indirect
golang.org/x/tools v0.6.0 // indirect
golang.org/x/xerrors v0.0.0-20220609144429-65e65417b02f // indirect
google.golang.org/appengine v1.6.7 // indirect
google.golang.org/genproto v0.0.0-20220627200112-0a929928cb33 // indirect

24
go.sum
View File

@@ -643,8 +643,8 @@ golang.org/x/crypto v0.0.0-20210616213533-5ff15b29337e/go.mod h1:GvvjBRRGRdwPK5y
golang.org/x/crypto v0.0.0-20210711020723-a769d52b0f97/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc=
golang.org/x/crypto v0.0.0-20210921155107-089bfa567519/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc=
golang.org/x/crypto v0.0.0-20220622213112-05595931fe9d/go.mod h1:IxCIyHEi3zRg3s0A5j5BB6A9Jmi73HwBIUl50j+osU4=
golang.org/x/crypto v0.1.0 h1:MDRAIl0xIo9Io2xV565hzXHw3zVseKrJKodhohM5CjU=
golang.org/x/crypto v0.1.0/go.mod h1:RecgLatLF4+eUMCP1PoPZQb+cVrJcOPbHkTkbkB9sbw=
golang.org/x/crypto v0.7.0 h1:AvwMYaRytfdeVt3u6mLaxYtErKYjxA2OXjJ1HHq6t3A=
golang.org/x/crypto v0.7.0/go.mod h1:pYwdfH91IfpZVANVyUOhSIPZaFoJGxTFbZhFTx+dXZU=
golang.org/x/exp v0.0.0-20190121172915-509febef88a4/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA=
golang.org/x/exp v0.0.0-20190306152737-a1d7652674e8/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA=
golang.org/x/exp v0.0.0-20190510132918-efd6b22b2522/go.mod h1:ZjyILWgesfNpC6sMxTJOJm9Kp84zZh5NQWvqDGG3Qr8=
@@ -682,8 +682,8 @@ golang.org/x/mod v0.3.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA=
golang.org/x/mod v0.4.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA=
golang.org/x/mod v0.4.1/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA=
golang.org/x/mod v0.4.2/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA=
golang.org/x/mod v0.6.0 h1:b9gGHsz9/HhJ3HF5DHQytPpuwocVTChQJK3AvoLRD5I=
golang.org/x/mod v0.6.0/go.mod h1:4mET923SAdbXp2ki8ey+zGs1SLqsuM2Y0uvdZR/fUNI=
golang.org/x/mod v0.8.0 h1:LUYupSeNrTNCGzR/hVBk2NHZO4hXcVaW1k4Qx7rjPx8=
golang.org/x/mod v0.8.0/go.mod h1:iBbtSCu2XBx23ZKBPSOrRkjjQPZFPuis4dIYUhu/chs=
golang.org/x/net v0.0.0-20180724234803-3673e40ba225/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=
golang.org/x/net v0.0.0-20180826012351-8a410e7b638d/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=
golang.org/x/net v0.0.0-20180906233101-161cd47e91fd/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=
@@ -735,8 +735,8 @@ golang.org/x/net v0.0.0-20220412020605-290c469a71a5/go.mod h1:CfG3xpIq0wQ8r1q4Su
golang.org/x/net v0.0.0-20220425223048-2871e0cb64e4/go.mod h1:CfG3xpIq0wQ8r1q4Su4UZFWDARRcnwPjda9FqA0JpMk=
golang.org/x/net v0.0.0-20220607020251-c690dde0001d/go.mod h1:XRhObCWvk6IyKnWLug+ECip1KBveYUHfp+8e9klMJ9c=
golang.org/x/net v0.0.0-20220617184016-355a448f1bc9/go.mod h1:XRhObCWvk6IyKnWLug+ECip1KBveYUHfp+8e9klMJ9c=
golang.org/x/net v0.1.0 h1:hZ/3BUoy5aId7sCpA/Tc5lt8DkFgdVS2onTpJsZ/fl0=
golang.org/x/net v0.1.0/go.mod h1:Cx3nUiGt4eDBEyega/BKRp+/AlGL8hYe7U9odMt2Cco=
golang.org/x/net v0.8.0 h1:Zrh2ngAOFYneWTAIAPethzeaQLuHwhuBkuV6ZiRnUaQ=
golang.org/x/net v0.8.0/go.mod h1:QVkue5JL9kW//ek3r6jTKnTFis1tRmNAW2P1shuFdJc=
golang.org/x/oauth2 v0.0.0-20180821212333-d2e6202438be/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U=
golang.org/x/oauth2 v0.0.0-20190226205417-e64efc72b421/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw=
golang.org/x/oauth2 v0.0.0-20190604053449-0f29369cfe45/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw=
@@ -852,8 +852,8 @@ golang.org/x/sys v0.0.0-20220503163025-988cb79eb6c6/go.mod h1:oPkhp1MJrh7nUepCBc
golang.org/x/sys v0.0.0-20220520151302-bc2c85ada10a/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
golang.org/x/sys v0.0.0-20220610221304-9f5ed59c137d/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
golang.org/x/sys v0.0.0-20220615213510-4f61da869c0c/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
golang.org/x/sys v0.1.0 h1:kunALQeHf1/185U1i0GOB/fy1IPRDDpuoOOqRReG57U=
golang.org/x/sys v0.1.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
golang.org/x/sys v0.6.0 h1:MVltZSvRTcU2ljQOhs94SXPftV6DCNnZViHeQps87pQ=
golang.org/x/sys v0.6.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
golang.org/x/term v0.0.0-20201117132131-f5c789dd3221/go.mod h1:Nr5EML6q2oocZ2LXRh80K7BxOlk5/8JxuGnuhpl+muw=
golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo=
golang.org/x/term v0.0.0-20210927222741-03fcf44c2211/go.mod h1:jbD1KX2456YbFQfuXm/mYQcufACuNUgVhRMnK/tPxf8=
@@ -866,8 +866,8 @@ golang.org/x/text v0.3.4/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ=
golang.org/x/text v0.3.5/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ=
golang.org/x/text v0.3.6/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ=
golang.org/x/text v0.3.7/go.mod h1:u+2+/6zg+i71rQMx5EYifcz6MCKuco9NR6JIITiCfzQ=
golang.org/x/text v0.4.0 h1:BrVqGRd7+k1DiOgtnFvAkoQEWQvBc25ouMJM6429SFg=
golang.org/x/text v0.4.0/go.mod h1:mrYo+phRRbMaCq/xk9113O4dZlRixOauAjOtrjsXDZ8=
golang.org/x/text v0.8.0 h1:57P1ETyNKtuIjB4SRd15iJxuhj8Gc416Y78H3qgMh68=
golang.org/x/text v0.8.0/go.mod h1:e1OnstbJyHTd6l/uOt8jFFHp6TRDWZR/bV3emEE/zU8=
golang.org/x/time v0.0.0-20181108054448-85acf8d2951c/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ=
golang.org/x/time v0.0.0-20190308202827-9d24e82272b4/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ=
golang.org/x/time v0.0.0-20191024005414-555d28b269f0/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ=
@@ -931,8 +931,8 @@ golang.org/x/tools v0.1.3/go.mod h1:o0xws9oXOQQZyjljx8fwUC0k7L1pTE6eaCbjGeHmOkk=
golang.org/x/tools v0.1.4/go.mod h1:o0xws9oXOQQZyjljx8fwUC0k7L1pTE6eaCbjGeHmOkk=
golang.org/x/tools v0.1.5/go.mod h1:o0xws9oXOQQZyjljx8fwUC0k7L1pTE6eaCbjGeHmOkk=
golang.org/x/tools v0.1.6-0.20210726203631-07bc1bf47fb2/go.mod h1:o0xws9oXOQQZyjljx8fwUC0k7L1pTE6eaCbjGeHmOkk=
golang.org/x/tools v0.2.0 h1:G6AHpWxTMGY1KyEYoAQ5WTtIekUUvDNjan3ugu60JvE=
golang.org/x/tools v0.2.0/go.mod h1:y4OqIKeOV/fWJetJ8bXPU1sEVniLMIyDAZWeHdV+NTA=
golang.org/x/tools v0.6.0 h1:BOw41kyTf3PuCW1pVQf8+Cyg8pMlkYB1oo9iJ6D/lKM=
golang.org/x/tools v0.6.0/go.mod h1:Xwgl3UAJ/d3gWutnCtw505GrjyAbvKui8lOU390QaIU=
golang.org/x/xerrors v0.0.0-20190410155217-1f06c39b4373/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=
golang.org/x/xerrors v0.0.0-20190513163551-3ee3066db522/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=
golang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=