@@ -2469,3 +2469,290 @@ version = "0.1.0"
24692469 & [ ( "Cargo.toml" , & rewritten_toml) ] ,
24702470 ) ;
24712471}
2472+
2473+ fn verify_packaged_status_line (
2474+ output : std:: process:: Output ,
2475+ num_files : usize ,
2476+ uncompressed_size : usize ,
2477+ compressed_size : usize ,
2478+ ) {
2479+ let stderr = String :: from_utf8 ( output. stderr ) . unwrap ( ) ;
2480+ let mut packaged_lines = stderr
2481+ . lines ( )
2482+ . filter ( |line| line. trim ( ) . starts_with ( "Packaged" ) ) ;
2483+ let packaged_line = packaged_lines
2484+ . next ( )
2485+ . expect ( "`Packaged` status line should appear in stderr" ) ;
2486+ assert ! (
2487+ packaged_lines. next( ) . is_none( ) ,
2488+ "Only one `Packaged` status line should appear in stderr"
2489+ ) ;
2490+ let size_info = packaged_line. trim ( ) . trim_start_matches ( "Packaged" ) . trim ( ) ;
2491+ let uncompressed = cargo:: util:: format_bytes ( uncompressed_size as f32 ) ;
2492+ let compressed = cargo:: util:: format_bytes ( compressed_size as f32 ) ;
2493+ let expected = format ! (
2494+ "{} files, {:.1}{}B ({:.1}{}B compressed)" ,
2495+ num_files, uncompressed. 0 , uncompressed. 1 , compressed. 0 , compressed. 1
2496+ ) ;
2497+ assert_eq ! ( size_info, expected) ;
2498+ }
2499+
2500+ #[ cargo_test]
2501+ fn basic_filesizes ( ) {
2502+ let cargo_toml_orig_contents = r#"
2503+ [package]
2504+ name = "foo"
2505+ version = "0.0.1"
2506+ authors = []
2507+ exclude = ["*.txt"]
2508+ license = "MIT"
2509+ description = "foo"
2510+ "# ;
2511+ let main_rs_contents = r#"fn main() { println!("🦀"); }"# ;
2512+ let cargo_toml_contents = format ! (
2513+ r#"{}
2514+ [package]
2515+ name = "foo"
2516+ version = "0.0.1"
2517+ authors = []
2518+ exclude = ["*.txt"]
2519+ description = "foo"
2520+ license = "MIT"
2521+ "# ,
2522+ cargo:: core:: package:: MANIFEST_PREAMBLE
2523+ ) ;
2524+ let cargo_lock_contents = r#"# This file is automatically @generated by Cargo.
2525+ # It is not intended for manual editing.
2526+ version = 3
2527+
2528+ [[package]]
2529+ name = "foo"
2530+ version = "0.0.1"
2531+ "# ;
2532+ let p = project ( )
2533+ . file ( "Cargo.toml" , cargo_toml_orig_contents)
2534+ . file ( "src/main.rs" , main_rs_contents)
2535+ . file ( "src/bar.txt" , "Ignored text file contents" ) // should be ignored when packaging
2536+ . build ( ) ;
2537+
2538+ let uncompressed_size = cargo_toml_orig_contents. len ( )
2539+ + main_rs_contents. len ( )
2540+ + cargo_toml_contents. len ( )
2541+ + cargo_lock_contents. len ( ) ;
2542+ let output = p. cargo ( "package" ) . exec_with_output ( ) . unwrap ( ) ;
2543+
2544+ assert ! ( p. root( ) . join( "target/package/foo-0.0.1.crate" ) . is_file( ) ) ;
2545+ p. cargo ( "package -l" )
2546+ . with_stdout (
2547+ "\
2548+ Cargo.lock
2549+ Cargo.toml
2550+ Cargo.toml.orig
2551+ src/main.rs
2552+ " ,
2553+ )
2554+ . run ( ) ;
2555+ p. cargo ( "package" ) . with_stdout ( "" ) . run ( ) ;
2556+
2557+ let f = File :: open ( & p. root ( ) . join ( "target/package/foo-0.0.1.crate" ) ) . unwrap ( ) ;
2558+ let compressed_size = f. metadata ( ) . unwrap ( ) . len ( ) as usize ;
2559+ verify_packaged_status_line ( output, 4 , uncompressed_size, compressed_size) ;
2560+ validate_crate_contents (
2561+ f,
2562+ "foo-0.0.1.crate" ,
2563+ & [ "Cargo.lock" , "Cargo.toml" , "Cargo.toml.orig" , "src/main.rs" ] ,
2564+ & [
2565+ ( "Cargo.lock" , cargo_lock_contents) ,
2566+ ( "Cargo.toml" , & cargo_toml_contents) ,
2567+ ( "Cargo.toml.orig" , cargo_toml_orig_contents) ,
2568+ ( "src/main.rs" , main_rs_contents) ,
2569+ ] ,
2570+ ) ;
2571+ }
2572+
2573+ #[ cargo_test]
2574+ fn larger_filesizes ( ) {
2575+ let cargo_toml_orig_contents = r#"
2576+ [package]
2577+ name = "foo"
2578+ version = "0.0.1"
2579+ authors = []
2580+ license = "MIT"
2581+ description = "foo"
2582+ "# ;
2583+ let lots_of_crabs = std:: iter:: repeat ( "🦀" ) . take ( 1337 ) . collect :: < String > ( ) ;
2584+ let main_rs_contents = format ! ( r#"fn main() {{ println!("{}"); }}"# , lots_of_crabs) ;
2585+ let bar_txt_contents = "This file is relatively uncompressible, to increase the compressed
2586+ package size beyond 1KiB.
2587+ Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt
2588+ ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation
2589+ ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in
2590+ reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur
2591+ sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est
2592+ laborum." ;
2593+ let cargo_toml_contents = format ! (
2594+ r#"{}
2595+ [package]
2596+ name = "foo"
2597+ version = "0.0.1"
2598+ authors = []
2599+ description = "foo"
2600+ license = "MIT"
2601+ "# ,
2602+ cargo:: core:: package:: MANIFEST_PREAMBLE
2603+ ) ;
2604+ let cargo_lock_contents = r#"# This file is automatically @generated by Cargo.
2605+ # It is not intended for manual editing.
2606+ version = 3
2607+
2608+ [[package]]
2609+ name = "foo"
2610+ version = "0.0.1"
2611+ "# ;
2612+ let p = project ( )
2613+ . file ( "Cargo.toml" , cargo_toml_orig_contents)
2614+ . file ( "src/main.rs" , & main_rs_contents)
2615+ . file ( "src/bar.txt" , bar_txt_contents)
2616+ . build ( ) ;
2617+
2618+ let uncompressed_size = cargo_toml_orig_contents. len ( )
2619+ + main_rs_contents. len ( )
2620+ + cargo_toml_contents. len ( )
2621+ + cargo_lock_contents. len ( )
2622+ + bar_txt_contents. len ( ) ;
2623+
2624+ let output = p. cargo ( "package" ) . exec_with_output ( ) . unwrap ( ) ;
2625+ assert ! ( p. root( ) . join( "target/package/foo-0.0.1.crate" ) . is_file( ) ) ;
2626+ p. cargo ( "package -l" )
2627+ . with_stdout (
2628+ "\
2629+ Cargo.lock
2630+ Cargo.toml
2631+ Cargo.toml.orig
2632+ src/bar.txt
2633+ src/main.rs
2634+ " ,
2635+ )
2636+ . run ( ) ;
2637+ p. cargo ( "package" ) . with_stdout ( "" ) . run ( ) ;
2638+
2639+ let f = File :: open ( & p. root ( ) . join ( "target/package/foo-0.0.1.crate" ) ) . unwrap ( ) ;
2640+ let compressed_size = f. metadata ( ) . unwrap ( ) . len ( ) as usize ;
2641+ verify_packaged_status_line ( output, 5 , uncompressed_size, compressed_size) ;
2642+ validate_crate_contents (
2643+ f,
2644+ "foo-0.0.1.crate" ,
2645+ & [
2646+ "Cargo.lock" ,
2647+ "Cargo.toml" ,
2648+ "Cargo.toml.orig" ,
2649+ "src/bar.txt" ,
2650+ "src/main.rs" ,
2651+ ] ,
2652+ & [
2653+ ( "Cargo.lock" , cargo_lock_contents) ,
2654+ ( "Cargo.toml" , & cargo_toml_contents) ,
2655+ ( "Cargo.toml.orig" , cargo_toml_orig_contents) ,
2656+ ( "src/bar.txt" , bar_txt_contents) ,
2657+ ( "src/main.rs" , & main_rs_contents) ,
2658+ ] ,
2659+ ) ;
2660+ }
2661+
2662+ #[ cargo_test]
2663+ fn symlink_filesizes ( ) {
2664+ if !symlink_supported ( ) {
2665+ return ;
2666+ }
2667+
2668+ let cargo_toml_orig_contents = r#"
2669+ [package]
2670+ name = "foo"
2671+ version = "0.0.1"
2672+ authors = []
2673+ license = "MIT"
2674+ description = "foo"
2675+ "# ;
2676+ let lots_of_crabs = std:: iter:: repeat ( "🦀" ) . take ( 1337 ) . collect :: < String > ( ) ;
2677+ let main_rs_contents = format ! ( r#"fn main() {{ println!("{}"); }}"# , lots_of_crabs) ;
2678+ let bar_txt_contents = "This file is relatively uncompressible, to increase the compressed
2679+ package size beyond 1KiB.
2680+ Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt
2681+ ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation
2682+ ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in
2683+ reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur
2684+ sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est
2685+ laborum." ;
2686+ let cargo_toml_contents = format ! (
2687+ r#"{}
2688+ [package]
2689+ name = "foo"
2690+ version = "0.0.1"
2691+ authors = []
2692+ description = "foo"
2693+ license = "MIT"
2694+ "# ,
2695+ cargo:: core:: package:: MANIFEST_PREAMBLE
2696+ ) ;
2697+ let cargo_lock_contents = r#"# This file is automatically @generated by Cargo.
2698+ # It is not intended for manual editing.
2699+ version = 3
2700+
2701+ [[package]]
2702+ name = "foo"
2703+ version = "0.0.1"
2704+ "# ;
2705+
2706+ let p = project ( )
2707+ . file ( "Cargo.toml" , cargo_toml_orig_contents)
2708+ . file ( "src/main.rs" , & main_rs_contents)
2709+ . file ( "bla/bar.txt" , bar_txt_contents)
2710+ . symlink_dir ( "bla" , "foo" )
2711+ . build ( ) ;
2712+
2713+ let uncompressed_size = cargo_toml_orig_contents. len ( )
2714+ + main_rs_contents. len ( )
2715+ + cargo_toml_contents. len ( )
2716+ + cargo_lock_contents. len ( )
2717+ + bar_txt_contents. len ( ) * 2 ;
2718+
2719+ let output = p. cargo ( "package" ) . exec_with_output ( ) . unwrap ( ) ;
2720+ assert ! ( p. root( ) . join( "target/package/foo-0.0.1.crate" ) . is_file( ) ) ;
2721+ p. cargo ( "package -l" )
2722+ . with_stdout (
2723+ "\
2724+ Cargo.lock
2725+ Cargo.toml
2726+ Cargo.toml.orig
2727+ bla/bar.txt
2728+ foo/bar.txt
2729+ src/main.rs
2730+ " ,
2731+ )
2732+ . run ( ) ;
2733+ p. cargo ( "package" ) . with_stdout ( "" ) . run ( ) ;
2734+
2735+ let f = File :: open ( & p. root ( ) . join ( "target/package/foo-0.0.1.crate" ) ) . unwrap ( ) ;
2736+ let compressed_size = f. metadata ( ) . unwrap ( ) . len ( ) as usize ;
2737+ verify_packaged_status_line ( output, 6 , uncompressed_size, compressed_size) ;
2738+ validate_crate_contents (
2739+ f,
2740+ "foo-0.0.1.crate" ,
2741+ & [
2742+ "Cargo.lock" ,
2743+ "Cargo.toml" ,
2744+ "Cargo.toml.orig" ,
2745+ "bla/bar.txt" ,
2746+ "foo/bar.txt" ,
2747+ "src/main.rs" ,
2748+ ] ,
2749+ & [
2750+ ( "Cargo.lock" , cargo_lock_contents) ,
2751+ ( "Cargo.toml" , & cargo_toml_contents) ,
2752+ ( "Cargo.toml.orig" , cargo_toml_orig_contents) ,
2753+ ( "bla/bar.txt" , bar_txt_contents) ,
2754+ ( "foo/bar.txt" , bar_txt_contents) ,
2755+ ( "src/main.rs" , & main_rs_contents) ,
2756+ ] ,
2757+ ) ;
2758+ }
0 commit comments