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  }