blob: 6439a6307b2b85f0ceff6a672d5092a56d721ac5 [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 schema_test
import (
"context"
"testing"
_ "github.com/apache/servicecomb-service-center/test"
"github.com/apache/servicecomb-service-center/datasource"
"github.com/apache/servicecomb-service-center/datasource/schema"
"github.com/apache/servicecomb-service-center/pkg/util"
pb "github.com/go-chassis/cari/discovery"
"github.com/go-chassis/cari/pkg/errsvc"
"github.com/stretchr/testify/assert"
)
func getContext() context.Context {
return util.WithNoCache(util.SetDomainProject(context.Background(), "default", "default"))
}
func TestGetRef(t *testing.T) {
var (
serviceID string
hash = "TestGetRef_hash_1"
)
ctx := getContext()
svc := &pb.MicroService{
ServiceName: "TestGetRef",
}
resp, err := datasource.GetMetadataManager().RegisterService(ctx, &pb.CreateServiceRequest{
Service: svc,
})
assert.NoError(t, err)
assert.NotEqual(t, "", resp.ServiceId)
serviceID = resp.ServiceId
defer schema.Instance().DeleteContent(ctx, &schema.ContentRequest{
Hash: hash,
})
defer datasource.GetMetadataManager().UnregisterService(ctx, &pb.DeleteServiceRequest{ServiceId: serviceID, Force: true})
t.Run("get ref with invalid request, should failed", func(t *testing.T) {
ref, err := schema.Instance().GetRef(ctx, &schema.RefRequest{
ServiceID: "not_exist",
SchemaID: "not_exist",
})
testErr := err.(*errsvc.Error)
assert.Error(t, testErr)
assert.Equal(t, pb.ErrSchemaNotExists, testErr.Code)
assert.Nil(t, ref)
ref, err = schema.Instance().GetRef(ctx, &schema.RefRequest{
ServiceID: serviceID,
SchemaID: "not_exist",
})
testErr = err.(*errsvc.Error)
assert.Error(t, testErr)
assert.Equal(t, pb.ErrSchemaNotExists, testErr.Code)
assert.Nil(t, ref)
})
t.Run("get a exist ref, should ok", func(t *testing.T) {
err := schema.Instance().PutContent(ctx, &schema.PutContentRequest{
ServiceID: serviceID,
SchemaID: "schemaID_1",
Content: &schema.ContentItem{
Hash: hash,
Summary: "summary_1",
},
})
assert.NoError(t, err)
ref, err := schema.Instance().GetRef(ctx, &schema.RefRequest{
ServiceID: serviceID,
SchemaID: "schemaID_1",
})
assert.NoError(t, err)
assert.NotNil(t, ref)
assert.Equal(t, "summary_1", ref.Summary)
assert.Equal(t, hash, ref.Hash)
})
}
func TestPutContent(t *testing.T) {
var (
serviceID string
hash = "TestPutContent_hash_1"
)
ctx := getContext()
svc := &pb.MicroService{
ServiceName: "TestPutContent",
Schemas: []string{"schemaID_1"},
}
resp, err := datasource.GetMetadataManager().RegisterService(ctx, &pb.CreateServiceRequest{
Service: svc,
})
assert.NoError(t, err)
assert.NotEqual(t, "", resp.ServiceId)
serviceID = resp.ServiceId
defer schema.Instance().DeleteContent(ctx, &schema.ContentRequest{Hash: hash})
defer datasource.GetMetadataManager().UnregisterService(ctx, &pb.DeleteServiceRequest{ServiceId: serviceID, Force: true})
t.Run("put content with invalid request, should failed", func(t *testing.T) {
err := schema.Instance().PutContent(ctx, &schema.PutContentRequest{})
testErr := err.(*errsvc.Error)
assert.Error(t, testErr)
assert.Equal(t, pb.ErrServiceNotExists, testErr.Code)
})
t.Run("put content with valid request, should ok", func(t *testing.T) {
err := schema.Instance().PutContent(ctx, &schema.PutContentRequest{
ServiceID: serviceID,
SchemaID: "schemaID_1",
Content: &schema.ContentItem{
Hash: hash,
Content: "content_1",
Summary: "summary_1",
},
})
assert.NoError(t, err)
content, err := schema.Instance().GetContent(ctx, &schema.ContentRequest{
Hash: hash,
})
assert.NoError(t, err)
assert.NotNil(t, content)
assert.Equal(t, hash, content.Hash)
assert.Equal(t, "content_1", content.Content)
ref, err := schema.Instance().GetRef(ctx, &schema.RefRequest{
ServiceID: serviceID,
SchemaID: "schemaID_1",
})
assert.NoError(t, err)
assert.NotNil(t, ref)
assert.Equal(t, "summary_1", ref.Summary)
})
t.Run("put the same content, should ok", func(t *testing.T) {
err := schema.Instance().PutContent(ctx, &schema.PutContentRequest{
ServiceID: serviceID,
SchemaID: "schemaID_2",
Content: &schema.ContentItem{
Hash: hash,
Content: "content_2",
Summary: "summary_2",
},
})
assert.NoError(t, err)
content, err := schema.Instance().GetContent(ctx, &schema.ContentRequest{
Hash: hash,
})
assert.NoError(t, err)
assert.NotNil(t, content)
assert.Equal(t, hash, content.Hash)
assert.Equal(t, "content_1", content.Content)
ref, err := schema.Instance().GetRef(ctx, &schema.RefRequest{
ServiceID: serviceID,
SchemaID: "schemaID_2",
})
assert.NoError(t, err)
assert.NotNil(t, ref)
assert.Equal(t, "summary_2", ref.Summary)
})
t.Run("check service schemaIDs after put content, should be updated", func(t *testing.T) {
service, err := datasource.GetMetadataManager().GetService(ctx, &pb.GetServiceRequest{
ServiceId: serviceID,
})
assert.NoError(t, err)
assert.NotNil(t, service)
assert.Equal(t, []string{"schemaID_1", "schemaID_2"}, service.Schemas)
})
}
func TestDeleteContent(t *testing.T) {
var (
serviceID string
hash = "TestDeleteContent_hash_1"
)
ctx := getContext()
svc := &pb.MicroService{
ServiceName: "TestDeleteContent",
}
resp, err := datasource.GetMetadataManager().RegisterService(ctx, &pb.CreateServiceRequest{
Service: svc,
})
assert.NoError(t, err)
assert.NotEqual(t, "", resp.ServiceId)
serviceID = resp.ServiceId
t.Run("delete content with invalid request, should failed", func(t *testing.T) {
err := schema.Instance().DeleteContent(ctx, &schema.ContentRequest{})
testErr := err.(*errsvc.Error)
assert.Error(t, testErr)
assert.Equal(t, pb.ErrSchemaNotExists, testErr.Code)
})
t.Run("delete content referenced by service, should failed", func(t *testing.T) {
err := schema.Instance().PutContent(ctx, &schema.PutContentRequest{
ServiceID: serviceID,
SchemaID: "schemaID_1",
Content: &schema.ContentItem{
Hash: hash,
Content: "content_1",
Summary: "summary_1",
},
})
assert.NoError(t, err)
err = schema.Instance().DeleteContent(ctx, &schema.ContentRequest{
Hash: hash,
})
testErr := err.(*errsvc.Error)
assert.Error(t, testErr)
assert.Equal(t, pb.ErrInvalidParams, testErr.Code)
})
t.Run("delete content without ref, should ok", func(t *testing.T) {
err := datasource.GetMetadataManager().UnregisterService(ctx, &pb.DeleteServiceRequest{ServiceId: serviceID, Force: true})
assert.NoError(t, err)
err = schema.Instance().DeleteContent(ctx, &schema.ContentRequest{
Hash: hash,
})
assert.NoError(t, err)
_, err = schema.Instance().GetRef(ctx, &schema.RefRequest{
ServiceID: serviceID,
SchemaID: "schemaID_1",
})
testErr := err.(*errsvc.Error)
assert.Error(t, testErr)
assert.Equal(t, pb.ErrSchemaNotExists, testErr.Code)
})
}
func TestPutManyContent(t *testing.T) {
var serviceID string
ctx := getContext()
svc := &pb.MicroService{
ServiceName: "TestPutManyContent",
Schemas: []string{"schemaID_1"},
}
resp, err := datasource.GetMetadataManager().RegisterService(ctx, &pb.CreateServiceRequest{
Service: svc,
})
assert.NoError(t, err)
assert.NotEqual(t, "", resp.ServiceId)
serviceID = resp.ServiceId
defer schema.Instance().DeleteContent(ctx, &schema.ContentRequest{Hash: "hash_3"})
defer datasource.GetMetadataManager().UnregisterService(ctx, &pb.DeleteServiceRequest{ServiceId: serviceID, Force: true})
t.Run("put many content with invalid request, should failed", func(t *testing.T) {
err := schema.Instance().PutManyContent(ctx, &schema.PutManyContentRequest{})
testErr := err.(*errsvc.Error)
assert.Error(t, testErr)
assert.Equal(t, pb.ErrServiceNotExists, testErr.Code)
err = schema.Instance().PutManyContent(ctx, &schema.PutManyContentRequest{
ServiceID: serviceID,
SchemaIDs: []string{"schemaID_1"},
Contents: []*schema.ContentItem{
{
Hash: "hash_1",
},
{
Hash: "hash_2",
},
},
})
testErr = err.(*errsvc.Error)
assert.Error(t, testErr)
assert.Equal(t, pb.ErrInvalidParams, testErr.Code)
})
t.Run("put content with valid request, should ok", func(t *testing.T) {
err = schema.Instance().PutManyContent(ctx, &schema.PutManyContentRequest{
ServiceID: serviceID,
SchemaIDs: []string{"schemaID_1", "schemaID_2"},
Contents: []*schema.ContentItem{
{
Hash: "hash_1",
Content: "content_1",
Summary: "summary_1",
},
{
Hash: "hash_2",
Content: "content_2",
Summary: "summary_2",
},
},
})
assert.NoError(t, err)
content, err := schema.Instance().GetContent(ctx, &schema.ContentRequest{
Hash: "hash_1",
})
assert.NoError(t, err)
assert.NotNil(t, content)
assert.Equal(t, "hash_1", content.Hash)
assert.Equal(t, "content_1", content.Content)
content, err = schema.Instance().GetContent(ctx, &schema.ContentRequest{
Hash: "hash_2",
})
assert.NoError(t, err)
assert.NotNil(t, content)
assert.Equal(t, "hash_2", content.Hash)
assert.Equal(t, "content_2", content.Content)
ref, err := schema.Instance().GetRef(ctx, &schema.RefRequest{
ServiceID: serviceID,
SchemaID: "schemaID_1",
})
assert.NoError(t, err)
assert.NotNil(t, ref)
assert.Equal(t, "summary_1", ref.Summary)
ref, err = schema.Instance().GetRef(ctx, &schema.RefRequest{
ServiceID: serviceID,
SchemaID: "schemaID_2",
})
assert.NoError(t, err)
assert.NotNil(t, ref)
assert.Equal(t, "summary_2", ref.Summary)
service, err := datasource.GetMetadataManager().GetService(ctx, &pb.GetServiceRequest{
ServiceId: serviceID,
})
assert.NoError(t, err)
assert.NotNil(t, service)
assert.Equal(t, []string{"schemaID_1", "schemaID_2"}, service.Schemas)
})
t.Run("put many content again, should overwrite", func(t *testing.T) {
err = schema.Instance().PutManyContent(ctx, &schema.PutManyContentRequest{
ServiceID: serviceID,
SchemaIDs: []string{"schemaID_3"},
Contents: []*schema.ContentItem{
{
Hash: "hash_3",
Content: "content_3",
Summary: "summary_3",
},
},
})
assert.NoError(t, err)
content, err := schema.Instance().GetContent(ctx, &schema.ContentRequest{
Hash: "hash_1",
})
assert.NoError(t, err)
assert.NotNil(t, content)
assert.Equal(t, "hash_1", content.Hash)
assert.Equal(t, "content_1", content.Content)
content, err = schema.Instance().GetContent(ctx, &schema.ContentRequest{
Hash: "hash_3",
})
assert.NoError(t, err)
assert.NotNil(t, content)
assert.Equal(t, "hash_3", content.Hash)
assert.Equal(t, "content_3", content.Content)
ref, err := schema.Instance().GetRef(ctx, &schema.RefRequest{
ServiceID: serviceID,
SchemaID: "schemaID_1",
})
testErr := err.(*errsvc.Error)
assert.Error(t, testErr)
assert.Equal(t, pb.ErrSchemaNotExists, testErr.Code)
ref, err = schema.Instance().GetRef(ctx, &schema.RefRequest{
ServiceID: serviceID,
SchemaID: "schemaID_3",
})
assert.NoError(t, err)
assert.NotNil(t, ref)
assert.Equal(t, "summary_3", ref.Summary)
service, err := datasource.GetMetadataManager().GetService(ctx, &pb.GetServiceRequest{
ServiceId: serviceID,
})
assert.NoError(t, err)
assert.NotNil(t, service)
assert.Equal(t, []string{"schemaID_3"}, service.Schemas)
err = schema.Instance().DeleteContent(ctx, &schema.ContentRequest{Hash: "hash_1"})
assert.NoError(t, err)
err = schema.Instance().DeleteContent(ctx, &schema.ContentRequest{Hash: "hash_2"})
assert.NoError(t, err)
})
}