• Home
  • Features
  • Pricing
  • Docs
  • Announcements
  • Sign In

tu6ge / oss-rs / 5874371460

pending completion
5874371460

Pull #24

github

tu6ge
chore: add clippy deprecated_semver rule
Pull Request #24: Branch0.12

39 of 39 new or added lines in 4 files covered. (100.0%)

6180 of 6422 relevant lines covered (96.23%)

9.24 hits per line

Source File
Press 'n' to go to next uncovered line, 'b' for previous

81.92
/src/decode/test.rs
1
static mut OBEJCT_ITEM_ID: i8 = 0;
2

3
use thiserror::Error;
4

5
use crate::decode::ListError;
6

7
#[derive(Debug, Error)]
×
8
#[error("custom")]
9
struct MyError {}
10

11
impl ListError for MyError {}
12

13
mod object_list_xml {
14

15
    use super::MyError;
16

17
    #[cfg(feature = "core")]
18
    use crate::object::{Object, ObjectList};
19

20
    use super::OBEJCT_ITEM_ID;
21

22
    #[test]
23
    fn from_xml() {
2✔
24
        use crate::decode::RefineObject;
25
        use crate::decode::RefineObjectList;
26

27
        #[derive(Default)]
×
28
        struct ObjectA {}
29

30
        impl RefineObject<MyError> for ObjectA {
31
            fn set_key(&mut self, key: &str) -> Result<(), MyError> {
3✔
32
                unsafe {
33
                    if OBEJCT_ITEM_ID == 0 {
3✔
34
                        assert_eq!(key, "9AB932LY.jpeg");
1✔
35
                    } else if OBEJCT_ITEM_ID == 1 {
2✔
36
                        assert_eq!(key, "CHANGELOG.md");
1✔
37
                    } else if OBEJCT_ITEM_ID == 2 {
1✔
38
                        assert_eq!(key, "LICENSE");
1✔
39
                    }
40
                }
41
                Ok(())
42
            }
3✔
43
            fn set_last_modified(&mut self, last_modified: &str) -> Result<(), MyError> {
3✔
44
                unsafe {
45
                    if OBEJCT_ITEM_ID == 0 {
3✔
46
                        assert_eq!(last_modified, "2022-06-26T09:53:21.000Z");
1✔
47
                    } else if OBEJCT_ITEM_ID == 1 {
2✔
48
                        assert_eq!(last_modified, "2022-06-12T06:11:06.000Z");
1✔
49
                    } else if OBEJCT_ITEM_ID == 2 {
1✔
50
                        assert_eq!(last_modified, "2022-06-12T06:11:06.000Z");
1✔
51
                    }
52
                }
53
                Ok(())
54
            }
3✔
55
            fn set_etag(&mut self, etag: &str) -> Result<(), MyError> {
3✔
56
                unsafe {
57
                    if OBEJCT_ITEM_ID == 0 {
3✔
58
                        assert_eq!(etag, "F75A15996D0857B16FA31A3B16624C26");
1✔
59
                    } else if OBEJCT_ITEM_ID == 1 {
2✔
60
                        assert_eq!(etag, "09C37AC5B145D368D52D0AAB58B25213");
1✔
61
                    } else if OBEJCT_ITEM_ID == 2 {
1✔
62
                        assert_eq!(etag, "2CBAB10A50CC6905EA2D7CCCEF31A6C9");
1✔
63
                    }
64
                }
65
                Ok(())
66
            }
3✔
67
            fn set_type(&mut self, _type: &str) -> Result<(), MyError> {
3✔
68
                unsafe {
69
                    if OBEJCT_ITEM_ID == 0 {
3✔
70
                        assert_eq!(_type, "Normal");
1✔
71
                    } else if OBEJCT_ITEM_ID == 1 {
2✔
72
                        assert_eq!(_type, "Normal");
1✔
73
                    } else if OBEJCT_ITEM_ID == 2 {
1✔
74
                        assert_eq!(_type, "Normal");
1✔
75
                    }
76
                }
77
                Ok(())
78
            }
3✔
79
            fn set_size(&mut self, size: &str) -> Result<(), MyError> {
3✔
80
                unsafe {
81
                    if OBEJCT_ITEM_ID == 0 {
3✔
82
                        assert_eq!(size, "18027");
1✔
83
                    } else if OBEJCT_ITEM_ID == 1 {
2✔
84
                        assert_eq!(size, "40845");
1✔
85
                    } else if OBEJCT_ITEM_ID == 2 {
1✔
86
                        assert_eq!(size, "1065");
1✔
87
                    }
88
                }
89
                Ok(())
90
            }
3✔
91
            fn set_storage_class(&mut self, storage_class: &str) -> Result<(), MyError> {
3✔
92
                assert_eq!(storage_class, "Standard");
3✔
93
                unsafe {
94
                    OBEJCT_ITEM_ID += 1;
3✔
95
                }
96
                Ok(())
97
            }
3✔
98
        }
99
        struct ListB {}
100
        impl RefineObjectList<ObjectA, MyError, MyError> for ListB {
101
            fn set_name(&mut self, name: &str) -> Result<(), MyError> {
1✔
102
                assert_eq!(name, "foo_bucket");
1✔
103
                Ok(())
104
            }
1✔
105
            fn set_prefix(&mut self, prefix: &str) -> Result<(), MyError> {
1✔
106
                assert_eq!(prefix, "foo_prefix");
1✔
107
                Ok(())
108
            }
1✔
109
            fn set_max_keys(&mut self, max_keys: &str) -> Result<(), MyError> {
1✔
110
                assert_eq!(max_keys, "100");
1✔
111
                Ok(())
112
            }
1✔
113
            fn set_key_count(&mut self, key_count: &str) -> Result<(), MyError> {
1✔
114
                assert_eq!(key_count, "3");
1✔
115
                Ok(())
116
            }
1✔
117
            fn set_next_continuation_token_str(&mut self, token: &str) -> Result<(), MyError> {
×
118
                assert!(token.is_empty());
×
119
                Ok(())
120
            }
×
121
            // fn set_list(self, list: Vec<T>) -> Result<Self, InvalidObjectListValue>{
122
            //     Ok(self)
123
            // }
124
        }
125

126
        let xml = r#"<?xml version="1.0" encoding="UTF-8"?>
1✔
127
        <ListBucketResult>
128
          <Name>foo_bucket</Name>
129
          <Prefix>foo_prefix</Prefix>
130
          <MaxKeys>100</MaxKeys>
131
          <Delimiter></Delimiter>
132
          <IsTruncated>false</IsTruncated>
133
          <Contents>
134
            <Key>9AB932LY.jpeg</Key>
135
            <LastModified>2022-06-26T09:53:21.000Z</LastModified>
136
            <ETag>"F75A15996D0857B16FA31A3B16624C26"</ETag>
137
            <Type>Normal</Type>
138
            <Size>18027</Size>
139
            <StorageClass>Standard</StorageClass>
140
          </Contents>
141
          <Contents>
142
            <Key>CHANGELOG.md</Key>
143
            <LastModified>2022-06-12T06:11:06.000Z</LastModified>
144
            <ETag>"09C37AC5B145D368D52D0AAB58B25213"</ETag>
145
            <Type>Normal</Type>
146
            <Size>40845</Size>
147
            <StorageClass>Standard</StorageClass>
148
          </Contents>
149
          <Contents>
150
            <Key>LICENSE</Key>
151
            <LastModified>2022-06-12T06:11:06.000Z</LastModified>
152
            <ETag>"2CBAB10A50CC6905EA2D7CCCEF31A6C9"</ETag>
153
            <Type>Normal</Type>
154
            <Size>1065</Size>
155
            <StorageClass>Standard</StorageClass>
156
          </Contents>
157
          <KeyCount>3</KeyCount>
158
        </ListBucketResult>"#;
159

160
        // let base = BucketBase::new("abc".try_into().unwrap(), EndPoint::CnQingdao);
161

162
        let mut list = ListB {};
163

164
        let res = list.decode(xml, || ObjectA {});
4✔
165

166
        assert!(res.is_ok());
1✔
167
    }
2✔
168

169
    // bench result        5,210 ns/iter (+/- 151)
170
    // update to &str      4,262 ns/iter (+/- 96)
171
    // update to &mut self 3,718 ns/iter (+/- 281)
172
    #[cfg(test)]
173
    #[cfg(feature = "bench")]
174
    #[bench]
175
    fn from_xml_bench(b: &mut test::Bencher) {
176
        use crate::decode::RefineObject;
177
        use crate::decode::RefineObjectList;
178

179
        #[derive(Default)]
180
        struct ObjectA {}
181

182
        impl RefineObject for ObjectA {
183
            type Bucket = Arc<BucketBase>;
184
            type Error = OssError;
185
            fn set_key(&mut self, key: &str) -> Result<(), OssError> {
186
                Ok(())
187
            }
188
            fn set_last_modified(&mut self, last_modified: &str) -> Result<(), OssError> {
189
                Ok(())
190
            }
191
            fn set_etag(&mut self, etag: &str) -> Result<(), OssError> {
192
                Ok(())
193
            }
194
            fn set_type(&mut self, _type: &str) -> Result<(), OssError> {
195
                Ok(())
196
            }
197
            fn set_size(&mut self, size: &str) -> Result<(), OssError> {
198
                Ok(())
199
            }
200
            fn set_storage_class(&mut self, storage_class: &str) -> Result<(), OssError> {
201
                Ok(())
202
            }
203
            fn set_bucket(self, bucket: Arc<BucketBase>) -> Self {
204
                self
205
            }
206
        }
207
        struct ListB {}
208
        impl RefineObjectList<ObjectA> for ListB {
209
            type Error = OssError;
210
        }
211

212
        let xml = r#"<?xml version="1.0" encoding="UTF-8"?>
213
        <ListBucketResult>
214
          <Name>foo_bucket</Name>
215
          <Prefix></Prefix>
216
          <MaxKeys>100</MaxKeys>
217
          <Delimiter></Delimiter>
218
          <IsTruncated>false</IsTruncated>
219
          <Contents>
220
            <Key>9AB932LY.jpeg</Key>
221
            <LastModified>2022-06-26T09:53:21.000Z</LastModified>
222
            <ETag>"F75A15996D0857B16FA31A3B16624C26"</ETag>
223
            <Type>Normal</Type>
224
            <Size>18027</Size>
225
            <StorageClass>Standard</StorageClass>
226
          </Contents>
227
          <Contents>
228
            <Key>CHANGELOG.md</Key>
229
            <LastModified>2022-06-12T06:11:06.000Z</LastModified>
230
            <ETag>"09C37AC5B145D368D52D0AAB58B25213"</ETag>
231
            <Type>Normal</Type>
232
            <Size>40845</Size>
233
            <StorageClass>Standard</StorageClass>
234
          </Contents>
235
          <Contents>
236
            <Key>LICENSE</Key>
237
            <LastModified>2022-06-12T06:11:06.000Z</LastModified>
238
            <ETag>"2CBAB10A50CC6905EA2D7CCCEF31A6C9"</ETag>
239
            <Type>Normal</Type>
240
            <Size>1065</Size>
241
            <StorageClass>Standard</StorageClass>
242
          </Contents>
243
          <KeyCount>3</KeyCount>
244
        </ListBucketResult>"#;
245

246
        let mut list = ListB {};
247

248
        b.iter(|| {
249
            let base = BucketBase::new("abc".parse().unwrap(), EndPoint::CnQingdao);
250
            list.decode(xml, Arc::new(base));
251
        })
252
    }
253

254
    // fn init_object_list(token: Option<String>, list: Vec<Object<RcPointer>>) -> ObjectList<RcPointer> {
255
    //     let client = ClientRc::new(
256
    //         "foo1".into(),
257
    //         "foo2".into(),
258
    //         "https://oss-cn-shanghai.aliyuncs.com".try_into().unwrap(),
259
    //         "foo4".try_into().unwrap(),
260
    //     );
261

262
    //     let object_list = ObjectList::<RcPointer>::new(
263
    //         BucketBase::from_str("abc.oss-cn-shanghai.aliyuncs.com").unwrap(),
264
    //         String::from("foo2"),
265
    //         100,
266
    //         200,
267
    //         list,
268
    //         token,
269
    //         Rc::new(client),
270
    //         [],
271
    //     );
272

273
    //     object_list
274
    // }
275

276
    #[cfg(feature = "core")]
277
    #[allow(dead_code)]
278
    fn init_object_list(token: Option<String>, list: Vec<Object>) -> ObjectList {
×
279
        use crate::builder::ArcPointer;
280
        use crate::client::Client;
281
        use std::sync::Arc;
282

283
        let client = Client::new(
×
284
            "foo1".into(),
×
285
            "foo2".into(),
×
286
            "https://oss-cn-shanghai.aliyuncs.com".parse().unwrap(),
×
287
            "foo4".parse().unwrap(),
×
288
        );
289

290
        let object_list = ObjectList::<ArcPointer>::new(
×
291
            "abc.oss-cn-shanghai.aliyuncs.com".parse().unwrap(),
×
292
            Some("foo2/".parse().unwrap()),
×
293
            100,
294
            200,
295
            list,
296
            token,
297
            Arc::new(client),
×
298
            [],
299
        );
300

301
        object_list
302
    }
×
303

304
    // update to &mut self 5,015 ns/iter (+/- 212)
305
    #[cfg(test)]
306
    #[cfg(feature = "bench")]
307
    #[bench]
308
    fn from_xml_bench_real_object(b: &mut test::Bencher) {
309
        use crate::decode::RefineObject;
310
        use crate::decode::RefineObjectList;
311

312
        let xml = r#"<?xml version="1.0" encoding="UTF-8"?>
313
        <ListBucketResult>
314
          <Name>foo_bucket</Name>
315
          <Prefix></Prefix>
316
          <MaxKeys>100</MaxKeys>
317
          <Delimiter></Delimiter>
318
          <IsTruncated>false</IsTruncated>
319
          <Contents>
320
            <Key>9AB932LY.jpeg</Key>
321
            <LastModified>2022-06-26T09:53:21.000Z</LastModified>
322
            <ETag>"F75A15996D0857B16FA31A3B16624C26"</ETag>
323
            <Type>Normal</Type>
324
            <Size>18027</Size>
325
            <StorageClass>Standard</StorageClass>
326
          </Contents>
327
          <Contents>
328
            <Key>CHANGELOG.md</Key>
329
            <LastModified>2022-06-12T06:11:06.000Z</LastModified>
330
            <ETag>"09C37AC5B145D368D52D0AAB58B25213"</ETag>
331
            <Type>Normal</Type>
332
            <Size>40845</Size>
333
            <StorageClass>Standard</StorageClass>
334
          </Contents>
335
          <Contents>
336
            <Key>LICENSE</Key>
337
            <LastModified>2022-06-12T06:11:06.000Z</LastModified>
338
            <ETag>"2CBAB10A50CC6905EA2D7CCCEF31A6C9"</ETag>
339
            <Type>Normal</Type>
340
            <Size>1065</Size>
341
            <StorageClass>Standard</StorageClass>
342
          </Contents>
343
          <KeyCount>3</KeyCount>
344
        </ListBucketResult>"#;
345

346
        let mut list = init_object_list(None, vec![]);
347
        b.iter(|| {
348
            let base = BucketBase::new("abc".parse().unwrap(), EndPoint::CnQingdao);
349
            list.decode(xml, Arc::new(base));
350
        })
351
    }
352

353
    #[test]
354
    fn from_xml_has_next() {
2✔
355
        use crate::decode::RefineObject;
356
        use crate::decode::RefineObjectList;
357

358
        #[derive(Default)]
×
359
        struct ObjectA {}
360

361
        impl RefineObject<MyError> for ObjectA {}
362

363
        struct ListB {}
364
        impl RefineObjectList<ObjectA, MyError, MyError> for ListB {
365
            fn set_next_continuation_token_str(&mut self, token: &str) -> Result<(), MyError> {
1✔
366
                assert!(
1✔
367
                    token == "CiphcHBzL1RhdXJpIFB1Ymxpc2ggQXBwXzAuMS42X3g2NF9lbi1VUy5tc2kQAA--"
1✔
368
                );
369
                Ok(())
370
            }
1✔
371
        }
372

373
        let xml = r#"<?xml version="1.0" encoding="UTF-8"?>
1✔
374
        <ListBucketResult>
375
          <Name>foo_bucket</Name>
376
          <Prefix></Prefix>
377
          <MaxKeys>100</MaxKeys>
378
          <Delimiter></Delimiter>
379
          <IsTruncated>false</IsTruncated>
380
          <NextContinuationToken>CiphcHBzL1RhdXJpIFB1Ymxpc2ggQXBwXzAuMS42X3g2NF9lbi1VUy5tc2kQAA--</NextContinuationToken>
381
          <Contents>
382
            <Key>9AB932LY.jpeg</Key>
383
            <LastModified>2022-06-26T09:53:21.000Z</LastModified>
384
            <ETag>"F75A15996D0857B16FA31A3B16624C26"</ETag>
385
            <Type>Normal</Type>
386
            <Size>18027</Size>
387
            <StorageClass>Standard</StorageClass>
388
          </Contents>
389
          <Contents>
390
            <Key>CHANGELOG.md</Key>
391
            <LastModified>2022-06-12T06:11:06.000Z</LastModified>
392
            <ETag>"09C37AC5B145D368D52D0AAB58B25213"</ETag>
393
            <Type>Normal</Type>
394
            <Size>40845</Size>
395
            <StorageClass>Standard</StorageClass>
396
          </Contents>
397
          <Contents>
398
            <Key>LICENSE</Key>
399
            <LastModified>2022-06-12T06:11:06.000Z</LastModified>
400
            <ETag>"2CBAB10A50CC6905EA2D7CCCEF31A6C9"</ETag>
401
            <Type>Normal</Type>
402
            <Size>1065</Size>
403
            <StorageClass>Standard</StorageClass>
404
          </Contents>
405
          <KeyCount>3</KeyCount>
406
        </ListBucketResult>"#;
407

408
        //let base = BucketBase::new("abc".try_into().unwrap(), EndPoint::CnQingdao);
409

410
        let mut list = ListB {};
411

412
        let init_object = || ObjectA {};
3✔
413

414
        let res = list.decode(xml, init_object);
1✔
415

416
        assert!(res.is_ok());
1✔
417
    }
2✔
418
}
419

420
mod bucket_xml {
421
    use super::MyError;
422

423
    #[test]
424
    fn from_xml() {
2✔
425
        use crate::decode::RefineBucket;
426

427
        struct BucketA {}
428

429
        impl RefineBucket<MyError> for BucketA {
430
            fn set_name(&mut self, name: &str) -> Result<(), MyError> {
1✔
431
                assert_eq!(name, "foo");
1✔
432
                Ok(())
433
            }
1✔
434
            fn set_creation_date(&mut self, creation_date: &str) -> Result<(), MyError> {
1✔
435
                assert_eq!(creation_date, "2016-11-05T13:10:10.000Z");
1✔
436
                Ok(())
437
            }
1✔
438
            fn set_location(&mut self, location: &str) -> Result<(), MyError> {
1✔
439
                assert_eq!(location, "oss-cn-shanghai");
1✔
440
                Ok(())
441
            }
1✔
442
            fn set_extranet_endpoint(&mut self, extranet_endpoint: &str) -> Result<(), MyError> {
1✔
443
                assert_eq!(extranet_endpoint, "oss-cn-shanghai.aliyuncs.com");
1✔
444
                Ok(())
445
            }
1✔
446
            fn set_intranet_endpoint(&mut self, intranet_endpoint: &str) -> Result<(), MyError> {
1✔
447
                assert_eq!(intranet_endpoint, "oss-cn-shanghai-internal.aliyuncs.com");
1✔
448
                Ok(())
449
            }
1✔
450
            fn set_storage_class(&mut self, storage_class: &str) -> Result<(), MyError> {
1✔
451
                assert_eq!(storage_class, "Standard");
1✔
452
                Ok(())
453
            }
1✔
454
        }
455

456
        let xml = r#"<?xml version="1.0" encoding="UTF-8"?>
1✔
457
        <BucketInfo>
458
          <Bucket>
459
            <AccessMonitor>Disabled</AccessMonitor>
460
            <Comment></Comment>
461
            <CreationDate>2016-11-05T13:10:10.000Z</CreationDate>
462
            <CrossRegionReplication>Disabled</CrossRegionReplication>
463
            <DataRedundancyType>LRS</DataRedundancyType>
464
            <ExtranetEndpoint>oss-cn-shanghai.aliyuncs.com</ExtranetEndpoint>
465
            <IntranetEndpoint>oss-cn-shanghai-internal.aliyuncs.com</IntranetEndpoint>
466
            <Location>oss-cn-shanghai</Location>
467
            <Name>foo</Name>
468
            <ResourceGroupId>rg-foobar</ResourceGroupId>
469
            <StorageClass>Standard</StorageClass>
470
            <TransferAcceleration>Disabled</TransferAcceleration>
471
            <Owner>
472
              <DisplayName>100889</DisplayName>
473
              <ID>3004212</ID>
474
            </Owner>
475
            <AccessControlList>
476
              <Grant>public-read</Grant>
477
            </AccessControlList>
478
            <ServerSideEncryptionRule>
479
              <SSEAlgorithm>None</SSEAlgorithm>
480
            </ServerSideEncryptionRule>
481
            <BucketPolicy>
482
              <LogBucket></LogBucket>
483
              <LogPrefix></LogPrefix>
484
            </BucketPolicy>
485
          </Bucket>
486
        </BucketInfo>"#;
487

488
        let info = BucketA {}.decode(xml);
1✔
489

490
        assert!(info.is_ok());
1✔
491
    }
2✔
492
}
493
static mut BUCKETS_ITEM_ID: i8 = 0;
494
mod bucket_list_xml {
495
    use super::MyError;
496

497
    use super::BUCKETS_ITEM_ID;
498

499
    #[test]
500
    fn from_xml() {
2✔
501
        use crate::decode::{RefineBucket, RefineBucketList};
502

503
        #[derive(Default)]
×
504
        struct BucketA {}
505

506
        impl RefineBucket<MyError> for BucketA {
507
            fn set_name(&mut self, name: &str) -> Result<(), MyError> {
2✔
508
                unsafe {
509
                    if BUCKETS_ITEM_ID == 0 {
2✔
510
                        assert_eq!(name, "foo124442");
1✔
511
                    } else if BUCKETS_ITEM_ID == 1 {
1✔
512
                        assert_eq!(name, "foo342390bar");
1✔
513
                    }
514
                }
515

516
                Ok(())
517
            }
2✔
518
            fn set_creation_date(&mut self, creation_date: &str) -> Result<(), MyError> {
2✔
519
                unsafe {
520
                    if BUCKETS_ITEM_ID == 0 {
2✔
521
                        assert_eq!(creation_date, "2020-09-13T03:14:54.000Z");
1✔
522
                    } else if BUCKETS_ITEM_ID == 1 {
1✔
523
                        assert_eq!(creation_date, "2016-11-05T13:10:10.000Z");
1✔
524
                    }
525
                }
526
                Ok(())
527
            }
2✔
528
            fn set_location(&mut self, location: &str) -> Result<(), MyError> {
2✔
529
                unsafe {
530
                    if BUCKETS_ITEM_ID == 0 {
2✔
531
                        assert_eq!(location, "oss-cn-shanghai");
1✔
532
                    } else if BUCKETS_ITEM_ID == 1 {
1✔
533
                        assert_eq!(location, "oss-cn-shanghai");
1✔
534
                    }
535
                }
536
                Ok(())
537
            }
2✔
538
            fn set_extranet_endpoint(&mut self, extranet_endpoint: &str) -> Result<(), MyError> {
2✔
539
                assert_eq!(extranet_endpoint, "oss-cn-shanghai.aliyuncs.com");
2✔
540
                Ok(())
541
            }
2✔
542
            fn set_intranet_endpoint(&mut self, intranet_endpoint: &str) -> Result<(), MyError> {
2✔
543
                assert_eq!(intranet_endpoint, "oss-cn-shanghai-internal.aliyuncs.com");
2✔
544
                Ok(())
545
            }
2✔
546
            fn set_storage_class(&mut self, storage_class: &str) -> Result<(), MyError> {
2✔
547
                assert_eq!(storage_class, "Standard");
2✔
548
                unsafe {
549
                    BUCKETS_ITEM_ID += 1;
2✔
550
                }
551
                Ok(())
552
            }
2✔
553
        }
554

555
        struct ListA {}
556

557
        impl RefineBucketList<BucketA, MyError> for ListA {
558
            fn set_prefix(&mut self, prefix: &str) -> Result<(), MyError> {
×
559
                assert_eq!(prefix, "");
×
560
                Ok(())
561
            }
×
562
            fn set_marker(&mut self, marker: &str) -> Result<(), MyError> {
×
563
                assert_eq!(marker, "");
×
564
                Ok(())
565
            }
×
566
            fn set_max_keys(&mut self, max_keys: &str) -> Result<(), MyError> {
×
567
                assert_eq!(max_keys, "");
×
568
                Ok(())
569
            }
×
570
            fn set_is_truncated(&mut self, is_truncated: bool) -> Result<(), MyError> {
×
571
                assert_eq!(is_truncated, false);
×
572
                Ok(())
573
            }
×
574
            fn set_next_marker(&mut self, next_marker: &str) -> Result<(), MyError> {
×
575
                assert_eq!(next_marker, "");
×
576
                Ok(())
577
            }
×
578
            fn set_id(&mut self, id: &str) -> Result<(), MyError> {
1✔
579
                assert_eq!(id, "100861222333");
1✔
580
                Ok(())
581
            }
1✔
582
            fn set_display_name(&mut self, display_name: &str) -> Result<(), MyError> {
1✔
583
                assert_eq!(display_name, "100861222");
1✔
584
                Ok(())
585
            }
1✔
586
        }
587

588
        let xml = r#"<?xml version="1.0" encoding="UTF-8"?>
1✔
589
        <ListAllMyBucketsResult>
590
          <Owner>
591
            <ID>100861222333</ID>
592
            <DisplayName>100861222</DisplayName>
593
          </Owner>
594
          <Buckets>
595
            <Bucket>
596
              <Comment></Comment>
597
              <CreationDate>2020-09-13T03:14:54.000Z</CreationDate>
598
              <ExtranetEndpoint>oss-cn-shanghai.aliyuncs.com</ExtranetEndpoint>
599
              <IntranetEndpoint>oss-cn-shanghai-internal.aliyuncs.com</IntranetEndpoint>
600
              <Location>oss-cn-shanghai</Location>
601
              <Name>foo124442</Name>
602
              <Region>cn-shanghai</Region>
603
              <StorageClass>Standard</StorageClass>
604
            </Bucket>
605
            <Bucket>
606
              <Comment></Comment>
607
              <CreationDate>2016-11-05T13:10:10.000Z</CreationDate>
608
              <ExtranetEndpoint>oss-cn-shanghai.aliyuncs.com</ExtranetEndpoint>
609
              <IntranetEndpoint>oss-cn-shanghai-internal.aliyuncs.com</IntranetEndpoint>
610
              <Location>oss-cn-shanghai</Location>
611
              <Name>foo342390bar</Name>
612
              <Region>cn-shanghai</Region>
613
              <StorageClass>Standard</StorageClass>
614
            </Bucket>
615
          </Buckets>
616
        </ListAllMyBucketsResult>"#;
617

618
        let mut list = ListA {};
619
        let res = list.decode(xml, || BucketA {});
3✔
620

621
        assert!(res.is_ok());
1✔
622
    }
2✔
623
}
624

625
mod some_tests {
626

627
    use std::{borrow::Cow, fmt};
628

629
    use crate::{
630
        decode::{InnerItemError, InnerListError, ListErrorKind, RefineObject, RefineObjectList},
631
        types::InvalidEndPoint,
632
    };
633

634
    use super::*;
635

636
    #[test]
637
    fn test_one_object_decode() {
2✔
638
        struct ObjectA {}
639
        impl RefineObject<MyError> for ObjectA {
640
            fn set_key(&mut self, key: &str) -> Result<(), MyError> {
1✔
641
                assert!(key == "LICENSE");
1✔
642
                Ok(())
643
            }
1✔
644
            fn set_last_modified(&mut self, last_modified: &str) -> Result<(), MyError> {
1✔
645
                assert!(last_modified == "2022-06-12T06:11:06.000Z");
1✔
646
                Ok(())
647
            }
1✔
648
            fn set_etag(&mut self, etag: &str) -> Result<(), MyError> {
1✔
649
                assert!(etag == "2CBAB10A50CC6905EA2D7CCCEF31A6C9");
1✔
650
                Ok(())
651
            }
1✔
652
            fn set_type(&mut self, _type: &str) -> Result<(), MyError> {
1✔
653
                assert!(_type == "Normal");
1✔
654
                Ok(())
655
            }
1✔
656
            fn set_size(&mut self, size: &str) -> Result<(), MyError> {
1✔
657
                assert!(size == "1065");
1✔
658
                Ok(())
659
            }
1✔
660
            fn set_storage_class(&mut self, storage_class: &str) -> Result<(), MyError> {
1✔
661
                assert!(storage_class == "Standard");
1✔
662
                Ok(())
663
            }
1✔
664
        }
665

666
        #[derive(Debug)]
×
667
        struct MyError {}
668

669
        impl From<InnerItemError> for MyError {
670
            fn from(_: InnerItemError) -> Self {
×
671
                MyError {}
672
            }
×
673
        }
674

675
        impl From<quick_xml::Error> for MyError {
676
            fn from(_: quick_xml::Error) -> Self {
×
677
                MyError {}
678
            }
×
679
        }
680

681
        impl fmt::Display for MyError {
682
            fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
×
683
                write!(f, "demo")
×
684
            }
×
685
        }
686
        impl std::error::Error for MyError {}
687

688
        let xml = r#"<Key>LICENSE</Key>
1✔
689
            <LastModified>2022-06-12T06:11:06.000Z</LastModified>
690
            <ETag>"2CBAB10A50CC6905EA2D7CCCEF31A6C9"</ETag>
691
            <Type>Normal</Type>
692
            <Size>1065</Size>
693
            <StorageClass>Standard</StorageClass>"#;
694

695
        let mut object = ObjectA {};
696
        let _ = object.decode(xml);
1✔
697
    }
2✔
698

699
    #[test]
700
    fn test_common_prefixes() {
2✔
701
        use std::error::Error;
702
        struct ObjectA {}
703
        impl RefineObject<MyError> for ObjectA {}
704

705
        struct ListA {}
706

707
        #[derive(Debug)]
×
708
        struct MyError {}
709

710
        impl From<InnerItemError> for MyError {
711
            fn from(_: InnerItemError) -> Self {
×
712
                MyError {}
713
            }
×
714
        }
715

716
        impl From<quick_xml::Error> for MyError {
717
            fn from(_: quick_xml::Error) -> Self {
×
718
                MyError {}
719
            }
×
720
        }
721

722
        impl fmt::Display for MyError {
723
            fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
×
724
                write!(f, "demo")
×
725
            }
×
726
        }
727

728
        impl Error for MyError {}
729
        impl ListError for MyError {}
730

731
        impl RefineObjectList<ObjectA, MyError, MyError> for ListA {
732
            fn set_prefix(&mut self, prefix: &str) -> Result<(), MyError> {
1✔
733
                assert!(prefix == "bar");
1✔
734
                Ok(())
735
            }
1✔
736

737
            fn set_common_prefix(&mut self, list: &[Cow<'_, str>]) -> Result<(), MyError> {
1✔
738
                assert!(list[0] == "foo1/");
1✔
739
                assert!(list[1] == "foo2/");
1✔
740
                Ok(())
741
            }
1✔
742
        }
743

744
        let xml = r#"<?xml version="1.0" encoding="UTF-8"?>
1✔
745
        <ListBucketResult>
746
          <Prefix>bar</Prefix>
747
          <Contents>
748
            <Key>9AB932LY.jpeg</Key>
749
          </Contents>
750
          <Contents>
751
            <Key>9AB932LY.jpeg</Key>
752
          </Contents>
753
          <CommonPrefixes>
754
            <Prefix>foo1/</Prefix>
755
            <Prefix>foo2/</Prefix>
756
          </CommonPrefixes>
757
        </ListBucketResult>
758
        "#;
759

760
        let mut list = ListA {};
761

762
        let res = list.decode(xml, || ObjectA {});
3✔
763

764
        assert!(res.is_ok());
1✔
765
    }
2✔
766

767
    #[test]
768
    fn test_item_from() {
2✔
769
        let string = InvalidEndPoint { _priv: () };
770
        let err = InnerItemError::from(string);
1✔
771
        assert_eq!(
1✔
772
            format!("{err}"),
1✔
773
            "endpoint must not with `-` prefix or `-` suffix or `oss-` prefix"
774
        );
775
    }
2✔
776

777
    #[test]
778
    fn test_error_item_source() {
2✔
779
        let err = InnerItemError::new();
1✔
780
        assert_eq!(format!("{}", err.get_source().unwrap()), "demo");
1✔
781
    }
2✔
782

783
    #[test]
784
    fn test_list_from() {
2✔
785
        let string = InvalidEndPoint { _priv: () };
786
        let err: InnerListError = string.into();
1✔
787
        assert_eq!(
1✔
788
            format!("{err}"),
1✔
789
            "endpoint must not with `-` prefix or `-` suffix or `oss-` prefix"
790
        );
791
    }
2✔
792

793
    #[test]
794
    fn test_error_list_display() {
2✔
795
        let err = InnerItemError::new();
1✔
796
        let err_list: InnerListError = err.into();
1✔
797
        assert_eq!(err_list.to_string(), "demo");
1✔
798

799
        let err = InnerListError::from_xml();
1✔
800
        assert_eq!(format!("{err}"), "Cannot read text, expecting Event::Text");
1✔
801

802
        let string = InvalidEndPoint { _priv: () };
803
        let kind = ListErrorKind::Custom(Box::new(string));
1✔
804

805
        let err = InnerListError { kind };
1✔
806
        assert_eq!(
1✔
807
            format!("{err}"),
1✔
808
            "endpoint must not with `-` prefix or `-` suffix or `oss-` prefix"
809
        );
810
    }
2✔
811

812
    #[test]
813
    fn test_error_list_get_source() {
2✔
814
        let err = InnerItemError::new();
1✔
815
        let err_list: InnerListError = err.into();
1✔
816
        assert_eq!(format!("{}", err_list.get_source().unwrap()), "demo");
1✔
817

818
        let err_list = InnerListError::from_xml();
1✔
819
        assert_eq!(
1✔
820
            format!("{}", err_list.get_source().unwrap()),
1✔
821
            "Cannot read text, expecting Event::Text"
822
        );
823

824
        let err_list = InnerListError::from_custom();
1✔
825
        assert_eq!(format!("{}", err_list.get_source().unwrap()), "custom");
1✔
826
    }
2✔
827

828
    #[test]
829
    fn test_error_list_from_item() {
2✔
830
        let err = InnerListError {
1✔
831
            kind: ListErrorKind::Xml(Box::new(quick_xml::Error::TextNotFound)),
1✔
832
        };
833
        assert_eq!(format!("{err}"), "Cannot read text, expecting Event::Text");
1✔
834

835
        fn bar() -> InnerListError {
1✔
836
            InnerItemError::new().into()
1✔
837
        }
1✔
838

839
        assert_eq!(
1✔
840
            format!("{:?}", bar()),
1✔
841
            "InnerListError { kind: Item(InnerItemError(MyError)) }"
842
        );
843
    }
2✔
844

845
    #[test]
846
    fn test_error_list_from_xml() {
2✔
847
        let err = InnerListError {
1✔
848
            kind: ListErrorKind::Xml(Box::new(quick_xml::Error::TextNotFound)),
1✔
849
        };
850
        assert_eq!(format!("{err}"), "Cannot read text, expecting Event::Text");
1✔
851

852
        fn bar() -> InnerListError {
1✔
853
            quick_xml::Error::TextNotFound.into()
1✔
854
        }
1✔
855

856
        assert_eq!(
1✔
857
            format!("{:?}", bar()),
1✔
858
            "InnerListError { kind: Xml(TextNotFound) }"
859
        );
860
    }
2✔
861
}
STATUS · Troubleshooting · Open an Issue · Sales · Support · CAREERS · ENTERPRISE · START FREE · SCHEDULE DEMO
ANNOUNCEMENTS · TWITTER · TOS & SLA · Supported CI Services · What's a CI service? · Automated Testing

© 2026 Coveralls, Inc