]> git.giacomolli.uk - onechat/blobdiff - daemon_test.go
Submit root events through the local socket
[onechat] / daemon_test.go
index c6cc2279a3435c514de8f943028fbc74f6cb8825..a32977890b31777e5075690a359bb5769f83ac52 100644 (file)
 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) {