github.com/pingcap/tiflow@v0.0.0-20240520035814-5bf52d54e205/pkg/sink/codec/avro/glue_schema_registry_test.go (about) 1 // Copyright 2023 PingCAP, Inc. 2 // 3 // Licensed under the Apache License, Version 2.0 (the "License"); 4 // you may not use this file except in compliance with the License. 5 // You may obtain a copy of the License at 6 // 7 // http://www.apache.org/licenses/LICENSE-2.0 8 // 9 // Unless required by applicable law or agreed to in writing, software 10 // distributed under the License is distributed on an "AS IS" BASIS, 11 // See the License for the specific language governing permissions and 12 // limitations under the License. 13 14 package avro 15 16 import ( 17 "context" 18 "testing" 19 20 "github.com/pingcap/tiflow/pkg/sink/codec/common" 21 "github.com/stretchr/testify/require" 22 ) 23 24 func newClueSchemaManagerForTest() *glueSchemaManager { 25 res := &glueSchemaManager{ 26 registryName: "test_registry", 27 client: newMockGlueClientImpl(), 28 cache: make(map[string]*schemaCacheEntry), 29 registryType: common.SchemaRegistryTypeGlue, 30 } 31 return res 32 } 33 34 func TestGlueSchemaManager_Register(t *testing.T) { 35 ctx := context.Background() 36 m := newClueSchemaManagerForTest() 37 38 schemaName := "test_schema" 39 schemaDefinition := `{"type": "record", "name": "test_schema", "fields": [{"name": "field1", "type": "string"}]}` 40 schemaID, err := m.Register(ctx, schemaName, schemaDefinition) 41 require.NoError(t, err) 42 require.NotEmpty(t, schemaID.glueSchemaID) 43 44 // Register the same schema again 45 schemaID2, err := m.Register(ctx, schemaName, schemaDefinition) 46 require.NoError(t, err) 47 require.Equal(t, schemaID.glueSchemaID, schemaID2.glueSchemaID) 48 49 // Register a different schema 50 schemaDefinition2 := `{"type": "record", "name": "test_schema2", "fields": [{"name": "field1", "type": "string"}]}` 51 schemaID3, err := m.Register(ctx, schemaName, schemaDefinition2) 52 require.NoError(t, err) 53 require.NotEqual(t, schemaID.glueSchemaID, schemaID3.glueSchemaID) 54 } 55 56 func TestGlueSchemaManager_Lookup(t *testing.T) { 57 ctx := context.Background() 58 m := newClueSchemaManagerForTest() 59 60 schemaName := "test_schema" 61 schemaDefinition := `{"type": "record", "name": "test_schema", "fields": [{"name": "field1", "type": "string"}]}` 62 schemaID, err := m.Register(ctx, schemaName, schemaDefinition) 63 require.NoError(t, err) 64 65 codec, err := m.Lookup(ctx, schemaName, schemaID) 66 require.NoError(t, err) 67 require.NotNil(t, codec) 68 require.Equal(t, schemaDefinition, codec.Schema()) 69 } 70 71 func TestGlueSchemaManager_GetCachedOrRegister(t *testing.T) { 72 ctx := context.Background() 73 m := newClueSchemaManagerForTest() 74 75 schemaName := "test_schema" 76 schemaDefinition := `{"type": "record", "name": "test_schema", "fields": [{"name": "field1", "type": "string"}]}` 77 codec, _, err := m.GetCachedOrRegister(ctx, schemaName, 1, func() (string, error) { 78 return schemaDefinition, nil 79 }) 80 require.NoError(t, err) 81 require.NotNil(t, codec) 82 require.Equal(t, schemaDefinition, codec.Schema()) 83 84 // Get the same schema again 85 codec2, _, err := m.GetCachedOrRegister(ctx, schemaName, 1, func() (string, error) { 86 return schemaDefinition, nil 87 }) 88 require.NoError(t, err) 89 require.Equal(t, codec, codec2) 90 } 91 92 func TestGlueSchemaManager_RegistryType(t *testing.T) { 93 m := newClueSchemaManagerForTest() 94 95 registryType := m.RegistryType() 96 require.Equal(t, common.SchemaRegistryTypeGlue, registryType) 97 } 98 99 func TestGlueSchemaManager_getMsgHeader(t *testing.T) { 100 ctx := context.Background() 101 m := newClueSchemaManagerForTest() 102 103 schemaName := "test_schema" 104 schemaDefinition := `{"type": "record", "name": "test_schema", "fields": [{"name": "field1", "type": "string"}]}` 105 schemaID, err := m.Register(ctx, schemaName, schemaDefinition) 106 require.NoError(t, err) 107 108 header, err := m.getMsgHeader(schemaID.glueSchemaID) 109 require.NoError(t, err) 110 require.Equal(t, header[0], headerVersionByte) 111 require.Equal(t, header[1], compressionDefaultByte) 112 sid, err := getGlueSchemaIDFromHeader(header) 113 require.NoError(t, err) 114 require.Equal(t, schemaID.glueSchemaID, sid) 115 }