sub_panic_test.go 1.5 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243
  1. package sub
  2. import (
  3. "fmt"
  4. "testing"
  5. "github.com/gin-gonic/gin"
  6. )
  7. // A subscription is built by iterating every client's share link with no
  8. // recover(), so any panic in the link generators 500s the whole subscription
  9. // for every client. Valid-but-unusual stream settings (an empty Reality
  10. // shortIds/serverNames array, a tcp-http header with no request, a grpc block
  11. // missing its keys) must therefore produce a link, not a panic.
  12. func TestGetSubsToleratesUnusualStreamSettings(t *testing.T) {
  13. gin.SetMode(gin.TestMode)
  14. cases := []struct {
  15. name string
  16. stream string
  17. }{
  18. {"reality empty arrays", `{"network":"tcp","security":"reality","realitySettings":{"serverNames":[],"shortIds":[],"settings":{"publicKey":"pk"}}}`},
  19. {"tcp http missing request", `{"network":"tcp","security":"none","tcpSettings":{"header":{"type":"http","response":{"headers":{}}}}}`},
  20. {"tcp http empty path", `{"network":"tcp","security":"none","tcpSettings":{"header":{"type":"http","request":{"path":[]}}}}`},
  21. {"grpc missing keys", `{"network":"grpc","security":"none","grpcSettings":{}}`},
  22. {"empty stream settings", `{}`},
  23. }
  24. for i, tc := range cases {
  25. t.Run(tc.name, func(t *testing.T) {
  26. seedSubDB(t)
  27. subId := fmt.Sprintf("s%d", i)
  28. seedSubInbound(t, subId, fmt.Sprintf("t%d", i), 46000+i, 1, tc.stream)
  29. links, _, _, _, err := NewSubService("").GetSubs(subId, "req.example.com")
  30. if err != nil {
  31. t.Fatalf("GetSubs errored: %v", err)
  32. }
  33. if len(links) != 1 {
  34. t.Fatalf("expected 1 share link, got %d", len(links))
  35. }
  36. })
  37. }
  38. }