Codex Handbook
config/src/requirements_layers/stack_tests.rs 1028 lines
use super::super::RequirementsLayerEntry;use super::super::hooks::HookDirectoryField;use super::RequirementsCompositionError;use super::compose_requirements_for_hostname;use super::compose_requirements_for_hostname_and_hook_directory;use super::compose_requirements_with_hostname_resolver;use crate::ConfigRequirementsToml;use crate::ConfigRequirementsWithSources;use crate::RequirementSource;use crate::Sourced;use codex_protocol::protocol::AskForApproval;use codex_utils_absolute_path::AbsolutePathBuf;use pretty_assertions::assert_eq;use std::cell::Cell;use std::collections::BTreeMap;fn layer(id: &str, name: &str, contents: &str) -> RequirementsLayerEntry {    RequirementsLayerEntry::from_toml(        RequirementSource::EnterpriseManaged {            id: id.to_string(),            name: name.to_string(),        },        contents,    )}fn compose(    layers: Vec<RequirementsLayerEntry>,) -> Result<Option<ConfigRequirementsToml>, RequirementsCompositionError> {    Ok(        compose_requirements_for_hostname(layers, /*hostname*/ None)?            .map(ConfigRequirementsWithSources::into_toml),    )}fn compose_with_hook_directory_field(    layers: Vec<RequirementsLayerEntry>,    hook_directory_field: HookDirectoryField,) -> Result<Option<ConfigRequirementsToml>, RequirementsCompositionError> {    Ok(compose_requirements_for_hostname_and_hook_directory(        layers,        /*hostname*/ None,        hook_directory_field,    )?    .map(ConfigRequirementsWithSources::into_toml))}fn expected_requirements(contents: impl AsRef<str>) -> ConfigRequirementsToml {    toml::from_str(contents.as_ref()).expect("parse expected requirements TOML")}#[test]fn empty_layers_compose_to_none() {    let composed = compose(Vec::new()).expect("compose empty layers");    assert_eq!(composed, None);}#[test]fn top_level_values_use_toml_priority() {    let composed = compose(vec![        layer(            "req_low",            "Low",            r#"allowed_approval_policies = ["on-request"]allowed_sandbox_modes = ["workspace-write"]default_permissions = ":workspace"allow_remote_control = true[allowed_permission_profiles]":read-only" = true":workspace" = true"#,        ),        layer(            "req_high",            "High",            r#"allowed_approval_policies = ["never"]allowed_sandbox_modes = ["read-only"]default_permissions = ":read-only"allow_remote_control = false[allowed_permission_profiles]":danger-full-access" = false":workspace" = false"#,        ),    ])    .expect("compose requirements")    .expect("requirements present");    assert_eq!(        composed,        expected_requirements(            r#"allowed_approval_policies = ["never"]allowed_sandbox_modes = ["read-only"]default_permissions = ":read-only"allow_remote_control = false[allowed_permission_profiles]":danger-full-access" = false":read-only" = true":workspace" = false"#        )    );}#[test]fn composition_strategy_applies_to_non_cloud_layers() {    let mdm_source = RequirementSource::MdmManagedPreferences {        domain: "com.openai.codex".to_string(),        key: "requirements_toml_base64".to_string(),    };    let system_file = if cfg!(windows) {        "C:\\requirements.toml"    } else {        "/etc/codex/requirements.toml"    };    let system_source = RequirementSource::SystemRequirementsToml {        file: AbsolutePathBuf::from_absolute_path(system_file).expect("absolute path"),    };    let high_path = if cfg!(windows) {        "C:\\secret"    } else {        "/secret"    };    let low_path = if cfg!(windows) {        "C:\\other-secret"    } else {        "/other-secret"    };    let composed = compose_requirements_for_hostname(        vec![            RequirementsLayerEntry::from_toml(                system_source,                format!(                    r#"allowed_approval_policies = ["on-request"]allow_remote_control = true[features]shared = falsesystem = true[[rules.prefix_rules]]pattern = [{{ token = "npm" }}]decision = "prompt"[permissions.filesystem]deny_read = [{low_path:?}]"#                ),            ),            RequirementsLayerEntry::from_toml(                mdm_source.clone(),                format!(                    r#"allowed_approval_policies = ["never"]allow_remote_control = false[features]shared = true[[rules.prefix_rules]]pattern = [{{ token = "git" }}]decision = "forbidden"[permissions.filesystem]deny_read = [{high_path:?}]"#                ),            ),        ],        /*hostname*/ None,    )    .expect("compose requirements")    .expect("requirements present");    assert_eq!(        composed.clone().into_toml(),        expected_requirements(format!(            r#"allowed_approval_policies = ["never"]allow_remote_control = false[features]shared = truesystem = true[[rules.prefix_rules]]pattern = [{{ token = "git" }}]decision = "forbidden"[[rules.prefix_rules]]pattern = [{{ token = "npm" }}]decision = "prompt"[permissions.filesystem]deny_read = [{high_path:?}, {low_path:?}]"#        ))    );    assert_eq!(        composed.allowed_approval_policies,        Some(Sourced::new(            vec![AskForApproval::Never],            mdm_source.clone()        ))    );    assert_eq!(        composed.allow_remote_control,        Some(Sourced::new(/*value*/ false, mdm_source))    );}#[test]fn single_regular_layer_keeps_enterprise_managed_source() {    let composed = compose_requirements_for_hostname(        vec![layer(            "req_1",            "Security baseline",            r#"allow_managed_hooks_only = true"#,        )],        /*hostname*/ None,    )    .expect("compose requirements")    .expect("requirements present");    assert_eq!(        composed.allow_managed_hooks_only,        Some(Sourced::new(            /*value*/ true,            RequirementSource::EnterpriseManaged {                id: "req_1".to_string(),                name: "Security baseline".to_string(),            },        ))    );}#[test]fn regular_toml_merge_recurses_into_tables() {    let composed = compose(vec![        layer(            "req_low",            "Low",            r#"[features]beta = falseshared = false[apps.connector_1]enabled = false[apps.connector_1.tools.search]approval_mode = "prompt"[apps.connector_1.tools.list]approval_mode = "prompt""#,        ),        layer(            "req_high",            "High",            r#"[features]alpha = trueshared = true[apps.connector_1]enabled = true[apps.connector_1.tools.search]approval_mode = "approve""#,        ),    ])    .expect("compose requirements")    .expect("requirements present");    assert_eq!(        composed,        expected_requirements(            r#"[features]alpha = truebeta = falseshared = true[apps.connector_1]enabled = true[apps.connector_1.tools.list]approval_mode = "prompt"[apps.connector_1.tools.search]approval_mode = "approve""#        )    );}#[test]fn merged_table_source_is_composite_in_priority_order() {    let high_source = RequirementSource::EnterpriseManaged {        id: "req_high".to_string(),        name: "High".to_string(),    };    let low_source = RequirementSource::EnterpriseManaged {        id: "req_low".to_string(),        name: "Low".to_string(),    };    let composed = compose_requirements_for_hostname(        vec![            RequirementsLayerEntry::from_toml(                low_source.clone(),                r#"[features]beta = true"#,            ),            RequirementsLayerEntry::from_toml(                high_source.clone(),                r#"[features]alpha = true"#,            ),        ],        /*hostname*/ None,    )    .expect("compose requirements")    .expect("requirements present");    assert_eq!(        composed.feature_requirements.expect("features"),        Sourced::new(            crate::FeatureRequirementsToml {                entries: BTreeMap::from([("alpha".to_string(), true), ("beta".to_string(), true),]),            },            RequirementSource::composite([high_source, low_source]),        )    );}#[test]fn mcp_requirements_use_regular_toml_merge() {    let composed = compose(vec![        layer(            "req_low",            "Low",            r#"[mcp_servers.shared.identity]command = "low-mcp"[mcp_servers.low.identity]url = "https://low.example.com/mcp""#,        ),        layer(            "req_high",            "High",            r#"[mcp_servers.shared.identity]command = "high-mcp""#,        ),    ])    .expect("compose requirements")    .expect("requirements present");    assert_eq!(        composed,        expected_requirements(            r#"[mcp_servers.low.identity]url = "https://low.example.com/mcp"[mcp_servers.shared.identity]command = "high-mcp""#        )    );}#[test]fn network_maps_use_regular_toml_merge() {    let composed = compose(vec![        layer(            "req_low",            "Low",            r#"[experimental_network.domains]"example.com" = "deny""low.example.com" = "deny""internal.example.com" = "allow"[experimental_network.unix_sockets]"/tmp/shared.sock" = "deny""/tmp/low.sock" = "allow""/tmp/admin.sock" = "allow""#,        ),        layer(            "req_high",            "High",            r#"[experimental_network.domains]"example.com" = "allow""high.example.com" = "allow""internal.example.com" = "deny"[experimental_network.unix_sockets]"/tmp/shared.sock" = "allow""/tmp/high.sock" = "allow""/tmp/admin.sock" = "deny""#,        ),    ])    .expect("compose requirements")    .expect("requirements present");    assert_eq!(        composed,        expected_requirements(            r#"[experimental_network.domains]"example.com" = "allow""high.example.com" = "allow""internal.example.com" = "deny""low.example.com" = "deny"[experimental_network.unix_sockets]"/tmp/admin.sock" = "deny""/tmp/high.sock" = "allow""/tmp/low.sock" = "allow""/tmp/shared.sock" = "allow""#        )    );}#[test]fn windows_requirements_use_regular_toml_merge() {    let composed = compose(vec![        layer(            "req_low",            "Low",            r#"[windows]allowed_sandbox_implementations = ["unelevated"]"#,        ),        layer(            "req_high",            "High",            r#"[windows]allowed_sandbox_implementations = ["elevated"]"#,        ),    ])    .expect("compose requirements")    .expect("requirements present");    assert_eq!(        composed,        expected_requirements(            r#"[windows]allowed_sandbox_implementations = ["elevated"]"#        )    );}#[test]fn remote_sandbox_config_is_applied_per_layer() {    let composed = compose_requirements_for_hostname(        vec![            layer(                "req_low",                "Low",                r#"allowed_sandbox_modes = ["read-only"]"#,            ),            layer(                "req_high",                "High",                r#"[[remote_sandbox_config]]hostname_patterns = ["build-*.example.com"]allowed_sandbox_modes = ["workspace-write"]"#,            ),        ],        Some("BUILD-01.EXAMPLE.COM."),    )    .expect("compose requirements")    .expect("requirements present")    .into_toml();    assert_eq!(        composed,        expected_requirements(            r#"allowed_sandbox_modes = ["workspace-write"]"#        )    );}#[test]fn unmatched_remote_sandbox_config_does_not_shadow_lower_layers() {    let composed = compose_requirements_for_hostname(        vec![            layer(                "req_low",                "Low",                r#"allowed_sandbox_modes = ["read-only"]"#,            ),            layer(                "req_high",                "High",                r#"[[remote_sandbox_config]]hostname_patterns = ["mac-*.example.com"]allowed_sandbox_modes = ["workspace-write"]"#,            ),        ],        Some("linux-01.example.com"),    )    .expect("compose requirements")    .expect("requirements present")    .into_toml();    assert_eq!(        composed,        expected_requirements(            r#"allowed_sandbox_modes = ["read-only"]"#        )    );}#[test]fn hostname_resolver_is_not_called_without_remote_sandbox_config() {    let calls = Cell::<usize>::default();    let composed = compose_requirements_with_hostname_resolver(        vec![layer(            "req",            "No remote selector",            r#"allowed_sandbox_modes = ["read-only"]"#,        )],        || {            calls.set(calls.get() + 1);            Some("build-01.example.com".to_string())        },    )    .expect("compose requirements")    .expect("requirements present")    .into_toml();    assert_eq!(calls.get(), 0);    assert_eq!(        composed,        expected_requirements(            r#"allowed_sandbox_modes = ["read-only"]"#        )    );}#[test]fn hostname_resolver_is_called_once_for_multiple_remote_sandbox_layers() {    let calls = Cell::<usize>::default();    let composed = compose_requirements_with_hostname_resolver(        vec![            layer(                "req_low",                "Low",                r#"[[remote_sandbox_config]]hostname_patterns = ["build-*.example.com"]allowed_sandbox_modes = ["read-only"]"#,            ),            layer(                "req_high",                "High",                r#"[[remote_sandbox_config]]hostname_patterns = ["build-*.example.com"]allowed_sandbox_modes = ["workspace-write"]"#,            ),        ],        || {            calls.set(calls.get() + 1);            Some("build-01.example.com".to_string())        },    )    .expect("compose requirements")    .expect("requirements present")    .into_toml();    assert_eq!(calls.get(), 1);    assert_eq!(        composed,        expected_requirements(            r#"allowed_sandbox_modes = ["workspace-write"]"#        )    );}#[test]fn rules_are_appended_in_priority_order() {    let composed = compose(vec![        layer(            "req_low",            "Low",            r#"[[rules.prefix_rules]]pattern = [{ token = "npm" }]decision = "prompt""#,        ),        layer(            "req_high",            "High",            r#"[[rules.prefix_rules]]pattern = [{ token = "git" }]decision = "forbidden""#,        ),    ])    .expect("compose requirements")    .expect("requirements present");    assert_eq!(        composed,        expected_requirements(            r#"[[rules.prefix_rules]]pattern = [{ token = "git" }]decision = "forbidden"[[rules.prefix_rules]]pattern = [{ token = "npm" }]decision = "prompt""#        )    );}#[test]fn hooks_append_groups_and_reject_conflicting_managed_dirs() {    let composed = compose_with_hook_directory_field(        vec![            layer(                "req_low",                "Low",                r#"[hooks]managed_dir = "/managed/hooks"[[hooks.PreToolUse]]matcher = "Bash"[[hooks.PreToolUse.hooks]]type = "command"command = "low""#,            ),            layer(                "req_high",                "High",                r#"[hooks]managed_dir = "/managed/hooks"[[hooks.PreToolUse]]matcher = "Edit"[[hooks.PreToolUse.hooks]]type = "command"command = "high""#,            ),        ],        HookDirectoryField::ManagedDir,    )    .expect("compose requirements")    .expect("requirements present");    assert_eq!(        composed,        expected_requirements(            r#"[hooks]managed_dir = "/managed/hooks"[[hooks.PreToolUse]]matcher = "Edit"[[hooks.PreToolUse.hooks]]type = "command"command = "high"[[hooks.PreToolUse]]matcher = "Bash"[[hooks.PreToolUse.hooks]]type = "command"command = "low""#        )    );    let err = compose_with_hook_directory_field(        vec![            layer(                "req_low",                "Low",                r#"[hooks]managed_dir = "/managed/low""#,            ),            layer(                "req_high",                "High",                r#"[hooks]managed_dir = "/managed/high""#,            ),        ],        HookDirectoryField::ManagedDir,    )    .expect_err("conflicting managed dirs should fail closed");    assert!(err.to_string().contains("hooks.managed_dir"));    assert!(err.to_string().contains("High (req_high)"));    assert!(err.to_string().contains("Low (req_low)"));}#[test]fn active_windows_managed_dir_conflicts_fail_closed() {    let err = compose_with_hook_directory_field(        vec![            layer(                "req_low",                "Low",                r#"[hooks]windows_managed_dir = 'C:\managed\low'"#,            ),            layer(                "req_high",                "High",                r#"[hooks]windows_managed_dir = 'C:\managed\high'"#,            ),        ],        HookDirectoryField::WindowsManagedDir,    )    .expect_err("conflicting windows managed dirs should fail closed");    assert!(err.to_string().contains("hooks.windows_managed_dir"));    assert!(err.to_string().contains("High (req_high)"));    assert!(err.to_string().contains("Low (req_low)"));}#[test]fn inactive_hook_dir_conflicts_do_not_fail_composition() {    let composed = compose_with_hook_directory_field(        vec![            layer(                "req_low",                "Low",                r#"[hooks]managed_dir = "/managed/hooks"windows_managed_dir = 'C:\managed\low'[[hooks.PreToolUse]]matcher = "Bash"[[hooks.PreToolUse.hooks]]type = "command"command = "low""#,            ),            layer(                "req_high",                "High",                r#"[hooks]managed_dir = "/managed/hooks"windows_managed_dir = 'C:\managed\high'[[hooks.PreToolUse]]matcher = "Edit"[[hooks.PreToolUse.hooks]]type = "command"command = "high""#,            ),        ],        HookDirectoryField::ManagedDir,    )    .expect("inactive windows managed dir conflict should not fail")    .expect("requirements present");    assert_eq!(        composed,        expected_requirements(            r#"[hooks]managed_dir = "/managed/hooks"windows_managed_dir = 'C:\managed\high'[[hooks.PreToolUse]]matcher = "Edit"[[hooks.PreToolUse.hooks]]type = "command"command = "high"[[hooks.PreToolUse]]matcher = "Bash"[[hooks.PreToolUse.hooks]]type = "command"command = "low""#        )    );    let composed = compose_with_hook_directory_field(        vec![            layer(                "req_low",                "Low",                r#"[hooks]managed_dir = "/managed/low"windows_managed_dir = 'C:\managed\hooks'[[hooks.PreToolUse]]matcher = "Bash"[[hooks.PreToolUse.hooks]]type = "command"command = "low""#,            ),            layer(                "req_high",                "High",                r#"[hooks]managed_dir = "/managed/high"windows_managed_dir = 'C:\managed\hooks'[[hooks.PreToolUse]]matcher = "Edit"[[hooks.PreToolUse.hooks]]type = "command"command = "high""#,            ),        ],        HookDirectoryField::WindowsManagedDir,    )    .expect("inactive managed dir conflict should not fail")    .expect("requirements present");    assert_eq!(        composed,        expected_requirements(            r#"[hooks]managed_dir = "/managed/high"windows_managed_dir = 'C:\managed\hooks'[[hooks.PreToolUse]]matcher = "Edit"[[hooks.PreToolUse.hooks]]type = "command"command = "high"[[hooks.PreToolUse]]matcher = "Bash"[[hooks.PreToolUse.hooks]]type = "command"command = "low""#        )    );}#[test]fn permissions_deny_read_unions_while_profiles_use_regular_toml_merge() {    let high_path = if cfg!(windows) {        "C:\\secret"    } else {        "/secret"    };    let low_path = if cfg!(windows) {        "C:\\other-secret"    } else {        "/other-secret"    };    let composed = compose(vec![        layer(            "req_low",            "Low",            &format!(                r#"[permissions.filesystem]deny_read = [{high_path:?}, {low_path:?}][permissions.managed-standard]description = "Low profile"extends = ":workspace""#            ),        ),        layer(            "req_high",            "High",            &format!(                r#"[permissions.filesystem]deny_read = [{high_path:?}][permissions.managed-standard]description = "High profile""#            ),        ),    ])    .expect("compose requirements")    .expect("requirements present");    assert_eq!(        composed,        expected_requirements(format!(            r#"[permissions.filesystem]deny_read = [{high_path:?}, {low_path:?}][permissions.managed-standard]description = "High profile"extends = ":workspace""#        ))    );}#[test]fn deny_read_only_layers_do_not_leave_empty_permissions_tables() {    let path = if cfg!(windows) {        "C:\\secret"    } else {        "/secret"    };    let composed = compose(vec![layer(        "req_high",        "High",        &format!(            r#"[permissions.filesystem]deny_read = [{path:?}]"#        ),    )])    .expect("compose requirements")    .expect("requirements present");    assert_eq!(        composed,        expected_requirements(format!(            r#"[permissions.filesystem]deny_read = [{path:?}]"#        ))    );}#[test]fn parse_error_names_layer() {    let err = compose(vec![layer(        "req_bad",        "Bad layer",        "allowed_approval_policies = [1]",    )])    .expect_err("invalid layer should fail");    assert!(err.to_string().contains("Bad layer (req_bad)"));    assert!(err.to_string().contains("allowed_approval_policies"));}