blob: 9e55a303271d3bce64a3e5dda80bcad6f213bd64 [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 resource
import (
"context"
"encoding/json"
"errors"
"testing"
"time"
kiemodel "github.com/apache/servicecomb-kie/pkg/model"
kiedb "github.com/apache/servicecomb-kie/server/datasource"
v1sync "github.com/apache/servicecomb-service-center/syncer/api/v1"
"github.com/go-chassis/cari/sync"
"github.com/stretchr/testify/assert"
)
type mockConfig struct {
kvs map[string]*kiemodel.KVDoc
}
func (m *mockConfig) Create(ctx context.Context, doc *kiemodel.KVDoc) error {
_, ok := m.kvs[doc.ID]
if ok {
return kiedb.ErrKVAlreadyExists
}
m.kvs[doc.ID] = doc
return nil
}
func (m *mockConfig) Get(ctx context.Context, ID string) (*kiemodel.KVDoc, error) {
result, ok := m.kvs[ID]
if !ok {
return nil, kiedb.ErrKeyNotExists
}
return result, nil
}
func (m *mockConfig) Update(ctx context.Context, doc *kiemodel.KVDoc) error {
_, ok := m.kvs[doc.ID]
if !ok {
return kiedb.ErrKeyNotExists
}
m.kvs[doc.ID] = doc
return nil
}
func (m *mockConfig) Delete(ctx context.Context, ID string) error {
_, ok := m.kvs[ID]
if !ok {
return kiedb.ErrKeyNotExists
}
delete(m.kvs, ID)
return nil
}
func TestOperateConfig(t *testing.T) {
const resourceID = "test"
t.Run("create update delete case", func(t *testing.T) {
createTime := time.Now().Unix()
input := &kiemodel.KVDoc{
ID: resourceID,
LabelFormat: "a:b",
Key: "key",
Value: "value",
ValueType: "text",
Project: "default",
Domain: "default",
Labels: map[string]string{
"a": "b",
},
Status: "enabled",
CreateTime: createTime,
UpdateTime: createTime,
}
value, _ := json.Marshal(input)
id, _ := v1sync.NewEventID()
e := &v1sync.Event{
Id: id,
Action: sync.CreateAction,
Subject: Config,
Opts: nil,
Value: value,
Timestamp: v1sync.Timestamp(),
}
a := &kvConfig{
event: e,
}
a.resource = &mockConfig{
kvs: make(map[string]*kiemodel.KVDoc),
}
ctx := context.Background()
result := a.LoadCurrentResource(ctx)
if assert.Nil(t, result) {
result = a.NeedOperate(ctx)
if assert.Nil(t, result) {
result = a.Operate(ctx)
if assert.NotNil(t, result) && assert.Equal(t, Success, result.Status) {
data, err := a.resource.Get(ctx, "test")
assert.Nil(t, err)
assert.NotNil(t, data)
}
}
}
updateTime := time.Now().Unix()
input = &kiemodel.KVDoc{
ID: resourceID,
LabelFormat: "a:b",
Key: "key",
Value: "changed",
ValueType: "text",
Project: "default",
Domain: "default",
Labels: map[string]string{
"a": "b",
},
Status: "enabled",
CreateTime: createTime,
UpdateTime: updateTime,
}
value, _ = json.Marshal(input)
id, _ = v1sync.NewEventID()
e1 := &v1sync.Event{
Id: id,
Action: sync.UpdateAction,
Subject: Config,
Opts: nil,
Value: value,
Timestamp: v1sync.Timestamp(),
}
a1 := &kvConfig{
event: e1,
resource: a.resource,
}
result = a1.LoadCurrentResource(ctx)
if assert.Nil(t, result) {
result = a1.NeedOperate(ctx)
if assert.Nil(t, result) {
result = a1.Operate(ctx)
if assert.NotNil(t, result) && assert.Equal(t, Success, result.Status) {
data, err := a1.resource.Get(ctx, "test")
assert.Nil(t, err)
assert.NotNil(t, data)
assert.Equal(t, "changed", data.Value)
}
}
}
id, _ = v1sync.NewEventID()
e2 := &v1sync.Event{
Id: id,
Action: sync.DeleteAction,
Subject: Config,
Opts: nil,
Value: value,
Timestamp: v1sync.Timestamp(),
}
a2 := &kvConfig{
event: e2,
resource: a.resource,
}
result = a2.LoadCurrentResource(ctx)
if assert.Nil(t, result) {
result = a2.NeedOperate(ctx)
if assert.Nil(t, result) {
result = a2.Operate(ctx)
if assert.NotNil(t, result) && assert.Equal(t, Success, result.Status) {
_, err := a2.resource.Get(ctx, "test")
assert.NotNil(t, err)
assert.True(t, errors.Is(err, kiedb.ErrKeyNotExists))
}
}
}
})
}