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  }