manager_test.go 2.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566
  1. package tools
  2. import (
  3. "context"
  4. "errors"
  5. "os"
  6. "path/filepath"
  7. "strings"
  8. "testing"
  9. )
  10. func TestPingReportsExecutionErrorsAndNoReply(t *testing.T) {
  11. dir := t.TempDir()
  12. t.Setenv("PATH", dir)
  13. m := NewManager()
  14. if _, err := m.RunPing(context.Background(), PingRequest{Target: "192.0.2.1"}); err == nil {
  15. t.Fatal("missing ping binary reported as timeout")
  16. }
  17. path := filepath.Join(dir, "ping")
  18. if err := os.WriteFile(path, []byte("#!/bin/sh\nprintf 'ping: invalid option\\n'\nexit 2\n"), 0755); err != nil {
  19. t.Fatal(err)
  20. }
  21. if _, err := m.RunPing(context.Background(), PingRequest{Target: "192.0.2.1"}); err == nil || !strings.Contains(err.Error(), "invalid option") {
  22. t.Fatalf("execution error: %v", err)
  23. }
  24. if err := os.WriteFile(path, []byte("#!/bin/sh\nprintf '1 packets transmitted, 0 received, 100%% packet loss\\n'\nexit 1\n"), 0755); err != nil {
  25. t.Fatal(err)
  26. }
  27. resp, err := m.RunPing(context.Background(), PingRequest{Target: "192.0.2.1", Count: 1})
  28. if err != nil || resp.Status != "timeout" || resp.PacketLossPct != 100 {
  29. t.Fatalf("no reply: %+v %v", resp, err)
  30. }
  31. if _, err := m.RunPing(context.Background(), PingRequest{Target: "192.0.2.1", Interface: "bad interface"}); err == nil {
  32. t.Fatal("invalid interface ignored")
  33. }
  34. }
  35. func TestStreamPingReportsExecutionError(t *testing.T) {
  36. dir := t.TempDir()
  37. t.Setenv("PATH", dir)
  38. if err := os.WriteFile(filepath.Join(dir, "ping"), []byte("#!/bin/sh\nprintf 'ping: invalid option\\n'\nexit 2\n"), 0755); err != nil {
  39. t.Fatal(err)
  40. }
  41. var events []PingStreamEvent
  42. err := NewManager().StreamPing(context.Background(), PingRequest{Target: "192.0.2.1"}, func(e PingStreamEvent) { events = append(events, e) })
  43. if err == nil {
  44. t.Fatal("ping process failure ignored")
  45. }
  46. for _, event := range events {
  47. if event.Type == "done" {
  48. t.Fatal("reported completion after execution failure")
  49. }
  50. }
  51. if err = NewManager().StreamPing(context.Background(), PingRequest{Target: "192.0.2.1", Interface: "bad interface"}, func(PingStreamEvent) {}); err == nil {
  52. t.Fatal("invalid interface accepted")
  53. }
  54. }
  55. func TestPingHonorsCanceledContext(t *testing.T) {
  56. ctx, cancel := context.WithCancel(context.Background())
  57. cancel()
  58. _, err := NewManager().RunPing(ctx, PingRequest{Target: "192.0.2.1"})
  59. if !errors.Is(err, context.Canceled) {
  60. t.Fatalf("expected canceled context, got %v", err)
  61. }
  62. }