summaryrefslogtreecommitdiffstats
path: root/extra/git2/tests/global_state.rs
blob: 192acdbd3a3ebaf7c83a4861ae5309e1f967bec5 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
//! Test for some global state set up by libgit2's `git_libgit2_init` function
//! that need to be synchronized within a single process.

use git2::opts;
use git2::{ConfigLevel, IntoCString};

// Test for mutating configuration file search path which is set during
// initialization in libgit2's `git_sysdir_global_init` function.
#[test]
fn search_path() -> Result<(), Box<dyn std::error::Error>> {
    use std::env::join_paths;

    let path = "fake_path";
    let original = unsafe { opts::get_search_path(ConfigLevel::Global) };
    assert_ne!(original, Ok(path.into_c_string()?));

    // Set
    unsafe {
        opts::set_search_path(ConfigLevel::Global, &path)?;
    }
    assert_eq!(
        unsafe { opts::get_search_path(ConfigLevel::Global) },
        Ok(path.into_c_string()?)
    );

    // Append
    let paths = join_paths(["$PATH", path].iter())?;
    let expected_paths = join_paths([path, path].iter())?.into_c_string()?;
    unsafe {
        opts::set_search_path(ConfigLevel::Global, paths)?;
    }
    assert_eq!(
        unsafe { opts::get_search_path(ConfigLevel::Global) },
        Ok(expected_paths)
    );

    // Reset
    unsafe {
        opts::reset_search_path(ConfigLevel::Global)?;
    }
    assert_eq!(
        unsafe { opts::get_search_path(ConfigLevel::Global) },
        original
    );

    Ok(())
}