Skip to content

Commit bdf2ea6

Browse files
committed
rely on pty for tty support
1 parent bf0f9cf commit bdf2ea6

File tree

4 files changed

+117
-80
lines changed

4 files changed

+117
-80
lines changed

e2e/capture_test.go

Lines changed: 22 additions & 24 deletions
Original file line numberDiff line numberDiff line change
@@ -55,23 +55,22 @@ func TestFlowCapture(t *testing.T) {
5555
// TODO: find a way to avoid error here; this is probably related to SIGTERM instead of CTRL + C call
5656
//assert.Nil(t, err)
5757

58-
err = os.WriteFile(path.Join("output", StartupDate+"-flowOutput"), output, 0666)
58+
err = os.WriteFile(path.Join("output", StartupDate+"-flowOutput"), []byte(output), 0666)
5959
assert.Nil(t, err)
6060

61-
str := string(output)
62-
assert.NotEmpty(t, str)
61+
assert.NotEmpty(t, output)
6362
// ensure script setup is fine
64-
assert.Contains(t, str, "namespace/netobserv-cli created")
65-
assert.Contains(t, str, "serviceaccount/netobserv-cli created")
66-
assert.Contains(t, str, "service/collector created")
67-
assert.Contains(t, str, "daemonset.apps/netobserv-cli created")
68-
assert.Contains(t, str, "pod/collector created")
69-
assert.Contains(t, str, "pod/collector condition met")
63+
assert.Contains(t, output, "namespace/netobserv-cli created")
64+
assert.Contains(t, output, "serviceaccount/netobserv-cli created")
65+
assert.Contains(t, output, "service/collector created")
66+
assert.Contains(t, output, "daemonset.apps/netobserv-cli created")
67+
assert.Contains(t, output, "pod/collector created")
68+
assert.Contains(t, output, "pod/collector condition met")
7069
// check that CLI is running
71-
assert.Contains(t, str, "Starting Flow Capture...")
72-
assert.Contains(t, str, "Started collector")
70+
assert.Contains(t, output, "Starting Flow Capture...")
71+
assert.Contains(t, output, "Started collector")
7372
// check that script terminated
74-
assert.Contains(t, str, "command terminated")
73+
assert.Contains(t, output, "command terminated")
7574
return ctx
7675
},
7776
).Assess("check downloaded output flow files",
@@ -129,23 +128,22 @@ func TestPacketCapture(t *testing.T) {
129128
// TODO: find a way to avoid error here; this is probably related to SIGTERM instead of CTRL + C call
130129
//assert.Nil(t, err)
131130

132-
err = os.WriteFile(path.Join("output", StartupDate+"-packetOutput"), output, 0666)
131+
err = os.WriteFile(path.Join("output", StartupDate+"-packetOutput"), []byte(output), 0666)
133132
assert.Nil(t, err)
134133

135-
str := string(output)
136-
assert.NotEmpty(t, str)
134+
assert.NotEmpty(t, output)
137135
// ensure script setup is fine
138-
assert.Contains(t, str, "namespace/netobserv-cli created")
139-
assert.Contains(t, str, "serviceaccount/netobserv-cli created")
140-
assert.Contains(t, str, "service/collector created")
141-
assert.Contains(t, str, "daemonset.apps/netobserv-cli created")
142-
assert.Contains(t, str, "pod/collector created")
143-
assert.Contains(t, str, "pod/collector condition met")
136+
assert.Contains(t, output, "namespace/netobserv-cli created")
137+
assert.Contains(t, output, "serviceaccount/netobserv-cli created")
138+
assert.Contains(t, output, "service/collector created")
139+
assert.Contains(t, output, "daemonset.apps/netobserv-cli created")
140+
assert.Contains(t, output, "pod/collector created")
141+
assert.Contains(t, output, "pod/collector condition met")
144142
// check that CLI is running
145-
assert.Contains(t, str, "Starting Packet Capture...")
146-
assert.Contains(t, str, "Started collector")
143+
assert.Contains(t, output, "Starting Packet Capture...")
144+
assert.Contains(t, output, "Started collector")
147145
// check that script terminated
148-
assert.Contains(t, str, "command terminated")
146+
assert.Contains(t, output, "command terminated")
149147
return ctx
150148
},
151149
).Assess("check downloaded output pcap files",

e2e/common.go

Lines changed: 46 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,11 +1,15 @@
11
package e2e
22

33
import (
4+
"bufio"
5+
"io"
46
"os/exec"
57
"path"
8+
"strings"
69
"syscall"
710
"time"
811

12+
"github.com/creack/pty"
913
"github.com/sirupsen/logrus"
1014
)
1115

@@ -18,14 +22,17 @@ var (
1822
)
1923

2024
// run command with tty support
21-
func RunCommand(log *logrus.Entry, commandName string, arg ...string) ([]byte, error) {
25+
func RunCommand(log *logrus.Entry, commandName string, arg ...string) (string, error) {
2226
cmdStr := path.Join("commands", commandName)
2327
log.WithFields(logrus.Fields{"cmd": cmdStr, "arg": arg}).Info("running command")
2428

2529
log.Print("Executing command...")
2630
cmd := exec.Command(cmdStr, arg...)
2731
cmd.Env = append(cmd.Environ(), "isE2E=true")
2832

33+
outPipe, _ := cmd.StdoutPipe()
34+
errPipe, _ := cmd.StderrPipe()
35+
2936
timer := time.AfterFunc(CommandTimeout, func() {
3037
log.Print("Terminating command...")
3138
err := cmd.Process.Signal(syscall.SIGTERM)
@@ -35,5 +42,42 @@ func RunCommand(log *logrus.Entry, commandName string, arg ...string) ([]byte, e
3542
})
3643
defer timer.Stop()
3744

38-
return cmd.CombinedOutput()
45+
var sb strings.Builder
46+
go func(_ io.ReadCloser) {
47+
reader := bufio.NewReader(errPipe)
48+
line, err := reader.ReadString('\n')
49+
for err == nil {
50+
sb.WriteString(line)
51+
line, err = reader.ReadString('\n')
52+
}
53+
}(errPipe)
54+
55+
go func(_ io.ReadCloser) {
56+
reader := bufio.NewReader(outPipe)
57+
line, err := reader.ReadString('\n')
58+
for err == nil {
59+
sb.WriteString(line)
60+
line, err = reader.ReadString('\n')
61+
}
62+
}(outPipe)
63+
64+
in, err := pty.Start(cmd)
65+
if err != nil {
66+
panic(err)
67+
}
68+
69+
timer = time.AfterFunc(30*time.Second, func() {
70+
log.Print("Simulating keyboard typing...")
71+
_, err := in.Write([]byte("netobserv"))
72+
if err != nil {
73+
log.Error(err)
74+
}
75+
})
76+
defer timer.Stop()
77+
78+
if err := cmd.Wait(); err != nil {
79+
return sb.String(), err
80+
}
81+
82+
return sb.String(), nil
3983
}

e2e/script_test.go

Lines changed: 28 additions & 30 deletions
Original file line numberDiff line numberDiff line change
@@ -20,38 +20,37 @@ func TestHelpCommand(t *testing.T) {
2020
output, err := RunCommand(slog, "oc-netobserv", "help")
2121
assert.Nil(t, err)
2222

23-
err = os.WriteFile(path.Join("output", StartupDate+"-helpOutput"), output, 0666)
23+
err = os.WriteFile(path.Join("output", StartupDate+"-helpOutput"), []byte(output), 0666)
2424
assert.Nil(t, err)
2525

26-
str := string(output)
27-
assert.NotEmpty(t, str)
26+
assert.NotEmpty(t, output)
2827
// ensure help display overall description
29-
assert.Contains(t, str, "Netobserv allows you to capture flows, packets and metrics from your cluster.")
30-
assert.Contains(t, str, "Find more information at: https://github.com/netobserv/network-observability-cli/")
28+
assert.Contains(t, output, "Netobserv allows you to capture flows, packets and metrics from your cluster.")
29+
assert.Contains(t, output, "Find more information at: https://github.com/netobserv/network-observability-cli/")
3130
// ensure help to display main commands
32-
assert.Contains(t, str, "main commands:")
33-
assert.Contains(t, str, "Syntax: netobserv [flows|packets|metrics|follow|stop|copy|cleanup|version] [options]")
34-
assert.Contains(t, str, "flows Capture flows information in JSON format using collector pod.")
35-
assert.Contains(t, str, "metrics Capture metrics information in Prometheus using a ServiceMonitor (OCP cluster only).")
36-
assert.Contains(t, str, "packets Capture packets information in pcap format using collector pod.")
31+
assert.Contains(t, output, "main commands:")
32+
assert.Contains(t, output, "Syntax: netobserv [flows|packets|metrics|follow|stop|copy|cleanup|version] [options]")
33+
assert.Contains(t, output, "flows Capture flows information in JSON format using collector pod.")
34+
assert.Contains(t, output, "metrics Capture metrics information in Prometheus using a ServiceMonitor (OCP cluster only).")
35+
assert.Contains(t, output, "packets Capture packets information in pcap format using collector pod.")
3736
// ensure help to display extra commands
38-
assert.Contains(t, str, "extra commands:")
39-
assert.Contains(t, str, "cleanup Remove netobserv components and configurations.")
40-
assert.Contains(t, str, "copy Copy collector generated files locally.")
41-
assert.Contains(t, str, "follow Follow collector logs when running in background.")
42-
assert.Contains(t, str, "stop Stop collection by removing agent daemonset.")
43-
assert.Contains(t, str, "version Print software version.")
37+
assert.Contains(t, output, "extra commands:")
38+
assert.Contains(t, output, "cleanup Remove netobserv components and configurations.")
39+
assert.Contains(t, output, "copy Copy collector generated files locally.")
40+
assert.Contains(t, output, "follow Follow collector logs when running in background.")
41+
assert.Contains(t, output, "stop Stop collection by removing agent daemonset.")
42+
assert.Contains(t, output, "version Print software version.")
4443
// ensure help to display examples
45-
assert.Contains(t, str, "basic examples:")
46-
assert.Contains(t, str, "netobserv flows --drops # Capture dropped flows on all nodes")
47-
assert.Contains(t, str, "netobserv flows --query='SrcK8S_Namespace=~\"app-.*\"' # Capture flows from any namespace starting by app-")
48-
assert.Contains(t, str, "netobserv packets --port=8080 # Capture packets on port 8080")
49-
assert.Contains(t, str, "netobserv metrics --enable_all # Capture default cluster metrics including packet drop, dns, rtt, network events packet translation and UDN mapping features informations")
50-
assert.Contains(t, str, "advanced examples:")
51-
assert.Contains(t, str, "Capture flows in background and copy output locally")
52-
assert.Contains(t, str, "Capture flows from a specific pod")
53-
assert.Contains(t, str, "Capture packets on specific nodes and port")
54-
assert.Contains(t, str, "Capture node and namespace drop metrics")
44+
assert.Contains(t, output, "basic examples:")
45+
assert.Contains(t, output, "netobserv flows --drops # Capture dropped flows on all nodes")
46+
assert.Contains(t, output, "netobserv flows --query='SrcK8S_Namespace=~\"app-.*\"' # Capture flows from any namespace starting by app-")
47+
assert.Contains(t, output, "netobserv packets --port=8080 # Capture packets on port 8080")
48+
assert.Contains(t, output, "netobserv metrics --enable_all # Capture default cluster metrics including packet drop, dns, rtt, network events packet translation and UDN mapping features informations")
49+
assert.Contains(t, output, "advanced examples:")
50+
assert.Contains(t, output, "Capture flows in background and copy output locally")
51+
assert.Contains(t, output, "Capture flows from a specific pod")
52+
assert.Contains(t, output, "Capture packets on specific nodes and port")
53+
assert.Contains(t, output, "Capture node and namespace drop metrics")
5554

5655
})
5756
}
@@ -61,12 +60,11 @@ func TestVersionCommand(t *testing.T) {
6160
output, err := RunCommand(slog, "oc-netobserv", "version")
6261
assert.Nil(t, err)
6362

64-
err = os.WriteFile(path.Join("output", StartupDate+"-versionOutput"), output, 0666)
63+
err = os.WriteFile(path.Join("output", StartupDate+"-versionOutput"), []byte(output), 0666)
6564
assert.Nil(t, err)
6665

67-
str := string(output)
68-
assert.NotEmpty(t, str)
66+
assert.NotEmpty(t, output)
6967
// ensure version display test
70-
assert.Contains(t, str, "Netobserv CLI version test")
68+
assert.Contains(t, output, "Netobserv CLI version test")
7169
})
7270
}

e2e/yaml_test.go

Lines changed: 21 additions & 24 deletions
Original file line numberDiff line numberDiff line change
@@ -32,18 +32,17 @@ func TestFlowFiltersYAML(t *testing.T) {
3232
"--yaml")
3333
assert.Nil(t, err)
3434

35-
err = os.WriteFile(path.Join("output", StartupDate+"-flowYAMLOutput"), output, 0666)
35+
err = os.WriteFile(path.Join("output", StartupDate+"-flowYAMLOutput"), []byte(output), 0666)
3636
assert.Nil(t, err)
3737

38-
str := string(output)
39-
assert.NotEmpty(t, str)
38+
assert.NotEmpty(t, output)
4039
// ensure script setup is fine
41-
assert.Contains(t, str, "creating netobserv-cli namespace")
42-
assert.Contains(t, str, "creating service account")
43-
assert.Contains(t, str, "creating collector service")
44-
assert.Contains(t, str, "creating flow-capture agents")
40+
assert.Contains(t, output, "creating netobserv-cli namespace")
41+
assert.Contains(t, output, "creating service account")
42+
assert.Contains(t, output, "creating collector service")
43+
assert.Contains(t, output, "creating flow-capture agents")
4544
// check CLI done successfully
46-
assert.Contains(t, str, "Check the generated YAML file in output folder")
45+
assert.Contains(t, output, "Check the generated YAML file in output folder")
4746

4847
return ctx
4948
},
@@ -127,18 +126,17 @@ func TestPacketFiltersYAML(t *testing.T) {
127126
"--yaml")
128127
assert.Nil(t, err)
129128

130-
err = os.WriteFile(path.Join("output", StartupDate+"-packetYAMLOutput"), output, 0666)
129+
err = os.WriteFile(path.Join("output", StartupDate+"-packetYAMLOutput"), []byte(output), 0666)
131130
assert.Nil(t, err)
132131

133-
str := string(output)
134-
assert.NotEmpty(t, str)
132+
assert.NotEmpty(t, output)
135133
// ensure script setup is fine
136-
assert.Contains(t, str, "creating netobserv-cli namespace")
137-
assert.Contains(t, str, "creating service account")
138-
assert.Contains(t, str, "creating collector service")
139-
assert.Contains(t, str, "creating packet-capture agents")
134+
assert.Contains(t, output, "creating netobserv-cli namespace")
135+
assert.Contains(t, output, "creating service account")
136+
assert.Contains(t, output, "creating collector service")
137+
assert.Contains(t, output, "creating packet-capture agents")
140138
// check CLI done successfully
141-
assert.Contains(t, str, "Check the generated YAML file in output folder")
139+
assert.Contains(t, output, "Check the generated YAML file in output folder")
142140

143141
return ctx
144142
},
@@ -220,18 +218,17 @@ func TestMetricYAML(t *testing.T) {
220218
output, err := RunCommand(ylog, "oc-netobserv", "metrics", "--yaml")
221219
assert.Nil(t, err)
222220

223-
err = os.WriteFile(path.Join("output", StartupDate+"-metricYAMLOutput"), output, 0666)
221+
err = os.WriteFile(path.Join("output", StartupDate+"-metricYAMLOutput"), []byte(output), 0666)
224222
assert.Nil(t, err)
225223

226-
str := string(output)
227-
assert.NotEmpty(t, str)
224+
assert.NotEmpty(t, output)
228225
// ensure script setup is fine
229-
assert.Contains(t, str, "creating netobserv-cli namespace")
230-
assert.Contains(t, str, "creating service account")
231-
assert.Contains(t, str, "creating service monitor")
232-
assert.Contains(t, str, "creating metric-capture agents")
226+
assert.Contains(t, output, "creating netobserv-cli namespace")
227+
assert.Contains(t, output, "creating service account")
228+
assert.Contains(t, output, "creating service monitor")
229+
assert.Contains(t, output, "creating metric-capture agents")
233230
// check CLI done successfully
234-
assert.Contains(t, str, "Check the generated YAML file in output folder.")
231+
assert.Contains(t, output, "Check the generated YAML file in output folder.")
235232

236233
return ctx
237234
},

0 commit comments

Comments
 (0)