arpx 0.5.0

Small-scale process orchestration
Documentation
mod common;

use common::TC;

test!(single_job_with_single_task, |t: TC| {
    let (out, err) = t
        .profile(
            r#"
            jobs:
                test: p1;

            processes:
                p1:
                    command: |
                        echo foo
                        sleep 0.1
                        echo bar
                        sleep 0.1
                        echo baz
                        sleep 0.1
        "#,
        )
        .opts("-j test")
        .run()
        .unwrap();

    assert_eq!(vec!["[p1] foo", "[p1] bar", "[p1] baz"], out[1..4]);
    assert_eq!(5, out.len());
    assert_eq!(0, err.len());
});

test!(single_job_with_multiple_tasks, |t: TC| {
    let (out, err) = t
        .profile(
            r#"
            jobs:
                test: |
                    p1;
                    p2;

            processes:
                p1:
                    command: |
                        echo foo
                        sleep 0.1
                p2:
                    command: |
                        echo bar
                        sleep 0.1
                        echo baz
                        sleep 0.1
        "#,
        )
        .opts("-j test")
        .run()
        .unwrap();

    assert_eq!("[p1] foo", out[1]);
    assert_eq!(vec!["[p2] bar", "[p2] baz"], out[4..6]);
    assert_eq!(7, out.len());
    assert_eq!(0, err.len());
});

test!(single_job_with_concurrent_task, |t: TC| {
    let (out, err) = t
        .profile(
            r#"
            jobs:
                test: |
                    [
                        p1;
                        p2;
                    ]

            processes:
                p1:
                    command: |
                        echo foo
                        sleep 0.2
                        echo baz
                p2:
                    command: |
                        sleep 0.1
                        echo bar
                        sleep 0.1
        "#,
        )
        .opts("-j test")
        .run()
        .unwrap();

    assert_btw!("foo", out, 0, 3);
    assert_btw!("bar", out, 2, 4);
    assert_btw!("baz", out, 3, 6);
    assert_eq!(7, out.len());
    assert_eq!(0, err.len());
});

test!(single_job_with_single_and_concurrent_task, |t: TC| {
    let (out, err) = t
        .profile(
            r#"
            jobs:
                test: |
                    p0;
                    [
                        p1;
                        p2;
                    ]

            processes:
                p0:
                    command: |
                        echo qux
                        sleep 0.1
                p1:
                    command: |
                        echo foo
                        sleep 0.2
                        echo baz
                p2:
                    command: |
                        sleep 0.1
                        echo bar
                        sleep 0.1
        "#,
        )
        .opts("-j test")
        .run()
        .unwrap();

    assert_eq!("[p0] qux", out[1]);
    assert_btw!("foo", out, 2, 6);
    assert_btw!("bar", out, 3, 9);
    assert_btw!("baz", out, 6, 9);
    assert_eq!(10, out.len());
    assert_eq!(0, err.len());
});

test!(multiple_jobs, |t: TC| {
    let (out, err) = t
        .profile(
            r#"
            jobs:
                test_1: p1;
                test_2: p2;

            processes:
                p1:
                    command: |
                        echo foo
                        sleep 0.1
                p2:
                    command: |
                        echo bar
                        sleep 0.1
                        echo baz
                        sleep 0.1
        "#,
        )
        .opts("-j test_1 -j test_2")
        .run()
        .unwrap();

    assert_eq!("[p1] foo", out[1]);
    assert_eq!(vec!["[p2] bar", "[p2] baz"], out[4..6]);
    assert_eq!(7, out.len());
    assert_eq!(0, err.len());
});

test!(job_with_onsucceed_process, |t: TC| {
    let (out, err) = t
        .profile(
            r#"
            jobs:
                test: one;

            processes:
                one:
                    command: |
                        echo foo
                        sleep 0.1
                    onsucceed: two
                two:
                    command: |
                        echo bar
                        sleep 0.1
                    onsucceed: three
                three:
                    command: |
                        echo baz
                        sleep 0.1
        "#,
        )
        .opts("-j test")
        .run()
        .unwrap();

    assert_eq!("[one] foo", out[1]);
    assert_btw!("bar", out, 3, 8);
    assert_btw!("baz", out, 5, 8);
    assert_eq!(9, out.len());
    assert_eq!(0, err.len());
});

test!(job_with_onfail_process, |t: TC| {
    let (out, err) = t
        .profile(
            r#"
            jobs:
                test: one;

            processes:
                one:
                    command: |
                        echo foo
                        sleep 0.1
                        exit 1
                    onfail: two
                two:
                    command: |
                        echo bar
                        sleep 0.1
                        exit 1
                    onfail: three
                three:
                    command: |
                        echo baz
                        sleep 0.1
        "#,
        )
        .opts("-j test")
        .run()
        .unwrap();

    assert_eq!("[one] foo", out[1]);
    assert_btw!("bar", out, 3, 8);
    assert_btw!("baz", out, 5, 8);
    assert_eq!(9, out.len());
    assert_eq!(0, err.len());
});

test!(job_with_single_log_monitor, |t: TC| {
    let (out, err) = t
        .profile(
            r#"
            jobs:
                test: p1; @m1

            processes:
                p1:
                    command: |
                        echo foo
                        sleep 0.1
                        echo bar
                        sleep 0.1
                p2:
                    command: |
                        echo baz
                        sleep 0.1
            log_monitors:
                m1:
                    buffer_size: 1
                    test: 'echo "$ARPX_BUFFER" | grep -q "bar"'
                    ontrigger: p2
        "#,
        )
        .opts("-j test")
        .run()
        .unwrap();

    assert_eq!(vec!["[p1] foo", "[p1] bar"], out[1..3]);
    assert_btw!("baz", out, 3, 6);
    assert_eq!(7, out.len());
    assert_eq!(0, err.len());
});

test!(job_with_multiple_log_monitors, |t: TC| {
    let (out, err) = t
        .profile(
            r#"
            jobs:
                test: p1; @m1 @m2

            processes:
                p1:
                    command: |
                        echo foo
                        sleep 0.2
                        echo bar
                        sleep 0.1
                p2:
                    command: |
                        echo baz
                        sleep 0.1
                p3:
                    command: |
                        sleep 0.3
                        echo qux
                        sleep 0.1
            log_monitors:
                m1:
                    buffer_size: 1
                    test: 'echo "$ARPX_BUFFER" | grep -q "foo"'
                    ontrigger: p2
                m2:
                    buffer_size: 1
                    test: 'echo "$ARPX_BUFFER" | grep -q "bar"'
                    ontrigger: p3
        "#,
        )
        .opts("-j test")
        .run()
        .unwrap();

    assert_eq!("[p1] foo", out[1]);
    assert_btw!("baz", out, 2, 6);
    assert_btw!("bar", out, 2, 6);
    assert_btw!("qux", out, 7, 9);
    assert_eq!(10, out.len());
    assert_eq!(0, err.len());
});

test!(job_overrides_process_contingency, |t: TC| {
    let (out, err) = t
        .profile(
            r#"
            jobs:
                test: |
                    p1 ? p2;
                    p3 : p1;

            processes:
                p1:
                    command: |
                        echo foo
                        sleep 0.1
                    onsucceed: p3;
                    onfail: p2;
                p2:
                    command: |
                        echo bar
                        sleep 0.1
                p3:
                    command: |
                        echo baz
                        sleep 0.1
                        exit 1
        "#,
        )
        .opts("-j test")
        .run()
        .unwrap();

    assert_eq!("[p1] foo", out[1]);
    assert_eq!("[p1] bar", out[4]);
    assert_eq!("[p3] baz", out[7]);
    assert_eq!("[p3] foo", out[10]);
    assert_eq!(12, out.len());
    assert_eq!(0, err.len());
});