summaryrefslogtreecommitdiff
path: root/integrationtests/dtail_test.go
diff options
context:
space:
mode:
Diffstat (limited to 'integrationtests/dtail_test.go')
-rw-r--r--integrationtests/dtail_test.go148
1 files changed, 148 insertions, 0 deletions
diff --git a/integrationtests/dtail_test.go b/integrationtests/dtail_test.go
new file mode 100644
index 0000000..c6d0107
--- /dev/null
+++ b/integrationtests/dtail_test.go
@@ -0,0 +1,148 @@
+package integrationtests
+
+import (
+ "context"
+ "fmt"
+ "os"
+ "strings"
+ "testing"
+ "time"
+
+ "github.com/mimecast/dtail/internal/config"
+)
+
+func TestDTailWithServer(t *testing.T) {
+ if !config.Env("DTAIL_RUN_INTEGRATION_TESTS") {
+ t.Log("Skipping")
+ return
+ }
+ followFile := "dtail.follow.tmp"
+ greetings := []string{"world!", "sol-system!", "milky-way!", "universe!", "multiverse!"}
+
+ ctx, cancel := context.WithCancel(context.Background())
+ defer cancel()
+
+ go func() {
+ select {
+ case <-time.After(time.Minute):
+ t.Error("Max time for this test exceeded!")
+ cancel()
+ case <-ctx.Done():
+ return
+ }
+ }()
+
+ serverCh, _, _, err := startCommand(ctx, t,
+ "../dserver",
+ "--logger", "stdout",
+ "--logLevel", "trace",
+ "--bindAddress", "localhost",
+ "--port", "4243",
+ "--relaxedAuth",
+ )
+ if err != nil {
+ t.Error(err)
+ return
+ }
+
+ // TODO: In testmode, the client should not try to manipulate any known_hosts files.
+ // TODO: In testmode, never read a config file (use none for all commands)
+ clientCh, _, _, err := startCommand(ctx, t,
+ "../dtail",
+ "--logger", "stdout",
+ "--logLevel", "trace",
+ "--servers", "localhost:4243",
+ "--files", followFile,
+ "--grep", "Hello",
+ "--trustAllHosts",
+ "--noColor",
+ )
+ if err != nil {
+ t.Error(err)
+ return
+ }
+ // Write greetings to followFile
+ fd, err := os.Create(followFile)
+ if err != nil {
+ t.Error(err)
+ }
+ defer fd.Close()
+
+ go func() {
+ var circular int
+ for {
+ select {
+ case <-time.After(time.Second):
+ fd.WriteString(time.Now().String())
+ fd.WriteString(fmt.Sprintf(" - Hello %s\n", greetings[circular]))
+ circular = (circular + 1) % len(greetings)
+ case <-ctx.Done():
+ return
+ }
+ }
+ }()
+
+ var greetingsRecv []string
+
+ for len(greetingsRecv) < len(greetings) {
+ select {
+ case line := <-serverCh:
+ t.Log("server:", line)
+ case line := <-clientCh:
+ t.Log("client:", line)
+ if strings.Contains(line, "Hello ") {
+ s := strings.Split(line, " ")
+ greeting := s[len(s)-1]
+ greetingsRecv = append(greetingsRecv, greeting)
+ t.Log("Received greeting", greeting, len(greetingsRecv))
+ }
+ case <-ctx.Done():
+ t.Log("Done reading client and server pipes")
+ break
+ }
+ }
+
+ // We expect to have received the greetings in the same order they were sent.`
+ offset := -1
+ for i, g := range greetings {
+ if g == greetingsRecv[0] {
+ offset = i
+ break
+ }
+ }
+ if offset == -1 {
+ t.Error("Could not find first offset of greetings received")
+ return
+ }
+
+ for i, g := range greetingsRecv {
+ index := (i + offset) % len(greetings)
+ if greetings[index] != g {
+ t.Error(fmt.Sprintf("Expected '%s' but got '%s' at '%v' vs '%v'\n",
+ g, greetings[index], greetings, greetingsRecv))
+ return
+ }
+ }
+
+ os.Remove(followFile)
+}
+
+func TestDTailColorTable(t *testing.T) {
+ if !config.Env("DTAIL_RUN_INTEGRATION_TESTS") {
+ t.Log("Skipping")
+ return
+ }
+ stdoutFile := "dtailcolortable.stdout.tmp"
+ expectedStdoutFile := "dtailcolortable.expected"
+
+ _, err := runCommand(context.TODO(), t, stdoutFile, "../dtail", "--colorTable")
+ if err != nil {
+ t.Error(err)
+ return
+ }
+ if err := compareFiles(t, stdoutFile, expectedStdoutFile); err != nil {
+ t.Error(err)
+ return
+ }
+ os.Remove(stdoutFile)
+}