/*
 * 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 service_test

import (
	pb "github.com/apache/servicecomb-service-center/server/core/proto"
	scerr "github.com/apache/servicecomb-service-center/server/error"
	"github.com/apache/servicecomb-service-center/server/plugin/pkg/quota"
	. "github.com/onsi/ginkgo"
	. "github.com/onsi/gomega"
	"strconv"
)

var _ = Describe("'Rule' service", func() {
	Describe("execute 'create' operartion", func() {
		var (
			serviceId1 string
			serviceId2 string
		)

		It("should be passed", func() {
			respCreateService, err := serviceResource.Create(getContext(), &pb.CreateServiceRequest{
				Service: &pb.MicroService{
					AppId:       "create_rule_group",
					ServiceName: "create_rule_service",
					Version:     "1.0.0",
					Level:       "FRONT",
					Status:      pb.MS_UP,
				},
			})
			Expect(err).To(BeNil())
			Expect(respCreateService.Response.Code).To(Equal(pb.Response_SUCCESS))
			serviceId1 = respCreateService.ServiceId

			respCreateService, err = serviceResource.Create(getContext(), &pb.CreateServiceRequest{
				Service: &pb.MicroService{
					AppId:       "create_rule_group",
					ServiceName: "create_rule_service",
					Version:     "1.0.1",
					Level:       "FRONT",
					Status:      pb.MS_UP,
				},
			})
			Expect(err).To(BeNil())
			Expect(respCreateService.Response.Code).To(Equal(pb.Response_SUCCESS))
			serviceId2 = respCreateService.ServiceId
		})

		Context("when request is invalid", func() {
			It("should be failed", func() {
				By("attribute is empty")
				respAddRule, err := serviceResource.AddRule(getContext(), &pb.AddServiceRulesRequest{
					ServiceId: serviceId1,
					Rules: []*pb.AddOrUpdateServiceRule{
						{
							RuleType:    "BLACK",
							Attribute:   "",
							Pattern:     "Test*",
							Description: "test BLACK",
						},
					},
				})
				Expect(err).To(BeNil())
				Expect(respAddRule.Response.Code).ToNot(Equal(pb.Response_SUCCESS))

				By("attribute is tag but name is invalid")
				respAddRule, err = serviceResource.AddRule(getContext(), &pb.AddServiceRulesRequest{
					ServiceId: serviceId1,
					Rules: []*pb.AddOrUpdateServiceRule{
						{
							RuleType:    "BLACK",
							Attribute:   "tag_@34",
							Pattern:     "Test*",
							Description: "test BLACK",
						},
					},
				})
				Expect(err).To(BeNil())
				Expect(respAddRule.Response.Code).ToNot(Equal(pb.Response_SUCCESS))

				By("attribute is a invalid field name")
				respAddRule, err = serviceResource.AddRule(getContext(), &pb.AddServiceRulesRequest{
					ServiceId: serviceId1,
					Rules: []*pb.AddOrUpdateServiceRule{
						{
							RuleType:    "BLACK",
							Attribute:   "xxx",
							Pattern:     "Test*",
							Description: "test BLACK",
						},
					},
				})
				Expect(err).To(BeNil())
				Expect(respAddRule.Response.Code).ToNot(Equal(pb.Response_SUCCESS))

				By("service does not exist")
				respAddRule, err = serviceResource.AddRule(getContext(), &pb.AddServiceRulesRequest{
					ServiceId: "notexistservice",
					Rules: []*pb.AddOrUpdateServiceRule{
						{
							RuleType:    "BLACK",
							Attribute:   "ServiceName",
							Pattern:     "Test*",
							Description: "test white",
						},
					},
				})
				Expect(err).To(BeNil())
				Expect(respAddRule.Response.Code).ToNot(Equal(pb.Response_SUCCESS))

				By("service id is empty")
				respAddRule, err = serviceResource.AddRule(getContext(), &pb.AddServiceRulesRequest{
					ServiceId: "",
					Rules: []*pb.AddOrUpdateServiceRule{
						{
							RuleType:    "BLACK",
							Attribute:   "",
							Pattern:     "Test*",
							Description: "test white",
						},
					},
				})
				Expect(err).To(BeNil())
				Expect(respAddRule.Response.Code).ToNot(Equal(pb.Response_SUCCESS))

				By("rules is nil")
				respAddRule, err = serviceResource.AddRule(getContext(), &pb.AddServiceRulesRequest{
					ServiceId: serviceId1,
				})
				Expect(err).To(BeNil())
				Expect(respAddRule.Response.Code).To(Equal(scerr.ErrInvalidParams))
			})
		})

		Context("when request is valid", func() {
			It("should be passed", func() {
				By("create a new black list")
				respAddRule, err := serviceResource.AddRule(getContext(), &pb.AddServiceRulesRequest{
					ServiceId: serviceId1,
					Rules: []*pb.AddOrUpdateServiceRule{
						{
							RuleType:    "BLACK",
							Attribute:   "ServiceName",
							Pattern:     "Test*",
							Description: "test black",
						},
					},
				})
				Expect(err).To(BeNil())
				Expect(respAddRule.Response.Code).To(Equal(pb.Response_SUCCESS))
				ruleId := respAddRule.RuleIds[0]
				Expect(ruleId).ToNot(Equal(""))

				By("create the black list again")
				respAddRule, err = serviceResource.AddRule(getContext(), &pb.AddServiceRulesRequest{
					ServiceId: serviceId1,
					Rules: []*pb.AddOrUpdateServiceRule{
						{
							RuleType:    "BLACK",
							Attribute:   "ServiceName",
							Pattern:     "Test*",
							Description: "test change black",
						},
					},
				})
				Expect(err).To(BeNil())
				Expect(respAddRule.Response.Code).To(Equal(pb.Response_SUCCESS))
				Expect(len(respAddRule.RuleIds)).To(Equal(0)) // no changed

				By("create a new white list when black list already exists")
				respAddRule, err = serviceResource.AddRule(getContext(), &pb.AddServiceRulesRequest{
					ServiceId: serviceId1,
					Rules: []*pb.AddOrUpdateServiceRule{
						{
							RuleType:    "WHITE",
							Attribute:   "ServiceName",
							Pattern:     "Test*",
							Description: "test white",
						},
					},
				})
				Expect(err).To(BeNil())
				Expect(respAddRule.Response.Code).ToNot(Equal(pb.Response_SUCCESS))
			})
		})

		Context("when create rule out of gauge", func() {
			It("should be failed", func() {
				size := quota.DefaultRuleQuota + 1
				rules := make([]*pb.AddOrUpdateServiceRule, 0, size)
				for i := 0; i < size; i++ {
					rules = append(rules, &pb.AddOrUpdateServiceRule{
						RuleType:    "BLACK",
						Attribute:   "ServiceName",
						Pattern:     strconv.Itoa(i),
						Description: "test white",
					})
				}
				resp, err := serviceResource.AddRule(getContext(), &pb.AddServiceRulesRequest{
					ServiceId: serviceId2,
					Rules:     rules,
				})
				Expect(err).To(BeNil())
				Expect(resp.Response.Code).To(Equal(scerr.ErrInvalidParams))

				resp, err = serviceResource.AddRule(getContext(), &pb.AddServiceRulesRequest{
					ServiceId: serviceId2,
					Rules:     rules[:size-1],
				})
				Expect(err).To(BeNil())
				Expect(resp.Response.Code).To(Equal(pb.Response_SUCCESS))

				resp, err = serviceResource.AddRule(getContext(), &pb.AddServiceRulesRequest{
					ServiceId: serviceId2,
					Rules:     rules[size-1:],
				})
				Expect(err).To(BeNil())
				Expect(resp.Response.Code).To(Equal(scerr.ErrNotEnoughQuota))
			})
		})
	})

	Describe("execute 'get' operartion", func() {
		var (
			serviceId string
			ruleId    string
		)

		It("should be passed", func() {
			respCreateService, err := serviceResource.Create(getContext(), &pb.CreateServiceRequest{
				Service: &pb.MicroService{
					AppId:       "get_rule_group",
					ServiceName: "get_rule_service",
					Version:     "1.0.0",
					Level:       "FRONT",
					Status:      pb.MS_UP,
				},
			})
			Expect(err).To(BeNil())
			Expect(respCreateService.Response.Code).To(Equal(pb.Response_SUCCESS))
			serviceId = respCreateService.ServiceId

			respAddRule, err := serviceResource.AddRule(getContext(), &pb.AddServiceRulesRequest{
				ServiceId: serviceId,
				Rules: []*pb.AddOrUpdateServiceRule{
					{
						RuleType:    "BLACK",
						Attribute:   "ServiceName",
						Pattern:     "Test*",
						Description: "test BLACK",
					},
				},
			})
			Expect(err).To(BeNil())
			Expect(respAddRule.Response.Code).To(Equal(pb.Response_SUCCESS))
			ruleId = respAddRule.RuleIds[0]
			Expect(ruleId).ToNot(Equal(""))
		})

		Context("when request is invalid", func() {
			It("should be failed", func() {
				By("service id is invalid")
				respGetRule, err := serviceResource.GetRule(getContext(), &pb.GetServiceRulesRequest{
					ServiceId: "",
				})
				Expect(err).To(BeNil())
				Expect(respGetRule.Response.Code).To(Equal(scerr.ErrInvalidParams))

				respGetRule, err = serviceResource.GetRule(getContext(), &pb.GetServiceRulesRequest{
					ServiceId: TOO_LONG_SERVICEID,
				})
				Expect(err).To(BeNil())
				Expect(respGetRule.Response.Code).To(Equal(scerr.ErrInvalidParams))

				By("service does not exist")
				respGetRule, err = serviceResource.GetRule(getContext(), &pb.GetServiceRulesRequest{
					ServiceId: "notexist",
				})
				Expect(err).To(BeNil())
				Expect(respGetRule.Response.Code).To(Equal(scerr.ErrServiceNotExists))
			})
		})

		Context("when request is valid", func() {
			It("should be passed", func() {
				respGetRule, err := serviceResource.GetRule(getContext(), &pb.GetServiceRulesRequest{
					ServiceId: serviceId,
				})
				Expect(err).To(BeNil())
				Expect(respGetRule.Response.Code).To(Equal(pb.Response_SUCCESS))
				Expect(respGetRule.Rules[0].RuleId).To(Equal(ruleId))
			})
		})
	})

	Describe("execute 'update' operartion", func() {
		var (
			serviceId string
			ruleId    string
		)

		It("should be passed", func() {
			respCreateService, err := serviceResource.Create(getContext(), &pb.CreateServiceRequest{
				Service: &pb.MicroService{
					AppId:       "update_rule_group",
					ServiceName: "update_rule_service",
					Version:     "1.0.0",
					Level:       "FRONT",
					Status:      pb.MS_UP,
				},
			})
			Expect(err).To(BeNil())
			Expect(respCreateService.Response.Code).To(Equal(pb.Response_SUCCESS))
			serviceId = respCreateService.ServiceId

			respAddRule, err := serviceResource.AddRule(getContext(), &pb.AddServiceRulesRequest{
				ServiceId: serviceId,
				Rules: []*pb.AddOrUpdateServiceRule{
					{
						RuleType:    "BLACK",
						Attribute:   "ServiceName",
						Pattern:     "Test*",
						Description: "test BLACK",
					},
				},
			})
			Expect(err).To(BeNil())
			Expect(respAddRule.Response.Code).To(Equal(pb.Response_SUCCESS))
			ruleId = respAddRule.RuleIds[0]
			Expect(ruleId).ToNot(Equal(""))
		})

		Context("when request is invalid", func() {
			It("should be failed", func() {
				rule := &pb.AddOrUpdateServiceRule{
					RuleType:    "BLACK",
					Attribute:   "ServiceName",
					Pattern:     "Test*",
					Description: "test BLACK update",
				}
				By("service id is empty")
				respAddRule, err := serviceResource.UpdateRule(getContext(), &pb.UpdateServiceRuleRequest{
					ServiceId: "",
					RuleId:    ruleId,
					Rule:      rule,
				})
				Expect(err).To(BeNil())
				Expect(respAddRule.Response.Code).ToNot(Equal(pb.Response_SUCCESS))

				By("service does not exist")
				respAddRule, err = serviceResource.UpdateRule(getContext(), &pb.UpdateServiceRuleRequest{
					ServiceId: "notexistservice",
					RuleId:    ruleId,
					Rule:      rule,
				})
				Expect(err).To(BeNil())
				Expect(respAddRule.Response.Code).ToNot(Equal(pb.Response_SUCCESS))

				By("rule id is empty")
				respAddRule, err = serviceResource.UpdateRule(getContext(), &pb.UpdateServiceRuleRequest{
					ServiceId: serviceId,
					RuleId:    "",
					Rule:      rule,
				})
				Expect(err).To(BeNil())
				Expect(respAddRule.Response.Code).ToNot(Equal(pb.Response_SUCCESS))

				By("rule does not exist")
				respAddRule, err = serviceResource.UpdateRule(getContext(), &pb.UpdateServiceRuleRequest{
					ServiceId: serviceId,
					RuleId:    "notexistrule",
					Rule:      rule,
				})
				Expect(err).To(BeNil())
				Expect(respAddRule.Response.Code).ToNot(Equal(pb.Response_SUCCESS))

				By("rule type is invalid")
				respAddRule, err = serviceResource.UpdateRule(getContext(), &pb.UpdateServiceRuleRequest{
					ServiceId: serviceId,
					RuleId:    ruleId,
					Rule: &pb.AddOrUpdateServiceRule{
						RuleType:    "notType",
						Attribute:   "ServiceName",
						Pattern:     "Test*",
						Description: "test BLACK update",
					},
				})
				Expect(err).To(BeNil())
				Expect(respAddRule.Response.Code).ToNot(Equal(pb.Response_SUCCESS))

				By("attribute is a invalid field name")
				respAddRule, err = serviceResource.UpdateRule(getContext(), &pb.UpdateServiceRuleRequest{
					ServiceId: serviceId,
					RuleId:    ruleId,
					Rule: &pb.AddOrUpdateServiceRule{
						RuleType:    "BLACK",
						Attribute:   "noattribute",
						Pattern:     "Test*",
						Description: "test BLACK update",
					},
				})
				Expect(err).To(BeNil())
				Expect(respAddRule.Response.Code).ToNot(Equal(pb.Response_SUCCESS))

				By("attribute is tag but name is invalid")
				respAddRule, err = serviceResource.UpdateRule(getContext(), &pb.UpdateServiceRuleRequest{
					ServiceId: serviceId,
					RuleId:    ruleId,
					Rule: &pb.AddOrUpdateServiceRule{
						RuleType:    "BLACK",
						Attribute:   "tag_@34",
						Pattern:     "Test*",
						Description: "test BLACK update",
					},
				})
				Expect(err).To(BeNil())
				Expect(respAddRule.Response.Code).ToNot(Equal(pb.Response_SUCCESS))

				By("change rule type")
				respAddRule, err = serviceResource.UpdateRule(getContext(), &pb.UpdateServiceRuleRequest{
					ServiceId: serviceId,
					RuleId:    ruleId,
					Rule: &pb.AddOrUpdateServiceRule{
						RuleType:    "WHITE",
						Attribute:   "ServiceName",
						Pattern:     "Test*",
						Description: "test white update",
					},
				})
				Expect(err).To(BeNil())
				Expect(respAddRule.Response.Code).ToNot(Equal(pb.Response_SUCCESS))
			})
		})

		Context("when request is valid", func() {
			It("should be passed", func() {
				respAddRule, err := serviceResource.UpdateRule(getContext(), &pb.UpdateServiceRuleRequest{
					ServiceId: serviceId,
					RuleId:    ruleId,
					Rule: &pb.AddOrUpdateServiceRule{
						RuleType:    "BLACK",
						Attribute:   "AppId",
						Pattern:     "Test*",
						Description: "test white update",
					},
				})
				Expect(err).To(BeNil())
				Expect(respAddRule.Response.Code).To(Equal(pb.Response_SUCCESS))
			})
		})
	})

	Describe("execute 'delete' operartion", func() {
		var (
			serviceId string
			ruleId    string
		)

		It("should be passed", func() {
			respCreateService, err := serviceResource.Create(getContext(), &pb.CreateServiceRequest{
				Service: &pb.MicroService{
					AppId:       "delete_rule_group",
					ServiceName: "delete_rule_service",
					Version:     "1.0.0",
					Level:       "FRONT",
					Status:      pb.MS_UP,
				},
			})
			Expect(err).To(BeNil())
			Expect(respCreateService.Response.Code).To(Equal(pb.Response_SUCCESS))
			serviceId = respCreateService.ServiceId

			respAddRule, err := serviceResource.AddRule(getContext(), &pb.AddServiceRulesRequest{
				ServiceId: serviceId,
				Rules: []*pb.AddOrUpdateServiceRule{
					{
						RuleType:    "BLACK",
						Attribute:   "ServiceName",
						Pattern:     "Test*",
						Description: "test BLACK",
					},
				},
			})
			Expect(err).To(BeNil())
			Expect(respAddRule.Response.Code).To(Equal(pb.Response_SUCCESS))
			ruleId = respAddRule.RuleIds[0]
			Expect(ruleId).ToNot(Equal(""))
		})

		Context("when request is invalid", func() {
			It("should be failed", func() {
				By("service id is empty")
				respAddRule, err := serviceResource.DeleteRule(getContext(), &pb.DeleteServiceRulesRequest{
					ServiceId: "",
					RuleIds:   []string{"1000000"},
				})
				Expect(err).To(BeNil())
				Expect(respAddRule.Response.Code).To(Equal(scerr.ErrInvalidParams))

				By("service does not exist")
				respAddRule, err = serviceResource.DeleteRule(getContext(), &pb.DeleteServiceRulesRequest{
					ServiceId: "notexistservice",
					RuleIds:   []string{"1000000"},
				})
				Expect(err).To(BeNil())
				Expect(respAddRule.Response.Code).To(Equal(scerr.ErrServiceNotExists))

				By("rule does not exist")
				respAddRule, err = serviceResource.DeleteRule(getContext(), &pb.DeleteServiceRulesRequest{
					ServiceId: serviceId,
					RuleIds:   []string{"notexistrule"},
				})
				Expect(err).To(BeNil())
				Expect(respAddRule.Response.Code).To(Equal(scerr.ErrRuleNotExists))

				By("rules is empty")
				respAddRule, err = serviceResource.DeleteRule(getContext(), &pb.DeleteServiceRulesRequest{
					ServiceId: serviceId,
				})
				Expect(err).To(BeNil())
				Expect(respAddRule.Response.Code).To(Equal(scerr.ErrInvalidParams))

				By("rules is invalid")
				var arr []string
				for i := 0; i < quota.DefaultRuleQuota+1; i++ {
					arr = append(arr, strconv.Itoa(i))
				}
				respAddRule, err = serviceResource.DeleteRule(getContext(), &pb.DeleteServiceRulesRequest{
					ServiceId: serviceId,
					RuleIds:   arr,
				})
				Expect(err).To(BeNil())
				Expect(respAddRule.Response.Code).To(Equal(scerr.ErrInvalidParams))

			})
		})

		Context("when request is valid", func() {
			It("should be passed", func() {
				respAddRule, err := serviceResource.DeleteRule(getContext(), &pb.DeleteServiceRulesRequest{
					ServiceId: serviceId,
					RuleIds:   []string{ruleId},
				})
				Expect(err).To(BeNil())
				Expect(respAddRule.Response.Code).To(Equal(pb.Response_SUCCESS))

				respGetRule, err := serviceResource.GetRule(getContext(), &pb.GetServiceRulesRequest{
					ServiceId: serviceId,
				})
				Expect(err).To(BeNil())
				Expect(respGetRule.Response.Code).To(Equal(pb.Response_SUCCESS))
				Expect(len(respGetRule.Rules)).To(Equal(0))
			})
		})
	})

	Describe("execute 'permission' operartion", func() {
		var (
			consumerVersion string
			consumerTag     string
			providerBlack   string
			providerWhite   string
		)

		It("should be passed", func() {
			respCreate, err := serviceResource.Create(getContext(), &pb.CreateServiceRequest{
				Service: &pb.MicroService{
					AppId:       "query_instance_tag",
					ServiceName: "query_instance_version_consumer",
					Version:     "1.0.0",
					Level:       "FRONT",
					Status:      pb.MS_UP,
				},
			})
			Expect(err).To(BeNil())
			Expect(respCreate.Response.Code).To(Equal(pb.Response_SUCCESS))
			consumerVersion = respCreate.ServiceId

			respCreate, err = serviceResource.Create(getContext(), &pb.CreateServiceRequest{
				Service: &pb.MicroService{
					AppId:       "query_instance_tag",
					ServiceName: "query_instance_tag_service",
					Version:     "1.0.2",
					Level:       "FRONT",
					Status:      pb.MS_UP,
				},
			})
			Expect(err).To(BeNil())
			Expect(respCreate.Response.Code).To(Equal(pb.Response_SUCCESS))
			providerBlack = respCreate.ServiceId

			resp, err := serviceResource.AddRule(getContext(), &pb.AddServiceRulesRequest{
				ServiceId: providerBlack,
				Rules: []*pb.AddOrUpdateServiceRule{
					{
						RuleType:  "BLACK",
						Attribute: "Version",
						Pattern:   "1.0.0",
					},
					{
						RuleType:  "BLACK",
						Attribute: "tag_a",
						Pattern:   "b",
					},
				},
			})
			Expect(err).To(BeNil())
			Expect(resp.Response.Code).To(Equal(pb.Response_SUCCESS))

			respCreate, err = serviceResource.Create(getContext(), &pb.CreateServiceRequest{
				Service: &pb.MicroService{
					AppId:       "query_instance_tag",
					ServiceName: "query_instance_tag_service",
					Version:     "1.0.3",
					Level:       "FRONT",
					Status:      pb.MS_UP,
				},
			})
			Expect(err).To(BeNil())
			Expect(respCreate.Response.Code).To(Equal(pb.Response_SUCCESS))
			providerWhite = respCreate.ServiceId

			resp, err = serviceResource.AddRule(getContext(), &pb.AddServiceRulesRequest{
				ServiceId: providerWhite,
				Rules: []*pb.AddOrUpdateServiceRule{
					{
						RuleType:  "WHITE",
						Attribute: "Version",
						Pattern:   "1.0.0",
					},
					{
						RuleType:  "WHITE",
						Attribute: "tag_a",
						Pattern:   "b",
					},
				},
			})
			Expect(err).To(BeNil())
			Expect(resp.Response.Code).To(Equal(pb.Response_SUCCESS))

			respCreate, err = serviceResource.Create(getContext(), &pb.CreateServiceRequest{
				Service: &pb.MicroService{
					AppId:       "query_instance_tag",
					ServiceName: "query_instance_tag_consumer",
					Version:     "1.0.4",
					Level:       "FRONT",
					Status:      pb.MS_UP,
				},
			})
			Expect(err).To(BeNil())
			Expect(respCreate.Response.Code).To(Equal(pb.Response_SUCCESS))
			consumerTag = respCreate.ServiceId

			resp1, err := serviceResource.AddTags(getContext(), &pb.AddServiceTagsRequest{
				ServiceId: consumerTag,
				Tags:      map[string]string{"a": "b"},
			})
			Expect(err).To(BeNil())
			Expect(resp1.Response.Code).To(Equal(pb.Response_SUCCESS))
		})

		Context("when query instances", func() {
			It("should be failed", func() {
				By("consumer version in black list")
				resp, err := instanceResource.GetInstances(getContext(), &pb.GetInstancesRequest{
					ConsumerServiceId: consumerVersion,
					ProviderServiceId: providerBlack,
				})
				Expect(err).To(BeNil())
				Expect(resp.Response.Code).To(Equal(scerr.ErrPermissionDeny))

				By("consumer tag in black list")
				resp, err = instanceResource.GetInstances(getContext(), &pb.GetInstancesRequest{
					ConsumerServiceId: consumerTag,
					ProviderServiceId: providerBlack,
				})
				Expect(err).To(BeNil())
				Expect(resp.Response.Code).To(Equal(scerr.ErrPermissionDeny))

				By("find should return 200 even if consumer permission deny")
				respFind, err := instanceResource.Find(getContext(), &pb.FindInstancesRequest{
					ConsumerServiceId: consumerVersion,
					AppId:             "query_instance_tag",
					ServiceName:       "query_instance_tag_service",
					VersionRule:       "0+",
				})
				Expect(err).To(BeNil())
				Expect(respFind.Response.Code).To(Equal(pb.Response_SUCCESS))
				Expect(len(respFind.Instances)).To(Equal(0))
				respFind, err = instanceResource.Find(getContext(), &pb.FindInstancesRequest{
					ConsumerServiceId: consumerTag,
					AppId:             "query_instance_tag",
					ServiceName:       "query_instance_tag_service",
					VersionRule:       "0+",
				})
				Expect(err).To(BeNil())
				Expect(respFind.Response.Code).To(Equal(pb.Response_SUCCESS))
				Expect(len(respFind.Instances)).To(Equal(0))

				By("consumer not in black list")
				resp, err = instanceResource.GetInstances(getContext(), &pb.GetInstancesRequest{
					ConsumerServiceId: providerWhite,
					ProviderServiceId: providerBlack,
				})
				Expect(err).To(BeNil())
				Expect(resp.Response.Code).To(Equal(pb.Response_SUCCESS))

				By("consumer not in white list")
				resp, err = instanceResource.GetInstances(getContext(), &pb.GetInstancesRequest{
					ConsumerServiceId: providerBlack,
					ProviderServiceId: providerWhite,
				})
				Expect(err).To(BeNil())
				Expect(resp.Response.Code).To(Equal(scerr.ErrPermissionDeny))

				By("consumer version in white list")
				resp, err = instanceResource.GetInstances(getContext(), &pb.GetInstancesRequest{
					ConsumerServiceId: consumerVersion,
					ProviderServiceId: providerWhite,
				})
				Expect(err).To(BeNil())
				Expect(resp.Response.Code).To(Equal(pb.Response_SUCCESS))

				By("consumer tag in white list")
				resp, err = instanceResource.GetInstances(getContext(), &pb.GetInstancesRequest{
					ConsumerServiceId: consumerTag,
					ProviderServiceId: providerWhite,
				})
				Expect(err).To(BeNil())
				Expect(resp.Response.Code).To(Equal(pb.Response_SUCCESS))
			})
		})
	})
})
