This is an automated email from the ASF dual-hosted git repository.

littlecui pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/servicecomb-service-center.git


The following commit(s) were added to refs/heads/master by this push:
     new 8f0b3c4  [Enhancement] Implement service/dep exist interface (#709)
8f0b3c4 is described below

commit 8f0b3c4ceacc9da7ce94fbcbeb4f2d6280424285
Author: xzccfzy <[email protected]>
AuthorDate: Thu Oct 15 09:25:33 2020 +0800

    [Enhancement] Implement service/dep exist interface (#709)
    
    Co-authored-by: 薛泽超 <[email protected]>
---
 server/service/dep/datasource.go           |  12 +-
 server/service/dep/etcd/etcd.go            | 181 +++++-
 server/service/dep/etcd/etcd_suite_test.go |  61 ++
 server/service/dep/etcd/etcd_test.go       | 895 +++++++++++++++++++++++++++++
 4 files changed, 1140 insertions(+), 9 deletions(-)

diff --git a/server/service/dep/datasource.go b/server/service/dep/datasource.go
index d26d969..5f9a45c 100644
--- a/server/service/dep/datasource.go
+++ b/server/service/dep/datasource.go
@@ -15,9 +15,15 @@
 
 package dep
 
+import (
+       "context"
+       pb "github.com/apache/servicecomb-service-center/pkg/registry"
+)
+
 type DataSource interface {
-       AddDependency()
-       SearchDependency()
-       UpdateDependency()
+       AddDependency(ctx context.Context, request *pb.AddDependenciesRequest) 
(*pb.AddDependenciesResponse, error)
+       CreateDependency(ctx context.Context, request 
*pb.CreateDependenciesRequest) (*pb.CreateDependenciesResponse, error)
+       SearchProviderDependency(ctx context.Context, request 
*pb.GetDependenciesRequest) (*pb.GetProDependenciesResponse, error)
+       SearchConsumerDependency(ctx context.Context, request 
*pb.GetDependenciesRequest) (*pb.GetConDependenciesResponse, error)
        DeleteDependency()
 }
diff --git a/server/service/dep/etcd/etcd.go b/server/service/dep/etcd/etcd.go
index c2e2c02..c8e0f84 100644
--- a/server/service/dep/etcd/etcd.go
+++ b/server/service/dep/etcd/etcd.go
@@ -16,7 +16,19 @@
 package etcd
 
 import (
+       "context"
+       "encoding/json"
+       "fmt"
        "github.com/apache/servicecomb-service-center/pkg/log"
+       pb "github.com/apache/servicecomb-service-center/pkg/registry"
+       "github.com/apache/servicecomb-service-center/pkg/util"
+       apt "github.com/apache/servicecomb-service-center/server/core"
+       "github.com/apache/servicecomb-service-center/server/core/backend"
+       "github.com/apache/servicecomb-service-center/server/core/proto"
+       "github.com/apache/servicecomb-service-center/server/plugin/registry"
+       scerr "github.com/apache/servicecomb-service-center/server/scerror"
+       "github.com/apache/servicecomb-service-center/server/service"
+       serviceUtil 
"github.com/apache/servicecomb-service-center/server/service/util"
 )
 
 // TODO: define error with names here
@@ -45,18 +57,175 @@ func (ds *DataSource) initialize() error {
        return nil
 }
 
-func (ds *DataSource) AddDependency() {
-       panic("implement me")
+func (ds *DataSource) AddDependency(ctx context.Context, request 
*pb.AddDependenciesRequest) (*pb.AddDependenciesResponse, error) {
+       if err := service.Validate(request); err != nil {
+               return &pb.AddDependenciesResponse{
+                       Response: 
serviceUtil.BadParamsResponse(err.Error()).Response,
+               }, nil
+       }
+
+       resp, err := ds.AddOrUpdateDependencies(ctx, request.Dependencies, 
false)
+       return &pb.AddDependenciesResponse{
+               Response: resp,
+       }, err
+
 }
 
-func (ds *DataSource) SearchDependency() {
-       panic("implement me")
+func (ds *DataSource) CreateDependency(ctx context.Context, request 
*pb.CreateDependenciesRequest) (*pb.CreateDependenciesResponse, error) {
+       if err := service.Validate(request); err != nil {
+               return &pb.CreateDependenciesResponse{
+                       Response: 
serviceUtil.BadParamsResponse(err.Error()).Response,
+               }, nil
+       }
+       resp, err := ds.AddOrUpdateDependencies(ctx, request.Dependencies, 
false)
+       return &pb.CreateDependenciesResponse{
+               Response: resp,
+       }, err
 }
 
-func (ds *DataSource) UpdateDependency() {
-       panic("implement me")
+func (ds *DataSource) SearchProviderDependency(ctx context.Context, request 
*pb.GetDependenciesRequest) (*pb.GetProDependenciesResponse, error) {
+       err := service.Validate(request)
+       if err != nil {
+               log.Errorf(err, "GetProviderDependencies failed for validating 
parameters failed")
+               return &pb.GetProDependenciesResponse{
+                       Response: proto.CreateResponse(scerr.ErrInvalidParams, 
err.Error()),
+               }, nil
+       }
+       domainProject := util.ParseDomainProject(ctx)
+       providerServiceID := request.ServiceId
+
+       provider, err := serviceUtil.GetService(ctx, domainProject, 
providerServiceID)
+       if err != nil {
+               log.Errorf(err, "GetProviderDependencies failed, provider is 
%s", providerServiceID)
+               return nil, err
+       }
+       if provider == nil {
+               log.Errorf(err, "GetProviderDependencies failed for 
provider[%s] does not exist", providerServiceID)
+               return &pb.GetProDependenciesResponse{
+                       Response: 
proto.CreateResponse(scerr.ErrServiceNotExists, "Provider does not exist"),
+               }, nil
+       }
+
+       dr := serviceUtil.NewProviderDependencyRelation(ctx, domainProject, 
provider)
+       services, err := 
dr.GetDependencyConsumers(toDependencyFilterOptions(request)...)
+       if err != nil {
+               log.Errorf(err, "GetProviderDependencies failed, provider is 
%s/%s/%s/%s",
+                       provider.Environment, provider.AppId, 
provider.ServiceName, provider.Version)
+               return &pb.GetProDependenciesResponse{
+                       Response: proto.CreateResponse(scerr.ErrInternal, 
err.Error()),
+               }, err
+       }
+       return &pb.GetProDependenciesResponse{
+               Response:  proto.CreateResponse(proto.Response_SUCCESS, "Get 
all consumers successful."),
+               Consumers: services,
+       }, nil
+}
+
+func (ds *DataSource) SearchConsumerDependency(ctx context.Context, request 
*pb.GetDependenciesRequest) (*pb.GetConDependenciesResponse, error) {
+       err := service.Validate(request)
+       if err != nil {
+               log.Errorf(err, "GetConsumerDependencies failed for validating 
parameters failed")
+               return &pb.GetConDependenciesResponse{
+                       Response: proto.CreateResponse(scerr.ErrInvalidParams, 
err.Error()),
+               }, nil
+       }
+       consumerID := request.ServiceId
+       domainProject := util.ParseDomainProject(ctx)
+
+       consumer, err := serviceUtil.GetService(ctx, domainProject, consumerID)
+       if err != nil {
+               log.Errorf(err, "GetConsumerDependencies failed, consumer is 
%s", consumerID)
+               return &pb.GetConDependenciesResponse{
+                       Response: proto.CreateResponse(scerr.ErrInternal, 
err.Error()),
+               }, err
+       }
+       if consumer == nil {
+               log.Errorf(err, "GetConsumerDependencies failed for 
consumer[%s] does not exist", consumerID)
+               return &pb.GetConDependenciesResponse{
+                       Response: 
proto.CreateResponse(scerr.ErrServiceNotExists, "Consumer does not exist"),
+               }, nil
+       }
+
+       dr := serviceUtil.NewConsumerDependencyRelation(ctx, domainProject, 
consumer)
+       services, err := 
dr.GetDependencyProviders(toDependencyFilterOptions(request)...)
+       if err != nil {
+               log.Errorf(err, "GetConsumerDependencies failed, consumer is 
%s/%s/%s/%s",
+                       consumer.Environment, consumer.AppId, 
consumer.ServiceName, consumer.Version)
+               return &pb.GetConDependenciesResponse{
+                       Response: proto.CreateResponse(scerr.ErrInternal, 
err.Error()),
+               }, err
+       }
+
+       return &pb.GetConDependenciesResponse{
+               Response:  proto.CreateResponse(proto.Response_SUCCESS, "Get 
all providers successfully."),
+               Providers: services,
+       }, nil
 }
 
 func (ds *DataSource) DeleteDependency() {
        panic("implement me")
 }
+
+func (ds *DataSource) AddOrUpdateDependencies(ctx context.Context, 
dependencyInfos []*pb.ConsumerDependency, override bool) (*pb.Response, error) {
+       opts := make([]registry.PluginOp, 0, len(dependencyInfos))
+       domainProject := util.ParseDomainProject(ctx)
+       for _, dependencyInfo := range dependencyInfos {
+               consumerFlag := 
util.StringJoin([]string{dependencyInfo.Consumer.Environment, 
dependencyInfo.Consumer.AppId, dependencyInfo.Consumer.ServiceName, 
dependencyInfo.Consumer.Version}, "/")
+               consumerInfo := 
proto.DependenciesToKeys([]*pb.MicroServiceKey{dependencyInfo.Consumer}, 
domainProject)[0]
+               providersInfo := 
proto.DependenciesToKeys(dependencyInfo.Providers, domainProject)
+
+               rsp := serviceUtil.ParamsChecker(consumerInfo, providersInfo)
+               if rsp != nil {
+                       log.Errorf(nil, "put request into dependency queue 
failed, override: %t, consumer is %s, %s",
+                               override, consumerFlag, 
rsp.Response.GetMessage())
+                       return rsp.Response, nil
+               }
+
+               consumerID, err := serviceUtil.GetServiceID(ctx, consumerInfo)
+               if err != nil {
+                       log.Errorf(err, "put request into dependency queue 
failed, override: %t, get consumer[%s] id failed",
+                               override, consumerFlag)
+                       return proto.CreateResponse(scerr.ErrInternal, 
err.Error()), err
+               }
+               if len(consumerID) == 0 {
+                       log.Errorf(nil, "put request into dependency queue 
failed, override: %t, consumer[%s] does not exist",
+                               override, consumerFlag)
+                       return proto.CreateResponse(scerr.ErrServiceNotExists, 
fmt.Sprintf("Consumer %s does not exist.", consumerFlag)), nil
+               }
+
+               dependencyInfo.Override = override
+               data, err := json.Marshal(dependencyInfo)
+               if err != nil {
+                       log.Errorf(err, "put request into dependency queue 
failed, override: %t, marshal consumer[%s] dependency failed",
+                               override, consumerFlag)
+                       return proto.CreateResponse(scerr.ErrInternal, 
err.Error()), err
+               }
+
+               id := apt.DepsQueueUUID
+               if !override {
+                       id = util.GenerateUUID()
+               }
+               key := apt.GenerateConsumerDependencyQueueKey(domainProject, 
consumerID, id)
+               opts = append(opts, registry.OpPut(registry.WithStrKey(key), 
registry.WithValue(data)))
+       }
+
+       err := backend.BatchCommit(ctx, opts)
+       if err != nil {
+               log.Errorf(err, "put request into dependency queue failed, 
override: %t, %v", override, dependencyInfos)
+               return proto.CreateResponse(scerr.ErrInternal, err.Error()), err
+       }
+
+       log.Infof("put request into dependency queue successfully, override: 
%t, %v, from remote %s",
+               override, dependencyInfos, util.GetIPFromContext(ctx))
+       return proto.CreateResponse(proto.Response_SUCCESS, "Create dependency 
successfully."), nil
+}
+
+func toDependencyFilterOptions(in *pb.GetDependenciesRequest) (opts 
[]serviceUtil.DependencyRelationFilterOption) {
+       if in.SameDomain {
+               opts = append(opts, serviceUtil.WithSameDomainProject())
+       }
+       if in.NoSelf {
+               opts = append(opts, serviceUtil.WithoutSelfDependency())
+       }
+       return opts
+}
diff --git a/server/service/dep/etcd/etcd_suite_test.go 
b/server/service/dep/etcd/etcd_suite_test.go
new file mode 100644
index 0000000..45728ee
--- /dev/null
+++ b/server/service/dep/etcd/etcd_suite_test.go
@@ -0,0 +1,61 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package etcd_test
+
+// initialize
+import (
+       _ "github.com/apache/servicecomb-service-center/server/bootstrap"
+       "github.com/apache/servicecomb-service-center/server/core/proto"
+       "github.com/apache/servicecomb-service-center/server/service"
+)
+import (
+       "context"
+       "github.com/apache/servicecomb-service-center/pkg/util"
+       "github.com/apache/servicecomb-service-center/server/core"
+       "github.com/astaxie/beego"
+       . "github.com/onsi/ginkgo"
+       "github.com/onsi/ginkgo/reporters"
+       . "github.com/onsi/gomega"
+       "testing"
+)
+
+var serviceResource proto.ServiceCtrlServer
+var instanceResource proto.ServiceInstanceCtrlServerEx
+
+func init() {
+       beego.AppConfig.Set("registry_plugin", "etcd")
+       testing.Init()
+       core.Initialize()
+}
+
+var _ = BeforeSuite(func() {
+       //init plugin
+       core.ServerInfo.Config.EnableCache = false
+       serviceResource, instanceResource = service.AssembleResources()
+})
+
+func getContext() context.Context {
+       return util.SetContext(
+               util.SetDomainProject(context.Background(), "default", 
"default"),
+               util.CtxNocache, "1")
+}
+
+func TestGrpc(t *testing.T) {
+       RegisterFailHandler(Fail)
+       junitReporter := reporters.NewJUnitReporter("model.junit.xml")
+       RunSpecsWithDefaultAndCustomReporters(t, "model Suite", 
[]Reporter{junitReporter})
+}
diff --git a/server/service/dep/etcd/etcd_test.go 
b/server/service/dep/etcd/etcd_test.go
new file mode 100644
index 0000000..f7da436
--- /dev/null
+++ b/server/service/dep/etcd/etcd_test.go
@@ -0,0 +1,895 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package etcd_test
+
+import (
+       pb "github.com/apache/servicecomb-service-center/pkg/registry"
+       "github.com/apache/servicecomb-service-center/server/core/proto"
+       scerr "github.com/apache/servicecomb-service-center/server/scerror"
+       "github.com/apache/servicecomb-service-center/server/service/dep"
+       "github.com/apache/servicecomb-service-center/server/service/dep/etcd"
+       "github.com/apache/servicecomb-service-center/server/service/event"
+       "github.com/go-chassis/go-archaius"
+       "github.com/stretchr/testify/assert"
+       "strconv"
+       "testing"
+)
+
+var deh event.DependencyEventHandler
+
+func Test_Creat(t *testing.T) {
+
+       dep.Install("etcd", func(opts dep.Options) (dep.DataSource, error) {
+               return etcd.NewDataSource(), nil
+       })
+
+       err := dep.Init(dep.Options{
+               Endpoint:       "",
+               PluginImplName: 
dep.ImplName(archaius.GetString("servicecomb.ms.name", "etcd")),
+       })
+       assert.NoError(t, err)
+
+       var (
+               consumerId1 string
+               consumerId2 string
+               consumerId3 string
+       )
+       t.Run("should be passed", func(t *testing.T) {
+               resp, err := serviceResource.Create(getContext(), 
&pb.CreateServiceRequest{
+                       Service: &pb.MicroService{
+                               AppId:       "create_dep_group",
+                               ServiceName: "create_dep_consumer",
+                               Version:     "1.0.0",
+                               Level:       "FRONT",
+                               Status:      pb.MS_UP,
+                       },
+               })
+               assert.NotNil(t, resp)
+               assert.NoError(t, err)
+               assert.Equal(t, proto.Response_SUCCESS, resp.Response.GetCode())
+               consumerId1 = resp.ServiceId
+
+               resp, err = serviceResource.Create(getContext(), 
&pb.CreateServiceRequest{
+                       Service: &pb.MicroService{
+                               AppId:       "create_dep_group",
+                               ServiceName: "create_dep_consumer_all",
+                               Version:     "1.0.0",
+                               Level:       "FRONT",
+                               Status:      pb.MS_UP,
+                       },
+               })
+               assert.NotNil(t, resp)
+               assert.NoError(t, err)
+               assert.Equal(t, proto.Response_SUCCESS, resp.Response.GetCode())
+               consumerId3 = resp.ServiceId
+
+               resp, err = serviceResource.Create(getContext(), 
&pb.CreateServiceRequest{
+                       Service: &pb.MicroService{
+                               Environment: pb.ENV_PROD,
+                               AppId:       "create_dep_group",
+                               ServiceName: "create_dep_consumer",
+                               Version:     "1.0.0",
+                               Level:       "FRONT",
+                               Status:      pb.MS_UP,
+                       },
+               })
+               assert.NotNil(t, resp)
+               assert.NoError(t, err)
+               assert.Equal(t, proto.Response_SUCCESS, resp.Response.GetCode())
+               consumerId2 = resp.ServiceId
+
+               resp, err = serviceResource.Create(getContext(), 
&pb.CreateServiceRequest{
+                       Service: &pb.MicroService{
+                               AppId:       "create_dep_group",
+                               ServiceName: "create_dep_provider",
+                               Version:     "1.0.0",
+                               Level:       "FRONT",
+                               Status:      pb.MS_UP,
+                       },
+               })
+               assert.NotNil(t, resp)
+               assert.NoError(t, err)
+               assert.Equal(t, proto.Response_SUCCESS, resp.Response.GetCode())
+
+               resp, err = serviceResource.Create(getContext(), 
&pb.CreateServiceRequest{
+                       Service: &pb.MicroService{
+                               AppId:       "create_dep_group",
+                               ServiceName: "create_dep_provider",
+                               Version:     "1.0.1",
+                               Level:       "FRONT",
+                               Status:      pb.MS_UP,
+                       },
+               })
+               assert.NotNil(t, resp)
+               assert.NoError(t, err)
+               assert.Equal(t, proto.Response_SUCCESS, resp.Response.GetCode())
+
+               resp, err = serviceResource.Create(getContext(), 
&pb.CreateServiceRequest{
+                       Service: &pb.MicroService{
+                               Environment: pb.ENV_PROD,
+                               AppId:       "create_dep_group",
+                               ServiceName: "create_dep_provider",
+                               Version:     "1.0.0",
+                               Level:       "FRONT",
+                               Status:      pb.MS_UP,
+                       },
+               })
+               assert.NotNil(t, resp)
+               assert.NoError(t, err)
+               assert.Equal(t, proto.Response_SUCCESS, resp.Response.GetCode())
+       })
+
+       t.Run("when request is invalid, should be failed", func(t *testing.T) {
+               consumer := &pb.MicroServiceKey{
+                       AppId:       "create_dep_group",
+                       ServiceName: "create_dep_consumer",
+                       Version:     "1.0.0",
+               }
+               providers := []*pb.MicroServiceKey{
+                       {
+                               AppId:       "create_dep_group",
+                               ServiceName: "create_dep_provider",
+                               Version:     "1.0.0",
+                       },
+               }
+
+               // consumer does not exist
+               resp, err := dep.Dependency().CreateDependency(getContext(), 
&pb.CreateDependenciesRequest{
+                       Dependencies: []*pb.ConsumerDependency{
+                               {
+                                       Consumer: &pb.MicroServiceKey{
+                                               AppId:       "noexistapp",
+                                               ServiceName: "noexistservice",
+                                               Version:     "1.0.0",
+                                       },
+                                       Providers: providers,
+                               },
+                       },
+               })
+               assert.NotNil(t, resp)
+               assert.NoError(t, err)
+               assert.Equal(t, scerr.ErrServiceNotExists, 
resp.Response.GetCode())
+
+               // provider version is invalid
+               resp, err = dep.Dependency().CreateDependency(getContext(), 
&pb.CreateDependenciesRequest{
+                       Dependencies: []*pb.ConsumerDependency{
+                               {
+                                       Consumer: consumer,
+                                       Providers: []*pb.MicroServiceKey{
+                                               {
+                                                       AppId:       
"create_dep_group",
+                                                       ServiceName: 
"create_dep_provider",
+                                                       Version:     
"1.0.32768",
+                                               },
+                                       },
+                               },
+                       },
+               })
+               assert.NotNil(t, resp)
+               assert.NoError(t, err)
+               assert.Equal(t, scerr.ErrInvalidParams, resp.Response.GetCode())
+
+               // consumer version is invalid
+               resp, err = dep.Dependency().CreateDependency(getContext(), 
&pb.CreateDependenciesRequest{
+                       Dependencies: []*pb.ConsumerDependency{
+                               {
+                                       Consumer: &pb.MicroServiceKey{
+                                               AppId:       "create_dep_group",
+                                               ServiceName: 
"create_dep_consumer",
+                                               Version:     "1.0.0+",
+                                       },
+                                       Providers: providers,
+                               },
+                       },
+               })
+               assert.NotNil(t, resp)
+               assert.NoError(t, err)
+               assert.Equal(t, scerr.ErrInvalidParams, resp.Response.GetCode())
+
+               resp, err = dep.Dependency().CreateDependency(getContext(), 
&pb.CreateDependenciesRequest{
+                       Dependencies: []*pb.ConsumerDependency{
+                               {
+                                       Consumer: &pb.MicroServiceKey{
+                                               AppId:       "create_dep_group",
+                                               ServiceName: 
"create_dep_consumer",
+                                               Version:     "1.0.0-1.0.1",
+                                       },
+                                       Providers: providers,
+                               },
+                       },
+               })
+               assert.NotNil(t, resp)
+               assert.NoError(t, err)
+               assert.Equal(t, scerr.ErrInvalidParams, resp.Response.GetCode())
+
+               resp, err = dep.Dependency().CreateDependency(getContext(), 
&pb.CreateDependenciesRequest{
+                       Dependencies: []*pb.ConsumerDependency{
+                               {
+                                       Consumer: &pb.MicroServiceKey{
+                                               AppId:       "create_dep_group",
+                                               ServiceName: 
"create_dep_consumer",
+                                               Version:     "latest",
+                                       },
+                                       Providers: providers,
+                               },
+                       },
+               })
+               assert.NotNil(t, resp)
+               assert.NoError(t, err)
+               assert.Equal(t, scerr.ErrInvalidParams, resp.Response.GetCode())
+
+               resp, err = dep.Dependency().CreateDependency(getContext(), 
&pb.CreateDependenciesRequest{
+                       Dependencies: []*pb.ConsumerDependency{
+                               {
+                                       Consumer: &pb.MicroServiceKey{
+                                               AppId:       "create_dep_group",
+                                               ServiceName: 
"create_dep_consumer",
+                                               Version:     "",
+                                       },
+                                       Providers: providers,
+                               },
+                       },
+               })
+               assert.NotNil(t, resp)
+               assert.NoError(t, err)
+               assert.Equal(t, scerr.ErrInvalidParams, resp.Response.GetCode())
+
+               resp, err = dep.Dependency().CreateDependency(getContext(), 
&pb.CreateDependenciesRequest{
+                       Dependencies: []*pb.ConsumerDependency{
+                               {
+                                       Consumer: &pb.MicroServiceKey{
+                                               AppId:       "create_dep_group",
+                                               ServiceName: "*",
+                                               Version:     "1.0.0",
+                                       },
+                                       Providers: providers,
+                               },
+                       },
+               })
+               assert.NotNil(t, resp)
+               assert.NoError(t, err)
+               assert.Equal(t, scerr.ErrInvalidParams, resp.Response.GetCode())
+
+               // provider app is invalid
+               resp, err = dep.Dependency().CreateDependency(getContext(), 
&pb.CreateDependenciesRequest{
+                       Dependencies: []*pb.ConsumerDependency{
+                               {
+                                       Consumer: consumer,
+                                       Providers: []*pb.MicroServiceKey{
+                                               {
+                                                       AppId:       "*",
+                                                       ServiceName: 
"service_name_provider",
+                                                       Version:     "2.0.0",
+                                               },
+                                       },
+                               },
+                       },
+               })
+               assert.NotNil(t, resp)
+               assert.NoError(t, err)
+               assert.Equal(t, scerr.ErrInvalidParams, resp.Response.GetCode())
+
+               // provider serviceName is invalid
+               resp, err = dep.Dependency().CreateDependency(getContext(), 
&pb.CreateDependenciesRequest{
+                       Dependencies: []*pb.ConsumerDependency{
+                               {
+                                       Consumer: consumer,
+                                       Providers: []*pb.MicroServiceKey{
+                                               {
+                                                       AppId:       
"service_group_provider",
+                                                       ServiceName: "-",
+                                                       Version:     "2.0.0",
+                                               },
+                                       },
+                               },
+                       },
+               })
+               assert.NotNil(t, resp)
+               assert.NoError(t, err)
+               assert.Equal(t, scerr.ErrInvalidParams, resp.Response.GetCode())
+
+               // provider version is invalid
+               resp, err = dep.Dependency().CreateDependency(getContext(), 
&pb.CreateDependenciesRequest{
+                       Dependencies: []*pb.ConsumerDependency{
+                               {
+                                       Consumer: consumer,
+                                       Providers: []*pb.MicroServiceKey{
+                                               {
+                                                       AppId:       
"service_group_provider",
+                                                       ServiceName: 
"service_name_provider",
+                                                       Version:     "",
+                                               },
+                                       },
+                               },
+                       },
+               })
+               assert.NotNil(t, resp)
+               assert.NoError(t, err)
+               assert.Equal(t, scerr.ErrInvalidParams, resp.Response.GetCode())
+
+               // provider in diff env
+               resp, err = dep.Dependency().CreateDependency(getContext(), 
&pb.CreateDependenciesRequest{
+                       Dependencies: []*pb.ConsumerDependency{
+                               {
+                                       Consumer: consumer,
+                                       Providers: []*pb.MicroServiceKey{
+                                               {
+                                                       Environment: 
pb.ENV_PROD,
+                                                       AppId:       
"service_group_provider",
+                                                       ServiceName: 
"service_name_provider",
+                                                       Version:     "latest",
+                                               },
+                                       },
+                               },
+                       },
+               })
+               assert.NotNil(t, resp)
+               assert.NoError(t, err)
+               assert.Equal(t, proto.Response_SUCCESS, resp.Response.GetCode())
+
+               // consumer in diff env
+               consumer.Environment = pb.ENV_PROD
+               resp, err = dep.Dependency().CreateDependency(getContext(), 
&pb.CreateDependenciesRequest{
+                       Dependencies: []*pb.ConsumerDependency{
+                               {
+                                       Consumer: consumer,
+                                       Providers: []*pb.MicroServiceKey{
+                                               {
+                                                       AppId:       
"service_group_provider",
+                                                       ServiceName: 
"service_name_provider",
+                                                       Version:     "latest",
+                                               },
+                                       },
+                               },
+                       },
+               })
+               assert.NotNil(t, resp)
+               assert.NoError(t, err)
+               assert.Equal(t, proto.Response_SUCCESS, resp.Response.GetCode())
+
+               assert.Equal(t, nil, deh.Handle())
+
+               respCon, err := 
serviceResource.GetConsumerDependencies(getContext(), 
&pb.GetDependenciesRequest{
+                       ServiceId: consumerId1,
+               })
+               assert.NotNil(t, respCon)
+               assert.NoError(t, err)
+               assert.Equal(t, proto.Response_SUCCESS, 
respCon.Response.GetCode())
+               assert.Equal(t, 0, len(respCon.Providers))
+
+               respCon, err = 
serviceResource.GetConsumerDependencies(getContext(), 
&pb.GetDependenciesRequest{
+                       ServiceId: consumerId2,
+               })
+               assert.NotNil(t, respCon)
+               assert.NoError(t, err)
+               assert.Equal(t, proto.Response_SUCCESS, 
respCon.Response.GetCode())
+               assert.Equal(t, 0, len(respCon.Providers))
+
+               // dependencies is invalid
+               var deps []*pb.ConsumerDependency
+               for i := 0; i < 101; i++ {
+                       deps = append(deps, &pb.ConsumerDependency{
+                               Consumer: &pb.MicroServiceKey{
+                                       AppId:       "create_dep_group",
+                                       ServiceName: "create_dep_consumer" + 
strconv.Itoa(i),
+                                       Version:     "1.0.0",
+                               },
+                               Providers: []*pb.MicroServiceKey{
+                                       {
+                                               AppId:       
"service_group_provider",
+                                               ServiceName: 
"service_name_provider",
+                                               Version:     "latest",
+                                       },
+                               },
+                       })
+               }
+               resp, err = 
serviceResource.CreateDependenciesForMicroServices(getContext(), 
&pb.CreateDependenciesRequest{
+                       Dependencies: deps,
+               })
+               assert.NotNil(t, resp)
+               assert.NoError(t, err)
+               assert.Equal(t, scerr.ErrInvalidParams, resp.Response.GetCode())
+       })
+
+       t.Run("when request is valid, should be passed", func(t *testing.T) {
+               consumer := &pb.MicroServiceKey{
+                       ServiceName: "create_dep_consumer",
+                       AppId:       "create_dep_group",
+                       Version:     "1.0.0",
+               }
+
+               // add latest
+               resp, err := dep.Dependency().CreateDependency(getContext(), 
&pb.CreateDependenciesRequest{
+                       Dependencies: []*pb.ConsumerDependency{
+                               {
+                                       Consumer: consumer,
+                                       Providers: []*pb.MicroServiceKey{
+                                               {
+                                                       AppId:       
"create_dep_group",
+                                                       ServiceName: 
"create_dep_provider",
+                                                       Version:     "latest",
+                                               },
+                                       },
+                               },
+                       },
+               })
+               assert.NotNil(t, resp)
+               assert.NoError(t, err)
+               assert.Equal(t, proto.Response_SUCCESS, resp.Response.GetCode())
+
+               assert.Equal(t, nil, deh.Handle())
+
+               respPro, err := 
dep.Dependency().SearchConsumerDependency(getContext(), 
&pb.GetDependenciesRequest{
+                       ServiceId: consumerId1,
+               })
+               assert.NotNil(t, respPro)
+               assert.NoError(t, err)
+               assert.Equal(t, proto.Response_SUCCESS, 
respPro.Response.GetCode())
+
+               // add 1.0.0+
+               resp, err = dep.Dependency().CreateDependency(getContext(), 
&pb.CreateDependenciesRequest{
+                       Dependencies: []*pb.ConsumerDependency{
+                               {
+                                       Consumer: consumer,
+                                       Providers: []*pb.MicroServiceKey{
+                                               {
+                                                       AppId:       
"create_dep_group",
+                                                       ServiceName: 
"create_dep_provider",
+                                                       Version:     "1.0.0+",
+                                               },
+                                       },
+                               },
+                       },
+               })
+               assert.NotNil(t, resp)
+               assert.NoError(t, err)
+               assert.Equal(t, proto.Response_SUCCESS, resp.Response.GetCode())
+
+               respPro, err = 
dep.Dependency().SearchConsumerDependency(getContext(), 
&pb.GetDependenciesRequest{
+                       ServiceId: consumerId1,
+               })
+               assert.NotNil(t, respPro)
+               assert.NoError(t, err)
+               assert.Equal(t, proto.Response_SUCCESS, 
respPro.Response.GetCode())
+
+               // add *
+               resp, err = dep.Dependency().CreateDependency(getContext(), 
&pb.CreateDependenciesRequest{
+                       Dependencies: []*pb.ConsumerDependency{
+                               {
+                                       Consumer: &pb.MicroServiceKey{
+                                               ServiceName: 
"create_dep_consumer_all",
+                                               AppId:       "create_dep_group",
+                                               Version:     "1.0.0",
+                                       },
+                                       Providers: []*pb.MicroServiceKey{
+                                               {
+                                                       ServiceName: "*",
+                                               },
+                                       },
+                               },
+                       },
+               })
+               assert.NotNil(t, resp)
+               assert.NoError(t, err)
+               assert.Equal(t, proto.Response_SUCCESS, resp.Response.GetCode())
+
+               respPro, err = 
dep.Dependency().SearchConsumerDependency(getContext(), 
&pb.GetDependenciesRequest{
+                       ServiceId: consumerId3,
+               })
+               assert.NotNil(t, respPro)
+               assert.NoError(t, err)
+               assert.Equal(t, proto.Response_SUCCESS, 
respPro.Response.GetCode())
+               assert.Equal(t, 0, len(respPro.Providers))
+
+               // clean all
+               resp, err = dep.Dependency().CreateDependency(getContext(), 
&pb.CreateDependenciesRequest{
+                       Dependencies: []*pb.ConsumerDependency{
+                               {
+                                       Consumer: &pb.MicroServiceKey{
+                                               ServiceName: 
"create_dep_consumer_all",
+                                               AppId:       "create_dep_group",
+                                               Version:     "1.0.0",
+                                       },
+                                       Providers: nil,
+                               },
+                       },
+               })
+               assert.NotNil(t, resp)
+               assert.NoError(t, err)
+               assert.Equal(t, proto.Response_SUCCESS, resp.Response.GetCode())
+
+               // add multiple providers
+               resp, err = dep.Dependency().CreateDependency(getContext(), 
&pb.CreateDependenciesRequest{
+                       Dependencies: []*pb.ConsumerDependency{
+                               {
+                                       Consumer: consumer,
+                                       Providers: []*pb.MicroServiceKey{
+                                               {
+                                                       AppId:       
"create_dep_group",
+                                                       ServiceName: 
"create_dep_provider",
+                                                       Version:     "1.0.0",
+                                               },
+                                               {
+                                                       ServiceName: "*",
+                                               },
+                                       },
+                               },
+                       },
+               })
+               assert.NotNil(t, resp)
+               assert.NoError(t, err)
+               assert.Equal(t, proto.Response_SUCCESS, resp.Response.GetCode())
+
+               // add 1.0.0-2.0.0 to override *
+               resp, err = dep.Dependency().CreateDependency(getContext(), 
&pb.CreateDependenciesRequest{
+                       Dependencies: []*pb.ConsumerDependency{
+                               {
+                                       Consumer: consumer,
+                                       Providers: []*pb.MicroServiceKey{
+                                               {
+                                                       AppId:       
"create_dep_group",
+                                                       ServiceName: 
"create_dep_provider",
+                                                       Version:     
"1.0.0-1.0.1",
+                                               },
+                                       },
+                               },
+                       },
+               })
+               assert.NotNil(t, resp)
+               assert.NoError(t, err)
+               assert.Equal(t, proto.Response_SUCCESS, resp.Response.GetCode())
+
+               assert.Equal(t, nil, deh.Handle())
+
+               respPro, err = 
dep.Dependency().SearchConsumerDependency(getContext(), 
&pb.GetDependenciesRequest{
+                       ServiceId: consumerId1,
+               })
+               assert.NotNil(t, respPro)
+               assert.NoError(t, err)
+               assert.Equal(t, proto.Response_SUCCESS, 
respPro.Response.GetCode())
+               assert.Equal(t, "1.0.0", respPro.Providers[0].Version)
+
+               // add not override
+               respAdd, err := dep.Dependency().AddDependency(getContext(), 
&pb.AddDependenciesRequest{
+                       Dependencies: []*pb.ConsumerDependency{
+                               {
+                                       Consumer: consumer,
+                                       Providers: []*pb.MicroServiceKey{
+                                               {
+                                                       AppId:       
"create_dep_group",
+                                                       ServiceName: 
"create_dep_provider",
+                                                       Version:     
"1.0.0-3.0.0",
+                                               },
+                                       },
+                               },
+                       },
+               })
+               assert.NotNil(t, respAdd)
+               assert.NoError(t, err)
+               assert.Equal(t, proto.Response_SUCCESS, 
respAdd.Response.GetCode())
+
+               assert.Equal(t, nil, deh.Handle())
+
+               respPro, err = 
dep.Dependency().SearchConsumerDependency(getContext(), 
&pb.GetDependenciesRequest{
+                       ServiceId: consumerId1,
+               })
+               assert.NotNil(t, respPro)
+               assert.NoError(t, err)
+               assert.Equal(t, proto.Response_SUCCESS, 
respPro.Response.GetCode())
+
+               // add provider is empty
+               resp, err = dep.Dependency().CreateDependency(getContext(), 
&pb.CreateDependenciesRequest{
+                       Dependencies: []*pb.ConsumerDependency{
+                               {
+                                       Consumer:  consumer,
+                                       Providers: []*pb.MicroServiceKey{},
+                               },
+                       },
+               })
+               assert.NotNil(t, resp)
+               assert.NoError(t, err)
+               assert.Equal(t, proto.Response_SUCCESS, resp.Response.GetCode())
+
+               resp, err = dep.Dependency().CreateDependency(getContext(), 
&pb.CreateDependenciesRequest{
+                       Dependencies: []*pb.ConsumerDependency{
+                               {
+                                       Consumer: consumer,
+                               },
+                       },
+               })
+               assert.NotNil(t, resp)
+               assert.NoError(t, err)
+               assert.Equal(t, proto.Response_SUCCESS, resp.Response.GetCode())
+
+               assert.Equal(t, nil, deh.Handle())
+
+               respPro, err = 
dep.Dependency().SearchConsumerDependency(getContext(), 
&pb.GetDependenciesRequest{
+                       ServiceId: consumerId1,
+               })
+               assert.NotNil(t, respPro)
+               assert.NoError(t, err)
+               assert.Equal(t, proto.Response_SUCCESS, 
respPro.Response.GetCode())
+               //assert.Equal(t, 0, len(respPro.Providers))
+
+       })
+}
+
+func Test_Get(t *testing.T) {
+       dep.Install("etcd", func(opts dep.Options) (dep.DataSource, error) {
+               return etcd.NewDataSource(), nil
+       })
+
+       err := dep.Init(dep.Options{
+               Endpoint:       "",
+               PluginImplName: 
dep.ImplName(archaius.GetString("servicecomb.ms.name", "etcd")),
+       })
+       assert.NoError(t, err)
+
+       var (
+               consumerId1 string
+               providerId1 string
+               providerId2 string
+       )
+
+       t.Run("should be passed", func(t *testing.T) {
+               resp, err := serviceResource.Create(getContext(), 
&pb.CreateServiceRequest{
+                       Service: &pb.MicroService{
+                               AppId:       "get_dep_group",
+                               ServiceName: "get_dep_consumer",
+                               Version:     "1.0.0",
+                               Level:       "FRONT",
+                               Status:      pb.MS_UP,
+                       },
+               })
+               assert.NotNil(t, resp)
+               assert.NoError(t, err)
+               assert.Equal(t, proto.Response_SUCCESS, resp.Response.GetCode())
+               consumerId1 = resp.ServiceId
+
+               resp, err = serviceResource.Create(getContext(), 
&pb.CreateServiceRequest{
+                       Service: &pb.MicroService{
+                               AppId:       "get_dep_group",
+                               ServiceName: "get_dep_provider",
+                               Version:     "1.0.0",
+                               Level:       "FRONT",
+                               Status:      pb.MS_UP,
+                       },
+               })
+               assert.NotNil(t, resp)
+               assert.NoError(t, err)
+               assert.Equal(t, proto.Response_SUCCESS, resp.Response.GetCode())
+               providerId1 = resp.ServiceId
+
+               resp, err = serviceResource.Create(getContext(), 
&pb.CreateServiceRequest{
+                       Service: &pb.MicroService{
+                               AppId:       "get_dep_group",
+                               ServiceName: "get_dep_provider",
+                               Version:     "2.0.0",
+                               Level:       "FRONT",
+                               Status:      pb.MS_UP,
+                       },
+               })
+               assert.NotNil(t, resp)
+               assert.NoError(t, err)
+               assert.Equal(t, proto.Response_SUCCESS, resp.Response.GetCode())
+               providerId2 = resp.ServiceId
+       })
+
+       t.Run("when request is invalid, should be failed", func(t *testing.T) {
+               //service id is empty when get provider
+               resp, err := 
dep.Dependency().SearchProviderDependency(getContext(), 
&pb.GetDependenciesRequest{
+                       ServiceId: "",
+               })
+               assert.NotNil(t, resp)
+               assert.NoError(t, err)
+               assert.Equal(t, scerr.ErrInvalidParams, resp.Response.GetCode())
+
+               //service does not exist when get provider
+               resp, err = 
dep.Dependency().SearchProviderDependency(getContext(), 
&pb.GetDependenciesRequest{
+                       ServiceId: "noneservice",
+               })
+               assert.NotNil(t, resp)
+               assert.NoError(t, err)
+               assert.Equal(t, scerr.ErrServiceNotExists, 
resp.Response.GetCode())
+
+               //service id is empty when get consumer
+               resp, err = 
dep.Dependency().SearchProviderDependency(getContext(), 
&pb.GetDependenciesRequest{
+                       ServiceId: "",
+               })
+               assert.NotNil(t, resp)
+               assert.NoError(t, err)
+               assert.Equal(t, scerr.ErrInvalidParams, resp.Response.GetCode())
+
+               //service does not exist when get consumer
+               resp, err = 
dep.Dependency().SearchProviderDependency(getContext(), 
&pb.GetDependenciesRequest{
+                       ServiceId: "noneservice",
+               })
+               assert.NotNil(t, resp)
+               assert.NoError(t, err)
+               assert.Equal(t, scerr.ErrServiceNotExists, 
resp.Response.GetCode())
+       })
+
+       t.Run("when request is valid, should be passed", func(t *testing.T) {
+               //get provider
+               resp, err := 
dep.Dependency().SearchProviderDependency(getContext(), 
&pb.GetDependenciesRequest{
+                       ServiceId: providerId1,
+               })
+               assert.NotNil(t, resp)
+               assert.NoError(t, err)
+               assert.Equal(t, proto.Response_SUCCESS, resp.Response.GetCode())
+
+               //get consumer
+               resp, err = 
dep.Dependency().SearchProviderDependency(getContext(), 
&pb.GetDependenciesRequest{
+                       ServiceId: consumerId1,
+               })
+               assert.NotNil(t, resp)
+               assert.NoError(t, err)
+               assert.Equal(t, proto.Response_SUCCESS, resp.Response.GetCode())
+       })
+
+       t.Run("when after finding instance, should created dependencies between 
C and P", func(t *testing.T) {
+               // find provider
+               resp, err := instanceResource.Find(getContext(), 
&pb.FindInstancesRequest{
+                       ConsumerServiceId: consumerId1,
+                       AppId:             "get_dep_group",
+                       ServiceName:       "get_dep_provider",
+                       VersionRule:       "1.0.0+",
+               })
+               assert.NotNil(t, resp)
+               assert.NoError(t, err)
+               assert.Equal(t, proto.Response_SUCCESS, resp.Response.GetCode())
+
+               assert.Equal(t, nil, deh.Handle())
+
+               // get consumer's deps
+               respGetP, err := 
dep.Dependency().SearchProviderDependency(getContext(), 
&pb.GetDependenciesRequest{
+                       ServiceId: providerId1,
+               })
+               assert.NotNil(t, respGetP)
+               assert.NoError(t, err)
+               assert.Equal(t, proto.Response_SUCCESS, 
respGetP.Response.GetCode())
+
+               // get provider's deps
+               respGetC, err := 
serviceResource.GetConsumerDependencies(getContext(), 
&pb.GetDependenciesRequest{
+                       ServiceId: consumerId1,
+               })
+               assert.NotNil(t, respGetC)
+               assert.NoError(t, err)
+               assert.Equal(t, proto.Response_SUCCESS, 
respGetC.Response.GetCode())
+
+               // get self deps
+               resp, err = instanceResource.Find(getContext(), 
&pb.FindInstancesRequest{
+                       ConsumerServiceId: consumerId1,
+                       AppId:             "get_dep_group",
+                       ServiceName:       "get_dep_consumer",
+                       VersionRule:       "1.0.0+",
+               })
+               assert.NotNil(t, resp)
+               assert.NoError(t, err)
+               assert.Equal(t, proto.Response_SUCCESS, resp.Response.GetCode())
+
+               assert.Equal(t, nil, deh.Handle())
+
+               respGetC, err = 
dep.Dependency().SearchConsumerDependency(getContext(), 
&pb.GetDependenciesRequest{
+                       ServiceId: consumerId1,
+                       NoSelf:    true,
+               })
+               assert.NotNil(t, respGetC)
+               assert.NoError(t, err)
+               assert.Equal(t, proto.Response_SUCCESS, 
respGetC.Response.GetCode())
+
+               // find before provider register
+               resp, err = instanceResource.Find(getContext(), 
&pb.FindInstancesRequest{
+                       ConsumerServiceId: providerId2,
+                       AppId:             "get_dep_group",
+                       ServiceName:       "get_dep_finder",
+                       VersionRule:       "1.0.0+",
+               })
+               assert.NotNil(t, resp)
+               assert.NoError(t, err)
+               assert.Equal(t, proto.Response_SUCCESS, resp.Response.GetCode())
+
+               respCreateF, err := serviceResource.Create(getContext(), 
&pb.CreateServiceRequest{
+                       Service: &pb.MicroService{
+                               AppId:       "get_dep_group",
+                               ServiceName: "get_dep_finder",
+                               Version:     "1.0.0",
+                               Level:       "FRONT",
+                               Status:      pb.MS_UP,
+                       },
+               })
+               assert.NotNil(t, respCreateF)
+               assert.NoError(t, err)
+               assert.Equal(t, proto.Response_SUCCESS, 
respCreateF.Response.GetCode())
+               finder1 := respCreateF.ServiceId
+
+               resp, err = instanceResource.Find(getContext(), 
&pb.FindInstancesRequest{
+                       ConsumerServiceId: providerId2,
+                       AppId:             "get_dep_group",
+                       ServiceName:       "get_dep_finder",
+                       VersionRule:       "1.0.0+",
+               })
+               assert.NotNil(t, resp)
+               assert.NoError(t, err)
+               assert.Equal(t, proto.Response_SUCCESS, resp.Response.GetCode())
+
+               assert.Equal(t, nil, deh.Handle())
+
+               respGetC, err = 
dep.Dependency().SearchConsumerDependency(getContext(), 
&pb.GetDependenciesRequest{
+                       ServiceId: providerId2,
+               })
+               assert.NotNil(t, respGetC)
+               assert.NoError(t, err)
+               assert.Equal(t, proto.Response_SUCCESS, 
respGetC.Response.GetCode())
+               assert.Equal(t, 1, len(respGetC.Providers))
+               assert.Equal(t, finder1, respGetC.Providers[0].ServiceId)
+
+               // find after delete micro service
+               respDelP, err := serviceResource.Delete(getContext(), 
&pb.DeleteServiceRequest{
+                       ServiceId: finder1, Force: true,
+               })
+               assert.NotNil(t, respDelP)
+               assert.NoError(t, err)
+               assert.Equal(t, proto.Response_SUCCESS, 
respDelP.Response.GetCode())
+
+               assert.Equal(t, nil, deh.Handle())
+
+               respGetC, err = 
dep.Dependency().SearchConsumerDependency(getContext(), 
&pb.GetDependenciesRequest{
+                       ServiceId: providerId2,
+               })
+               assert.NotNil(t, respGetC)
+               assert.NoError(t, err)
+               assert.Equal(t, proto.Response_SUCCESS, 
respGetC.Response.GetCode())
+               assert.Equal(t, 0, len(respGetC.Providers))
+
+               respCreateF, err = serviceResource.Create(getContext(), 
&pb.CreateServiceRequest{
+                       Service: &pb.MicroService{
+                               ServiceId:   finder1,
+                               AppId:       "get_dep_group",
+                               ServiceName: "get_dep_finder",
+                               Version:     "1.0.0",
+                               Level:       "FRONT",
+                               Status:      pb.MS_UP,
+                       },
+               })
+               assert.NotNil(t, respCreateF)
+               assert.NoError(t, err)
+               assert.Equal(t, proto.Response_SUCCESS, 
respCreateF.Response.GetCode())
+
+               resp, err = instanceResource.Find(getContext(), 
&pb.FindInstancesRequest{
+                       ConsumerServiceId: providerId2,
+                       AppId:             "get_dep_group",
+                       ServiceName:       "get_dep_finder",
+                       VersionRule:       "1.0.0+",
+               })
+               assert.NotNil(t, resp)
+               assert.NoError(t, err)
+               assert.Equal(t, proto.Response_SUCCESS, resp.Response.GetCode())
+
+               assert.Equal(t, nil, deh.Handle())
+
+               respGetC, err = 
dep.Dependency().SearchConsumerDependency(getContext(), 
&pb.GetDependenciesRequest{
+                       ServiceId: providerId2,
+               })
+               assert.NotNil(t, respGetC)
+               assert.NoError(t, err)
+               assert.Equal(t, proto.Response_SUCCESS, 
respGetC.Response.GetCode())
+               assert.Equal(t, 1, len(respGetC.Providers))
+               assert.Equal(t, finder1, respGetC.Providers[0].ServiceId)
+       })
+}

Reply via email to