2022-01-16 03:33:35 +00:00
|
|
|
package cmd
|
|
|
|
|
|
|
|
import (
|
|
|
|
"fmt"
|
|
|
|
"math/rand"
|
2022-01-26 03:04:54 +00:00
|
|
|
"os"
|
2022-01-16 03:33:35 +00:00
|
|
|
"os/exec"
|
|
|
|
"path/filepath"
|
|
|
|
"testing"
|
|
|
|
"time"
|
2022-10-08 02:15:45 +00:00
|
|
|
|
|
|
|
"github.com/gorilla/websocket"
|
|
|
|
"github.com/stretchr/testify/assert"
|
|
|
|
"github.com/stretchr/testify/require"
|
|
|
|
"heckel.io/ntfy/client"
|
|
|
|
"heckel.io/ntfy/test"
|
|
|
|
"heckel.io/ntfy/util"
|
2022-01-16 03:33:35 +00:00
|
|
|
)
|
|
|
|
|
|
|
|
func init() {
|
|
|
|
rand.Seed(time.Now().UnixMilli())
|
|
|
|
}
|
|
|
|
|
|
|
|
func TestCLI_Serve_Unix_Curl(t *testing.T) {
|
2023-02-26 01:23:22 +00:00
|
|
|
t.Parallel()
|
2022-01-16 03:33:35 +00:00
|
|
|
sockFile := filepath.Join(t.TempDir(), "ntfy.sock")
|
2022-01-26 03:04:54 +00:00
|
|
|
configFile := newEmptyFile(t) // Avoid issues with existing server.yml file on system
|
2022-01-16 03:33:35 +00:00
|
|
|
go func() {
|
|
|
|
app, _, _, _ := newTestApp()
|
2022-01-26 03:04:54 +00:00
|
|
|
err := app.Run([]string{"ntfy", "serve", "--config=" + configFile, "--listen-http=-", "--listen-unix=" + sockFile})
|
2022-01-16 03:33:35 +00:00
|
|
|
require.Nil(t, err)
|
|
|
|
}()
|
|
|
|
for i := 0; i < 40 && !util.FileExists(sockFile); i++ {
|
|
|
|
time.Sleep(50 * time.Millisecond)
|
|
|
|
}
|
|
|
|
require.True(t, util.FileExists(sockFile))
|
|
|
|
|
|
|
|
cmd := exec.Command("curl", "-s", "--unix-socket", sockFile, "-d", "this is a message", "localhost/mytopic")
|
|
|
|
out, err := cmd.Output()
|
|
|
|
require.Nil(t, err)
|
|
|
|
m := toMessage(t, string(out))
|
|
|
|
require.Equal(t, "this is a message", m.Message)
|
|
|
|
}
|
|
|
|
|
|
|
|
func TestCLI_Serve_WebSocket(t *testing.T) {
|
|
|
|
port := 10000 + rand.Intn(20000)
|
|
|
|
go func() {
|
2022-01-26 03:04:54 +00:00
|
|
|
configFile := newEmptyFile(t) // Avoid issues with existing server.yml file on system
|
2022-01-16 03:33:35 +00:00
|
|
|
app, _, _, _ := newTestApp()
|
2022-01-26 03:04:54 +00:00
|
|
|
err := app.Run([]string{"ntfy", "serve", "--config=" + configFile, fmt.Sprintf("--listen-http=:%d", port)})
|
2022-01-16 03:33:35 +00:00
|
|
|
require.Nil(t, err)
|
|
|
|
}()
|
|
|
|
test.WaitForPortUp(t, port)
|
|
|
|
|
|
|
|
ws, _, err := websocket.DefaultDialer.Dial(fmt.Sprintf("ws://127.0.0.1:%d/mytopic/ws", port), nil)
|
|
|
|
require.Nil(t, err)
|
|
|
|
|
|
|
|
messageType, data, err := ws.ReadMessage()
|
|
|
|
require.Nil(t, err)
|
|
|
|
require.Equal(t, websocket.TextMessage, messageType)
|
|
|
|
require.Equal(t, "open", toMessage(t, string(data)).Event)
|
|
|
|
|
|
|
|
c := client.New(client.NewConfig())
|
|
|
|
_, err = c.Publish(fmt.Sprintf("http://127.0.0.1:%d/mytopic", port), "my message")
|
|
|
|
require.Nil(t, err)
|
|
|
|
|
|
|
|
messageType, data, err = ws.ReadMessage()
|
|
|
|
require.Nil(t, err)
|
|
|
|
require.Equal(t, websocket.TextMessage, messageType)
|
|
|
|
|
|
|
|
m := toMessage(t, string(data))
|
|
|
|
require.Equal(t, "my message", m.Message)
|
|
|
|
require.Equal(t, "mytopic", m.Topic)
|
|
|
|
}
|
2022-01-26 03:04:54 +00:00
|
|
|
|
2022-10-08 02:15:45 +00:00
|
|
|
func TestIP_Host_Parsing(t *testing.T) {
|
|
|
|
cases := map[string]string{
|
|
|
|
"1.1.1.1": "1.1.1.1/32",
|
|
|
|
"fd00::1234": "fd00::1234/128",
|
|
|
|
"192.168.0.3/24": "192.168.0.0/24",
|
|
|
|
"10.1.2.3/8": "10.0.0.0/8",
|
|
|
|
"201:be93::4a6/21": "201:b800::/21",
|
|
|
|
}
|
|
|
|
for q, expectedAnswer := range cases {
|
|
|
|
ips, err := parseIPHostPrefix(q)
|
|
|
|
require.Nil(t, err)
|
|
|
|
assert.Equal(t, 1, len(ips))
|
|
|
|
assert.Equal(t, expectedAnswer, ips[0].String())
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2022-01-26 03:04:54 +00:00
|
|
|
func newEmptyFile(t *testing.T) string {
|
|
|
|
filename := filepath.Join(t.TempDir(), "empty")
|
|
|
|
require.Nil(t, os.WriteFile(filename, []byte{}, 0600))
|
|
|
|
return filename
|
|
|
|
}
|