Skip to content

Commit d512dd4

Browse files
committed
Add tests.
1 parent a4bd03c commit d512dd4

File tree

2 files changed

+211
-3
lines changed

2 files changed

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

0 commit comments

Comments
 (0)