@@ -8,6 +8,7 @@ use cargo_test_support::publish::validate_alt_upload;
88use cargo_test_support:: registry:: { self , Package , RegistryBuilder } ;
99use cargo_test_support:: str;
1010use cargo_test_support:: { basic_manifest, paths, project} ;
11+ use rand:: Rng ;
1112
1213#[ cargo_test]
1314fn 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