blob: a77764c828e8c292ae80ab4ca01dcd93d31536c7 [file] [log] [blame]
/*
* 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 disco_test
import (
"strconv"
"strings"
"testing"
"github.com/apache/servicecomb-service-center/datasource"
"github.com/apache/servicecomb-service-center/datasource/schema"
"github.com/apache/servicecomb-service-center/server/service/disco"
quotasvc "github.com/apache/servicecomb-service-center/server/service/quota"
pb "github.com/go-chassis/cari/discovery"
"github.com/go-chassis/cari/pkg/errsvc"
"github.com/stretchr/testify/assert"
)
const (
invalidSchemaId = "@"
)
var (
TOO_LONG_SUMMARY = strings.Repeat("x", 129)
)
func TestPutSchema(t *testing.T) {
var (
serviceId string
serviceIdDev string
serviceIdPro string
)
ctx := getContext()
t.Run("should be passed, create service", func(t *testing.T) {
respCreateService, err := datasource.GetMetadataManager().RegisterService(ctx, &pb.CreateServiceRequest{
Service: &pb.MicroService{
AppId: "create_schema_group",
ServiceName: "create_schema_service",
Version: "1.0.0",
Level: "FRONT",
Status: pb.MS_UP,
Environment: pb.ENV_DEV,
},
})
assert.NoError(t, err)
assert.Equal(t, pb.ResponseSuccess, respCreateService.Response.GetCode())
serviceIdDev = respCreateService.ServiceId
respCreateService, err = datasource.GetMetadataManager().RegisterService(ctx, &pb.CreateServiceRequest{
Service: &pb.MicroService{
AppId: "create_schema_group",
ServiceName: "create_schema_service",
Version: "1.0.0",
Level: "FRONT",
Status: pb.MS_UP,
Environment: pb.ENV_PROD,
},
})
assert.NoError(t, err)
assert.Equal(t, pb.ResponseSuccess, respCreateService.Response.GetCode())
serviceId = respCreateService.ServiceId
respCreateService, err = datasource.GetMetadataManager().RegisterService(ctx, &pb.CreateServiceRequest{
Service: &pb.MicroService{
AppId: "create_schemas_prod",
ServiceName: "create_schemas_service",
Version: "1.0.1",
Level: "FRONT",
Schemas: []string{
"first_schemaId",
"second_schemaId",
},
Status: pb.MS_UP,
Environment: pb.ENV_PROD,
},
})
assert.NoError(t, err)
assert.Equal(t, pb.ResponseSuccess, respCreateService.Response.GetCode())
serviceIdPro = respCreateService.ServiceId
})
defer func() {
datasource.GetMetadataManager().UnregisterService(ctx, &pb.DeleteServiceRequest{ServiceId: serviceIdDev, Force: true})
datasource.GetMetadataManager().UnregisterService(ctx, &pb.DeleteServiceRequest{ServiceId: serviceId, Force: true})
datasource.GetMetadataManager().UnregisterService(ctx, &pb.DeleteServiceRequest{ServiceId: serviceIdPro, Force: true})
}()
f := func() {
err := disco.PutSchema(ctx, &pb.ModifySchemaRequest{
ServiceId: "",
SchemaId: "com.huawei.test",
Schema: "create schema",
})
testErr := err.(*errsvc.Error)
assert.Error(t, testErr)
assert.Equal(t, pb.ErrInvalidParams, testErr.Code)
err = disco.PutSchema(ctx, &pb.ModifySchemaRequest{
ServiceId: "notExistService",
SchemaId: "com.huawei.test",
Schema: "create schema",
})
testErr = err.(*errsvc.Error)
assert.Error(t, testErr)
assert.Equal(t, pb.ErrServiceNotExists, testErr.Code)
err = disco.PutSchema(ctx, &pb.ModifySchemaRequest{
ServiceId: serviceIdDev,
SchemaId: invalidSchemaId,
Schema: "create schema",
})
testErr = err.(*errsvc.Error)
assert.Error(t, testErr)
assert.Equal(t, pb.ErrInvalidParams, testErr.Code)
err = disco.PutSchema(ctx, &pb.ModifySchemaRequest{
ServiceId: serviceIdDev,
SchemaId: "com.huawei.test",
Schema: "create schema",
Summary: TOO_LONG_SUMMARY,
})
testErr = err.(*errsvc.Error)
assert.Error(t, testErr)
assert.Equal(t, pb.ErrInvalidParams, testErr.Code)
err = disco.PutSchema(ctx, &pb.ModifySchemaRequest{
ServiceId: serviceIdDev,
SchemaId: "com.huawei.test",
Schema: "create schema",
Summary: "_",
})
testErr = err.(*errsvc.Error)
assert.Error(t, testErr)
assert.Equal(t, pb.ErrInvalidParams, testErr.Code)
}
t.Run("should be failed in prod env, when create an invalid schema", func(t *testing.T) {
old := serviceIdDev
serviceIdDev = serviceId
f()
serviceIdDev = old
})
t.Run("should be failed in dev env, when create an invalid schema", func(t *testing.T) {
f()
})
f = func() {
err := disco.PutSchemas(ctx, &pb.ModifySchemasRequest{
ServiceId: serviceIdDev,
})
testErr := err.(*errsvc.Error)
assert.Error(t, testErr)
assert.Equal(t, pb.ErrInvalidParams, testErr.Code)
err = disco.PutSchemas(ctx, &pb.ModifySchemasRequest{
ServiceId: "",
Schemas: []*pb.Schema{
{
SchemaId: "com.huawei.test",
Summary: "create schema",
Schema: "create schema",
},
},
})
testErr = err.(*errsvc.Error)
assert.Error(t, testErr)
assert.Equal(t, pb.ErrInvalidParams, testErr.Code)
err = disco.PutSchemas(ctx, &pb.ModifySchemasRequest{
ServiceId: serviceIdDev,
Schemas: []*pb.Schema{
{
SchemaId: invalidSchemaId,
Summary: "create schema",
Schema: "create schema",
},
},
})
testErr = err.(*errsvc.Error)
assert.Error(t, testErr)
assert.Equal(t, pb.ErrInvalidParams, testErr.Code)
err = disco.PutSchemas(ctx, &pb.ModifySchemasRequest{
ServiceId: serviceIdDev,
Schemas: []*pb.Schema{
{
SchemaId: "com.huawei.test",
Summary: "create schema",
},
},
})
testErr = err.(*errsvc.Error)
assert.Error(t, testErr)
assert.Equal(t, pb.ErrInvalidParams, testErr.Code)
err = disco.PutSchemas(ctx, &pb.ModifySchemasRequest{
ServiceId: serviceIdDev,
Schemas: []*pb.Schema{
{
SchemaId: "com.huawei.test",
Schema: "create schema",
},
},
})
testErr = err.(*errsvc.Error)
assert.Error(t, testErr)
assert.Equal(t, pb.ErrInvalidParams, testErr.Code)
err = disco.PutSchemas(ctx, &pb.ModifySchemasRequest{
ServiceId: serviceIdDev,
Schemas: []*pb.Schema{
{
SchemaId: "com.huawei.test",
Schema: "create schema",
Summary: TOO_LONG_SUMMARY,
},
},
})
testErr = err.(*errsvc.Error)
assert.Error(t, testErr)
assert.Equal(t, pb.ErrInvalidParams, testErr.Code)
}
t.Run("should be failed in dev env, when batch create invalid schemas", func(t *testing.T) {
f()
})
t.Run("should be failed in prod env, when batch create invalid schemas", func(t *testing.T) {
old := serviceIdDev
serviceIdDev = serviceId
f()
serviceIdDev = old
})
max := int(quotasvc.SchemaQuota())
size := max + 1
schemaIds := make([]string, 0, size)
schemas := make([]*pb.Schema, 0, size)
for i := 0; i < size; i++ {
s := "ServiceCombTestTheLimitOfSchemas" + strconv.Itoa(i)
schemaIds = append(schemaIds, s)
schemas = append(schemas, &pb.Schema{
SchemaId: s,
Schema: s,
Summary: s,
})
}
t.Run("should be failed, when put schemas out of gauge", func(t *testing.T) {
err := disco.PutSchemas(ctx, &pb.ModifySchemasRequest{
ServiceId: serviceIdDev,
Schemas: schemas,
})
testErr := err.(*errsvc.Error)
assert.Error(t, testErr)
assert.Equal(t, pb.ErrInvalidParams, testErr.Code)
})
err := disco.PutSchemas(ctx, &pb.ModifySchemasRequest{
ServiceId: serviceIdDev,
Schemas: schemas[:max],
})
assert.NoError(t, err)
t.Run("should be failed, when put schema out of gauge", func(t *testing.T) {
schema := schemas[max]
err = disco.PutSchema(ctx, &pb.ModifySchemaRequest{
ServiceId: serviceIdDev,
SchemaId: schema.SchemaId,
Schema: schema.Schema,
})
testErr := err.(*errsvc.Error)
assert.Error(t, testErr)
assert.Equal(t, pb.ErrNotEnoughQuota, testErr.Code)
})
t.Run("should be ok, when put a exist schema", func(t *testing.T) {
schema := schemas[0]
err = disco.PutSchema(ctx, &pb.ModifySchemaRequest{
ServiceId: serviceIdDev,
SchemaId: schema.SchemaId,
Schema: schema.Schema,
})
assert.NoError(t, err)
})
t.Run("should be failed when create service with exceed schemaIDs", func(t *testing.T) {
createServiceResponse, err := serviceResource.Create(ctx, &pb.CreateServiceRequest{
Service: &pb.MicroService{
AppId: "check_schema_group",
ServiceName: "check_schema_service",
Version: "1.0.0",
Level: "FRONT",
Schemas: schemaIds,
Status: pb.MS_UP,
},
})
assert.NoError(t, err)
assert.Equal(t, pb.ErrInvalidParams, createServiceResponse.Response.GetCode())
})
t.Run("should be failed, when modify schema and summary is empty", func(t *testing.T) {
err := disco.PutSchema(ctx, &pb.ModifySchemaRequest{
ServiceId: serviceIdPro,
SchemaId: "first_schemaId",
Schema: "first_schema",
})
assert.NoError(t, err)
schemas := []*pb.Schema{
{
SchemaId: "first_schemaId",
Schema: "first_schema",
Summary: "first0summary",
},
}
err = disco.PutSchemas(ctx, &pb.ModifySchemasRequest{
ServiceId: serviceIdPro,
Schemas: schemas,
})
assert.NoError(t, err)
respExist, err := disco.ExistSchema(ctx, &pb.GetSchemaRequest{
ServiceId: serviceIdPro,
SchemaId: "first_schemaId",
})
assert.NoError(t, err)
assert.Equal(t, "first0summary", respExist.Summary)
schemas = []*pb.Schema{
{
SchemaId: "second_schemaId",
Schema: "second_schema",
Summary: "second0summary",
},
}
err = disco.PutSchemas(ctx, &pb.ModifySchemasRequest{
ServiceId: serviceIdPro,
Schemas: schemas,
})
assert.NoError(t, err)
})
}
func TestPutSchemas(t *testing.T) {
var (
serviceIdDev1 string
serviceIdDev2 string
)
respCreateService, err := datasource.GetMetadataManager().RegisterService(getContext(), &pb.CreateServiceRequest{
Service: &pb.MicroService{
AppId: "create_schemas_dev",
ServiceName: "create_schemas_service",
Version: "1.0.0",
Level: "FRONT",
Status: pb.MS_UP,
Environment: pb.ENV_DEV,
},
})
assert.NoError(t, err)
assert.Equal(t, pb.ResponseSuccess, respCreateService.Response.GetCode())
serviceIdDev1 = respCreateService.ServiceId
defer datasource.GetMetadataManager().UnregisterService(getContext(), &pb.DeleteServiceRequest{ServiceId: serviceIdDev1, Force: true})
respCreateService, err = datasource.GetMetadataManager().RegisterService(getContext(), &pb.CreateServiceRequest{
Service: &pb.MicroService{
AppId: "create_schemas_dev",
ServiceName: "create_schemas_service",
Version: "1.0.1",
Level: "FRONT",
Schemas: []string{
"first_schemaId",
},
Status: pb.MS_UP,
Environment: pb.ENV_DEV,
},
})
assert.NoError(t, err)
assert.Equal(t, pb.ResponseSuccess, respCreateService.Response.GetCode())
serviceIdDev2 = respCreateService.ServiceId
defer datasource.GetMetadataManager().UnregisterService(getContext(), &pb.DeleteServiceRequest{ServiceId: serviceIdDev2, Force: true})
t.Run("should be passed, when create schemas when service schema id set is empty", func(t *testing.T) {
schemas := []*pb.Schema{
{
SchemaId: "first_schemaId",
Schema: "first_schema",
Summary: "first0summary",
},
}
err := disco.PutSchemas(getContext(), &pb.ModifySchemasRequest{
ServiceId: serviceIdDev1,
Schemas: schemas,
})
assert.NoError(t, err)
assert.Equal(t, pb.ResponseSuccess, respCreateService.Response.GetCode())
schemas, err = disco.ListSchema(getContext(), &pb.GetAllSchemaRequest{
ServiceId: serviceIdDev1,
})
assert.NoError(t, err)
assert.Equal(t, 1, len(schemas))
schemas = []*pb.Schema{}
err = disco.PutSchemas(getContext(), &pb.ModifySchemasRequest{
ServiceId: serviceIdDev2,
Schemas: schemas,
})
testErr := err.(*errsvc.Error)
assert.Error(t, testErr)
assert.Equal(t, pb.ErrInvalidParams, testErr.Code)
schemas = []*pb.Schema{
{
SchemaId: "first_schemaId",
Schema: "first_schema_change",
Summary: "first0summary1change",
},
}
err = disco.PutSchemas(getContext(), &pb.ModifySchemasRequest{
ServiceId: serviceIdDev1,
Schemas: schemas,
})
assert.NoError(t, err)
schemas = []*pb.Schema{
{
SchemaId: "second_schemaId",
Schema: "second_schema",
Summary: "second0summary",
},
}
err = disco.PutSchemas(getContext(), &pb.ModifySchemasRequest{
ServiceId: serviceIdDev1,
Schemas: schemas,
})
assert.NoError(t, err)
service, err := disco.GetService(getContext(), &pb.GetServiceRequest{
ServiceId: serviceIdDev1,
})
assert.NoError(t, err)
assert.Equal(t, []string{"second_schemaId"}, service.Schemas)
schemas = []*pb.Schema{}
err = disco.PutSchemas(getContext(), &pb.ModifySchemasRequest{
ServiceId: serviceIdDev1,
Schemas: schemas,
})
testErr = err.(*errsvc.Error)
assert.Error(t, testErr)
assert.Equal(t, pb.ErrInvalidParams, testErr.Code)
schemas = []*pb.Schema{
{
SchemaId: "second_schemaId",
Schema: "second_schema",
Summary: "second0summary",
},
}
err = disco.PutSchemas(getContext(), &pb.ModifySchemasRequest{
ServiceId: serviceIdDev2,
Schemas: schemas,
})
assert.NoError(t, err)
service, err = disco.GetService(getContext(), &pb.GetServiceRequest{
ServiceId: serviceIdDev2,
})
assert.NoError(t, err)
assert.Equal(t, []string{"second_schemaId"}, service.Schemas)
})
}
func TestExistSchema(t *testing.T) {
var (
serviceId string
)
respCreateService, err := datasource.GetMetadataManager().RegisterService(getContext(), &pb.CreateServiceRequest{
Service: &pb.MicroService{
AppId: "query_schema_group",
ServiceName: "query_schema_service",
Version: "1.0.0",
Level: "FRONT",
Status: pb.MS_UP,
Environment: pb.ENV_DEV,
},
})
assert.NoError(t, err)
assert.Equal(t, pb.ResponseSuccess, respCreateService.Response.GetCode())
serviceId = respCreateService.ServiceId
defer datasource.GetMetadataManager().UnregisterService(getContext(), &pb.DeleteServiceRequest{ServiceId: serviceId, Force: true})
err = disco.PutSchema(getContext(), &pb.ModifySchemaRequest{
ServiceId: serviceId,
SchemaId: "com.huawei.test",
Schema: "query schema",
Summary: "summary",
})
assert.NoError(t, err)
err = disco.PutSchema(getContext(), &pb.ModifySchemaRequest{
ServiceId: serviceId,
SchemaId: "com.huawei.test.no.summary",
Schema: "query schema",
})
assert.NoError(t, err)
t.Run("should be failed, when request is invalid", func(t *testing.T) {
_, err := disco.ExistSchema(getContext(), &pb.GetSchemaRequest{
ServiceId: "",
SchemaId: "com.huawei.test",
})
testErr := err.(*errsvc.Error)
assert.Error(t, testErr)
assert.Equal(t, pb.ErrInvalidParams, testErr.Code)
_, err = disco.ExistSchema(getContext(), &pb.GetSchemaRequest{
ServiceId: serviceId,
SchemaId: "noneschema",
})
testErr = err.(*errsvc.Error)
assert.Error(t, testErr)
assert.Equal(t, pb.ErrSchemaNotExists, testErr.Code)
_, err = disco.ExistSchema(getContext(), &pb.GetSchemaRequest{
ServiceId: serviceId,
SchemaId: TOO_LONG_SCHEMAID,
})
testErr = err.(*errsvc.Error)
assert.Error(t, testErr)
assert.Equal(t, pb.ErrInvalidParams, testErr.Code)
})
t.Run("should be passed, when request is valid", func(t *testing.T) {
resp, err := disco.ExistSchema(getContext(), &pb.GetSchemaRequest{
ServiceId: serviceId,
SchemaId: "com.huawei.test",
})
assert.NoError(t, err)
assert.Equal(t, "summary", resp.Summary)
resp, err = disco.ExistSchema(getContext(), &pb.GetSchemaRequest{
ServiceId: serviceId,
SchemaId: "com.huawei.test.no.summary",
})
assert.NoError(t, err)
assert.Equal(t, "com.huawei.test.no.summary", resp.SchemaId)
assert.Equal(t, "", resp.Summary)
})
}
func TestGetSchema(t *testing.T) {
var (
serviceId string
serviceId1 string
schemaId1 = "all_schema1"
schemaId2 = "all_schema2"
schemaId3 = "all_schema3"
summary = "this0is1a2test"
schemaContent = "the content is vary large"
)
respCreateService, err := datasource.GetMetadataManager().RegisterService(getContext(), &pb.CreateServiceRequest{
Service: &pb.MicroService{
AppId: "get_schema_group",
ServiceName: "get_schema_service",
Version: "1.0.0",
Level: "FRONT",
Schemas: []string{
"non-schema-content",
},
Status: pb.MS_UP,
Environment: pb.ENV_DEV,
},
})
assert.NoError(t, err)
assert.Equal(t, pb.ResponseSuccess, respCreateService.Response.GetCode())
serviceId = respCreateService.ServiceId
defer datasource.GetMetadataManager().UnregisterService(getContext(), &pb.DeleteServiceRequest{ServiceId: serviceId, Force: true})
respCreateService, err = datasource.GetMetadataManager().RegisterService(getContext(), &pb.CreateServiceRequest{
Service: &pb.MicroService{
AppId: "get_all_schema",
ServiceName: "get_all_schema",
Version: "1.0.0",
Level: "FRONT",
Schemas: []string{
schemaId1,
schemaId2,
schemaId3,
},
Status: pb.MS_UP,
},
})
assert.NoError(t, err)
assert.Equal(t, pb.ResponseSuccess, respCreateService.Response.GetCode())
serviceId1 = respCreateService.ServiceId
defer datasource.GetMetadataManager().UnregisterService(getContext(), &pb.DeleteServiceRequest{ServiceId: serviceId1, Force: true})
err = disco.PutSchema(getContext(), &pb.ModifySchemaRequest{
ServiceId: serviceId,
SchemaId: "com.huawei.test",
Schema: "get schema",
Summary: "schema0summary",
})
assert.NoError(t, err)
err = disco.PutSchema(getContext(), &pb.ModifySchemaRequest{
ServiceId: serviceId1,
SchemaId: schemaId2,
Schema: schemaContent,
})
assert.NoError(t, err)
err = disco.PutSchema(getContext(), &pb.ModifySchemaRequest{
ServiceId: serviceId1,
SchemaId: schemaId3,
Schema: schemaContent,
Summary: summary,
})
assert.NoError(t, err)
t.Run("should be pass, when list schema", func(t *testing.T) {
schemas, err := disco.ListSchema(getContext(), &pb.GetAllSchemaRequest{
ServiceId: serviceId1,
WithSchema: false,
})
assert.NoError(t, err)
for _, schema := range schemas {
if schema.SchemaId == schemaId1 {
assert.Empty(t, schema.Summary)
assert.Empty(t, schema.Schema)
}
if schema.SchemaId == schemaId2 {
assert.Empty(t, schema.Summary)
assert.Empty(t, schema.Schema)
}
if schema.SchemaId == schemaId3 {
assert.Equal(t, summary, schema.Summary)
assert.Empty(t, schema.Schema)
}
}
schemas, err = disco.ListSchema(getContext(), &pb.GetAllSchemaRequest{
ServiceId: serviceId1,
WithSchema: true,
})
assert.NoError(t, err)
for _, schema := range schemas {
if schema.SchemaId == schemaId1 {
assert.Empty(t, schema.Summary)
assert.Empty(t, schema.Schema)
}
if schema.SchemaId == schemaId2 {
assert.Empty(t, schema.Summary)
assert.Equal(t, schemaContent, schema.Schema)
}
if schema.SchemaId == schemaId3 {
assert.Equal(t, summary, schema.Summary)
assert.Equal(t, schemaContent, schema.Schema)
}
}
})
t.Run("should be failed, when request is invalid", func(t *testing.T) {
_, err := disco.GetSchema(getContext(), &pb.GetSchemaRequest{
ServiceId: "noneexistservice",
SchemaId: "com.huawei.test",
})
testErr := err.(*errsvc.Error)
assert.Error(t, testErr)
assert.Equal(t, pb.ErrServiceNotExists, testErr.Code)
_, err = disco.ListSchema(getContext(), &pb.GetAllSchemaRequest{
ServiceId: "noneexistservice",
})
testErr = err.(*errsvc.Error)
assert.Error(t, testErr)
assert.Equal(t, pb.ErrServiceNotExists, testErr.Code)
_, err = disco.GetSchema(getContext(), &pb.GetSchemaRequest{
ServiceId: "",
SchemaId: "com.huawei.test",
})
testErr = err.(*errsvc.Error)
assert.Error(t, testErr)
assert.Equal(t, pb.ErrInvalidParams, testErr.Code)
_, err = disco.ListSchema(getContext(), &pb.GetAllSchemaRequest{
ServiceId: "",
})
testErr = err.(*errsvc.Error)
assert.Error(t, testErr)
assert.Equal(t, pb.ErrInvalidParams, testErr.Code)
_, err = disco.GetSchema(getContext(), &pb.GetSchemaRequest{
ServiceId: TOO_LONG_SERVICEID,
SchemaId: "com.huawei.test",
})
testErr = err.(*errsvc.Error)
assert.Error(t, testErr)
assert.Equal(t, pb.ErrInvalidParams, testErr.Code)
_, err = disco.ListSchema(getContext(), &pb.GetAllSchemaRequest{
ServiceId: TOO_LONG_SERVICEID,
})
testErr = err.(*errsvc.Error)
assert.Error(t, testErr)
assert.Equal(t, pb.ErrInvalidParams, testErr.Code)
_, err = disco.GetSchema(getContext(), &pb.GetSchemaRequest{
ServiceId: serviceId,
SchemaId: "nonexistschema",
})
testErr = err.(*errsvc.Error)
assert.Error(t, testErr)
assert.Equal(t, pb.ErrSchemaNotExists, testErr.Code)
_, err = disco.GetSchema(getContext(), &pb.GetSchemaRequest{
ServiceId: serviceId,
SchemaId: "",
})
testErr = err.(*errsvc.Error)
assert.Error(t, testErr)
assert.Equal(t, pb.ErrInvalidParams, testErr.Code)
_, err = disco.GetSchema(getContext(), &pb.GetSchemaRequest{
ServiceId: serviceId,
SchemaId: TOO_LONG_SCHEMAID,
})
testErr = err.(*errsvc.Error)
assert.Error(t, testErr)
assert.Equal(t, pb.ErrInvalidParams, testErr.Code)
_, err = disco.GetSchema(getContext(), &pb.GetSchemaRequest{
ServiceId: serviceId,
SchemaId: invalidSchemaId,
})
testErr = err.(*errsvc.Error)
assert.Error(t, testErr)
assert.Equal(t, pb.ErrInvalidParams, testErr.Code)
_, err = disco.GetSchema(getContext(), &pb.GetSchemaRequest{
ServiceId: serviceId,
SchemaId: "non-schema-content",
})
testErr = err.(*errsvc.Error)
assert.Error(t, testErr)
assert.Equal(t, pb.ErrSchemaNotExists, testErr.Code)
})
t.Run("should be passed, when request is valid", func(t *testing.T) {
schema, err := disco.GetSchema(getContext(), &pb.GetSchemaRequest{
ServiceId: serviceId,
SchemaId: "com.huawei.test",
})
assert.NoError(t, err)
assert.NotNil(t, schema)
assert.Equal(t, "com.huawei.test", schema.SchemaId)
assert.Equal(t, "get schema", schema.Schema)
assert.Equal(t, "schema0summary", schema.Summary)
})
}
func TestDeleteSchema(t *testing.T) {
var (
serviceId string
)
respCreateService, err := datasource.GetMetadataManager().RegisterService(getContext(), &pb.CreateServiceRequest{
Service: &pb.MicroService{
AppId: "delete_schema_group",
ServiceName: "delete_schema_service",
Version: "1.0.0",
Level: "FRONT",
Status: pb.MS_UP,
},
})
assert.NoError(t, err)
assert.Equal(t, pb.ResponseSuccess, respCreateService.Response.GetCode())
serviceId = respCreateService.ServiceId
defer datasource.GetMetadataManager().UnregisterService(getContext(), &pb.DeleteServiceRequest{ServiceId: serviceId, Force: true})
err = disco.PutSchema(getContext(), &pb.ModifySchemaRequest{
ServiceId: serviceId,
SchemaId: "com.huawei.test",
Schema: "delete schema",
Summary: "summary",
})
assert.NoError(t, err)
t.Run("should be failed, when request is invalid", func(t *testing.T) {
err := disco.DeleteSchema(getContext(), &pb.DeleteSchemaRequest{
ServiceId: serviceId,
SchemaId: "noneschema",
})
testErr := err.(*errsvc.Error)
assert.Error(t, testErr)
assert.Equal(t, pb.ErrSchemaNotExists, testErr.Code)
err = disco.DeleteSchema(getContext(), &pb.DeleteSchemaRequest{
ServiceId: "",
SchemaId: "com.huawei.test",
})
testErr = err.(*errsvc.Error)
assert.Error(t, testErr)
assert.Equal(t, pb.ErrInvalidParams, testErr.Code)
err = disco.DeleteSchema(getContext(), &pb.DeleteSchemaRequest{
ServiceId: "noexistservice",
SchemaId: "com.huawei.test",
})
testErr = err.(*errsvc.Error)
assert.Error(t, testErr)
assert.Equal(t, pb.ErrServiceNotExists, testErr.Code)
err = disco.DeleteSchema(getContext(), &pb.DeleteSchemaRequest{
ServiceId: serviceId,
SchemaId: invalidSchemaId,
})
testErr = err.(*errsvc.Error)
assert.Error(t, testErr)
assert.Equal(t, pb.ErrInvalidParams, testErr.Code)
})
t.Run("should be passed, when request is valid", func(t *testing.T) {
err := disco.DeleteSchema(getContext(), &pb.DeleteSchemaRequest{
ServiceId: serviceId,
SchemaId: "com.huawei.test",
})
assert.NoError(t, err)
_, err = disco.GetSchema(getContext(), &pb.GetSchemaRequest{
ServiceId: serviceId,
SchemaId: "com.huawei.test",
})
testErr := err.(*errsvc.Error)
assert.Error(t, testErr)
assert.Equal(t, pb.ErrSchemaNotExists, testErr.Code)
_, err = disco.ExistSchema(getContext(), &pb.GetSchemaRequest{
ServiceId: serviceId,
SchemaId: "com.huawei.test",
})
testErr = err.(*errsvc.Error)
assert.Error(t, testErr)
assert.Equal(t, pb.ErrSchemaNotExists, testErr.Code)
})
}
func TestListSchema(t *testing.T) {
var serviceID string
ctx := getContext()
respCreateService, err := datasource.GetMetadataManager().RegisterService(ctx, &pb.CreateServiceRequest{
Service: &pb.MicroService{
ServiceName: "TestListSchema",
Schemas: []string{
"schemaID_1",
},
},
})
assert.NoError(t, err)
assert.Equal(t, pb.ResponseSuccess, respCreateService.Response.GetCode())
serviceID = respCreateService.ServiceId
defer datasource.GetMetadataManager().UnregisterService(ctx, &pb.DeleteServiceRequest{ServiceId: serviceID, Force: true})
err = disco.PutSchema(ctx, &pb.ModifySchemaRequest{
ServiceId: serviceID,
SchemaId: "schemaID_1",
Schema: "schema_1",
Summary: "summary1",
})
assert.NoError(t, err)
t.Run("list schema with invalid request, should failed", func(t *testing.T) {
schemas, err := disco.ListSchema(ctx, &pb.GetAllSchemaRequest{})
testErr := err.(*errsvc.Error)
assert.Error(t, testErr)
assert.Equal(t, pb.ErrInvalidParams, testErr.Code)
assert.Nil(t, schemas)
schemas, err = disco.ListSchema(ctx, &pb.GetAllSchemaRequest{
ServiceId: "not_exist_id",
})
testErr = err.(*errsvc.Error)
assert.Error(t, testErr)
assert.Equal(t, pb.ErrServiceNotExists, testErr.Code)
assert.Nil(t, schemas)
})
t.Run("list schema, should ok", func(t *testing.T) {
schemas, err := disco.ListSchema(ctx, &pb.GetAllSchemaRequest{
ServiceId: serviceID,
})
assert.NoError(t, err)
assert.Equal(t, 1, len(schemas))
schema := schemas[0]
assert.Equal(t, "schemaID_1", schema.SchemaId)
assert.Equal(t, "summary1", schema.Summary)
assert.Empty(t, schema.Schema)
schemas, err = disco.ListSchema(ctx, &pb.GetAllSchemaRequest{
ServiceId: serviceID,
WithSchema: true,
})
assert.NoError(t, err)
assert.Equal(t, 1, len(schemas))
schema = schemas[0]
assert.Equal(t, "schemaID_1", schema.SchemaId)
assert.Equal(t, "summary1", schema.Summary)
assert.Equal(t, "schema_1", schema.Schema)
})
}
func TestCompatibleOperateSchema(t *testing.T) {
var serviceID string
ctx := getContext()
respCreateService, err := datasource.GetMetadataManager().RegisterService(ctx, &pb.CreateServiceRequest{
Service: &pb.MicroService{
ServiceName: "TestListSchema",
Schemas: []string{
"schemaID_1",
},
},
})
assert.NoError(t, err)
assert.Equal(t, pb.ResponseSuccess, respCreateService.Response.GetCode())
serviceID = respCreateService.ServiceId
defer schema.Instance().DeleteContent(ctx, &schema.ContentRequest{
Hash: schema.Hash("schemaID_1", "schema_1"),
})
defer schema.Instance().DeleteContent(ctx, &schema.ContentRequest{
Hash: schema.Hash("schemaID_2", "schema_2"),
})
defer datasource.GetMetadataManager().UnregisterService(ctx, &pb.DeleteServiceRequest{ServiceId: serviceID, Force: true})
t.Run("get/list schema with old content, should ok", func(t *testing.T) {
_, err := datasource.GetMetadataManager().ModifySchema(ctx, &pb.ModifySchemaRequest{
ServiceId: serviceID,
SchemaId: "schemaID_1",
Schema: "schema_1",
Summary: "summary1",
})
assert.NoError(t, err)
schema, err := disco.GetSchema(ctx, &pb.GetSchemaRequest{
ServiceId: serviceID,
SchemaId: "schemaID_1",
})
assert.NoError(t, err)
assert.Equal(t, "schema_1", schema.Schema)
assert.Equal(t, "summary1", schema.Summary)
schemas, err := disco.ListSchema(ctx, &pb.GetAllSchemaRequest{
ServiceId: serviceID,
WithSchema: true,
})
assert.NoError(t, err)
assert.Equal(t, 1, len(schemas))
schema = schemas[0]
assert.Equal(t, "schema_1", schema.Schema)
assert.Equal(t, "summary1", schema.Summary)
})
t.Run("put schema overwrite old content, should ok", func(t *testing.T) {
_, err := datasource.GetMetadataManager().ModifySchema(ctx, &pb.ModifySchemaRequest{
ServiceId: serviceID,
SchemaId: "schemaID_2",
Schema: "schema_2",
Summary: "summary2",
})
assert.NoError(t, err)
err = disco.PutSchema(ctx, &pb.ModifySchemaRequest{
ServiceId: serviceID,
SchemaId: "schemaID_2",
Schema: "schema_2",
Summary: "summary2",
})
assert.NoError(t, err)
schema, err := disco.GetSchema(ctx, &pb.GetSchemaRequest{
ServiceId: serviceID,
SchemaId: "schemaID_2",
})
assert.NoError(t, err)
assert.Equal(t, "schema_2", schema.Schema)
assert.Equal(t, "summary2", schema.Summary)
schemas, err := disco.ListSchema(ctx, &pb.GetAllSchemaRequest{
ServiceId: serviceID,
WithSchema: true,
})
assert.NoError(t, err)
assert.Equal(t, 2, len(schemas))
schema = findSchemaBySchemaID(schemas, "schemaID_2")
assert.NotNil(t, schema)
assert.Equal(t, "schema_2", schema.Schema)
assert.Equal(t, "summary2", schema.Summary)
})
t.Run("delete schema with old content, should ok", func(t *testing.T) {
err := disco.DeleteSchema(ctx, &pb.DeleteSchemaRequest{
ServiceId: serviceID,
SchemaId: "schemaID_1",
})
assert.NoError(t, err)
schema, err := disco.GetSchema(ctx, &pb.GetSchemaRequest{
ServiceId: serviceID,
SchemaId: "schemaID_1",
})
testErr := err.(*errsvc.Error)
assert.Error(t, testErr)
assert.Equal(t, pb.ErrSchemaNotExists, testErr.Code)
schemas, err := disco.ListSchema(ctx, &pb.GetAllSchemaRequest{
ServiceId: serviceID,
WithSchema: true,
})
assert.NoError(t, err)
assert.Equal(t, 2, len(schemas))
schema = findSchemaBySchemaID(schemas, "schemaID_1")
assert.NotNil(t, schema)
assert.Empty(t, schema.Schema)
assert.Empty(t, schema.Summary)
schema = findSchemaBySchemaID(schemas, "schemaID_2")
assert.NotNil(t, schema)
assert.Equal(t, "schema_2", schema.Schema)
assert.Equal(t, "summary2", schema.Summary)
})
t.Run("delete schema with new/old content, should ok", func(t *testing.T) {
err := disco.DeleteSchema(ctx, &pb.DeleteSchemaRequest{
ServiceId: serviceID,
SchemaId: "schemaID_2",
})
assert.NoError(t, err)
schema, err := disco.GetSchema(ctx, &pb.GetSchemaRequest{
ServiceId: serviceID,
SchemaId: "schemaID_2",
})
testErr := err.(*errsvc.Error)
assert.Error(t, testErr)
assert.Equal(t, pb.ErrSchemaNotExists, testErr.Code)
schemas, err := disco.ListSchema(ctx, &pb.GetAllSchemaRequest{
ServiceId: serviceID,
WithSchema: true,
})
assert.NoError(t, err)
assert.Equal(t, 2, len(schemas))
schema = findSchemaBySchemaID(schemas, "schemaID_1")
assert.NotNil(t, schema)
assert.Empty(t, schema.Schema)
assert.Empty(t, schema.Summary)
schema = findSchemaBySchemaID(schemas, "schemaID_2")
assert.NotNil(t, schema)
assert.Empty(t, schema.Schema)
assert.Empty(t, schema.Summary)
})
}
func findSchemaBySchemaID(schemas []*pb.Schema, schemaID string) *pb.Schema {
for _, schema := range schemas {
if schema.SchemaId == schemaID {
return schema
}
}
return nil
}