serve_test.go 2.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596
  1. package cmd
  2. import (
  3. "fmt"
  4. "math/rand"
  5. "os"
  6. "os/exec"
  7. "path/filepath"
  8. "testing"
  9. "time"
  10. "github.com/gorilla/websocket"
  11. "github.com/stretchr/testify/assert"
  12. "github.com/stretchr/testify/require"
  13. "heckel.io/ntfy/client"
  14. "heckel.io/ntfy/test"
  15. "heckel.io/ntfy/util"
  16. )
  17. func init() {
  18. rand.Seed(time.Now().UnixMilli())
  19. }
  20. func TestCLI_Serve_Unix_Curl(t *testing.T) {
  21. t.Parallel()
  22. sockFile := filepath.Join(t.TempDir(), "ntfy.sock")
  23. configFile := newEmptyFile(t) // Avoid issues with existing server.yml file on system
  24. go func() {
  25. app, _, _, _ := newTestApp()
  26. err := app.Run([]string{"ntfy", "serve", "--config=" + configFile, "--listen-http=-", "--listen-unix=" + sockFile})
  27. require.Nil(t, err)
  28. }()
  29. for i := 0; i < 40 && !util.FileExists(sockFile); i++ {
  30. time.Sleep(50 * time.Millisecond)
  31. }
  32. require.True(t, util.FileExists(sockFile))
  33. cmd := exec.Command("curl", "-s", "--unix-socket", sockFile, "-d", "this is a message", "localhost/mytopic")
  34. out, err := cmd.Output()
  35. require.Nil(t, err)
  36. m := toMessage(t, string(out))
  37. require.Equal(t, "this is a message", m.Message)
  38. }
  39. func TestCLI_Serve_WebSocket(t *testing.T) {
  40. port := 10000 + rand.Intn(20000)
  41. go func() {
  42. configFile := newEmptyFile(t) // Avoid issues with existing server.yml file on system
  43. app, _, _, _ := newTestApp()
  44. err := app.Run([]string{"ntfy", "serve", "--config=" + configFile, fmt.Sprintf("--listen-http=:%d", port)})
  45. require.Nil(t, err)
  46. }()
  47. test.WaitForPortUp(t, port)
  48. ws, _, err := websocket.DefaultDialer.Dial(fmt.Sprintf("ws://127.0.0.1:%d/mytopic/ws", port), nil)
  49. require.Nil(t, err)
  50. messageType, data, err := ws.ReadMessage()
  51. require.Nil(t, err)
  52. require.Equal(t, websocket.TextMessage, messageType)
  53. require.Equal(t, "open", toMessage(t, string(data)).Event)
  54. c := client.New(client.NewConfig())
  55. _, err = c.Publish(fmt.Sprintf("http://127.0.0.1:%d/mytopic", port), "my message")
  56. require.Nil(t, err)
  57. messageType, data, err = ws.ReadMessage()
  58. require.Nil(t, err)
  59. require.Equal(t, websocket.TextMessage, messageType)
  60. m := toMessage(t, string(data))
  61. require.Equal(t, "my message", m.Message)
  62. require.Equal(t, "mytopic", m.Topic)
  63. }
  64. func TestIP_Host_Parsing(t *testing.T) {
  65. cases := map[string]string{
  66. "1.1.1.1": "1.1.1.1/32",
  67. "fd00::1234": "fd00::1234/128",
  68. "192.168.0.3/24": "192.168.0.0/24",
  69. "10.1.2.3/8": "10.0.0.0/8",
  70. "201:be93::4a6/21": "201:b800::/21",
  71. }
  72. for q, expectedAnswer := range cases {
  73. ips, err := parseIPHostPrefix(q)
  74. require.Nil(t, err)
  75. assert.Equal(t, 1, len(ips))
  76. assert.Equal(t, expectedAnswer, ips[0].String())
  77. }
  78. }
  79. func newEmptyFile(t *testing.T) string {
  80. filename := filepath.Join(t.TempDir(), "empty")
  81. require.Nil(t, os.WriteFile(filename, []byte{}, 0600))
  82. return filename
  83. }