Skip to content

Commit 656fc15

Browse files
committed
Add tests.
1 parent a4bd03c commit 656fc15

File tree

2 files changed

+201
-3
lines changed

2 files changed

+201
-3
lines changed

crates/cargo-test-support/src/registry.rs

Lines changed: 16 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -157,8 +157,10 @@ type RequestCallback = Box<dyn Send + Fn(&Request, &HttpServer) -> Response>;
157157
pub struct RegistryBuilder {
158158
/// If set, configures an alternate registry with the given name.
159159
alternative: Option<String>,
160-
/// The authorization token for the registry.
160+
/// The client-supplied authorization token for the registry.
161161
token: Option<Token>,
162+
/// The actual server authorization token for the registry.
163+
server_token: Option<Token>,
162164
/// If set, the registry requires authorization for all operations.
163165
auth_required: bool,
164166
/// If set, serves the index over http.
@@ -241,6 +243,7 @@ impl RegistryBuilder {
241243
RegistryBuilder {
242244
alternative: None,
243245
token: None,
246+
server_token: None,
244247
auth_required: false,
245248
http_api: false,
246249
http_index: false,
@@ -309,13 +312,20 @@ impl RegistryBuilder {
309312
self
310313
}
311314

312-
/// Sets the token value
315+
/// Sets the client-supplied token value
313316
#[must_use]
314317
pub fn token(mut self, token: Token) -> Self {
315318
self.token = Some(token);
316319
self
317320
}
318321

322+
/// Sets the server token value
323+
#[must_use]
324+
pub fn server_token(mut self, token: Token) -> Self {
325+
self.server_token = Some(token);
326+
self
327+
}
328+
319329
/// Sets this registry to require the authentication token for
320330
/// all operations.
321331
#[must_use]
@@ -372,6 +382,9 @@ impl RegistryBuilder {
372382
.token
373383
.unwrap_or_else(|| Token::Plaintext(format!("{prefix}sekrit")));
374384

385+
// Uses the client token unless otherwise set.
386+
let server_token = self.server_token.unwrap_or_else(|| token.clone());
387+
375388
let (server, index_url, api_url, dl_url) = if !self.http_index && !self.http_api {
376389
// No need to start the HTTP server.
377390
(None, index_url, api_url, dl_url)
@@ -380,7 +393,7 @@ impl RegistryBuilder {
380393
registry_path.clone(),
381394
dl_path,
382395
api_path.clone(),
383-
token.clone(),
396+
server_token.clone(),
384397
self.auth_required,
385398
self.custom_responders,
386399
self.not_found_handler,

tests/testsuite/alt_registry.rs

Lines changed: 185 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,7 @@ use cargo_test_support::publish::validate_alt_upload;
88
use cargo_test_support::registry::{self, Package, RegistryBuilder};
99
use cargo_test_support::str;
1010
use cargo_test_support::{basic_manifest, paths, project};
11+
use rand::Rng;
1112

1213
#[cargo_test]
1314
fn depend_on_alt_registry() {
@@ -1985,3 +1986,187 @@ fn empty_dependency_registry() {
19851986
"#]])
19861987
.run();
19871988
}
1989+
1990+
#[cargo_test]
1991+
fn token_error_messages() {
1992+
enum TokenStatus {
1993+
Valid,
1994+
Missing,
1995+
InvalidHasScheme,
1996+
InvalidNoScheme,
1997+
}
1998+
struct TokenTest {
1999+
crates_io_token: TokenStatus,
2000+
alternative_token: TokenStatus,
2001+
expected_message: &'static str,
2002+
}
2003+
2004+
let tests = [
2005+
// TokenTest {
2006+
// crates_io_token: TokenStatus::Valid,
2007+
// alternative_token: TokenStatus::Valid,
2008+
// expected_message: "",
2009+
// },
2010+
// TokenTest {
2011+
// crates_io_token: TokenStatus::Valid,
2012+
// alternative_token: TokenStatus::Missing,
2013+
// expected_message: "",
2014+
// },
2015+
// TokenTest {
2016+
// crates_io_token: TokenStatus::Valid,
2017+
// alternative_token: TokenStatus::InvalidHasScheme,
2018+
// expected_message: "",
2019+
// },
2020+
// TokenTest {
2021+
// crates_io_token: TokenStatus::Valid,
2022+
// alternative_token: TokenStatus::InvalidNoScheme,
2023+
// expected_message: "",
2024+
// },
2025+
// TokenTest {
2026+
// crates_io_token: TokenStatus::Missing,
2027+
// alternative_token: TokenStatus::Valid,
2028+
// expected_message: "",
2029+
// },
2030+
// TokenTest {
2031+
// crates_io_token: TokenStatus::Missing,
2032+
// alternative_token: TokenStatus::Missing,
2033+
// expected_message: "",
2034+
// },
2035+
// TokenTest {
2036+
// crates_io_token: TokenStatus::Missing,
2037+
// alternative_token: TokenStatus::InvalidHasScheme,
2038+
// expected_message: "",
2039+
// },
2040+
TokenTest {
2041+
crates_io_token: TokenStatus::Missing,
2042+
alternative_token: TokenStatus::InvalidNoScheme,
2043+
expected_message: " token rejected for `alternative`, please run `cargo login --registry alternative`\n or use environment variable CARGO_REGISTRIES_ALTERNATIVE_TOKEN",
2044+
},
2045+
// TokenTest {
2046+
// crates_io_token: TokenStatus::InvalidHasScheme,
2047+
// alternative_token: TokenStatus::Valid,
2048+
// expected_message: "",
2049+
// },
2050+
// TokenTest {
2051+
// crates_io_token: TokenStatus::InvalidHasScheme,
2052+
// alternative_token: TokenStatus::Missing,
2053+
// expected_message: "",
2054+
// },
2055+
// TokenTest {
2056+
// crates_io_token: TokenStatus::InvalidHasScheme,
2057+
// alternative_token: TokenStatus::InvalidHasScheme,
2058+
// expected_message: "",
2059+
// },
2060+
// TokenTest {
2061+
// crates_io_token: TokenStatus::InvalidHasScheme,
2062+
// alternative_token: TokenStatus::InvalidNoScheme,
2063+
// expected_message: "",
2064+
// },
2065+
// TokenTest {
2066+
// crates_io_token: TokenStatus::InvalidNoScheme,
2067+
// alternative_token: TokenStatus::Valid,
2068+
// expected_message: "",
2069+
// },
2070+
// TokenTest {
2071+
// crates_io_token: TokenStatus::InvalidNoScheme,
2072+
// alternative_token: TokenStatus::Missing,
2073+
// expected_message: "",
2074+
// },
2075+
// TokenTest {
2076+
// crates_io_token: TokenStatus::InvalidNoScheme,
2077+
// alternative_token: TokenStatus::InvalidHasScheme,
2078+
// expected_message: "",
2079+
// },
2080+
// TokenTest {
2081+
// crates_io_token: TokenStatus::InvalidNoScheme,
2082+
// alternative_token: TokenStatus::InvalidNoScheme,
2083+
// expected_message: "",
2084+
// },
2085+
];
2086+
2087+
let unmatchable_token = rand::rng()
2088+
.sample_iter(&rand::distr::Alphanumeric)
2089+
.take(8)
2090+
.map(char::from)
2091+
.collect::<String>();
2092+
2093+
for test in &tests {
2094+
let crates_io_builder = RegistryBuilder::new()
2095+
.http_api()
2096+
.http_index()
2097+
.credential_provider(&[&"cargo:token"])
2098+
.auth_required();
2099+
let alternative_builder = RegistryBuilder::new()
2100+
.http_api()
2101+
.http_index()
2102+
.credential_provider(&[&"cargo:token"])
2103+
.alternative()
2104+
.auth_required();
2105+
2106+
let crates_io_mock = match test.crates_io_token {
2107+
TokenStatus::Valid => crates_io_builder.build(),
2108+
TokenStatus::Missing => crates_io_builder.no_configure_token().build(),
2109+
TokenStatus::InvalidHasScheme => crates_io_builder
2110+
.token(cargo_test_support::registry::Token::Plaintext(
2111+
"Bearer <TOKEN>".to_string(),
2112+
))
2113+
.server_token(cargo_test_support::registry::Token::Plaintext(
2114+
unmatchable_token.clone(),
2115+
))
2116+
.build(),
2117+
TokenStatus::InvalidNoScheme => crates_io_builder
2118+
.token(cargo_test_support::registry::Token::Plaintext(
2119+
"<TOKEN>>".to_string(),
2120+
))
2121+
.server_token(cargo_test_support::registry::Token::Plaintext(
2122+
unmatchable_token.clone(),
2123+
))
2124+
.build(),
2125+
};
2126+
let alternative_mock = match test.alternative_token {
2127+
TokenStatus::Valid => alternative_builder.build(),
2128+
TokenStatus::Missing => alternative_builder.no_configure_token().build(),
2129+
TokenStatus::InvalidHasScheme => alternative_builder
2130+
.token(cargo_test_support::registry::Token::Plaintext(
2131+
"Bearer <TOKEN>".to_string(),
2132+
))
2133+
.server_token(cargo_test_support::registry::Token::Plaintext(
2134+
unmatchable_token.clone(),
2135+
))
2136+
.build(),
2137+
TokenStatus::InvalidNoScheme => alternative_builder
2138+
.token(cargo_test_support::registry::Token::Plaintext(
2139+
"<TOKEN>>".to_string(),
2140+
))
2141+
.server_token(cargo_test_support::registry::Token::Plaintext(
2142+
unmatchable_token.clone(),
2143+
))
2144+
.build(),
2145+
};
2146+
2147+
let p = project()
2148+
.file(
2149+
"Cargo.toml",
2150+
r#"
2151+
[package]
2152+
name = "foo"
2153+
version = "0.0.1"
2154+
authors = []
2155+
edition = "2015"
2156+
2157+
[dependencies.bar]
2158+
version = "0.0.1"
2159+
registry = "alternative"
2160+
"#,
2161+
)
2162+
.file("src/main.rs", "fn main() {}")
2163+
.build();
2164+
2165+
Package::new("bar", "0.0.1").alternative(true).publish();
2166+
p.cargo("build")
2167+
.replace_crates_io(crates_io_mock.index_url())
2168+
.with_status(101)
2169+
.with_stderr_contains(test.expected_message)
2170+
.run();
2171+
}
2172+
}

0 commit comments

Comments
 (0)