github.com/observiq/carbon@v0.9.11-0.20200820160507-1b872e368a5e/commands/example_test.go (about) 1 package commands 2 3 import ( 4 "bytes" 5 "context" 6 "os" 7 "runtime" 8 "strings" 9 "sync" 10 "testing" 11 "time" 12 13 "github.com/observiq/carbon/operator/builtin/output" 14 "github.com/stretchr/testify/require" 15 ) 16 17 type muxWriter struct { 18 buffer bytes.Buffer 19 sync.Mutex 20 } 21 22 func (b *muxWriter) Write(p []byte) (n int, err error) { 23 b.Lock() 24 defer b.Unlock() 25 return b.buffer.Write(p) 26 } 27 28 func (b *muxWriter) String() string { 29 b.Lock() 30 defer b.Unlock() 31 return b.buffer.String() 32 } 33 34 func TestTomcatExample(t *testing.T) { 35 if runtime.GOOS == "windows" { 36 t.Skip("Skipping on windows because of service failures") 37 } 38 err := os.Chdir("../examples/tomcat") 39 require.NoError(t, err) 40 defer func() { 41 err := os.Chdir("../../commands") 42 require.NoError(t, err) 43 }() 44 45 cmd := NewRootCmd() 46 cmd.SetArgs([]string{}) 47 48 buf := muxWriter{} 49 output.Stdout = &buf 50 51 ctx, cancel := context.WithCancel(context.Background()) 52 defer cancel() 53 54 done := make(chan struct{}) 55 go func() { 56 defer close(done) 57 err = cmd.ExecuteContext(ctx) 58 require.NoError(t, err) 59 }() 60 defer func() { <-done }() 61 62 expected := `{"timestamp":"2019-03-13T10:43:00-04:00","severity":60,"labels":{"file_name":"access.log","log_type":"tomcat"},"record":{"bytes_sent":"-","http_method":"GET","http_status":"404","remote_host":"10.66.2.46","remote_user":"-","url_path":"/"}} 63 {"timestamp":"2019-03-13T10:43:01-04:00","severity":60,"labels":{"file_name":"access.log","log_type":"tomcat"},"record":{"bytes_sent":"-","http_method":"GET","http_status":"404","remote_host":"10.66.2.46","remote_user":"-","url_path":"/favicon.ico"}} 64 {"timestamp":"2019-03-13T10:43:08-04:00","severity":30,"labels":{"file_name":"access.log","log_type":"tomcat"},"record":{"bytes_sent":"-","http_method":"GET","http_status":"302","remote_host":"10.66.2.46","remote_user":"-","url_path":"/manager"}} 65 {"timestamp":"2019-03-13T10:43:08-04:00","severity":60,"labels":{"file_name":"access.log","log_type":"tomcat"},"record":{"bytes_sent":"3420","http_method":"GET","http_status":"403","remote_host":"10.66.2.46","remote_user":"-","url_path":"/manager/"}} 66 {"timestamp":"2019-03-13T11:00:26-04:00","severity":60,"labels":{"file_name":"access.log","log_type":"tomcat"},"record":{"bytes_sent":"2473","http_method":"GET","http_status":"401","remote_host":"10.66.2.46","remote_user":"-","url_path":"/manager/html"}} 67 {"timestamp":"2019-03-13T11:00:53-04:00","severity":20,"labels":{"file_name":"access.log","log_type":"tomcat"},"record":{"bytes_sent":"11936","http_method":"GET","http_status":"200","remote_host":"10.66.2.46","remote_user":"tomcat","url_path":"/manager/html"}} 68 {"timestamp":"2019-03-13T11:00:53-04:00","severity":20,"labels":{"file_name":"access.log","log_type":"tomcat"},"record":{"bytes_sent":"19698","http_method":"GET","http_status":"200","remote_host":"10.66.2.46","remote_user":"-","url_path":"/manager/images/asf-logo.svg"}} 69 ` 70 71 timeout := time.After(5 * time.Second) 72 for { 73 select { 74 case <-time.After(100 * time.Millisecond): 75 if len(strings.Split(buf.String(), "\n")) == len(strings.Split(expected, "\n")) { 76 defer cancel() 77 require.Equal(t, expected, buf.String()) 78 return 79 } 80 case <-timeout: 81 require.FailNow(t, "Timed out waiting for logs to be written to stdout") 82 } 83 } 84 } 85 86 func TestSimplePluginsExample(t *testing.T) { 87 if runtime.GOOS == "windows" { 88 t.Skip("Skipping on windows because of service failures") 89 } 90 err := os.Chdir("../examples/simple_plugins") 91 require.NoError(t, err) 92 defer func() { 93 err := os.Chdir("../../commands") 94 require.NoError(t, err) 95 }() 96 97 cmd := NewRootCmd() 98 cmd.SetArgs([]string{"--plugin_dir", "./plugins"}) 99 100 buf := muxWriter{} 101 output.Stdout = &buf 102 103 ctx, cancel := context.WithCancel(context.Background()) 104 defer cancel() 105 106 done := make(chan struct{}) 107 go func() { 108 defer close(done) 109 err = cmd.ExecuteContext(ctx) 110 require.NoError(t, err) 111 }() 112 defer func() { <-done }() 113 114 expected := `{"timestamp":"2006-01-02T15:04:05Z","severity":0,"labels":{"decorated":"my_decorated_value"},"record":"test record"} 115 {"timestamp":"2006-01-02T15:04:05Z","severity":0,"labels":{"decorated":"my_decorated_value"},"record":"test record"} 116 {"timestamp":"2006-01-02T15:04:05Z","severity":0,"labels":{"decorated":"my_decorated_value"},"record":"test record"} 117 {"timestamp":"2006-01-02T15:04:05Z","severity":0,"labels":{"decorated":"my_decorated_value"},"record":"test record"} 118 {"timestamp":"2006-01-02T15:04:05Z","severity":0,"labels":{"decorated":"my_decorated_value"},"record":"test record"} 119 ` 120 121 timeout := time.After(5 * time.Second) 122 for { 123 select { 124 case <-time.After(100 * time.Millisecond): 125 if len(strings.Split(buf.String(), "\n")) == len(strings.Split(expected, "\n")) { 126 defer cancel() 127 require.Equal(t, expected, buf.String()) 128 return 129 } 130 case <-timeout: 131 require.FailNow(t, "Timed out waiting for logs to be written to stdout") 132 } 133 } 134 }