@@ -1152,3 +1152,90 @@ async fn test_shredded_variant_read_rejection() -> Result<(), Box<dyn std::error
1152
1152
1153
1153
Ok ( ( ) )
1154
1154
}
1155
+
1156
+ #[ tokio:: test]
1157
+ async fn test_set_domain_metadata_basic ( ) -> Result < ( ) , Box < dyn std:: error:: Error > > {
1158
+ let _ = tracing_subscriber:: fmt:: try_init ( ) ;
1159
+
1160
+ let schema = Arc :: new ( StructType :: new ( vec ! [ StructField :: nullable(
1161
+ "number" ,
1162
+ DataType :: INTEGER ,
1163
+ ) ] ) ) ;
1164
+
1165
+ for ( table_url, engine, store, table_name) in
1166
+ setup_test_tables ( schema. clone ( ) , & [ ] , None , "test_table" ) . await ?
1167
+ {
1168
+ let snapshot = Arc :: new ( Snapshot :: builder ( table_url. clone ( ) ) . build ( & engine) ?) ;
1169
+ let mut txn = snapshot. transaction ( ) ?;
1170
+
1171
+ // Set multiple domain metadata
1172
+ let domain1 = "app.config" ;
1173
+ let config1 = r#"{"version": 1}"# ;
1174
+ let domain2 = "spark.settings" ;
1175
+ let config2 = r#"{"cores": 4}"# ;
1176
+
1177
+ txn. set_domain_metadata ( domain1. into ( ) , config1. into ( ) ) ?;
1178
+ txn. set_domain_metadata ( domain2. into ( ) , config2. into ( ) ) ?;
1179
+ txn. commit ( & engine) ?;
1180
+
1181
+ let commit_data = store
1182
+ . get ( & Path :: from ( format ! (
1183
+ "/{table_name}/_delta_log/00000000000000000001.json"
1184
+ ) ) )
1185
+ . await ?
1186
+ . bytes ( )
1187
+ . await ?;
1188
+ let actions: Vec < serde_json:: Value > = Deserializer :: from_slice ( & commit_data)
1189
+ . into_iter ( )
1190
+ . try_collect ( ) ?;
1191
+
1192
+ let domain_actions: Vec < _ > = actions
1193
+ . iter ( )
1194
+ . filter ( |v| v. get ( "domainMetadata" ) . is_some ( ) )
1195
+ . collect ( ) ;
1196
+ assert_eq ! ( domain_actions. len( ) , 2 ) ;
1197
+
1198
+ // Check domains and their configurations
1199
+ for action in & domain_actions {
1200
+ let domain = action[ "domainMetadata" ] [ "domain" ] . as_str ( ) . unwrap ( ) ;
1201
+ let config = action[ "domainMetadata" ] [ "configuration" ] . as_str ( ) . unwrap ( ) ;
1202
+ assert ! ( !action[ "domainMetadata" ] [ "removed" ] . as_bool( ) . unwrap( ) ) ;
1203
+
1204
+ match domain {
1205
+ d if d == domain1 => assert_eq ! ( config, config1) ,
1206
+ d if d == domain2 => assert_eq ! ( config, config2) ,
1207
+ _ => panic ! ( "Unexpected domain: {}" , domain) ,
1208
+ }
1209
+ }
1210
+ }
1211
+ Ok ( ( ) )
1212
+ }
1213
+
1214
+ #[ tokio:: test]
1215
+ async fn test_set_domain_metadata_errors ( ) -> Result < ( ) , Box < dyn std:: error:: Error > > {
1216
+ let _ = tracing_subscriber:: fmt:: try_init ( ) ;
1217
+
1218
+ let schema = Arc :: new ( StructType :: new ( vec ! [ StructField :: nullable(
1219
+ "number" ,
1220
+ DataType :: INTEGER ,
1221
+ ) ] ) ) ;
1222
+
1223
+ for ( table_url, engine, _, _) in
1224
+ setup_test_tables ( schema. clone ( ) , & [ ] , None , "test_table" ) . await ?
1225
+ {
1226
+ let snapshot = Arc :: new ( Snapshot :: builder ( table_url. clone ( ) ) . build ( & engine) ?) ;
1227
+ let mut txn = snapshot. transaction ( ) ?;
1228
+
1229
+ // System domain rejection
1230
+ assert ! ( txn
1231
+ . set_domain_metadata( "delta.system" . into( ) , "config" . into( ) )
1232
+ . is_err( ) ) ;
1233
+
1234
+ // Duplicate domain rejection
1235
+ txn. set_domain_metadata ( "app.config" . into ( ) , "v1" . into ( ) ) ?;
1236
+ assert ! ( txn
1237
+ . set_domain_metadata( "app.config" . into( ) , "v2" . into( ) )
1238
+ . is_err( ) ) ;
1239
+ }
1240
+ Ok ( ( ) )
1241
+ }
0 commit comments