forked from newrelic/newrelic-php-agent
-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathtest_php_stacked_segment.c
120 lines (96 loc) · 3.33 KB
/
test_php_stacked_segment.c
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
117
118
119
120
/*
* Copyright 2020 New Relic Corporation. All rights reserved.
* SPDX-License-Identifier: Apache-2.0
*/
#include "tlib_php.h"
#include "php_agent.h"
#include "php_call.h"
#include "php_stacked_segment.h"
#include "php_globals.h"
#include "php_wrapper.h"
tlib_parallel_info_t parallel_info
= {.suggested_nthreads = -1, .state_size = 0};
static void test_start_end_discard(TSRMLS_D) {
nr_segment_t stacked = {0};
nr_segment_t* segment;
tlib_php_request_start();
/*
* Initial state: current segment forced to root
*/
tlib_pass_if_ptr_equal("current stacked segment forced to root",
NRTXN(segment_root), NRTXN(force_current_segment));
/*
* Add a stacked segment.
*/
nr_php_stacked_segment_init(&stacked TSRMLS_CC);
tlib_pass_if_ptr_equal("current stacked segment has txn", stacked.txn,
NRPRG(txn));
tlib_pass_if_ptr_equal("current stacked forced to stacked", &stacked,
NRTXN(force_current_segment));
/*
* Discard a stacked segment.
*/
nr_php_stacked_segment_deinit(&stacked TSRMLS_CC);
tlib_pass_if_ptr_equal("current stacked segment forced to root",
NRTXN(segment_root), NRTXN(force_current_segment));
tlib_pass_if_size_t_equal(
"no segment created", 0,
nr_segment_children_size(&NRTXN(segment_root)->children));
/*
* Add another stacked segment.
*/
nr_php_stacked_segment_init(&stacked TSRMLS_CC);
tlib_pass_if_ptr_equal("current stacked segment has txn", stacked.txn,
NRPRG(txn));
tlib_pass_if_ptr_equal("current stacked forced to stacked", &stacked,
NRTXN(force_current_segment));
/*
* End a stacked segment.
*/
segment = nr_php_stacked_segment_move_to_heap(&stacked TSRMLS_CC);
nr_segment_end(&segment);
tlib_pass_if_true("moved segment is different from stacked segment",
segment != &stacked, "%p!=%p", segment, &stacked);
tlib_pass_if_ptr_equal("current stacked segment forced to root",
NRTXN(segment_root), NRTXN(force_current_segment));
tlib_pass_if_size_t_equal(
"no segment created", 1,
nr_segment_children_size(&NRTXN(segment_root)->children));
tlib_php_request_end();
}
static void test_unwind(TSRMLS_D) {
nr_segment_t stacked_1 = {0};
nr_segment_t stacked_2 = {0};
nr_segment_t stacked_3 = {0};
nr_segment_t* segment;
tlib_php_request_start();
/*
* Add stacked segments.
*/
nr_php_stacked_segment_init(&stacked_1 TSRMLS_CC);
nr_php_stacked_segment_init(&stacked_2 TSRMLS_CC);
nr_php_stacked_segment_init(&stacked_3 TSRMLS_CC);
/*
* Add a regular segment.
*/
segment = nr_segment_start(NRPRG(txn), NULL, NULL);
nr_segment_end(&segment);
/*
* Unwind the stacked segment stack.
*/
nr_php_stacked_segment_unwind(TSRMLS_C);
tlib_pass_if_size_t_equal(
"one child segment of root", 1,
nr_segment_children_size(&NRTXN(segment_root)->children));
tlib_pass_if_size_t_equal("4 segments in total ", 4, NRTXN(segment_count));
tlib_php_request_end();
}
void test_main(void* p NRUNUSED) {
#if defined(ZTS) && !defined(PHP7)
void*** tsrm_ls = NULL;
#endif /* ZTS && !PHP7 */
tlib_php_engine_create("" PTSRMLS_CC);
test_start_end_discard(TSRMLS_C);
test_unwind(TSRMLS_C);
tlib_php_engine_destroy(TSRMLS_C);
}