14
14
15
15
use std:: collections:: HashSet ;
16
16
17
+ use common_datavalues:: chrono:: DateTime ;
18
+ use common_datavalues:: chrono:: NaiveDate ;
19
+ use common_datavalues:: chrono:: NaiveDateTime ;
20
+ use common_datavalues:: chrono:: NaiveTime ;
21
+ use common_datavalues:: chrono:: Utc ;
17
22
use common_meta_types as mt;
18
23
use common_meta_types:: UserInfo ;
19
24
use common_meta_types:: UserPrivilegeType ;
@@ -148,6 +153,22 @@ pub(crate) fn test_gcs_stage_info() -> mt::UserStageInfo {
148
153
}
149
154
}
150
155
156
+ pub ( crate ) fn test_stage_file ( ) -> mt:: StageFile {
157
+ let dt = NaiveDateTime :: new (
158
+ NaiveDate :: from_ymd ( 2022 , 9 , 16 ) ,
159
+ NaiveTime :: from_hms ( 0 , 1 , 2 ) ,
160
+ ) ;
161
+ let user_id = mt:: UserIdentity :: new ( "datafuselabs" , "datafuselabs.rs" ) ;
162
+ mt:: StageFile {
163
+ path : "/path/to/stage" . to_string ( ) ,
164
+ size : 233 ,
165
+ md5 : None ,
166
+ last_modified : DateTime :: from_utc ( dt, Utc ) ,
167
+ creator : Some ( user_id) ,
168
+ etag : None ,
169
+ }
170
+ }
171
+
151
172
#[ test]
152
173
fn test_user_pb_from_to ( ) -> anyhow:: Result < ( ) > {
153
174
let test_user_info = test_user_info ( ) ;
@@ -158,6 +179,16 @@ fn test_user_pb_from_to() -> anyhow::Result<()> {
158
179
Ok ( ( ) )
159
180
}
160
181
182
+ #[ test]
183
+ fn test_stage_file_pb_from_to ( ) -> anyhow:: Result < ( ) > {
184
+ let test_stage_file = test_stage_file ( ) ;
185
+ let test_stage_file_pb = test_stage_file. to_pb ( ) ?;
186
+ let got = mt:: StageFile :: from_pb ( test_stage_file_pb) ?;
187
+ assert_eq ! ( got, test_stage_file) ;
188
+
189
+ Ok ( ( ) )
190
+ }
191
+
161
192
#[ test]
162
193
fn test_user_incompatible ( ) -> anyhow:: Result < ( ) > {
163
194
{
@@ -179,6 +210,25 @@ fn test_user_incompatible() -> anyhow::Result<()> {
179
210
) ;
180
211
}
181
212
213
+ {
214
+ let stage_file = test_stage_file ( ) ;
215
+ let mut p = stage_file. to_pb ( ) ?;
216
+ p. ver = VER + 1 ;
217
+ p. min_compatible = VER + 1 ;
218
+
219
+ let res = mt:: StageFile :: from_pb ( p) ;
220
+ assert_eq ! (
221
+ Incompatible {
222
+ reason: format!(
223
+ "executable ver={} is smaller than the message min compatible ver: {}" ,
224
+ VER ,
225
+ VER + 1
226
+ )
227
+ } ,
228
+ res. unwrap_err( )
229
+ )
230
+ }
231
+
182
232
{
183
233
let fs_stage_info = test_fs_stage_info ( ) ;
184
234
let mut p = fs_stage_info. to_pb ( ) ?;
@@ -250,7 +300,16 @@ fn test_build_user_pb_buf() -> anyhow::Result<()> {
250
300
251
301
let mut buf = vec ! [ ] ;
252
302
common_protos:: prost:: Message :: encode ( & p, & mut buf) ?;
253
- println ! ( "{:?}" , buf) ;
303
+ println ! ( "user_info: {:?}" , buf) ;
304
+ }
305
+
306
+ // StageFile
307
+ {
308
+ let stage_file = test_stage_file ( ) ;
309
+ let p = stage_file. to_pb ( ) ?;
310
+ let mut buf = vec ! [ ] ;
311
+ common_protos:: prost:: Message :: encode ( & p, & mut buf) ?;
312
+ println ! ( "stage_file: {:?}" , buf) ;
254
313
}
255
314
256
315
// Stage on local file system
@@ -261,7 +320,7 @@ fn test_build_user_pb_buf() -> anyhow::Result<()> {
261
320
262
321
let mut buf = vec ! [ ] ;
263
322
common_protos:: prost:: Message :: encode ( & p, & mut buf) ?;
264
- println ! ( "{:?}" , buf) ;
323
+ println ! ( "fs_stage_info: {:?}" , buf) ;
265
324
}
266
325
267
326
// Stage on S3
@@ -272,7 +331,7 @@ fn test_build_user_pb_buf() -> anyhow::Result<()> {
272
331
273
332
let mut buf = vec ! [ ] ;
274
333
common_protos:: prost:: Message :: encode ( & p, & mut buf) ?;
275
- println ! ( "{:?}" , buf) ;
334
+ println ! ( "s3_stage_info: {:?}" , buf) ;
276
335
}
277
336
278
337
// Stage on GCS, supported in version >=4.
@@ -281,7 +340,7 @@ fn test_build_user_pb_buf() -> anyhow::Result<()> {
281
340
let p = gcs_stage_info. to_pb ( ) ?;
282
341
let mut buf = vec ! [ ] ;
283
342
common_protos:: prost:: Message :: encode ( & p, & mut buf) ?;
284
- println ! ( "{:?}" , buf) ;
343
+ println ! ( "gcs_stage_info: {:?}" , buf) ;
285
344
}
286
345
287
346
Ok ( ( ) )
@@ -360,3 +419,39 @@ fn test_load_old_user() -> anyhow::Result<()> {
360
419
361
420
Ok ( ( ) )
362
421
}
422
+
423
+ #[ test]
424
+ fn test_old_stage_file ( ) -> anyhow:: Result < ( ) > {
425
+ // Encoded data of version 7 of StageFile:
426
+ // Generated with `test_build_user_pb_buf`
427
+ {
428
+ let stage_file_v7 = vec ! [
429
+ 10 , 14 , 47 , 112 , 97 , 116 , 104 , 47 , 116 , 111 , 47 , 115 , 116 , 97 , 103 , 101 , 16 , 233 , 1 ,
430
+ 34 , 23 , 50 , 48 , 50 , 50 , 45 , 48 , 57 , 45 , 49 , 54 , 32 , 48 , 48 , 58 , 48 , 49 , 58 , 48 , 50 , 32 ,
431
+ 85 , 84 , 67 , 42 , 37 , 10 , 12 , 100 , 97 , 116 , 97 , 102 , 117 , 115 , 101 , 108 , 97 , 98 , 115 , 18 ,
432
+ 15 , 100 , 97 , 116 , 97 , 102 , 117 , 115 , 101 , 108 , 97 , 98 , 115 , 46 , 114 , 115 , 160 , 6 , 8 ,
433
+ 168 , 6 , 1 , 160 , 6 , 8 , 168 , 6 , 1 ,
434
+ ] ;
435
+ let p: pb:: StageFile =
436
+ common_protos:: prost:: Message :: decode ( stage_file_v7. as_slice ( ) ) . map_err ( print_err) ?;
437
+ let got = mt:: StageFile :: from_pb ( p) . map_err ( print_err) ?;
438
+
439
+ let dt = NaiveDateTime :: new (
440
+ NaiveDate :: from_ymd ( 2022 , 9 , 16 ) ,
441
+ NaiveTime :: from_hms ( 0 , 1 , 2 ) ,
442
+ ) ;
443
+ let user_id = mt:: UserIdentity :: new ( "datafuselabs" , "datafuselabs.rs" ) ;
444
+ let want = mt:: StageFile {
445
+ path : "/path/to/stage" . to_string ( ) ,
446
+ size : 233 ,
447
+ md5 : None ,
448
+ last_modified : DateTime :: from_utc ( dt, Utc ) ,
449
+ creator : Some ( user_id) ,
450
+ ..Default :: default ( )
451
+ } ;
452
+
453
+ assert_eq ! ( got, want) ;
454
+ }
455
+
456
+ Ok ( ( ) )
457
+ }
0 commit comments