diff --git a/engine/datamanager_test.go b/engine/datamanager_test.go index ba45c01fb..57ff65584 100644 --- a/engine/datamanager_test.go +++ b/engine/datamanager_test.go @@ -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) + } +} diff --git a/go.mod b/go.mod index a4dc4ebb1..dae782b68 100644 --- a/go.mod +++ b/go.mod @@ -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 diff --git a/go.sum b/go.sum index 13473dc7c..3a2c605ef 100644 --- a/go.sum +++ b/go.sum @@ -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=