cargo/tests/testsuite/cross_publish.rs
Dale Wijnand 7fe2fbc8a3
Remove the argument from the project test support function
By rewriting the tests, with rerast (https://github.com/google/rerast),
to use the newly introduced "at" method.

First I added the following temporary function to cargotest::support:

    pub fn project_foo() -> ProjectBuilder {
        project("foo")
    }

Then I defined the following rewrite.rs:

    use cargotest::support::{ project, project_foo };

    fn rule1(a: &'static str) {
        replace!(project("foo") => project_foo());
        replace!(project(a) => project_foo().at(a));
    }

Then I ran rerast:

    cargo +nightly rerast --rules_file=rewrite.rs --force --targets tests --file tests/testsuite/main.rs

Finally I searched and replaced the references to project_foo with
argument-less project (a little awkardly on macOS with a git clean).

    find tests -type f -exec sed -i -e 's/project_foo/project/g' {} +
    git clean -d tests
2018-07-20 13:31:50 +01:00

136 lines
3.4 KiB
Rust

use std::fs::File;
use std::path::PathBuf;
use std::io::prelude::*;
use cargotest::support::{cross_compile, execs, project, publish};
use hamcrest::{assert_that, contains};
use flate2::read::GzDecoder;
use tar::Archive;
#[test]
fn simple_cross_package() {
if cross_compile::disabled() {
return;
}
let p = project()
.file(
"Cargo.toml",
r#"
[package]
name = "foo"
version = "0.0.0"
authors = []
license = "MIT"
description = "foo"
repository = "bar"
"#,
)
.file(
"src/main.rs",
&format!(
r#"
use std::env;
fn main() {{
assert_eq!(env::consts::ARCH, "{}");
}}
"#,
cross_compile::alternate_arch()
),
)
.build();
let target = cross_compile::alternate();
assert_that(
p.cargo("package").arg("--target").arg(&target),
execs().with_status(0).with_status(0).with_stderr(&format!(
" Packaging foo v0.0.0 ({dir})
Verifying foo v0.0.0 ({dir})
Compiling foo v0.0.0 ({dir}/target/package/foo-0.0.0)
Finished dev [unoptimized + debuginfo] target(s) in [..]
",
dir = p.url()
)),
);
// Check that the tarball contains the files
let f = File::open(&p.root().join("target/package/foo-0.0.0.crate")).unwrap();
let mut rdr = GzDecoder::new(f);
let mut contents = Vec::new();
rdr.read_to_end(&mut contents).unwrap();
let mut ar = Archive::new(&contents[..]);
let entries = ar.entries().unwrap();
let entry_paths = entries
.map(|entry| entry.unwrap().path().unwrap().into_owned())
.collect::<Vec<PathBuf>>();
assert_that(
&entry_paths,
contains(vec![PathBuf::from("foo-0.0.0/Cargo.toml")]),
);
assert_that(
&entry_paths,
contains(vec![PathBuf::from("foo-0.0.0/Cargo.toml.orig")]),
);
assert_that(
&entry_paths,
contains(vec![PathBuf::from("foo-0.0.0/src/main.rs")]),
);
}
#[test]
fn publish_with_target() {
if cross_compile::disabled() {
return;
}
publish::setup();
let p = project()
.file(
"Cargo.toml",
r#"
[package]
name = "foo"
version = "0.0.0"
authors = []
license = "MIT"
description = "foo"
repository = "bar"
"#,
)
.file(
"src/main.rs",
&format!(
r#"
use std::env;
fn main() {{
assert_eq!(env::consts::ARCH, "{}");
}}
"#,
cross_compile::alternate_arch()
),
)
.build();
let target = cross_compile::alternate();
assert_that(
p.cargo("publish")
.arg("--index")
.arg(publish::registry().to_string())
.arg("--target")
.arg(&target),
execs().with_status(0).with_stderr(&format!(
" Updating registry `{registry}`
Packaging foo v0.0.0 ({dir})
Verifying foo v0.0.0 ({dir})
Compiling foo v0.0.0 ({dir}/target/package/foo-0.0.0)
Finished dev [unoptimized + debuginfo] target(s) in [..]
Uploading foo v0.0.0 ({dir})
",
dir = p.url(),
registry = publish::registry()
)),
);
}