|
5 | 5 |
|
6 | 6 | pub use self::compression::{CompressionAlgorithm, CompressionAlgorithms, compress, decompress}; |
7 | 7 | use self::{ |
8 | | - compression::{wrap_reader_for_decompression, wrap_writer_for_compression}, |
| 8 | + compression::{compress_async, wrap_reader_for_decompression}, |
9 | 9 | database::DatabaseBackend, |
10 | 10 | s3::S3Backend, |
11 | 11 | }; |
@@ -543,9 +543,10 @@ impl AsyncStorage { |
543 | 543 | .await?; |
544 | 544 |
|
545 | 545 | let mut buf: Vec<u8> = Vec::new(); |
546 | | - tokio::io::copy( |
| 546 | + compress_async( |
547 | 547 | &mut tokio::io::BufReader::new(tokio::fs::File::open(&local_index_path).await?), |
548 | | - &mut wrap_writer_for_compression(&mut buf, alg), |
| 548 | + &mut buf, |
| 549 | + alg, |
549 | 550 | ) |
550 | 551 | .await?; |
551 | 552 | buf |
@@ -1014,6 +1015,61 @@ mod test { |
1014 | 1015 | use std::env; |
1015 | 1016 | use test_case::test_case; |
1016 | 1017 |
|
| 1018 | + #[tokio::test] |
| 1019 | + #[test_case(CompressionAlgorithm::Zstd)] |
| 1020 | + #[test_case(CompressionAlgorithm::Bzip2)] |
| 1021 | + #[test_case(CompressionAlgorithm::Gzip)] |
| 1022 | + async fn test_async_compression(alg: CompressionAlgorithm) -> Result<()> { |
| 1023 | + const CONTENT: &[u8] = b"Hello, world! Hello, world! Hello, world! Hello, world!"; |
| 1024 | + |
| 1025 | + let compressed_index_content = { |
| 1026 | + let mut buf: Vec<u8> = Vec::new(); |
| 1027 | + compress_async(&mut io::Cursor::new(CONTENT.to_vec()), &mut buf, alg).await?; |
| 1028 | + buf |
| 1029 | + }; |
| 1030 | + |
| 1031 | + { |
| 1032 | + // try low-level async decompression |
| 1033 | + let mut decompressed_buf: Vec<u8> = Vec::new(); |
| 1034 | + let mut reader = wrap_reader_for_decompression( |
| 1035 | + io::Cursor::new(compressed_index_content.clone()), |
| 1036 | + alg, |
| 1037 | + ); |
| 1038 | + |
| 1039 | + tokio::io::copy(&mut reader, &mut io::Cursor::new(&mut decompressed_buf)).await?; |
| 1040 | + |
| 1041 | + assert_eq!(decompressed_buf, CONTENT); |
| 1042 | + } |
| 1043 | + |
| 1044 | + { |
| 1045 | + // try sync decompression |
| 1046 | + let decompressed_buf: Vec<u8> = decompress( |
| 1047 | + io::Cursor::new(compressed_index_content.clone()), |
| 1048 | + alg, |
| 1049 | + usize::MAX, |
| 1050 | + )?; |
| 1051 | + |
| 1052 | + assert_eq!(decompressed_buf, CONTENT); |
| 1053 | + } |
| 1054 | + |
| 1055 | + // try decompress via storage API |
| 1056 | + let stream = StreamingBlob { |
| 1057 | + path: "some_path.db".into(), |
| 1058 | + mime: mime::APPLICATION_OCTET_STREAM, |
| 1059 | + date_updated: Utc::now(), |
| 1060 | + compression: Some(alg), |
| 1061 | + content_length: compressed_index_content.len(), |
| 1062 | + content: Box::new(io::Cursor::new(compressed_index_content)), |
| 1063 | + }; |
| 1064 | + |
| 1065 | + let blob = stream.materialize(usize::MAX).await?; |
| 1066 | + |
| 1067 | + assert_eq!(blob.compression, None); |
| 1068 | + assert_eq!(blob.content, CONTENT); |
| 1069 | + |
| 1070 | + Ok(()) |
| 1071 | + } |
| 1072 | + |
1017 | 1073 | #[test_case("latest", RustdocJsonFormatVersion::Latest)] |
1018 | 1074 | #[test_case("42", RustdocJsonFormatVersion::Version(42))] |
1019 | 1075 | fn test_json_format_version(input: &str, expected: RustdocJsonFormatVersion) { |
|
0 commit comments