rust-embed v8.11.0
git clone https://git.pyrossh.dev/rust-embed
rust macro which loads files into the rust binary at compile time during release and loads the file from the fs during dev.
tests/compression.rs
| c3aed87 | 1 | use rust_embed::{Embed, EmbeddedCompressedFile, EmbeddedFile}; |
| c3aed87 | 2 | |
| c3aed87 | 3 | #[derive(Embed)] |
| c3aed87 | 4 | #[folder = "examples/public/"] |
| c3aed87 | 5 | struct Asset; |
| c3aed87 | 6 | |
| c3aed87 | 7 | #[derive(Embed)] |
| c3aed87 | 8 | #[folder = "examples/public/"] |
| c3aed87 | 9 | #[metadata_only = true] |
| c3aed87 | 10 | struct MetadataAsset; |
| c3aed87 | 11 | |
| c3aed87 | 12 | #[test] |
| c3aed87 | 13 | fn get_returns_decompressed_content() { |
| c3aed87 | 14 | let file: EmbeddedFile = Asset::get("index.html").expect("index.html exists"); |
| c3aed87 | 15 | assert!(!file.data.is_empty()); |
| c3aed87 | 16 | } |
| c3aed87 | 17 | |
| c3aed87 | 18 | #[test] |
| c3aed87 | 19 | fn get_missing_returns_none() { |
| c3aed87 | 20 | assert!(Asset::get("missing.html").is_none()); |
| c3aed87 | 21 | } |
| c3aed87 | 22 | |
| c3aed87 | 23 | #[test] |
| c3aed87 | 24 | fn metadata_only_compressed_always_returns_none() { |
| c3aed87 | 25 | let file: Option<EmbeddedCompressedFile> = MetadataAsset::compressed("index.html"); |
| c3aed87 | 26 | assert!(file.is_none(), "metadata_only structs never have compressed data"); |
| c3aed87 | 27 | } |
| c3aed87 | 28 | |
| c3aed87 | 29 | #[test] |
| c3aed87 | 30 | fn metadata_only_get_returns_empty_data() { |
| c3aed87 | 31 | let file: EmbeddedFile = MetadataAsset::get("index.html").expect("index.html exists"); |
| c3aed87 | 32 | assert_eq!(file.data.len(), 0); |
| c3aed87 | 33 | } |
| c3aed87 | 34 | |
| c3aed87 | 35 | #[cfg(any(not(debug_assertions), feature = "debug-embed"))] |
| c3aed87 | 36 | mod release { |
| c3aed87 | 37 | use super::*; |
| c3aed87 | 38 | |
| c3aed87 | 39 | #[test] |
| c3aed87 | 40 | fn compressed_exists() { |
| c3aed87 | 41 | let file: Option<EmbeddedCompressedFile> = Asset::compressed("index.html"); |
| c3aed87 | 42 | assert!(file.is_some(), "index.html should have a compressed version"); |
| c3aed87 | 43 | } |
| c3aed87 | 44 | |
| c3aed87 | 45 | #[test] |
| c3aed87 | 46 | fn compressed_missing_returns_none() { |
| c3aed87 | 47 | let file: Option<EmbeddedCompressedFile> = Asset::compressed("missing.html"); |
| c3aed87 | 48 | assert!(file.is_none()); |
| c3aed87 | 49 | } |
| c3aed87 | 50 | |
| c3aed87 | 51 | #[test] |
| c3aed87 | 52 | fn compressed_decompresses_to_original_content() { |
| c3aed87 | 53 | let compressed: EmbeddedCompressedFile = Asset::compressed("index.html").expect("index.html exists"); |
| c3aed87 | 54 | let uncompressed: EmbeddedFile = Asset::get("index.html").expect("index.html exists"); |
| c3aed87 | 55 | assert_eq!(compressed.data.decoded(), uncompressed.data.as_ref()); |
| c3aed87 | 56 | } |
| c3aed87 | 57 | |
| c3aed87 | 58 | #[test] |
| c3aed87 | 59 | fn compressed_and_get_share_same_hash() { |
| c3aed87 | 60 | let compressed: EmbeddedCompressedFile = Asset::compressed("index.html").expect("index.html exists"); |
| c3aed87 | 61 | let uncompressed: EmbeddedFile = Asset::get("index.html").expect("index.html exists"); |
| c3aed87 | 62 | assert_eq!(compressed.metadata.sha256_hash(), uncompressed.metadata.sha256_hash()); |
| c3aed87 | 63 | } |
| c3aed87 | 64 | |
| c3aed87 | 65 | #[test] |
| c3aed87 | 66 | fn compressed_bytes_smaller_than_original_for_text() { |
| c3aed87 | 67 | let compressed: EmbeddedCompressedFile = Asset::compressed("index.html").expect("index.html exists"); |
| c3aed87 | 68 | let uncompressed: EmbeddedFile = Asset::get("index.html").expect("index.html exists"); |
| c3aed87 | 69 | assert!( |
| c3aed87 | 70 | compressed.data.compressed().len() < uncompressed.data.len(), |
| c3aed87 | 71 | "compressed text should be smaller than the original" |
| c3aed87 | 72 | ); |
| c3aed87 | 73 | } |
| c3aed87 | 74 | |
| c3aed87 | 75 | #[test] |
| c3aed87 | 76 | fn content_encoding_is_valid_http_header_value() { |
| c3aed87 | 77 | let compressed: EmbeddedCompressedFile = Asset::compressed("index.html").expect("index.html exists"); |
| c3aed87 | 78 | let encoding = compressed.content_encoding(); |
| c3aed87 | 79 | assert!( |
| c3aed87 | 80 | encoding == "deflate" || encoding == "zstd", |
| c3aed87 | 81 | "content_encoding should be a known HTTP Content-Encoding value, got: {}", |
| c3aed87 | 82 | encoding |
| c3aed87 | 83 | ); |
| c3aed87 | 84 | } |
| c3aed87 | 85 | |
| c3aed87 | 86 | #[test] |
| c3aed87 | 87 | fn compressed_iter_matches_get_iter() { |
| c3aed87 | 88 | let file_count = Asset::iter().count(); |
| c3aed87 | 89 | let compressed_count = Asset::iter().filter_map(|p| Asset::compressed(p.as_ref())).count(); |
| c3aed87 | 90 | assert_eq!(file_count, compressed_count, "every file should have a compressed version"); |
| c3aed87 | 91 | } |
| c3aed87 | 92 | } |