@@ -207,6 +207,119 @@ func TestWriteDDLEvent(t *testing.T) {
207207 }` , string (tableSchema ))
208208}
209209
210+ func TestWriteDDLEventWithTableIDAsPath (t * testing.T ) {
211+ parentDir := t .TempDir ()
212+ uri := fmt .Sprintf ("file:///%s?protocol=csv&use-table-id-as-path=true" , parentDir )
213+ sinkURI , err := url .Parse (uri )
214+ require .NoError (t , err )
215+
216+ replicaConfig := config .GetDefaultReplicaConfig ()
217+ err = replicaConfig .ValidateAndAdjust (sinkURI )
218+ require .NoError (t , err )
219+
220+ ctx , cancel := context .WithCancel (context .Background ())
221+ defer cancel ()
222+
223+ mockPDClock := pdutil .NewClock4Test ()
224+ appcontext .SetService (appcontext .DefaultPDClock , mockPDClock )
225+
226+ cloudStorageSink , err := newSinkForTest (ctx , replicaConfig , sinkURI , nil )
227+ require .NoError (t , err )
228+
229+ go cloudStorageSink .Run (ctx )
230+
231+ tableInfo := common .WrapTableInfo ("test" , & timodel.TableInfo {
232+ ID : 20 ,
233+ Name : ast .NewCIStr ("table1" ),
234+ Columns : []* timodel.ColumnInfo {
235+ {
236+ Name : ast .NewCIStr ("col1" ),
237+ FieldType : * types .NewFieldType (mysql .TypeLong ),
238+ },
239+ {
240+ Name : ast .NewCIStr ("col2" ),
241+ FieldType : * types .NewFieldType (mysql .TypeVarchar ),
242+ },
243+ },
244+ })
245+ ddlEvent := & commonEvent.DDLEvent {
246+ Query : "alter table test.table1 add col2 varchar(64)" ,
247+ Type : byte (timodel .ActionAddColumn ),
248+ SchemaName : "test" ,
249+ TableName : "table1" ,
250+ FinishedTs : 100 ,
251+ TableInfo : tableInfo ,
252+ }
253+
254+ err = cloudStorageSink .WriteBlockEvent (ddlEvent )
255+ require .NoError (t , err )
256+
257+ tableDir := path .Join (parentDir , "test/20/meta/" )
258+ tableSchema , err := os .ReadFile (path .Join (tableDir , "schema_100_4192708364.json" ))
259+ require .NoError (t , err )
260+ require .Contains (t , string (tableSchema ), `"Table": "table1"` )
261+ }
262+
263+ func TestWriteDDLEventWithInvalidExchangePartitionEvent (t * testing.T ) {
264+ testCases := []struct {
265+ name string
266+ multipleTableInfos []* common.TableInfo
267+ }{
268+ {
269+ name : "nil source table info" ,
270+ multipleTableInfos : []* common.TableInfo {nil },
271+ },
272+ {
273+ name : "short table infos" ,
274+ multipleTableInfos : nil ,
275+ },
276+ }
277+
278+ for _ , tc := range testCases {
279+ t .Run (tc .name , func (t * testing.T ) {
280+ parentDir := t .TempDir ()
281+ uri := fmt .Sprintf ("file:///%s?protocol=csv&use-table-id-as-path=true" , parentDir )
282+ sinkURI , err := url .Parse (uri )
283+ require .NoError (t , err )
284+
285+ replicaConfig := config .GetDefaultReplicaConfig ()
286+ err = replicaConfig .ValidateAndAdjust (sinkURI )
287+ require .NoError (t , err )
288+
289+ ctx , cancel := context .WithCancel (context .Background ())
290+ defer cancel ()
291+
292+ cloudStorageSink , err := newSinkForTest (ctx , replicaConfig , sinkURI , nil )
293+ require .NoError (t , err )
294+
295+ tableInfo := common .WrapTableInfo ("test" , & timodel.TableInfo {
296+ ID : 20 ,
297+ Name : ast .NewCIStr ("table1" ),
298+ Columns : []* timodel.ColumnInfo {
299+ {
300+ Name : ast .NewCIStr ("col1" ),
301+ FieldType : * types .NewFieldType (mysql .TypeLong ),
302+ },
303+ },
304+ })
305+ ddlEvent := & commonEvent.DDLEvent {
306+ Query : "alter table test.table1 exchange partition p0 with table test.table2" ,
307+ Type : byte (timodel .ActionExchangeTablePartition ),
308+ SchemaName : "test" ,
309+ TableName : "table1" ,
310+ ExtraSchemaName : "test" ,
311+ ExtraTableName : "table2" ,
312+ FinishedTs : 100 ,
313+ TableInfo : tableInfo ,
314+ }
315+ ddlEvent .MultipleTableInfos = append ([]* common.TableInfo {tableInfo }, tc .multipleTableInfos ... )
316+
317+ err = cloudStorageSink .WriteBlockEvent (ddlEvent )
318+ require .ErrorContains (t , err , "invalid exchange partition ddl event, source table info is missing" )
319+ })
320+ }
321+ }
322+
210323func TestWriteCheckpointEvent (t * testing.T ) {
211324 parentDir := t .TempDir ()
212325 uri := fmt .Sprintf ("file:///%s?protocol=csv" , parentDir )
0 commit comments