package main
import (
+ "encoding/json"
"io"
+ "net"
"net/http"
"os"
"path/filepath"
"strings"
"testing"
+ "time"
"github.com/stretchr/testify/require"
)
+func TestNotificationReceiptIsPrivateToItsSubmittingSocket(t *testing.T) {
+ server := newModelFake(t)
+ socket := daemonStartTest(t, server)
+ observer, err := net.Dial("unix", socket)
+ require.NoError(t, err)
+ require.NoError(t, observer.SetDeadline(time.Now().Add(10*time.Second)))
+
+ decoder := json.NewDecoder(observer)
+
+ var event Event
+
+ require.NoError(t, decoder.Decode(&event))
+ require.Equal(t, "ready", event.Kind)
+
+ submitter, err := net.Dial("unix", socket)
+ require.NoError(t, err)
+ require.NoError(t, submitter.SetDeadline(time.Now().Add(10*time.Second)))
+ require.NoError(t, json.NewEncoder(submitter).Encode(SocketRequest{
+ Type: "notify",
+ Notify: &NotifyInput{
+ Source: "check",
+ ID: "1",
+ Text: "A new result.",
+ },
+ }))
+
+ accepted := false
+ answer := json.NewDecoder(submitter)
+ for !accepted {
+ require.NoError(t, answer.Decode(&event))
+
+ accepted = event.Kind == "notify"
+ }
+
+ require.Equal(t, "accepted", event.Status)
+
+ for {
+ require.NoError(t, decoder.Decode(&event))
+ require.NotEqual(t, "notify", event.Kind)
+
+ if event.Kind == "idle" {
+ break
+ }
+ }
+
+ require.NoError(t, submitter.Close())
+ require.NoError(t, observer.Close())
+}
+
+func TestNotificationSocketRejectsMissingOrInvalidData(t *testing.T) {
+ server := newModelFake(t)
+ socket := daemonStartTest(t, server)
+ conn, err := net.Dial("unix", socket)
+ require.NoError(t, err)
+ require.NoError(t, conn.SetDeadline(time.Now().Add(10*time.Second)))
+
+ decoder := json.NewDecoder(conn)
+ encoder := json.NewEncoder(conn)
+
+ var event Event
+
+ require.NoError(t, decoder.Decode(&event))
+ require.Equal(t, "ready", event.Kind)
+
+ testCases := []*NotifyInput{
+ nil,
+ {
+ Source: "invalid source",
+ ID: "1",
+ Text: "data",
+ },
+ }
+
+ for _, tc := range testCases {
+ require.NoError(t, encoder.Encode(SocketRequest{
+ Type: "notify",
+ Notify: tc,
+ }))
+ require.NoError(t, decoder.Decode(&event))
+ require.Equal(t, "error", event.Kind)
+ require.NotContains(t, event.Text, "invalid source")
+ }
+
+ _, err = io.WriteString(conn, `{"type":"notify","agent":"Garden","notify":{"source":"check","id":"1","text":"data"}}`+"\n")
+ require.NoError(t, err)
+ require.NoError(t, decoder.Decode(&event))
+ require.Equal(t, "error", event.Kind)
+
+ require.Zero(t, server.Calls())
+ require.NoError(t, conn.Close())
+}
+
func TestClientsSeeTheTurnAsItHappens(t *testing.T) {
server := newModelFake(t)
server.reply = func(w http.ResponseWriter, call ModelFakeCall) {