use std::borrow::Cow; use git_object::bstr::BStr; fn bcow(input: &str) -> Cow<'_, BStr> { Cow::Borrowed(input.into())} mod keys { use std::borrow::Cow; use git_object::bstr::ByteSlice; use git_repository as git; use git_repository::config::tree::{Key, Section}; use crate::config::tree::bcow; #[test] fn string() -> crate::Result { assert_eq!( git::config::tree::Http::USER_AGENT.try_into_string(bcow("agent"))?, "agent" ); assert!(git::config::tree::Http::USER_AGENT.validate("agent".into()).is_ok()); let invalid = b"\xF0\x80\x80".as_bstr(); assert_eq!( git::config::tree::Http::USER_AGENT .try_into_string(Cow::Borrowed(invalid)) .unwrap_err() .to_string(), "The utf-8 string at \"http.userAgent=���\" could not be decoded" ); assert!(git::config::tree::Http::USER_AGENT.validate(invalid).is_err()); Ok(()) } #[test] fn any() { assert!( !git::config::Tree.sections().is_empty(), "the root has at least one section" ); assert_eq!(git::config::Tree::AUTHOR.name(), "author"); assert_eq!(git::config::tree::Author.keys().len(), 2); assert_eq!(git::config::tree::Author::NAME.name(), "name"); assert_eq!(git::config::tree::Author::EMAIL.name(), "email"); assert_eq!( git::config::tree::Author::NAME .validated_assignment("user".into()) .unwrap(), "author.name=user" ); assert_eq!( git::config::tree::Author::NAME .validated_assignment("user".into()) .unwrap(), "author.name=user" ); } #[test] fn remote_name() { assert!(git::config::tree::Remote::PUSH_DEFAULT .validate("origin".into()) .is_ok()); assert!(git::config::tree::Remote::PUSH_DEFAULT .validate("https://github.com/byron/gitoxide".into()) .is_ok()); }} mod branch { use git_repository::config::tree::{branch, Branch, Key}; use crate::config::tree::bcow; #[test] fn merge() { assert!(branch::Merge::try_into_fullrefname(bcow("refs/heads/main")).is_ok()); assert!(branch::Merge::try_into_fullrefname(bcow("main")).is_err()); assert!(Branch::MERGE.full_name(None).is_err()); assert_eq!( Branch::MERGE.full_name(Some("name".into())).expect("valid"), "branch.name.merge" ); }} mod ssh { #[test] #[cfg(feature = "blocking-network-client")] fn variant() -> crate::Result { use git_protocol::transport::client::ssh::ProgramKind; use git_repository::config::tree::Ssh; use crate::config::tree::bcow; for (actual, expected) in [ ("auto", None), ("ssh", Some(ProgramKind::Ssh)), ("simple", Some(ProgramKind::Simple)), ("plink", Some(ProgramKind::Plink)), ("putty", Some(ProgramKind::Putty)), ("tortoiseplink", Some(ProgramKind::TortoisePlink)), ] { assert_eq!(Ssh::VARIANT.try_into_variant(bcow(actual))?, expected); } assert_eq!( Ssh::VARIANT.try_into_variant(bcow("SSH")).unwrap_err().to_string(), "The key \"ssh.variant=SSH\" (possibly from GIT_SSH_VARIANT) was invalid", "case-sensitive comparisons" ); Ok(()) }} mod diff { use git_diff::blob::Algorithm; use git_repository::config::tree::{Diff, Key}; use crate::config::tree::bcow; #[test] fn algorithm() -> crate::Result { for (actual, expected) in [ ("myers", Algorithm::Myers), ("Myers", Algorithm::Myers), ("default", Algorithm::Myers), ("Default", Algorithm::Myers), ("minimal", Algorithm::MyersMinimal), ("histogram", Algorithm::Histogram), ] { assert_eq!(Diff::ALGORITHM.try_into_algorithm(bcow(actual))?, expected); assert!(Diff::ALGORITHM.validate(actual.into()).is_ok()); } assert_eq!( Diff::ALGORITHM .try_into_algorithm(bcow("patience")) .unwrap_err() .to_string(), "The 'patience' algorithm is not yet implemented" ); assert_eq!( Diff::ALGORITHM.try_into_algorithm(bcow("foo")).unwrap_err().to_string(), "Unknown diff algorithm named 'foo'" ); Ok(()) }} mod core { use std::time::Duration; use git_lock::acquire::Fail; use git_repository::{ config::tree::{Core, Key}, revision::spec::parse::ObjectKindHint, }; use crate::config::tree::bcow; fn signed(value: i64) -> Result<i64, git_config::value::Error> { Ok(value) } #[test] fn timeouts() -> crate::Result { assert_eq!( Core::FILES_REF_LOCK_TIMEOUT.try_into_lock_timeout(Ok(0))?, Fail::Immediately ); assert!(Core::FILES_REF_LOCK_TIMEOUT.validate("0".into()).is_ok()); assert_eq!( Core::FILES_REF_LOCK_TIMEOUT.try_into_lock_timeout(Ok(-5))?, Fail::AfterDurationWithBackoff(Duration::from_secs(u64::MAX)) ); assert!(Core::FILES_REF_LOCK_TIMEOUT.validate("-1".into()).is_ok()); assert_eq!( Core::FILES_REF_LOCK_TIMEOUT.try_into_lock_timeout(Ok(2500))?, Fail::AfterDurationWithBackoff(Duration::from_millis(2500)) ); assert!(Core::FILES_REF_LOCK_TIMEOUT.validate("2500".into()).is_ok()); assert_eq!( Core::FILES_REF_LOCK_TIMEOUT .try_into_lock_timeout(Err(git_config::value::Error::new("err", "bogus"))) .unwrap_err() .to_string(), "The timeout at key \"core.filesRefLockTimeout\" was invalid" ); Ok(()) } #[test] fn disambiguate() -> crate::Result { for (value, expected) in [ ("none", None), ("commit", Some(ObjectKindHint::Commit)), ("committish", Some(ObjectKindHint::Committish)), ("tree", Some(ObjectKindHint::Tree)), ("treeish", Some(ObjectKindHint::Treeish)), ("blob", Some(ObjectKindHint::Blob)), ] { assert_eq!( Core::DISAMBIGUATE.try_into_object_kind_hint(bcow(value)).unwrap(), expected ); assert!(Core::DISAMBIGUATE.validate(value.into()).is_ok()); } assert_eq!( Core::DISAMBIGUATE .try_into_object_kind_hint(bcow("CommiT")) .unwrap_err() .to_string(), "The key \"core.disambiguate=CommiT\" was invalid" ); Ok(()) } #[test] fn log_all_ref_updates() -> crate::Result { assert_eq!( Core::LOG_ALL_REF_UPDATES.try_into_ref_updates(Some(Ok(true)), || None)?, Some(git_ref::store::WriteReflog::Normal) ); assert!(Core::LOG_ALL_REF_UPDATES.validate("true".into()).is_ok()); assert_eq!( Core::LOG_ALL_REF_UPDATES.try_into_ref_updates(Some(Ok(false)), || None)?, Some(git_ref::store::WriteReflog::Disable) ); assert!(Core::LOG_ALL_REF_UPDATES.validate("0".into()).is_ok()); assert_eq!( Core::LOG_ALL_REF_UPDATES.try_into_ref_updates(None, || Some(bcow("always")))?, Some(git_ref::store::WriteReflog::Always) ); assert!(Core::LOG_ALL_REF_UPDATES.validate("always".into()).is_ok()); assert_eq!( Core::LOG_ALL_REF_UPDATES .try_into_ref_updates(None, || Some(bcow("invalid"))) .unwrap_err() .to_string(), "The key \"core.logAllRefUpdates=invalid\" was invalid" ); assert!(Core::LOG_ALL_REF_UPDATES.validate("invalid".into()).is_err()); Ok(()) } #[test] fn abbrev() -> crate::Result { let object_hash = git_hash::Kind::Sha1; assert_eq!(Core::ABBREV.try_into_abbreviation(bcow("4"), object_hash)?, Some(4)); assert_eq!(Core::ABBREV.try_into_abbreviation(bcow("auto"), object_hash)?, None); assert_eq!( Core::ABBREV.try_into_abbreviation(bcow("AUto"), object_hash)?, None, "case-insensitive" ); assert_eq!( Core::ABBREV.try_into_abbreviation(bcow("false"), object_hash)?, Some(object_hash.len_in_hex()), "turns abbreviations off entirely" ); assert_eq!( Core::ABBREV .try_into_abbreviation(bcow(" "), object_hash) .unwrap_err() .to_string(), "Invalid value for 'core.abbrev' = ' '. It must be between 4 and 40" ); for invalid in ["foo", "3", "41"] { assert!(Core::ABBREV.try_into_abbreviation(bcow(invalid), object_hash).is_err()); } Ok(()) } #[test] fn delta_base_cache_limit() -> crate::Result { assert_eq!(Core::DELTA_BASE_CACHE_LIMIT.try_into_usize(signed(1))?, 1); assert_eq!(Core::DELTA_BASE_CACHE_LIMIT.try_into_usize(signed(0))?, 0); assert!(Core::DELTA_BASE_CACHE_LIMIT.validate("0".into()).is_ok()); assert!(Core::DELTA_BASE_CACHE_LIMIT.validate("1".into()).is_ok()); assert_eq!( Core::DELTA_BASE_CACHE_LIMIT .try_into_usize(signed(-1)) .unwrap_err() .to_string(), "The value of key \"core.deltaBaseCacheLimit\" (possibly from GITOXIDE_PACK_CACHE_MEMORY) could not be parsed as unsigned integer" ); assert!(Core::DELTA_BASE_CACHE_LIMIT.validate("-1".into()).is_err()); Ok(()) } #[test] fn check_stat() -> crate::Result { assert!(Core::CHECK_STAT.try_into_checkstat(bcow("default"))?); assert!(!Core::CHECK_STAT.try_into_checkstat(bcow("minimal"))?); assert_eq!( Core::CHECK_STAT .try_into_checkstat(bcow("normal")) .unwrap_err() .to_string(), "The key \"core.checkStat=normal\" was invalid" ); assert!(Core::CHECK_STAT.validate("default".into()).is_ok()); assert!(Core::CHECK_STAT.validate("minimal".into()).is_ok()); assert!(Core::CHECK_STAT.validate("foo".into()).is_err()); Ok(()) }} mod extensions { use git_repository::config::tree::{Extensions, Key}; use crate::config::tree::bcow; #[test] fn object_format() -> crate::Result { assert_eq!( Extensions::OBJECT_FORMAT.try_into_object_format(bcow("sha1"))?, git_hash::Kind::Sha1 ); assert_eq!( Extensions::OBJECT_FORMAT.try_into_object_format(bcow("SHA1"))?, git_hash::Kind::Sha1, "case-insensitive" ); assert_eq!( Extensions::OBJECT_FORMAT .try_into_object_format(bcow("invalid")) .unwrap_err() .to_string(), "The key \"extensions.objectFormat=invalid\" was invalid" ); assert!(Extensions::OBJECT_FORMAT.validate("sha1".into()).is_ok()); assert!(Extensions::OBJECT_FORMAT.validate("invalid".into()).is_err()); Ok(()) }} mod checkout { use git_repository::config::tree::{Checkout, Key}; fn int(value: i64) -> Result<i64, git_config::value::Error> { Ok(value) } #[test] fn workers() -> crate::Result { assert!(Checkout::WORKERS.validate("0".into()).is_ok()); assert_eq!(Checkout::WORKERS.try_from_workers(int(0))?, 0); assert!(Checkout::WORKERS.validate("-1".into()).is_ok()); assert_eq!(Checkout::WORKERS.try_from_workers(int(-1))?, 0); assert!(Checkout::WORKERS.validate("-2".into()).is_ok()); assert!(Checkout::WORKERS.validate("3".into()).is_ok()); assert_eq!(Checkout::WORKERS.try_from_workers(int(2))?, 2); Ok(()) }} mod pack { use git_repository::config::tree::{Key, Pack}; #[test] fn index_version() -> crate::Result { assert_eq!( Pack::INDEX_VERSION.try_into_index_version(Ok(1))?, git_pack::index::Version::V1 ); assert!(Pack::INDEX_VERSION.validate("1".into()).is_ok()); assert_eq!( Pack::INDEX_VERSION.try_into_index_version(Ok(2))?, git_pack::index::Version::V2 ); assert!(Pack::INDEX_VERSION.validate("2".into()).is_ok()); assert_eq!( Pack::INDEX_VERSION .try_into_index_version(Ok(3)) .unwrap_err() .to_string(), "The value of key \"pack.indexVersion\" was invalid" ); assert!(Pack::INDEX_VERSION.validate("3".into()).is_err()); assert!(Pack::INDEX_VERSION.validate("-1".into()).is_err()); Ok(()) }} #[cfg(any(feature = "blocking-network-client", feature = "async-network-client"))]mod protocol { use git_repository::{ config::tree::{protocol, Key, Protocol}, remote::url::scheme_permission::Allow, }; use crate::config::tree::bcow; #[test] fn allow() -> crate::Result { for (key, protocol_name_parameter) in [ (&Protocol::ALLOW, None), (&protocol::NameParameter::ALLOW, Some("http")), ] { for (input, expected) in [ ("always", Allow::Always), ("never", Allow::Never), ("user", Allow::User), ] { assert_eq!(key.try_into_allow(bcow(input), protocol_name_parameter)?, expected); assert!(key.validate(input.into()).is_ok()); } assert_eq!( key.try_into_allow(bcow("User"), protocol_name_parameter) .unwrap_err() .to_string(), format!( "The value \"User\" must be allow|deny|user in configuration key {}", protocol_name_parameter .map(|key| format!("protocol.{key}.allow")) .unwrap_or_else(|| "protocol.allow".into()) ) ); } Ok(()) }} mod gitoxide { mod http { use git_repository::config::tree::{gitoxide, Key}; use std::time::Duration; #[test] fn connect_timeout() -> crate::Result { assert_eq!( gitoxide::Http::CONNECT_TIMEOUT.validated_assignment_fmt(&Duration::from_millis(1000).as_millis())?, "gitoxide.http.connectTimeout=1000" ); Ok(()) } } mod allow { use git_repository::config::tree::{gitoxide, Key}; #[test] fn protocol_from_user() { assert!( gitoxide::Allow::PROTOCOL_FROM_USER.validate("1".into()).is_ok(), "this really is the only valid value" ); assert!(gitoxide::Allow::PROTOCOL_FROM_USER.validate("true".into()).is_err()); assert!(gitoxide::Allow::PROTOCOL_FROM_USER.validate("0".into()).is_err()); } } mod commit { use git_repository::config::tree::{gitoxide, Key}; #[test] fn author_and_committer_date() { assert_eq!( gitoxide::Commit::AUTHOR_DATE .validated_assignment("Thu, 1 Aug 2022 12:45:06 +0800".into()) .expect("valid"), "gitoxide.commit.authorDate=Thu, 1 Aug 2022 12:45:06 +0800" ); assert_eq!( gitoxide::Commit::COMMITTER_DATE .validated_assignment("Thu, 1 Aug 2022 12:45:06 +0800".into()) .expect("valid"), "gitoxide.commit.committerDate=Thu, 1 Aug 2022 12:45:06 +0800" ); } } mod author { use git_repository::config::tree::{gitoxide, Key}; #[test] fn name_and_email_fallback() { assert_eq!( gitoxide::Author::NAME_FALLBACK .validated_assignment("name".into()) .expect("valid"), "gitoxide.author.nameFallback=name" ); assert_eq!( gitoxide::Author::EMAIL_FALLBACK .validated_assignment("email".into()) .expect("valid"), "gitoxide.author.emailFallback=email" ); } } mod committer { use git_repository::config::tree::{gitoxide, Key}; Lines 1–500 of 740. Load more
use std::borrow::Cow; use git_object::bstr::BStr; fn bcow(input: &str) -> Cow<'_, BStr> { Cow::Borrowed(input.into()) } mod keys { use std::borrow::Cow; use git_object::bstr::ByteSlice; use git_repository as git; use git_repository::config::tree::{Key, Section}; use crate::config::tree::bcow; #[test] fn string() -> crate::Result { assert_eq!( git::config::tree::Http::USER_AGENT.try_into_string(bcow("agent"))?, "agent" ); assert!(git::config::tree::Http::USER_AGENT.validate("agent".into()).is_ok()); let invalid = b"\xF0\x80\x80".as_bstr(); assert_eq!( git::config::tree::Http::USER_AGENT .try_into_string(Cow::Borrowed(invalid)) .unwrap_err() .to_string(), "The utf-8 string at \"http.userAgent=���\" could not be decoded" ); assert!(git::config::tree::Http::USER_AGENT.validate(invalid).is_err()); Ok(()) } #[test] fn any() { assert!( !git::config::Tree.sections().is_empty(), "the root has at least one section" ); assert_eq!(git::config::Tree::AUTHOR.name(), "author"); assert_eq!(git::config::tree::Author.keys().len(), 2); assert_eq!(git::config::tree::Author::NAME.name(), "name"); assert_eq!(git::config::tree::Author::EMAIL.name(), "email"); assert_eq!( git::config::tree::Author::NAME .validated_assignment("user".into()) .unwrap(), "author.name=user" ); assert_eq!( git::config::tree::Author::NAME .validated_assignment("user".into()) .unwrap(), "author.name=user" ); } #[test] fn remote_name() { assert!(git::config::tree::Remote::PUSH_DEFAULT .validate("origin".into()) .is_ok()); assert!(git::config::tree::Remote::PUSH_DEFAULT .validate("https://github.com/byron/gitoxide".into()) .is_ok()); } } mod branch { use git_repository::config::tree::{branch, Branch, Key}; use crate::config::tree::bcow; #[test] fn merge() { assert!(branch::Merge::try_into_fullrefname(bcow("refs/heads/main")).is_ok()); assert!(branch::Merge::try_into_fullrefname(bcow("main")).is_err()); assert!(Branch::MERGE.full_name(None).is_err()); assert_eq!( Branch::MERGE.full_name(Some("name".into())).expect("valid"), "branch.name.merge" ); } } mod ssh { #[test] #[cfg(feature = "blocking-network-client")] fn variant() -> crate::Result { use git_protocol::transport::client::ssh::ProgramKind; use git_repository::config::tree::Ssh; use crate::config::tree::bcow; for (actual, expected) in [ ("auto", None), ("ssh", Some(ProgramKind::Ssh)), ("simple", Some(ProgramKind::Simple)), ("plink", Some(ProgramKind::Plink)), ("putty", Some(ProgramKind::Putty)), ("tortoiseplink", Some(ProgramKind::TortoisePlink)), ] { assert_eq!(Ssh::VARIANT.try_into_variant(bcow(actual))?, expected); } assert_eq!( Ssh::VARIANT.try_into_variant(bcow("SSH")).unwrap_err().to_string(), "The key \"ssh.variant=SSH\" (possibly from GIT_SSH_VARIANT) was invalid", "case-sensitive comparisons" ); Ok(()) } } mod diff { use git_diff::blob::Algorithm; use git_repository::config::tree::{Diff, Key}; use crate::config::tree::bcow; #[test] fn algorithm() -> crate::Result { for (actual, expected) in [ ("myers", Algorithm::Myers), ("Myers", Algorithm::Myers), ("default", Algorithm::Myers), ("Default", Algorithm::Myers), ("minimal", Algorithm::MyersMinimal), ("histogram", Algorithm::Histogram), ] { assert_eq!(Diff::ALGORITHM.try_into_algorithm(bcow(actual))?, expected); assert!(Diff::ALGORITHM.validate(actual.into()).is_ok()); } assert_eq!( Diff::ALGORITHM .try_into_algorithm(bcow("patience")) .unwrap_err() .to_string(), "The 'patience' algorithm is not yet implemented" ); assert_eq!( Diff::ALGORITHM.try_into_algorithm(bcow("foo")).unwrap_err().to_string(), "Unknown diff algorithm named 'foo'" ); Ok(()) } } mod core { use std::time::Duration; use git_lock::acquire::Fail; use git_repository::{ config::tree::{Core, Key}, revision::spec::parse::ObjectKindHint, }; use crate::config::tree::bcow; fn signed(value: i64) -> Result<i64, git_config::value::Error> { Ok(value) } #[test] fn timeouts() -> crate::Result { assert_eq!( Core::FILES_REF_LOCK_TIMEOUT.try_into_lock_timeout(Ok(0))?, Fail::Immediately ); assert!(Core::FILES_REF_LOCK_TIMEOUT.validate("0".into()).is_ok()); assert_eq!( Core::FILES_REF_LOCK_TIMEOUT.try_into_lock_timeout(Ok(-5))?, Fail::AfterDurationWithBackoff(Duration::from_secs(u64::MAX)) ); assert!(Core::FILES_REF_LOCK_TIMEOUT.validate("-1".into()).is_ok()); assert_eq!( Core::FILES_REF_LOCK_TIMEOUT.try_into_lock_timeout(Ok(2500))?, Fail::AfterDurationWithBackoff(Duration::from_millis(2500)) ); assert!(Core::FILES_REF_LOCK_TIMEOUT.validate("2500".into()).is_ok()); assert_eq!( Core::FILES_REF_LOCK_TIMEOUT .try_into_lock_timeout(Err(git_config::value::Error::new("err", "bogus"))) .unwrap_err() .to_string(), "The timeout at key \"core.filesRefLockTimeout\" was invalid" ); Ok(()) } #[test] fn disambiguate() -> crate::Result { for (value, expected) in [ ("none", None), ("commit", Some(ObjectKindHint::Commit)), ("committish", Some(ObjectKindHint::Committish)), ("tree", Some(ObjectKindHint::Tree)), ("treeish", Some(ObjectKindHint::Treeish)), ("blob", Some(ObjectKindHint::Blob)), ] { assert_eq!( Core::DISAMBIGUATE.try_into_object_kind_hint(bcow(value)).unwrap(), expected ); assert!(Core::DISAMBIGUATE.validate(value.into()).is_ok()); } assert_eq!( Core::DISAMBIGUATE .try_into_object_kind_hint(bcow("CommiT")) .unwrap_err() .to_string(), "The key \"core.disambiguate=CommiT\" was invalid" ); Ok(()) } #[test] fn log_all_ref_updates() -> crate::Result { assert_eq!( Core::LOG_ALL_REF_UPDATES.try_into_ref_updates(Some(Ok(true)), || None)?, Some(git_ref::store::WriteReflog::Normal) ); assert!(Core::LOG_ALL_REF_UPDATES.validate("true".into()).is_ok()); assert_eq!( Core::LOG_ALL_REF_UPDATES.try_into_ref_updates(Some(Ok(false)), || None)?, Some(git_ref::store::WriteReflog::Disable) ); assert!(Core::LOG_ALL_REF_UPDATES.validate("0".into()).is_ok()); assert_eq!( Core::LOG_ALL_REF_UPDATES.try_into_ref_updates(None, || Some(bcow("always")))?, Some(git_ref::store::WriteReflog::Always) ); assert!(Core::LOG_ALL_REF_UPDATES.validate("always".into()).is_ok()); assert_eq!( Core::LOG_ALL_REF_UPDATES .try_into_ref_updates(None, || Some(bcow("invalid"))) .unwrap_err() .to_string(), "The key \"core.logAllRefUpdates=invalid\" was invalid" ); assert!(Core::LOG_ALL_REF_UPDATES.validate("invalid".into()).is_err()); Ok(()) } #[test] fn abbrev() -> crate::Result { let object_hash = git_hash::Kind::Sha1; assert_eq!(Core::ABBREV.try_into_abbreviation(bcow("4"), object_hash)?, Some(4)); assert_eq!(Core::ABBREV.try_into_abbreviation(bcow("auto"), object_hash)?, None); assert_eq!( Core::ABBREV.try_into_abbreviation(bcow("AUto"), object_hash)?, None, "case-insensitive" ); assert_eq!( Core::ABBREV.try_into_abbreviation(bcow("false"), object_hash)?, Some(object_hash.len_in_hex()), "turns abbreviations off entirely" ); assert_eq!( Core::ABBREV .try_into_abbreviation(bcow(" "), object_hash) .unwrap_err() .to_string(), "Invalid value for 'core.abbrev' = ' '. It must be between 4 and 40" ); for invalid in ["foo", "3", "41"] { assert!(Core::ABBREV.try_into_abbreviation(bcow(invalid), object_hash).is_err()); } Ok(()) } #[test] fn delta_base_cache_limit() -> crate::Result { assert_eq!(Core::DELTA_BASE_CACHE_LIMIT.try_into_usize(signed(1))?, 1); assert_eq!(Core::DELTA_BASE_CACHE_LIMIT.try_into_usize(signed(0))?, 0); assert!(Core::DELTA_BASE_CACHE_LIMIT.validate("0".into()).is_ok()); assert!(Core::DELTA_BASE_CACHE_LIMIT.validate("1".into()).is_ok()); assert_eq!( Core::DELTA_BASE_CACHE_LIMIT .try_into_usize(signed(-1)) .unwrap_err() .to_string(), "The value of key \"core.deltaBaseCacheLimit\" (possibly from GITOXIDE_PACK_CACHE_MEMORY) could not be parsed as unsigned integer" ); assert!(Core::DELTA_BASE_CACHE_LIMIT.validate("-1".into()).is_err()); Ok(()) } #[test] fn check_stat() -> crate::Result { assert!(Core::CHECK_STAT.try_into_checkstat(bcow("default"))?); assert!(!Core::CHECK_STAT.try_into_checkstat(bcow("minimal"))?); assert_eq!( Core::CHECK_STAT .try_into_checkstat(bcow("normal")) .unwrap_err() .to_string(), "The key \"core.checkStat=normal\" was invalid" ); assert!(Core::CHECK_STAT.validate("default".into()).is_ok()); assert!(Core::CHECK_STAT.validate("minimal".into()).is_ok()); assert!(Core::CHECK_STAT.validate("foo".into()).is_err()); Ok(()) } } mod extensions { use git_repository::config::tree::{Extensions, Key}; use crate::config::tree::bcow; #[test] fn object_format() -> crate::Result { assert_eq!( Extensions::OBJECT_FORMAT.try_into_object_format(bcow("sha1"))?, git_hash::Kind::Sha1 ); assert_eq!( Extensions::OBJECT_FORMAT.try_into_object_format(bcow("SHA1"))?, git_hash::Kind::Sha1, "case-insensitive" ); assert_eq!( Extensions::OBJECT_FORMAT .try_into_object_format(bcow("invalid")) .unwrap_err() .to_string(), "The key \"extensions.objectFormat=invalid\" was invalid" ); assert!(Extensions::OBJECT_FORMAT.validate("sha1".into()).is_ok()); assert!(Extensions::OBJECT_FORMAT.validate("invalid".into()).is_err()); Ok(()) } } mod checkout { use git_repository::config::tree::{Checkout, Key}; fn int(value: i64) -> Result<i64, git_config::value::Error> { Ok(value) } #[test] fn workers() -> crate::Result { assert!(Checkout::WORKERS.validate("0".into()).is_ok()); assert_eq!(Checkout::WORKERS.try_from_workers(int(0))?, 0); assert!(Checkout::WORKERS.validate("-1".into()).is_ok()); assert_eq!(Checkout::WORKERS.try_from_workers(int(-1))?, 0); assert!(Checkout::WORKERS.validate("-2".into()).is_ok()); assert!(Checkout::WORKERS.validate("3".into()).is_ok()); assert_eq!(Checkout::WORKERS.try_from_workers(int(2))?, 2); Ok(()) } } mod pack { use git_repository::config::tree::{Key, Pack}; #[test] fn index_version() -> crate::Result { assert_eq!( Pack::INDEX_VERSION.try_into_index_version(Ok(1))?, git_pack::index::Version::V1 ); assert!(Pack::INDEX_VERSION.validate("1".into()).is_ok()); assert_eq!( Pack::INDEX_VERSION.try_into_index_version(Ok(2))?, git_pack::index::Version::V2 ); assert!(Pack::INDEX_VERSION.validate("2".into()).is_ok()); assert_eq!( Pack::INDEX_VERSION .try_into_index_version(Ok(3)) .unwrap_err() .to_string(), "The value of key \"pack.indexVersion\" was invalid" ); assert!(Pack::INDEX_VERSION.validate("3".into()).is_err()); assert!(Pack::INDEX_VERSION.validate("-1".into()).is_err()); Ok(()) } } #[cfg(any(feature = "blocking-network-client", feature = "async-network-client"))] mod protocol { use git_repository::{ config::tree::{protocol, Key, Protocol}, remote::url::scheme_permission::Allow, }; use crate::config::tree::bcow; #[test] fn allow() -> crate::Result { for (key, protocol_name_parameter) in [ (&Protocol::ALLOW, None), (&protocol::NameParameter::ALLOW, Some("http")), ] { for (input, expected) in [ ("always", Allow::Always), ("never", Allow::Never), ("user", Allow::User), ] { assert_eq!(key.try_into_allow(bcow(input), protocol_name_parameter)?, expected); assert!(key.validate(input.into()).is_ok()); } assert_eq!( key.try_into_allow(bcow("User"), protocol_name_parameter) .unwrap_err() .to_string(), format!( "The value \"User\" must be allow|deny|user in configuration key {}", protocol_name_parameter .map(|key| format!("protocol.{key}.allow")) .unwrap_or_else(|| "protocol.allow".into()) ) ); } Ok(()) } } mod gitoxide { mod http { use git_repository::config::tree::{gitoxide, Key}; use std::time::Duration; #[test] fn connect_timeout() -> crate::Result { assert_eq!( gitoxide::Http::CONNECT_TIMEOUT.validated_assignment_fmt(&Duration::from_millis(1000).as_millis())?, "gitoxide.http.connectTimeout=1000" ); Ok(()) } } mod allow { use git_repository::config::tree::{gitoxide, Key}; #[test] fn protocol_from_user() { assert!( gitoxide::Allow::PROTOCOL_FROM_USER.validate("1".into()).is_ok(), "this really is the only valid value" ); assert!(gitoxide::Allow::PROTOCOL_FROM_USER.validate("true".into()).is_err()); assert!(gitoxide::Allow::PROTOCOL_FROM_USER.validate("0".into()).is_err()); } } mod commit { use git_repository::config::tree::{gitoxide, Key}; #[test] fn author_and_committer_date() { assert_eq!( gitoxide::Commit::AUTHOR_DATE .validated_assignment("Thu, 1 Aug 2022 12:45:06 +0800".into()) .expect("valid"), "gitoxide.commit.authorDate=Thu, 1 Aug 2022 12:45:06 +0800" ); assert_eq!( gitoxide::Commit::COMMITTER_DATE .validated_assignment("Thu, 1 Aug 2022 12:45:06 +0800".into()) .expect("valid"), "gitoxide.commit.committerDate=Thu, 1 Aug 2022 12:45:06 +0800" ); } } mod author { use git_repository::config::tree::{gitoxide, Key}; #[test] fn name_and_email_fallback() { assert_eq!( gitoxide::Author::NAME_FALLBACK .validated_assignment("name".into()) .expect("valid"), "gitoxide.author.nameFallback=name" ); assert_eq!( gitoxide::Author::EMAIL_FALLBACK .validated_assignment("email".into()) .expect("valid"), "gitoxide.author.emailFallback=email" ); } } mod committer { use git_repository::config::tree::{gitoxide, Key};