182 lines
		
	
	
		
			4.4 KiB
		
	
	
	
		
			Go
		
	
	
	
			
		
		
	
	
			182 lines
		
	
	
		
			4.4 KiB
		
	
	
	
		
			Go
		
	
	
	
package papertrail
 | 
						|
 | 
						|
import (
 | 
						|
	"net/http"
 | 
						|
	"net/http/httptest"
 | 
						|
	"net/url"
 | 
						|
	"strings"
 | 
						|
	"testing"
 | 
						|
 | 
						|
	"github.com/influxdata/telegraf/testutil"
 | 
						|
	"github.com/stretchr/testify/require"
 | 
						|
)
 | 
						|
 | 
						|
const (
 | 
						|
	contentType = "application/x-www-form-urlencoded"
 | 
						|
)
 | 
						|
 | 
						|
func post(pt *PapertrailWebhook, contentType string, body string) *httptest.ResponseRecorder {
 | 
						|
	req, _ := http.NewRequest("POST", "/", strings.NewReader(body))
 | 
						|
	req.Header.Set("Content-Type", contentType)
 | 
						|
	w := httptest.NewRecorder()
 | 
						|
	pt.eventHandler(w, req)
 | 
						|
	return w
 | 
						|
}
 | 
						|
 | 
						|
func TestWrongContentType(t *testing.T) {
 | 
						|
	var acc testutil.Accumulator
 | 
						|
	pt := &PapertrailWebhook{Path: "/papertrail", acc: &acc}
 | 
						|
	form := url.Values{}
 | 
						|
	form.Set("payload", sampleEventPayload)
 | 
						|
	data := form.Encode()
 | 
						|
 | 
						|
	resp := post(pt, "", data)
 | 
						|
	require.Equal(t, http.StatusUnsupportedMediaType, resp.Code)
 | 
						|
}
 | 
						|
 | 
						|
func TestMissingPayload(t *testing.T) {
 | 
						|
	var acc testutil.Accumulator
 | 
						|
	pt := &PapertrailWebhook{Path: "/papertrail", acc: &acc}
 | 
						|
 | 
						|
	resp := post(pt, contentType, "")
 | 
						|
	require.Equal(t, http.StatusBadRequest, resp.Code)
 | 
						|
}
 | 
						|
 | 
						|
func TestPayloadNotJSON(t *testing.T) {
 | 
						|
	var acc testutil.Accumulator
 | 
						|
	pt := &PapertrailWebhook{Path: "/papertrail", acc: &acc}
 | 
						|
 | 
						|
	resp := post(pt, contentType, "payload={asdf]")
 | 
						|
	require.Equal(t, http.StatusBadRequest, resp.Code)
 | 
						|
}
 | 
						|
 | 
						|
func TestPayloadInvalidJSON(t *testing.T) {
 | 
						|
	var acc testutil.Accumulator
 | 
						|
	pt := &PapertrailWebhook{Path: "/papertrail", acc: &acc}
 | 
						|
 | 
						|
	resp := post(pt, contentType, `payload={"value": 42}`)
 | 
						|
	require.Equal(t, http.StatusBadRequest, resp.Code)
 | 
						|
}
 | 
						|
 | 
						|
func TestEventPayload(t *testing.T) {
 | 
						|
	var acc testutil.Accumulator
 | 
						|
	pt := &PapertrailWebhook{Path: "/papertrail", acc: &acc}
 | 
						|
 | 
						|
	form := url.Values{}
 | 
						|
	form.Set("payload", sampleEventPayload)
 | 
						|
	resp := post(pt, contentType, form.Encode())
 | 
						|
	require.Equal(t, http.StatusOK, resp.Code)
 | 
						|
 | 
						|
	fields := map[string]interface{}{
 | 
						|
		"count": uint64(1),
 | 
						|
	}
 | 
						|
 | 
						|
	tags1 := map[string]string{
 | 
						|
		"event": "Important stuff",
 | 
						|
		"host":  "abc",
 | 
						|
	}
 | 
						|
	tags2 := map[string]string{
 | 
						|
		"event": "Important stuff",
 | 
						|
		"host":  "def",
 | 
						|
	}
 | 
						|
 | 
						|
	acc.AssertContainsTaggedFields(t, "papertrail", fields, tags1)
 | 
						|
	acc.AssertContainsTaggedFields(t, "papertrail", fields, tags2)
 | 
						|
}
 | 
						|
 | 
						|
func TestCountPayload(t *testing.T) {
 | 
						|
	var acc testutil.Accumulator
 | 
						|
	pt := &PapertrailWebhook{Path: "/papertrail", acc: &acc}
 | 
						|
	form := url.Values{}
 | 
						|
	form.Set("payload", sampleCountPayload)
 | 
						|
	resp := post(pt, contentType, form.Encode())
 | 
						|
	require.Equal(t, http.StatusOK, resp.Code)
 | 
						|
 | 
						|
	fields1 := map[string]interface{}{
 | 
						|
		"count": uint64(5),
 | 
						|
	}
 | 
						|
	fields2 := map[string]interface{}{
 | 
						|
		"count": uint64(3),
 | 
						|
	}
 | 
						|
 | 
						|
	tags1 := map[string]string{
 | 
						|
		"event": "Important stuff",
 | 
						|
		"host":  "arthur",
 | 
						|
	}
 | 
						|
	tags2 := map[string]string{
 | 
						|
		"event": "Important stuff",
 | 
						|
		"host":  "ford",
 | 
						|
	}
 | 
						|
 | 
						|
	acc.AssertContainsTaggedFields(t, "papertrail", fields1, tags1)
 | 
						|
	acc.AssertContainsTaggedFields(t, "papertrail", fields2, tags2)
 | 
						|
}
 | 
						|
 | 
						|
const sampleEventPayload = `{
 | 
						|
  "events": [
 | 
						|
    {
 | 
						|
      "id": 7711561783320576,
 | 
						|
      "received_at": "2011-05-18T20:30:02-07:00",
 | 
						|
      "display_received_at": "May 18 20:30:02",
 | 
						|
      "source_ip": "208.75.57.121",
 | 
						|
      "source_name": "abc",
 | 
						|
      "source_id": 2,
 | 
						|
      "hostname": "abc",
 | 
						|
      "program": "CROND",
 | 
						|
      "severity": "Info",
 | 
						|
      "facility": "Cron",
 | 
						|
      "message": "message body"
 | 
						|
    },
 | 
						|
    {
 | 
						|
      "id": 7711562567655424,
 | 
						|
      "received_at": "2011-05-18T20:30:02-07:00",
 | 
						|
      "display_received_at": "May 18 20:30:02",
 | 
						|
      "source_ip": "208.75.57.120",
 | 
						|
      "source_name": "server1",
 | 
						|
      "source_id": 19,
 | 
						|
      "hostname": "def",
 | 
						|
      "program": "CROND",
 | 
						|
      "severity": "Info",
 | 
						|
      "facility": "Cron",
 | 
						|
      "message": "A short event"
 | 
						|
    }
 | 
						|
  ],
 | 
						|
  "saved_search": {
 | 
						|
    "id": 42,
 | 
						|
    "name": "Important stuff",
 | 
						|
    "query": "cron OR server1",
 | 
						|
    "html_edit_url": "https://papertrailapp.com/searches/42/edit",
 | 
						|
    "html_search_url": "https://papertrailapp.com/searches/42"
 | 
						|
  },
 | 
						|
  "max_id": "7711582041804800",
 | 
						|
  "min_id": "7711561783320576"
 | 
						|
}`
 | 
						|
 | 
						|
const sampleCountPayload = `{
 | 
						|
   "counts": [
 | 
						|
     {
 | 
						|
       "source_name": "arthur",
 | 
						|
       "source_id": 4,
 | 
						|
       "timeseries": {
 | 
						|
         "1453248895": 5
 | 
						|
       }
 | 
						|
     },
 | 
						|
     {
 | 
						|
       "source_name": "ford",
 | 
						|
       "source_id": 3,
 | 
						|
       "timeseries": {
 | 
						|
         "1453248927": 3
 | 
						|
       }
 | 
						|
     }
 | 
						|
   ],
 | 
						|
   "saved_search": {
 | 
						|
     "id": 42,
 | 
						|
     "name": "Important stuff",
 | 
						|
     "query": "cron OR server1",
 | 
						|
     "html_edit_url": "https://papertrailapp.com/searches/42/edit",
 | 
						|
     "html_search_url": "https://papertrailapp.com/searches/42"
 | 
						|
   },
 | 
						|
   "max_id": "7711582041804800",
 | 
						|
   "min_id": "7711561783320576"
 | 
						|
}`
 |