github.com/observiq/carbon@v0.9.11-0.20200820160507-1b872e368a5e/operator/builtin/input/journald_test.go (about) 1 // +build linux 2 3 package input 4 5 import ( 6 "bytes" 7 "context" 8 "io" 9 "io/ioutil" 10 "testing" 11 "time" 12 13 "github.com/observiq/carbon/entry" 14 "github.com/observiq/carbon/operator" 15 "github.com/observiq/carbon/testutil" 16 "github.com/stretchr/testify/mock" 17 "github.com/stretchr/testify/require" 18 ) 19 20 type fakeJournaldCmd struct{} 21 22 func (f *fakeJournaldCmd) Start() error { 23 return nil 24 } 25 26 func (f *fakeJournaldCmd) StdoutPipe() (io.ReadCloser, error) { 27 response := `{ "_BOOT_ID": "c4fa36de06824d21835c05ff80c54468", "_CAP_EFFECTIVE": "0", "_TRANSPORT": "journal", "_UID": "1000", "_EXE": "/usr/lib/systemd/systemd", "_AUDIT_LOGINUID": "1000", "MESSAGE": "run-docker-netns-4f76d707d45f.mount: Succeeded.", "_PID": "13894", "_CMDLINE": "/lib/systemd/systemd --user", "_MACHINE_ID": "d777d00e7caf45fbadedceba3975520d", "_SELINUX_CONTEXT": "unconfined\n", "CODE_FUNC": "unit_log_success", "SYSLOG_IDENTIFIER": "systemd", "_HOSTNAME": "myhostname", "MESSAGE_ID": "7ad2d189f7e94e70a38c781354912448", "_SYSTEMD_CGROUP": "/user.slice/user-1000.slice/user@1000.service/init.scope", "_SOURCE_REALTIME_TIMESTAMP": "1587047866229317", "USER_UNIT": "run-docker-netns-4f76d707d45f.mount", "SYSLOG_FACILITY": "3", "_SYSTEMD_SLICE": "user-1000.slice", "_AUDIT_SESSION": "286", "CODE_FILE": "../src/core/unit.c", "_SYSTEMD_USER_UNIT": "init.scope", "_COMM": "systemd", "USER_INVOCATION_ID": "88f7ca6bbf244dc8828fa901f9fe9be1", "CODE_LINE": "5487", "_SYSTEMD_INVOCATION_ID": "83f7fc7799064520b26eb6de1630429c", "PRIORITY": "6", "_GID": "1000", "__REALTIME_TIMESTAMP": "1587047866229555", "_SYSTEMD_UNIT": "user@1000.service", "_SYSTEMD_USER_SLICE": "-.slice", "__CURSOR": "s=b1e713b587ae4001a9ca482c4b12c005;i=1eed30;b=c4fa36de06824d21835c05ff80c54468;m=9f9d630205;t=5a369604ee333;x=16c2d4fd4fdb7c36", "__MONOTONIC_TIMESTAMP": "685540311557", "_SYSTEMD_OWNER_UID": "1000" } 28 ` 29 reader := bytes.NewReader([]byte(response)) 30 return ioutil.NopCloser(reader), nil 31 } 32 33 func TestInputJournald(t *testing.T) { 34 cfg := NewJournaldInputConfig("my_journald_input") 35 cfg.OutputIDs = []string{"output"} 36 37 journaldInput, err := cfg.Build(testutil.NewBuildContext(t)) 38 require.NoError(t, err) 39 40 mockOutput := testutil.NewMockOperator("output") 41 received := make(chan *entry.Entry) 42 mockOutput.On("Process", mock.Anything, mock.Anything).Run(func(args mock.Arguments) { 43 received <- args.Get(1).(*entry.Entry) 44 }).Return(nil) 45 46 err = journaldInput.SetOutputs([]operator.Operator{mockOutput}) 47 require.NoError(t, err) 48 49 journaldInput.(*JournaldInput).newCmd = func(ctx context.Context, cursor []byte) cmd { 50 return &fakeJournaldCmd{} 51 } 52 53 err = journaldInput.Start() 54 require.NoError(t, err) 55 56 expected := map[string]interface{}{ 57 "_BOOT_ID": "c4fa36de06824d21835c05ff80c54468", 58 "_CAP_EFFECTIVE": "0", 59 "_TRANSPORT": "journal", 60 "_UID": "1000", 61 "_EXE": "/usr/lib/systemd/systemd", 62 "_AUDIT_LOGINUID": "1000", 63 "MESSAGE": "run-docker-netns-4f76d707d45f.mount: Succeeded.", 64 "_PID": "13894", 65 "_CMDLINE": "/lib/systemd/systemd --user", 66 "_MACHINE_ID": "d777d00e7caf45fbadedceba3975520d", 67 "_SELINUX_CONTEXT": "unconfined\n", 68 "CODE_FUNC": "unit_log_success", 69 "SYSLOG_IDENTIFIER": "systemd", 70 "_HOSTNAME": "myhostname", 71 "MESSAGE_ID": "7ad2d189f7e94e70a38c781354912448", 72 "_SYSTEMD_CGROUP": "/user.slice/user-1000.slice/user@1000.service/init.scope", 73 "_SOURCE_REALTIME_TIMESTAMP": "1587047866229317", 74 "USER_UNIT": "run-docker-netns-4f76d707d45f.mount", 75 "SYSLOG_FACILITY": "3", 76 "_SYSTEMD_SLICE": "user-1000.slice", 77 "_AUDIT_SESSION": "286", 78 "CODE_FILE": "../src/core/unit.c", 79 "_SYSTEMD_USER_UNIT": "init.scope", 80 "_COMM": "systemd", 81 "USER_INVOCATION_ID": "88f7ca6bbf244dc8828fa901f9fe9be1", 82 "CODE_LINE": "5487", 83 "_SYSTEMD_INVOCATION_ID": "83f7fc7799064520b26eb6de1630429c", 84 "PRIORITY": "6", 85 "_GID": "1000", 86 "_SYSTEMD_UNIT": "user@1000.service", 87 "_SYSTEMD_USER_SLICE": "-.slice", 88 "__CURSOR": "s=b1e713b587ae4001a9ca482c4b12c005;i=1eed30;b=c4fa36de06824d21835c05ff80c54468;m=9f9d630205;t=5a369604ee333;x=16c2d4fd4fdb7c36", 89 "__MONOTONIC_TIMESTAMP": "685540311557", 90 "_SYSTEMD_OWNER_UID": "1000", 91 } 92 93 select { 94 case e := <-received: 95 require.Equal(t, expected, e.Record) 96 case <-time.After(time.Second): 97 require.FailNow(t, "Timed out waiting for entry to be read") 98 } 99 }