@@ -5,6 +5,7 @@ package exectrace_test
5
5
6
6
import (
7
7
"context"
8
+ "fmt"
8
9
"io"
9
10
"os"
10
11
"os/exec"
@@ -40,11 +41,11 @@ func TestExectrace(t *testing.T) {
40
41
41
42
// Launch processes.
42
43
const (
43
- expected = "hello exectrace test 1 "
44
+ expected = "hello exectrace basic test "
44
45
uid = 1000
45
46
gid = 2000
46
47
)
47
- var args = []string {"sh" , "-c" , "# " + expected }
48
+ args : = []string {"sh" , "-c" , "# " + expected }
48
49
filename , err := exec .LookPath (args [0 ])
49
50
require .NoError (t , err )
50
51
processDone := spamProcess (ctx , t , args , func (cmd * exec.Cmd ) {
@@ -76,6 +77,82 @@ func TestExectrace(t *testing.T) {
76
77
<- processDone
77
78
}
78
79
80
+ func TestExectraceTruncatedArgs (t * testing.T ) {
81
+ // This test must be run as root so we can start exectrace.
82
+ if os .Geteuid () != 0 {
83
+ t .Fatal ("must be run as root" )
84
+ }
85
+
86
+ ctx , cancel := context .WithTimeout (context .Background (), 15 * time .Second )
87
+ defer cancel ()
88
+
89
+ tracer , err := exectrace .New (& exectrace.TracerOpts {
90
+ LogFn : func (uid , gid , pid uint32 , logLine string ) {
91
+ t .Errorf ("tracer error log (uid=%v, gid=%v, pid=%v): %s" , uid , gid , pid , logLine )
92
+ },
93
+ })
94
+ require .NoError (t , err )
95
+ defer tracer .Close ()
96
+
97
+ const expected = "hello exectrace overflow test"
98
+ args := []string {"echo" , expected }
99
+
100
+ // Exectrace only captures the first 32 arguments of each process.
101
+ for i := 0 ; i < 30 ; i ++ {
102
+ args = append (args , fmt .Sprint (i ))
103
+ }
104
+ args = append (args , "final" )
105
+ require .Len (t , args , 33 )
106
+
107
+ // Launch processes.
108
+ processDone := spamProcess (ctx , t , args , nil )
109
+ event := getLogEntry (ctx , t , tracer , expected )
110
+
111
+ // Should only hold the first 32 args, and truncated should be true.
112
+ require .Len (t , event .Argv , 32 )
113
+ require .Equal (t , args [:32 ], event .Argv , "event.Argv" )
114
+ require .True (t , event .Truncated , "event.Truncated is false" )
115
+
116
+ cancel ()
117
+ <- processDone
118
+ }
119
+
120
+ func TestExectraceTruncatedLongArg (t * testing.T ) {
121
+ // This test must be run as root so we can start exectrace.
122
+ if os .Geteuid () != 0 {
123
+ t .Fatal ("must be run as root" )
124
+ }
125
+
126
+ ctx , cancel := context .WithTimeout (context .Background (), 15 * time .Second )
127
+ defer cancel ()
128
+
129
+ tracer , err := exectrace .New (& exectrace.TracerOpts {
130
+ LogFn : func (uid , gid , pid uint32 , logLine string ) {
131
+ t .Errorf ("tracer error log (uid=%v, gid=%v, pid=%v): %s" , uid , gid , pid , logLine )
132
+ },
133
+ })
134
+ require .NoError (t , err )
135
+ defer tracer .Close ()
136
+
137
+ // We only record the first 1024 bytes of each argument, so use an arg
138
+ // that's longer.
139
+ const expected = "hello exectrace arg length test"
140
+ args := []string {"echo" , expected , strings .Repeat ("a" , 1025 ), "final" }
141
+
142
+ // Launch processes.
143
+ processDone := spamProcess (ctx , t , args , nil )
144
+ event := getLogEntry (ctx , t , tracer , expected )
145
+
146
+ // Should only hold the first 1021 chars of the long arg with a trailing
147
+ // "...".
148
+ args [2 ] = args [2 ][:1021 ] + "..."
149
+ require .Equal (t , args , event .Argv , "event.Argv" )
150
+ require .True (t , event .Truncated , "event.Truncated is false" )
151
+
152
+ cancel ()
153
+ <- processDone
154
+ }
155
+
79
156
//nolint:paralleltest
80
157
func TestExectracePIDNS (t * testing.T ) {
81
158
// This test must be run as root so we can start exectrace.
@@ -100,8 +177,8 @@ func TestExectracePIDNS(t *testing.T) {
100
177
defer tracer .Close ()
101
178
102
179
// Launch processes.
103
- const expected = "hello exectrace test 2 "
104
- var args = []string {"sh" , "-c" , "# " + expected }
180
+ const expected = "hello exectrace pidns test same "
181
+ args : = []string {"sh" , "-c" , "# " + expected }
105
182
processDone := spamProcess (ctx , t , args , nil )
106
183
107
184
_ = getLogEntry (ctx , t , tracer , expected )
@@ -127,8 +204,8 @@ func TestExectracePIDNS(t *testing.T) {
127
204
defer tracer .Close ()
128
205
129
206
// Launch processes.
130
- const expected = "hello exectrace test 3 "
131
- var args = []string {"sh" , "-c" , "# " + expected }
207
+ const expected = "hello exectrace pidns test child "
208
+ args : = []string {"sh" , "-c" , "# " + expected }
132
209
processDone := spamProcess (ctx , t , args , func (cmd * exec.Cmd ) {
133
210
cmd .SysProcAttr = & syscall.SysProcAttr {
134
211
// Subprocess will be in a child PID namespace.
@@ -159,8 +236,8 @@ func TestExectracePIDNS(t *testing.T) {
159
236
defer tracer .Close ()
160
237
161
238
// Launch processes.
162
- const expected = "hello exectrace test 3 "
163
- var args = []string {"sh" , "-c" , "# " + expected }
239
+ const expected = "hello exectrace pidns test different "
240
+ args : = []string {"sh" , "-c" , "# " + expected }
164
241
processDone := spamProcess (ctx , t , args , nil )
165
242
166
243
// We should not see any events. Read events for up to 5 seconds.
0 commit comments