#![allow(non_upper_case_globals)]
#![allow(non_camel_case_types)]
#![allow(dead_code)]
pub const PASSWD_FILE: &str = "/etc/passwd";
pub const PASSWD_MAP: &str = "passwd.byname";
pub const CACHE_USERNAMES: i32 = 1;
pub const JOB_CONTROL: i32 = 1;
pub const USE_SUSPENDED: i32 = 1;
pub const DEFAULT_HISTSIZE: i32 = 30;
pub const DEFAULT_FCEDIT: &str = "vi";
pub const DEFAULT_TMPPREFIX: &str = "/tmp/zsh";
pub const BROKEN_ISPRINT: i32 = 1;
pub const CONFIG_LOCALE: i32 = 1;
pub const DEFAULT_PATH: &str = "/usr/bin:/bin:/usr/sbin:/sbin";
pub const DEFAULT_READNULLCMD: &str = "more";
pub const DL_EXT: &str = "so";
pub const DYNAMIC: i32 = 1;
pub const DYNAMIC_NAME_CLASH_OK: i32 = 1;
pub const GETCWD_CALLS_MALLOC: i32 = 1;
pub const GETPGRP_VOID: i32 = 1;
pub const GLOBAL_ZLOGIN: &str = "/etc/zlogin";
pub const GLOBAL_ZLOGOUT: &str = "/etc/zlogout";
pub const GLOBAL_ZPROFILE: &str = "/etc/zprofile";
pub const GLOBAL_ZSHENV: &str = "/etc/zshenv";
pub const GLOBAL_ZSHRC: &str = "/etc/zshrc";
pub const HAVE_ALLOCA: i32 = 1;
pub const HAVE_ALLOCA_H: i32 = 1;
pub const HAVE_ARC4RANDOM_BUF: i32 = 1;
pub const HAVE_BOOLCODES: i32 = 1;
pub const HAVE_BOOLNAMES: i32 = 1;
pub const HAVE_BRK: i32 = 1;
pub const HAVE_BRK_PROTO: i32 = 1;
pub const HAVE_CLOCK_GETTIME: i32 = 1;
pub const HAVE_CURSES_H: i32 = 1;
pub const HAVE_DIFFTIME: i32 = 1;
pub const HAVE_DIRENT_H: i32 = 1;
pub const HAVE_DLCLOSE: i32 = 1;
pub const HAVE_DLERROR: i32 = 1;
pub const HAVE_DLFCN_H: i32 = 1;
pub const HAVE_DLOPEN: i32 = 1;
pub const HAVE_DLSYM: i32 = 1;
pub const HAVE_ENDUTXENT: i32 = 1;
pub const HAVE_ERAND48: i32 = 1;
pub const HAVE_ERRNO_H: i32 = 1;
pub const HAVE_FCHDIR: i32 = 1;
pub const HAVE_FCHMOD: i32 = 1;
pub const HAVE_FCHOWN: i32 = 1;
pub const HAVE_FCNTL_H: i32 = 1;
pub const HAVE_FIFOS: i32 = 1;
pub const HAVE_FPURGE: i32 = 1;
pub const HAVE_FSEEKO: i32 = 1;
pub const HAVE_FSTAT: i32 = 1;
pub const HAVE_FTELLO: i32 = 1;
pub const HAVE_FTRUNCATE: i32 = 1;
pub const HAVE_GETCCHAR: i32 = 1;
pub const HAVE_GETCWD: i32 = 1;
pub const HAVE_GETENV: i32 = 1;
pub const HAVE_GETGRGID: i32 = 1;
pub const HAVE_GETGRNAM: i32 = 1;
pub const HAVE_GETHOSTBYNAME2: i32 = 1;
pub const HAVE_GETHOSTNAME: i32 = 1;
pub const HAVE_GETIPNODEBYNAME: i32 = 1;
pub const HAVE_GETLOGIN: i32 = 1;
pub const HAVE_GETPAGESIZE: i32 = 1;
pub const HAVE_GETPWENT: i32 = 1;
pub const HAVE_GETPWNAM: i32 = 1;
pub const HAVE_GETPWUID: i32 = 1;
pub const HAVE_GETRLIMIT: i32 = 1;
pub const HAVE_GETRUSAGE: i32 = 1;
pub const HAVE_GETTIMEOFDAY: i32 = 1;
pub const HAVE_GETUTXENT: i32 = 1;
pub const HAVE_GETXATTR: i32 = 1;
pub const HAVE_GRANTPT: i32 = 1;
pub const HAVE_GRP_H: i32 = 1;
pub const HAVE_HTONS: i32 = 1;
pub const HAVE_ICONV: i32 = 1;
pub const HAVE_ICONV_H: i32 = 1;
pub const HAVE_INET_ATON: i32 = 1;
pub const HAVE_INET_NTOP: i32 = 1;
pub const HAVE_INET_PTON: i32 = 1;
pub const HAVE_INITGROUPS: i32 = 1;
pub const HAVE_INITSCR: i32 = 1;
pub const HAVE_INTTYPES_H: i32 = 1;
pub const HAVE_IOCTL_PROTO: i32 = 1;
pub const HAVE_ISBLANK: i32 = 1;
pub const HAVE_ISINF: i32 = 1;
pub const HAVE_ISNAN: i32 = 1;
pub const HAVE_ISWBLANK: i32 = 1;
pub const HAVE_KILLPG: i32 = 1;
pub const HAVE_LANGINFO_H: i32 = 1;
pub const HAVE_LCHOWN: i32 = 1;
pub const HAVE_LIBC_H: i32 = 1;
pub const HAVE_LIBDL: i32 = 1;
pub const HAVE_LIBM: i32 = 1;
pub const HAVE_LIMITS_H: i32 = 1;
pub const HAVE_LINK: i32 = 1;
pub const HAVE_LOCALE_H: i32 = 1;
pub const HAVE_LOG2: i32 = 1;
pub const HAVE_LSTAT: i32 = 1;
pub const HAVE_MEMCPY: i32 = 1;
pub const HAVE_MEMMOVE: i32 = 1;
pub const HAVE_MEMORY_H: i32 = 1;
pub const HAVE_MKFIFO: i32 = 1;
pub const HAVE_MKNOD_PROTO: i32 = 1;
pub const HAVE_MKSTEMP: i32 = 1;
pub const HAVE_MKTIME: i32 = 1;
pub const HAVE_MMAP: i32 = 1;
pub const HAVE_MSYNC: i32 = 1;
pub const HAVE_MUNMAP: i32 = 1;
pub const HAVE_NANOSLEEP: i32 = 1;
pub const HAVE_NCURSES_H: i32 = 1;
pub const HAVE_NETINET_IN_SYSTM_H: i32 = 1;
pub const HAVE_NICE: i32 = 1;
pub const HAVE_NL_LANGINFO: i32 = 1;
pub const HAVE_NTOHS: i32 = 1;
pub const HAVE_NUMCODES: i32 = 1;
pub const HAVE_NUMNAMES: i32 = 1;
pub const HAVE_OPEN_MEMSTREAM: i32 = 1;
pub const HAVE_OSPEED: i32 = 1;
pub const HAVE_PATHCONF: i32 = 1;
pub const HAVE_POLL: i32 = 1;
pub const HAVE_POLL_H: i32 = 1;
pub const HAVE_POSIX_OPENPT: i32 = 1;
pub const HAVE_PTSNAME: i32 = 1;
pub const HAVE_PUTENV: i32 = 1;
pub const HAVE_PWD_H: i32 = 1;
pub const HAVE_READLINK: i32 = 1;
pub const HAVE_REALPATH: i32 = 1;
pub const HAVE_REGCOMP: i32 = 1;
pub const HAVE_REGERROR: i32 = 1;
pub const HAVE_REGEXEC: i32 = 1;
pub const HAVE_REGFREE: i32 = 1;
pub const HAVE_RESIZE_TERM: i32 = 1;
pub const HAVE_RLIMIT_AS: i32 = 1;
pub const HAVE_RLIMIT_MEMLOCK: i32 = 1;
pub const HAVE_RLIMIT_NOFILE: i32 = 1;
pub const HAVE_RLIMIT_NPROC: i32 = 1;
pub const HAVE_RLIMIT_RSS: i32 = 1;
pub const HAVE_SBRK: i32 = 1;
pub const HAVE_SBRK_PROTO: i32 = 1;
pub const HAVE_SCALBN: i32 = 1;
pub const HAVE_SELECT: i32 = 1;
pub const HAVE_SETCCHAR: i32 = 1;
pub const HAVE_SETEGID: i32 = 1;
pub const HAVE_SETENV: i32 = 1;
pub const HAVE_SETEUID: i32 = 1;
pub const HAVE_SETGID: i32 = 1;
pub const HAVE_SETLOCALE: i32 = 1;
pub const HAVE_SETPGID: i32 = 1;
pub const HAVE_SETPGRP: i32 = 1;
pub const HAVE_SETREGID: i32 = 1;
pub const HAVE_SETREUID: i32 = 1;
pub const HAVE_SETSID: i32 = 1;
pub const HAVE_SETUID: i32 = 1;
pub const HAVE_SETUPTERM: i32 = 1;
pub const HAVE_SETUTXENT: i32 = 1;
pub const HAVE_SIGACTION: i32 = 1;
pub const HAVE_SIGBLOCK: i32 = 1;
pub const HAVE_SIGHOLD: i32 = 1;
pub const HAVE_SIGNGAM: i32 = 1;
pub const HAVE_SIGPROCMASK: i32 = 1;
pub const HAVE_SIGRELSE: i32 = 1;
pub const HAVE_SIGSETMASK: i32 = 1;
pub const HAVE_STDARG_H: i32 = 1;
pub const HAVE_STDDEF_H: i32 = 1;
pub const HAVE_STDINT_H: i32 = 1;
pub const HAVE_STDIO_H: i32 = 1;
pub const HAVE_STDLIB_H: i32 = 1;
pub const HAVE_STRCODES: i32 = 1;
pub const HAVE_STRCOLL: i32 = 1;
pub const HAVE_STRERROR: i32 = 1;
pub const HAVE_STRFTIME: i32 = 1;
pub const HAVE_STRINGS_H: i32 = 1;
pub const HAVE_STRING_H: i32 = 1;
pub const HAVE_STRNAMES: i32 = 1;
pub const HAVE_STRPTIME: i32 = 1;
pub const HAVE_STRSTR: i32 = 1;
pub const HAVE_STRTOUL: i32 = 1;
pub const HAVE_STRUCT_DIRENT_D_INO: i32 = 1;
pub const HAVE_STRUCT_RUSAGE_RU_IDRSS: i32 = 1;
pub const HAVE_STRUCT_RUSAGE_RU_INBLOCK: i32 = 1;
pub const HAVE_STRUCT_RUSAGE_RU_ISRSS: i32 = 1;
pub const HAVE_STRUCT_RUSAGE_RU_IXRSS: i32 = 1;
pub const HAVE_STRUCT_RUSAGE_RU_MAJFLT: i32 = 1;
pub const HAVE_STRUCT_RUSAGE_RU_MAXRSS: i32 = 1;
pub const HAVE_STRUCT_RUSAGE_RU_MINFLT: i32 = 1;
pub const HAVE_STRUCT_RUSAGE_RU_MSGRCV: i32 = 1;
pub const HAVE_STRUCT_RUSAGE_RU_MSGSND: i32 = 1;
pub const HAVE_STRUCT_RUSAGE_RU_NIVCSW: i32 = 1;
pub const HAVE_STRUCT_RUSAGE_RU_NSIGNALS: i32 = 1;
pub const HAVE_STRUCT_RUSAGE_RU_NSWAP: i32 = 1;
pub const HAVE_STRUCT_RUSAGE_RU_NVCSW: i32 = 1;
pub const HAVE_STRUCT_RUSAGE_RU_OUBLOCK: i32 = 1;
pub const HAVE_STRUCT_SOCKADDR_IN6_SIN6_SCOPE_ID: i32 = 1;
pub const HAVE_STRUCT_STAT_ST_ATIMESPEC_TV_NSEC: i32 = 1;
pub const HAVE_STRUCT_STAT_ST_CTIMESPEC_TV_NSEC: i32 = 1;
pub const HAVE_STRUCT_STAT_ST_MTIMESPEC_TV_NSEC: i32 = 1;
pub const HAVE_STRUCT_TIMESPEC: i32 = 1;
pub const HAVE_STRUCT_TIMEZONE: i32 = 1;
pub const HAVE_STRUCT_UTMP: i32 = 1;
pub const HAVE_STRUCT_UTMPX: i32 = 1;
pub const HAVE_STRUCT_UTMPX_UT_HOST: i32 = 1;
pub const HAVE_STRUCT_UTMPX_UT_TV: i32 = 1;
pub const HAVE_STRUCT_UTMP_UT_HOST: i32 = 1;
pub const HAVE_SYMLINK: i32 = 1;
pub const HAVE_SYSCONF: i32 = 1;
pub const HAVE_SYS_FILIO_H: i32 = 1;
pub const HAVE_SYS_MMAN_H: i32 = 1;
pub const HAVE_SYS_PARAM_H: i32 = 1;
pub const HAVE_SYS_RANDOM_H: i32 = 1;
pub const HAVE_SYS_RESOURCE_H: i32 = 1;
pub const HAVE_SYS_SELECT_H: i32 = 1;
pub const HAVE_SYS_STAT_H: i32 = 1;
pub const HAVE_SYS_TIMES_H: i32 = 1;
pub const HAVE_SYS_TIME_H: i32 = 1;
pub const HAVE_SYS_TYPES_H: i32 = 1;
pub const HAVE_SYS_UTSNAME_H: i32 = 1;
pub const HAVE_SYS_WAIT_H: i32 = 1;
pub const HAVE_SYS_XATTR_H: i32 = 1;
pub const HAVE_TCGETATTR: i32 = 1;
pub const HAVE_TCSETPGRP: i32 = 1;
pub const HAVE_TERMCAP_H: i32 = 1;
pub const HAVE_TERMIOS_H: i32 = 1;
pub const HAVE_TERM_H: i32 = 1;
pub const HAVE_TGAMMA: i32 = 1;
pub const HAVE_TGETENT: i32 = 1;
pub const HAVE_TIGETFLAG: i32 = 1;
pub const HAVE_TIGETNUM: i32 = 1;
pub const HAVE_TIGETSTR: i32 = 1;
pub const HAVE_TIMELOCAL: i32 = 1;
pub const HAVE_UNAME: i32 = 1;
pub const HAVE_UNION_INIT: i32 = 1;
pub const HAVE_UNISTD_H: i32 = 1;
pub const HAVE_UNLOCKPT: i32 = 1;
pub const HAVE_UNSETENV: i32 = 1;
pub const HAVE_USE_DEFAULT_COLORS: i32 = 1;
pub const HAVE_UTMPX_H: i32 = 1;
pub const HAVE_UTMP_H: i32 = 1;
pub const HAVE_VARIABLE_LENGTH_ARRAYS: i32 = 1;
pub const HAVE_WADDWSTR: i32 = 1;
pub const HAVE_WAIT3: i32 = 1;
pub const HAVE_WAITPID: i32 = 1;
pub const HAVE_WCHAR_H: i32 = 1;
pub const HAVE_WCTOMB: i32 = 1;
pub const HAVE_WGET_WCH: i32 = 1;
pub const HAVE_WIN_WCH: i32 = 1;
pub const HAVE__MKTEMP: i32 = 1;
pub const ICONV_CONST: bool = true;
pub const ICONV_FROM_LIBICONV: i32 = 1;
pub const IOCTL_IN_SYS_IOCTL: i32 = 1;
pub const LONG_IS_64_BIT: i32 = 1;
pub const MACHTYPE: &str = "arm";
pub const MAX_FUNCTION_DEPTH: i32 = 500;
pub const MULTIBYTE_SUPPORT: i32 = 1;
pub const OSTYPE: &str = "darwin23.6.0";
pub const PACKAGE_BUGREPORT: &str = "";
pub const PACKAGE_NAME: &str = "";
pub const PACKAGE_STRING: &str = "";
pub const PACKAGE_TARNAME: &str = "";
pub const PACKAGE_URL: &str = "";
pub const PACKAGE_VERSION: &str = "";
pub const PATH_DEV_FD: &str = "/dev/fd";
pub const PATH_UTMPX_FILE: &str = "/var/run/utmpx";
pub const POSIX_SIGNALS: i32 = 1;
pub const PRINTF_HAS_LLD: i32 = 1;
pub const REALPATH_ACCEPTS_NULL: i32 = 1;
pub const RESTRICTED_R: i32 = 1;
pub const RLIMIT_RSS_IS_AS: i32 = 1;
pub const RLIM_T_IS_UNSIGNED: i32 = 1;
pub const RU_MAXRSS_IS_IN_BYTES: i32 = 1;
pub const STDC_HEADERS: i32 = 1;
pub const TGETENT_ACCEPTS_NULL: i32 = 1;
pub const TGETENT_SUCCESS: i32 = 1;
pub const USE_DEV_PTMX: i32 = 1;
pub const USE_GETCWD: i32 = 1;
pub const USE_LSEEK: i32 = 1;
pub const VENDOR: &str = "apple";
pub const XATTR_EXTRA_ARGS: i32 = 1;
pub const ZSH_HAVE_CURSES_H: i32 = 1;
pub const ZSH_HAVE_TERM_H: i32 = 1;
pub type ZSOCKLEN_T = libc::socklen_t;
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn job_control_is_enabled() {
let _g = crate::test_util::global_state_lock();
assert_eq!(JOB_CONTROL, 1);
assert_eq!(USE_SUSPENDED, 1);
}
#[test]
fn passwd_file_is_posix_standard_location() {
let _g = crate::test_util::global_state_lock();
assert_eq!(PASSWD_FILE, "/etc/passwd");
}
#[test]
fn default_config_values_match_upstream_config_h() {
let _g = crate::test_util::global_state_lock();
assert_eq!(
DEFAULT_HISTSIZE, 30,
"configure.ac:2978 / config.h:13 — DEFAULT_HISTSIZE = 30"
);
assert_eq!(
DEFAULT_FCEDIT, "vi",
"configure.ac:2981 / config.h:16 — DEFAULT_FCEDIT = \"vi\""
);
assert_eq!(
DEFAULT_TMPPREFIX, "/tmp/zsh",
"configure.ac:2984 / config.h:19 — DEFAULT_TMPPREFIX = \"/tmp/zsh\""
);
}
#[test]
fn global_rc_paths_have_canonical_etc_zsh_prefix() {
let _g = crate::test_util::global_state_lock();
for (name, path) in [
("GLOBAL_ZSHENV", GLOBAL_ZSHENV),
("GLOBAL_ZPROFILE", GLOBAL_ZPROFILE),
("GLOBAL_ZSHRC", GLOBAL_ZSHRC),
("GLOBAL_ZLOGIN", GLOBAL_ZLOGIN),
("GLOBAL_ZLOGOUT", GLOBAL_ZLOGOUT),
] {
assert!(
path.starts_with("/etc/z"),
"{} = {:?} — must live under /etc/z* per zsh init convention",
name,
path
);
assert!(
!path.contains(".."),
"{} = {:?} — path traversal in a startup-file path is a security risk",
name,
path
);
}
}
#[test]
fn global_rc_paths_are_all_distinct() {
let _g = crate::test_util::global_state_lock();
let all = [
GLOBAL_ZSHENV,
GLOBAL_ZPROFILE,
GLOBAL_ZSHRC,
GLOBAL_ZLOGIN,
GLOBAL_ZLOGOUT,
];
let unique: std::collections::HashSet<_> = all.iter().copied().collect();
assert_eq!(
unique.len(),
all.len(),
"duplicate startup-file path detected: {:?}",
all
);
}
#[test]
fn default_path_is_colon_separated_and_includes_bin_dirs() {
let _g = crate::test_util::global_state_lock();
assert!(DEFAULT_PATH.contains("/bin"));
assert!(DEFAULT_PATH.contains("/usr/bin"));
assert!(
!DEFAULT_PATH.ends_with(':'),
"trailing colon in DEFAULT_PATH = {:?} means cwd-on-PATH — security regression",
DEFAULT_PATH
);
for seg in DEFAULT_PATH.split(':') {
assert!(seg.starts_with('/'),
"DEFAULT_PATH segment {:?} is not absolute — relative paths in PATH are a security risk",
seg);
}
}
#[test]
fn dl_ext_is_nonempty_extension_stem() {
let _g = crate::test_util::global_state_lock();
assert!(
!DL_EXT.is_empty(),
"DL_EXT must be set so zmodload can find .so files"
);
assert!(
!DL_EXT.starts_with('.'),
"DL_EXT = {:?} starts with `.` — concatenation would produce `..so`",
DL_EXT
);
assert!(
matches!(DL_EXT, "so" | "dylib" | "bundle"),
"DL_EXT = {:?} — unexpected dynamic-library extension",
DL_EXT
);
}
#[test]
fn dynamic_module_loading_is_enabled() {
let _g = crate::test_util::global_state_lock();
assert_eq!(DYNAMIC, 1, "DYNAMIC=0 disables zmodload entirely");
assert_eq!(
DYNAMIC_NAME_CLASH_OK, 1,
"DYNAMIC_NAME_CLASH_OK=0 forbids the same fn name across modules"
);
}
#[test]
fn core_have_sentinels_match_runtime_capabilities() {
let _g = crate::test_util::global_state_lock();
assert_eq!(
HAVE_CLOCK_GETTIME, 1,
"$EPOCHREALTIME relies on clock_gettime"
);
assert_eq!(HAVE_ALLOCA, 1);
assert_eq!(HAVE_ALLOCA_H, 1);
assert_eq!(HAVE_BRK, 1);
assert_eq!(HAVE_BRK_PROTO, 1);
}
#[test]
fn cache_usernames_is_enabled_for_tilde_expansion_perf() {
let _g = crate::test_util::global_state_lock();
assert_eq!(
CACHE_USERNAMES, 1,
"CACHE_USERNAMES drives ~user lookup table; 0 means fork-per-lookup"
);
}
#[test]
fn broken_isprint_workaround_is_active() {
let _g = crate::test_util::global_state_lock();
assert_eq!(BROKEN_ISPRINT, 1);
}
#[test]
fn default_fcedit_resolves_to_a_present_editor_command() {
let _g = crate::test_util::global_state_lock();
assert!(
matches!(DEFAULT_FCEDIT, "vi" | "ed"),
"DEFAULT_FCEDIT = {:?} — must be a POSIX-installed editor",
DEFAULT_FCEDIT
);
assert!(
!DEFAULT_FCEDIT.contains('/'),
"DEFAULT_FCEDIT must be PATH-resolved, not a fixed path"
);
}
#[test]
fn default_tmpprefix_is_absolute_under_tmp() {
let _g = crate::test_util::global_state_lock();
assert!(
DEFAULT_TMPPREFIX.starts_with("/tmp/"),
"DEFAULT_TMPPREFIX = {:?} must live under /tmp so it inherits sticky-bit",
DEFAULT_TMPPREFIX
);
}
#[test]
fn default_readnullcmd_matches_upstream() {
let _g = crate::test_util::global_state_lock();
assert_eq!(
DEFAULT_READNULLCMD, "more",
"config.h:85 — DEFAULT_READNULLCMD must remain `more` to match zsh"
);
}
#[test]
fn passwd_map_is_canonical_nis_name() {
let _g = crate::test_util::global_state_lock();
assert_eq!(PASSWD_MAP, "passwd.byname");
}
#[test]
fn config_locale_is_enabled() {
let _g = crate::test_util::global_state_lock();
assert_eq!(
CONFIG_LOCALE, 1,
"CONFIG_LOCALE=0 silently disables every locale-aware code path"
);
}
#[test]
fn getcwd_and_getpgrp_use_modern_signatures() {
let _g = crate::test_util::global_state_lock();
assert_eq!(
GETCWD_CALLS_MALLOC, 1,
"GETCWD_CALLS_MALLOC=0 means we'd pass a buffer — POSIX requires the NULL-arg form"
);
assert_eq!(
GETPGRP_VOID, 1,
"GETPGRP_VOID=0 means getpgrp(pid) — only ancient SysV uses that form"
);
}
#[test]
fn config_h_corpus_passwd_file_default_path() {
assert_eq!(PASSWD_FILE, "/etc/passwd");
}
#[test]
fn config_h_corpus_default_fcedit_is_vi() {
assert_eq!(DEFAULT_FCEDIT, "vi");
}
#[test]
fn config_h_corpus_default_tmpprefix_starts_with_tmp() {
assert!(
DEFAULT_TMPPREFIX.starts_with("/tmp/"),
"tmp prefix in /tmp/ namespace, got {DEFAULT_TMPPREFIX:?}"
);
}
#[test]
fn config_h_corpus_default_path_has_usr_bin_and_bin() {
assert!(DEFAULT_PATH.contains("/usr/bin"));
assert!(DEFAULT_PATH.contains("/bin"));
}
#[test]
fn config_h_corpus_default_readnullcmd_is_more() {
assert_eq!(DEFAULT_READNULLCMD, "more");
}
#[test]
fn config_h_corpus_dl_ext_is_known() {
assert!(
DL_EXT == "so" || DL_EXT == "dylib" || DL_EXT == "dll",
"DL_EXT must be a known shlib ext, got {DL_EXT:?}"
);
}
#[test]
fn config_h_corpus_cache_usernames_enabled() {
assert_eq!(CACHE_USERNAMES, 1);
}
#[test]
fn config_h_corpus_job_control_enabled() {
assert_eq!(JOB_CONTROL, 1);
}
#[test]
fn config_h_corpus_default_histsize_positive() {
assert!(
DEFAULT_HISTSIZE > 0,
"histsize must be positive, got {DEFAULT_HISTSIZE}"
);
}
#[test]
fn passwd_file_is_etc_passwd() {
assert_eq!(PASSWD_FILE, "/etc/passwd");
}
#[test]
fn default_fcedit_is_vi() {
assert_eq!(DEFAULT_FCEDIT, "vi");
}
#[test]
fn default_tmpprefix_under_tmp() {
assert!(
DEFAULT_TMPPREFIX.starts_with("/tmp"),
"got {:?}",
DEFAULT_TMPPREFIX
);
}
#[test]
fn default_readnullcmd_non_empty() {
assert!(!DEFAULT_READNULLCMD.is_empty());
}
#[test]
fn global_z_files_are_under_etc() {
for p in [
GLOBAL_ZLOGIN,
GLOBAL_ZLOGOUT,
GLOBAL_ZPROFILE,
GLOBAL_ZSHENV,
GLOBAL_ZSHRC,
] {
assert!(p.starts_with("/etc/"), "{:?} must be under /etc", p);
}
}
#[test]
fn global_z_files_pairwise_distinct() {
let paths = [
GLOBAL_ZLOGIN,
GLOBAL_ZLOGOUT,
GLOBAL_ZPROFILE,
GLOBAL_ZSHENV,
GLOBAL_ZSHRC,
];
let unique: std::collections::HashSet<_> = paths.iter().copied().collect();
assert_eq!(unique.len(), paths.len(), "must be distinct");
}
#[test]
fn have_flags_are_zero_or_one() {
for f in [HAVE_ALLOCA, HAVE_ALLOCA_H, HAVE_ARC4RANDOM_BUF] {
assert!(f == 0 || f == 1, "HAVE_* must be 0 or 1, got {}", f);
}
}
#[test]
fn dynamic_enabled() {
assert_eq!(DYNAMIC, 1);
}
#[test]
fn use_suspended_enabled() {
assert_eq!(USE_SUSPENDED, 1);
}
#[test]
fn default_histsize_is_thirty() {
assert_eq!(DEFAULT_HISTSIZE, 30, "upstream zsh default");
}
#[test]
fn default_histsize_positive() {
assert!(DEFAULT_HISTSIZE > 0, "history size must be > 0");
}
#[test]
fn passwd_file_absolute_path() {
assert!(PASSWD_FILE.starts_with('/'), "PASSWD_FILE must be absolute");
}
#[test]
fn passwd_map_dotted_nis_name() {
assert!(
PASSWD_MAP.contains('.'),
"NIS map names use dot: passwd.byname"
);
}
#[test]
fn dl_ext_short_ascii() {
assert!(DL_EXT.is_ascii(), "DL_EXT must be ASCII");
assert!(!DL_EXT.is_empty(), "DL_EXT must be non-empty");
assert!(DL_EXT.len() <= 5, "DL_EXT must be a short ext stem");
}
#[test]
fn dl_ext_has_no_dots() {
assert!(!DL_EXT.contains('.'), "DL_EXT stem must not contain dots");
}
#[test]
fn all_global_z_paths_under_etc() {
for path in &[
GLOBAL_ZLOGIN,
GLOBAL_ZLOGOUT,
GLOBAL_ZPROFILE,
GLOBAL_ZSHENV,
GLOBAL_ZSHRC,
] {
assert!(
path.starts_with("/etc/"),
"GLOBAL_Z* path must start with /etc/, got {:?}",
path
);
}
}
#[test]
fn default_path_has_multiple_entries() {
let entries: Vec<&str> = DEFAULT_PATH.split(':').collect();
assert!(
entries.len() >= 2,
"DEFAULT_PATH must have ≥ 2 entries, got {:?}",
entries
);
}
#[test]
fn default_path_entries_all_absolute() {
for entry in DEFAULT_PATH.split(':') {
assert!(
entry.starts_with('/'),
"DEFAULT_PATH entry must be absolute: {:?}",
entry
);
}
}
#[test]
fn default_tmpprefix_no_trailing_slash() {
assert!(
!DEFAULT_TMPPREFIX.ends_with('/'),
"DEFAULT_TMPPREFIX is a prefix; trailing slash would be wrong"
);
}
#[test]
fn all_path_strings_non_empty() {
for s in &[
PASSWD_FILE,
DEFAULT_PATH,
DEFAULT_TMPPREFIX,
DEFAULT_FCEDIT,
DEFAULT_READNULLCMD,
DL_EXT,
GLOBAL_ZLOGIN,
GLOBAL_ZLOGOUT,
GLOBAL_ZPROFILE,
GLOBAL_ZSHENV,
GLOBAL_ZSHRC,
] {
assert!(
!s.is_empty(),
"config path string must not be empty: {:?}",
s
);
}
}
#[test]
fn boolean_flags_all_zero_or_one() {
for &v in &[
CACHE_USERNAMES,
JOB_CONTROL,
USE_SUSPENDED,
BROKEN_ISPRINT,
CONFIG_LOCALE,
DYNAMIC,
DYNAMIC_NAME_CLASH_OK,
GETCWD_CALLS_MALLOC,
GETPGRP_VOID,
] {
assert!(v == 0 || v == 1, "flag must be 0/1, got {}", v);
}
}
#[test]
fn config_path_strings_are_ascii() {
for s in &[
PASSWD_FILE,
PASSWD_MAP,
DEFAULT_PATH,
DEFAULT_TMPPREFIX,
DEFAULT_FCEDIT,
DEFAULT_READNULLCMD,
DL_EXT,
GLOBAL_ZLOGIN,
GLOBAL_ZLOGOUT,
GLOBAL_ZPROFILE,
GLOBAL_ZSHENV,
GLOBAL_ZSHRC,
] {
assert!(s.is_ascii(), "config string must be ASCII: {:?}", s);
}
}
#[test]
fn long_is_64_bit_enabled() {
assert_eq!(LONG_IS_64_BIT, 1, "modern targets use 64-bit long");
}
#[test]
fn max_function_depth_is_500() {
assert_eq!(MAX_FUNCTION_DEPTH, 500, "zsh canonical recursion limit");
}
#[test]
fn multibyte_support_enabled() {
assert_eq!(MULTIBYTE_SUPPORT, 1, "UTF-8 must be enabled");
}
#[test]
fn posix_signals_enabled() {
assert_eq!(POSIX_SIGNALS, 1, "POSIX signal API mandatory");
}
#[test]
fn machtype_non_empty_ascii() {
assert!(!MACHTYPE.is_empty(), "MACHTYPE must be non-empty");
assert!(MACHTYPE.is_ascii(), "MACHTYPE must be ASCII");
}
#[test]
fn ostype_non_empty_ascii() {
assert!(!OSTYPE.is_empty(), "OSTYPE must be non-empty");
assert!(OSTYPE.is_ascii(), "OSTYPE must be ASCII");
}
#[test]
fn vendor_non_empty_ascii() {
assert!(!VENDOR.is_empty(), "VENDOR must be non-empty");
assert!(VENDOR.is_ascii(), "VENDOR must be ASCII");
}
#[test]
fn path_dev_fd_is_canonical() {
assert_eq!(
PATH_DEV_FD, "/dev/fd",
"canonical fd filesystem path per POSIX"
);
}
#[test]
fn path_utmpx_file_absolute() {
assert!(
PATH_UTMPX_FILE.starts_with('/'),
"PATH_UTMPX_FILE must be absolute"
);
}
#[test]
fn machtype_ostype_vendor_no_whitespace() {
for s in &[MACHTYPE, OSTYPE, VENDOR] {
assert!(
!s.chars().any(|c| c.is_whitespace()),
"config target string must not contain whitespace: {:?}",
s
);
}
}
#[test]
fn package_fields_are_ascii_strings() {
for s in &[
PACKAGE_BUGREPORT,
PACKAGE_NAME,
PACKAGE_STRING,
PACKAGE_TARNAME,
PACKAGE_URL,
PACKAGE_VERSION,
] {
assert!(s.is_ascii(), "PACKAGE_* must be ASCII: {:?}", s);
}
}
#[test]
fn passwd_file_is_absolute_path() {
assert!(
PASSWD_FILE.starts_with('/'),
"PASSWD_FILE must be absolute, got {:?}",
PASSWD_FILE
);
}
#[test]
fn passwd_file_is_canonical_etc_passwd() {
assert_eq!(
PASSWD_FILE, "/etc/passwd",
"PASSWD_FILE must be the POSIX canonical /etc/passwd"
);
}
#[test]
fn default_histsize_is_positive() {
assert!(
DEFAULT_HISTSIZE > 0,
"DEFAULT_HISTSIZE must be positive, got {}",
DEFAULT_HISTSIZE
);
}
#[test]
fn default_fcedit_is_non_empty_ascii() {
assert!(!DEFAULT_FCEDIT.is_empty());
assert!(DEFAULT_FCEDIT.is_ascii());
}
#[test]
fn default_tmpprefix_is_absolute() {
assert!(
DEFAULT_TMPPREFIX.starts_with('/'),
"DEFAULT_TMPPREFIX must be absolute path"
);
}
#[test]
fn default_path_contains_usr_bin() {
assert!(
DEFAULT_PATH.contains("/usr/bin"),
"DEFAULT_PATH must contain /usr/bin; got {:?}",
DEFAULT_PATH
);
}
#[test]
fn default_path_uses_colon_separator() {
assert!(
DEFAULT_PATH.contains(':'),
"DEFAULT_PATH must use ':' separator"
);
}
#[test]
fn default_readnullcmd_is_non_empty() {
assert!(!DEFAULT_READNULLCMD.is_empty());
}
#[test]
fn dl_ext_is_non_empty_ascii() {
assert!(
!DL_EXT.is_empty(),
"DL_EXT must be non-empty (e.g. 'so'/'dylib')"
);
assert!(DL_EXT.is_ascii());
}
#[test]
fn max_function_depth_is_at_least_100() {
assert!(
MAX_FUNCTION_DEPTH >= 100,
"MAX_FUNCTION_DEPTH must be ≥ 100 to support real scripts"
);
}
#[test]
fn job_control_and_use_suspended_enabled() {
assert_eq!(JOB_CONTROL, 1, "JOB_CONTROL required for shell");
assert_eq!(USE_SUSPENDED, 1, "USE_SUSPENDED required");
}
#[test]
fn cache_usernames_enabled() {
assert_eq!(
CACHE_USERNAMES, 1,
"CACHE_USERNAMES must be enabled for ~user expansion"
);
}
#[test]
fn passwd_file_is_canonical_unix_path() {
assert_eq!(
PASSWD_FILE, "/etc/passwd",
"PASSWD_FILE must be /etc/passwd"
);
}
#[test]
fn default_fcedit_non_empty() {
assert!(
!DEFAULT_FCEDIT.is_empty(),
"DEFAULT_FCEDIT must have a value"
);
}
#[test]
fn default_tmpprefix_starts_with_tmp() {
assert!(
DEFAULT_TMPPREFIX.starts_with("/tmp"),
"DEFAULT_TMPPREFIX must be under /tmp, got {:?}",
DEFAULT_TMPPREFIX
);
}
#[test]
fn default_path_contains_usr_bin_and_bin() {
assert!(
DEFAULT_PATH.contains("/usr/bin"),
"DEFAULT_PATH must contain /usr/bin"
);
assert!(
DEFAULT_PATH.contains("/bin"),
"DEFAULT_PATH must contain /bin"
);
}
#[test]
fn default_path_uses_colon_separator_alt() {
assert!(
DEFAULT_PATH.contains(':'),
"DEFAULT_PATH must use ':' separator"
);
}
#[test]
fn default_histsize_is_positive_alt() {
assert!(
DEFAULT_HISTSIZE > 0,
"DEFAULT_HISTSIZE must be > 0, got {}",
DEFAULT_HISTSIZE
);
}
#[test]
fn global_z_files_under_etc() {
for (name, val) in [
("GLOBAL_ZLOGIN", GLOBAL_ZLOGIN),
("GLOBAL_ZLOGOUT", GLOBAL_ZLOGOUT),
("GLOBAL_ZPROFILE", GLOBAL_ZPROFILE),
("GLOBAL_ZSHENV", GLOBAL_ZSHENV),
("GLOBAL_ZSHRC", GLOBAL_ZSHRC),
] {
assert!(
val.starts_with("/etc/"),
"{} must be under /etc/, got {:?}",
name,
val
);
}
}
#[test]
fn global_z_files_non_empty() {
for (name, val) in [
("GLOBAL_ZLOGIN", GLOBAL_ZLOGIN),
("GLOBAL_ZLOGOUT", GLOBAL_ZLOGOUT),
("GLOBAL_ZPROFILE", GLOBAL_ZPROFILE),
("GLOBAL_ZSHENV", GLOBAL_ZSHENV),
("GLOBAL_ZSHRC", GLOBAL_ZSHRC),
] {
assert!(!val.is_empty(), "{} must be non-empty", name);
}
}
#[test]
fn path_dev_fd_is_canonical_alt() {
assert_eq!(
PATH_DEV_FD, "/dev/fd",
"PATH_DEV_FD must be /dev/fd for process substitution"
);
}
#[test]
fn multibyte_support_enabled_alt() {
assert_eq!(
MULTIBYTE_SUPPORT, 1,
"MULTIBYTE_SUPPORT must be on for modern shells"
);
}
#[test]
fn string_consts_all_valid_utf8() {
for s in [
PASSWD_FILE,
PASSWD_MAP,
DEFAULT_FCEDIT,
DEFAULT_TMPPREFIX,
DEFAULT_PATH,
DEFAULT_READNULLCMD,
DL_EXT,
GLOBAL_ZLOGIN,
GLOBAL_ZLOGOUT,
GLOBAL_ZPROFILE,
GLOBAL_ZSHENV,
GLOBAL_ZSHRC,
PATH_DEV_FD,
PATH_UTMPX_FILE,
MACHTYPE,
OSTYPE,
VENDOR,
] {
let _ = std::str::from_utf8(s.as_bytes()).expect("must be UTF-8");
}
}
#[test]
fn dl_ext_is_so_no_leading_dot() {
assert_eq!(DL_EXT, "so", "DL_EXT must be `so` (no leading dot)");
}
#[test]
fn default_fcedit_is_vi_alt() {
assert_eq!(DEFAULT_FCEDIT, "vi", "canonical default fc editor");
}
}