File: cross_process_lock_tests.c

package info (click to toggle)
aws-crt-python 0.28.4%2Bdfsg-1
  • links: PTS, VCS
  • area: main
  • in suites: forky, sid
  • size: 78,428 kB
  • sloc: ansic: 437,955; python: 27,657; makefile: 5,855; sh: 4,289; ruby: 208; java: 82; perl: 73; cpp: 25; xml: 11
file content (116 lines) | stat: -rw-r--r-- 4,922 bytes parent folder | download | duplicates (3)
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
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
/**
 * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.
 * SPDX-License-Identifier: Apache-2.0.
 */
#include <aws/common/cross_process_lock.h>
#include <aws/common/environment.h>
#include <aws/common/process.h>
#include <aws/testing/aws_test_harness.h>

static int s_test_cross_process_lock_works_in_proc(struct aws_allocator *allocator, void *ctx) {
    (void)ctx;
    aws_common_library_init(allocator);

    struct aws_byte_cursor lock_nonce = aws_byte_cursor_from_c_str("lock_nonce");
    struct aws_cross_process_lock *instance_lock = aws_cross_process_lock_try_acquire(allocator, lock_nonce);
    ASSERT_NOT_NULL(instance_lock);

    struct aws_cross_process_lock *should_be_null = aws_cross_process_lock_try_acquire(allocator, lock_nonce);
    ASSERT_NULL(should_be_null);

    aws_cross_process_lock_release(instance_lock);
    struct aws_cross_process_lock *should_not_be_null = aws_cross_process_lock_try_acquire(allocator, lock_nonce);
    ASSERT_NOT_NULL(should_not_be_null);
    aws_cross_process_lock_release(should_not_be_null);

    aws_common_library_clean_up();

    return AWS_OP_SUCCESS;
}
AWS_TEST_CASE(test_cross_process_lock_works_in_proc, s_test_cross_process_lock_works_in_proc)

static int s_cross_process_lock_mp_test_runner(struct aws_allocator *allocator, void *ctx) {
    (void)ctx;
    aws_common_library_init(allocator);

    /* so the test runner doesn't actually run the portion of the test we want to test unless we're invoking it as a
     * subprocess. */
    struct aws_string *test_run_gate = aws_string_new_from_c_str(allocator, "aws_crt_test_run_gate");
    struct aws_string *output_val = NULL;
    if (aws_get_environment_value(allocator, test_run_gate, &output_val) == AWS_OP_SUCCESS && output_val) {
        aws_string_destroy(output_val);
        struct aws_byte_cursor lock_nonce = aws_byte_cursor_from_c_str("lock_mp_nonce");
        struct aws_cross_process_lock *instance_lock = aws_cross_process_lock_try_acquire(allocator, lock_nonce);
        ASSERT_NOT_NULL(instance_lock);

        aws_cross_process_lock_release(instance_lock);
    }
    aws_string_destroy(test_run_gate);
    aws_common_library_clean_up();

    return AWS_OP_SUCCESS;
}
AWS_TEST_CASE(cross_process_lock_mp_test_runner, s_cross_process_lock_mp_test_runner)

static int s_test_cross_process_lock_works_cross_proc(struct aws_allocator *allocator, void *ctx) {
    (void)ctx;
    aws_common_library_init(allocator);

    struct aws_string *test_run_gate = aws_string_new_from_c_str(allocator, "aws_crt_test_run_gate");
    struct aws_string *test_run_gate_val = aws_string_new_from_c_str(allocator, "ON");

    /* so the test runner doesn't actually run the portion of the test we want to test unless we're invoking it from
     * here. */
    ASSERT_SUCCESS(aws_set_environment_value(test_run_gate, test_run_gate_val));
    aws_string_destroy(test_run_gate_val);
    aws_string_destroy(test_run_gate);

    /* Invoke the test runner in a new process for ease so cmake automatically does the work for us. */
    struct aws_run_command_options command_options = {
#ifdef _WIN32
        .command = "aws-c-common-tests cross_process_lock_mp_test_runner",
#else
        .command = "./aws-c-common-tests cross_process_lock_mp_test_runner",
#endif /* _WIN32 */
    };

    struct aws_run_command_result result;
    AWS_ZERO_STRUCT(result);

    ASSERT_SUCCESS(aws_run_command(allocator, &command_options, &result));
    ASSERT_TRUE(result.ret_code == 0);
    aws_run_command_result_cleanup(&result);
    AWS_ZERO_STRUCT(result);
    struct aws_byte_cursor lock_nonce = aws_byte_cursor_from_c_str("lock_mp_nonce");
    struct aws_cross_process_lock *instance_lock = aws_cross_process_lock_try_acquire(allocator, lock_nonce);
    ASSERT_NOT_NULL(instance_lock);

    ASSERT_SUCCESS(aws_run_command(allocator, &command_options, &result));
    ASSERT_FALSE(result.ret_code == 0);
    aws_run_command_result_cleanup(&result);

    aws_cross_process_lock_release(instance_lock);
    aws_common_library_clean_up();

    return AWS_OP_SUCCESS;
}
AWS_TEST_CASE(test_cross_process_lock_works_cross_proc, s_test_cross_process_lock_works_cross_proc)

static int s_test_cross_process_lock_invalid_nonce(struct aws_allocator *allocator, void *ctx) {
    (void)ctx;
    aws_common_library_init(allocator);
#ifdef _WIN32
    struct aws_byte_cursor lock_nonce = aws_byte_cursor_from_c_str("invalid\\lock_nonce");
#else
    struct aws_byte_cursor lock_nonce = aws_byte_cursor_from_c_str("invalid/lock_nonce");
#endif /* _WIN32 */

    struct aws_cross_process_lock *instance_lock = aws_cross_process_lock_try_acquire(allocator, lock_nonce);
    ASSERT_NULL(instance_lock);
    ASSERT_INT_EQUALS(AWS_ERROR_INVALID_ARGUMENT, aws_last_error());

    aws_common_library_clean_up();

    return AWS_OP_SUCCESS;
}
AWS_TEST_CASE(test_cross_process_lock_invalid_nonce_fails, s_test_cross_process_lock_invalid_nonce)