bfd_transaction_test.go 2.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566
  1. package dynamicrouting
  2. import (
  3. "encoding/json"
  4. "os"
  5. "path/filepath"
  6. "strings"
  7. "testing"
  8. )
  9. func TestBFDSaveFailureRestoresMemory(t *testing.T) {
  10. root := t.TempDir()
  11. bad := filepath.Join(root, "directory")
  12. if err := os.Mkdir(bad, 0700); err != nil {
  13. t.Fatal(err)
  14. }
  15. old := BFDNeighbor{ID: "peer", Address: "192.0.2.1", Disabled: true}
  16. m := &Manager{configPath: bad, config: DynamicConfig{BFDNeighbors: []BFDNeighbor{old}}}
  17. _, err := m.SaveBFDNeighbor(BFDNeighbor{ID: "peer", Address: old.Address, Disabled: false})
  18. if err == nil {
  19. t.Fatal("expected failure")
  20. }
  21. if got := m.ListBFDNeighbors(); len(got) != 1 || !got[0].Disabled {
  22. t.Fatalf("configuration changed: %+v", got)
  23. }
  24. }
  25. func TestBFDApplyFailureRestoresConfig(t *testing.T) {
  26. root := t.TempDir()
  27. birdDir := filepath.Join(root, "bird.conf.new")
  28. if err := os.Mkdir(birdDir, 0700); err != nil {
  29. t.Fatal(err)
  30. }
  31. old := BFDNeighbor{ID: "peer", Address: "192.0.2.1", Disabled: true}
  32. path := filepath.Join(root, "dynamic.json")
  33. m := &Manager{configPath: path, birdConfigPath: filepath.Join(root, "bird.conf"), config: DynamicConfig{BFDNeighbors: []BFDNeighbor{old}}}
  34. if err := m.save(); err != nil {
  35. t.Fatal(err)
  36. }
  37. _, err := m.SaveBFDNeighbor(BFDNeighbor{ID: "peer", Address: old.Address, Disabled: false})
  38. if err == nil || !strings.Contains(err.Error(), "apply BFD") {
  39. t.Fatalf("unexpected: %v", err)
  40. }
  41. var saved DynamicConfig
  42. data, err := os.ReadFile(path)
  43. if err != nil {
  44. t.Fatal(err)
  45. }
  46. if err = json.Unmarshal(data, &saved); err != nil {
  47. t.Fatal(err)
  48. }
  49. if len(saved.BFDNeighbors) != 1 || !saved.BFDNeighbors[0].Disabled || !m.ListBFDNeighbors()[0].Disabled {
  50. t.Fatalf("configuration not restored: %+v", saved.BFDNeighbors)
  51. }
  52. }
  53. func TestActiveEIGRPRequiresVtysh(t *testing.T) {
  54. t.Setenv("PATH", t.TempDir())
  55. m := &Manager{config: DynamicConfig{EIGRPInstances: []EIGRPInstance{{Name: "test", Disabled: false}}}}
  56. if err := m.applyFRREigrpConfig(); err == nil || !strings.Contains(err.Error(), "vtysh") {
  57. t.Fatalf("expected vtysh error, got %v", err)
  58. }
  59. m.config.EIGRPInstances[0].Disabled = true
  60. if err := m.applyFRREigrpConfig(); err != nil {
  61. t.Fatalf("inactive EIGRP: %v", err)
  62. }
  63. }