changelog shortlog graph tags branches changeset files revisions annotate raw help

Mercurial > core / rust/lib/dl/tests/download-curl-resume.rs

changeset 698: 96958d3eb5b0
parent: 966f92770ddf
author: Richard Westhaver <ellis@rwest.io>
date: Fri, 04 Oct 2024 22:04:59 -0400
permissions: -rw-r--r--
description: fixes
1 #![cfg(feature = "curl-backend")]
2 
3 use std::sync::{
4  atomic::{AtomicBool, Ordering},
5  Mutex,
6 };
7 
8 use url::Url;
9 
10 use dl::*;
11 
12 mod support;
13 use crate::support::{serve_file, tmp_dir, write_file};
14 
15 #[test]
16 fn partially_downloaded_file_gets_resumed_from_byte_offset() {
17  let tmpdir = tmp_dir();
18  let from_path = tmpdir.path().join("download-source");
19  write_file(&from_path, "xxx45");
20 
21  let target_path = tmpdir.path().join("downloaded");
22  write_file(&target_path, "123");
23 
24  let from_url = Url::from_file_path(&from_path).unwrap();
25  download_to_path_with_backend(
26  Backend::Curl,
27  &from_url,
28  &target_path,
29  true,
30  None,
31  )
32  .expect("Test download failed");
33 
34  assert_eq!(std::fs::read_to_string(&target_path).unwrap(), "12345");
35 }
36 
37 #[test]
38 fn callback_gets_all_data_as_if_the_download_happened_all_at_once() {
39  let tmpdir = tmp_dir();
40  let target_path = tmpdir.path().join("downloaded");
41  write_file(&target_path, "123");
42 
43  let addr = serve_file(b"xxx45".to_vec());
44 
45  let from_url = format!("http://{addr}").parse().unwrap();
46 
47  let callback_partial = AtomicBool::new(false);
48  let callback_len = Mutex::new(None);
49  let received_in_callback = Mutex::new(Vec::new());
50 
51  download_to_path_with_backend(
52  Backend::Curl,
53  &from_url,
54  &target_path,
55  true,
56  Some(&|msg| {
57  match msg {
58  Event::ResumingPartialDownload => {
59  assert!(!callback_partial.load(Ordering::SeqCst));
60  callback_partial.store(true, Ordering::SeqCst);
61  }
62  Event::DownloadContentLengthReceived(len) => {
63  let mut flag = callback_len.lock().unwrap();
64  assert!(flag.is_none());
65  *flag = Some(len);
66  }
67  Event::DownloadDataReceived(data) => {
68  for b in data.iter() {
69  received_in_callback.lock().unwrap().push(*b);
70  }
71  }
72  }
73 
74  Ok(())
75  }),
76  )
77  .expect("Test download failed");
78 
79  assert!(callback_partial.into_inner());
80  assert_eq!(*callback_len.lock().unwrap(), Some(5));
81  let observed_bytes = received_in_callback.into_inner().unwrap();
82  assert_eq!(observed_bytes, vec![b'1', b'2', b'3', b'4', b'5']);
83  assert_eq!(std::fs::read_to_string(&target_path).unwrap(), "12345");
84 }