| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116 |
- package dynamicrouting
- import (
- "encoding/json"
- "os"
- "path/filepath"
- "strings"
- "testing"
- )
- func TestBFDSaveFailureRestoresMemory(t *testing.T) {
- root := t.TempDir()
- bad := filepath.Join(root, "directory")
- if err := os.Mkdir(bad, 0700); err != nil {
- t.Fatal(err)
- }
- old := BFDNeighbor{ID: "peer", Address: "192.0.2.1", Disabled: true}
- m := &Manager{configPath: bad, config: DynamicConfig{BFDNeighbors: []BFDNeighbor{old}}}
- _, err := m.SaveBFDNeighbor(BFDNeighbor{ID: "peer", Address: old.Address, Disabled: false})
- if err == nil {
- t.Fatal("expected failure")
- }
- if got := m.ListBFDNeighbors(); len(got) != 1 || !got[0].Disabled {
- t.Fatalf("configuration changed: %+v", got)
- }
- }
- func TestBFDApplyFailureRestoresConfig(t *testing.T) {
- root := t.TempDir()
- birdDir := filepath.Join(root, "bird.conf.new")
- if err := os.Mkdir(birdDir, 0700); err != nil {
- t.Fatal(err)
- }
- old := BFDNeighbor{ID: "peer", Address: "192.0.2.1", Disabled: true}
- path := filepath.Join(root, "dynamic.json")
- m := &Manager{configPath: path, birdConfigPath: filepath.Join(root, "bird.conf"), config: DynamicConfig{BFDNeighbors: []BFDNeighbor{old}}}
- if err := m.save(); err != nil {
- t.Fatal(err)
- }
- _, err := m.SaveBFDNeighbor(BFDNeighbor{ID: "peer", Address: old.Address, Disabled: false})
- if err == nil || !strings.Contains(err.Error(), "apply BFD") {
- t.Fatalf("unexpected: %v", err)
- }
- var saved DynamicConfig
- data, err := os.ReadFile(path)
- if err != nil {
- t.Fatal(err)
- }
- if err = json.Unmarshal(data, &saved); err != nil {
- t.Fatal(err)
- }
- if len(saved.BFDNeighbors) != 1 || !saved.BFDNeighbors[0].Disabled || !m.ListBFDNeighbors()[0].Disabled {
- t.Fatalf("configuration not restored: %+v", saved.BFDNeighbors)
- }
- }
- func TestActiveEIGRPRequiresVtysh(t *testing.T) {
- t.Setenv("PATH", t.TempDir())
- m := &Manager{config: DynamicConfig{EIGRPInstances: []EIGRPInstance{{Name: "test", Disabled: false}}}}
- if err := m.applyFRREigrpConfig(); err == nil || !strings.Contains(err.Error(), "vtysh") {
- t.Fatalf("expected vtysh error, got %v", err)
- }
- m.config.EIGRPInstances[0].Disabled = true
- if err := m.applyFRREigrpConfig(); err != nil {
- t.Fatalf("inactive EIGRP: %v", err)
- }
- }
- func TestRoutingFilterApplyFailureRestoresPreviousConfig(t *testing.T) {
- root := t.TempDir()
- if err := os.Mkdir(filepath.Join(root, "bird.conf.new"), 0700); err != nil {
- t.Fatal(err)
- }
- path := filepath.Join(root, "dynamic.json")
- old := RoutingFilterRule{ID: "rule-1", Chain: "test", Action: "accept", RuleOrder: 10}
- m := &Manager{configPath: path, birdConfigPath: filepath.Join(root, "bird.conf"), config: DynamicConfig{RoutingFilters: []RoutingFilterRule{old}}}
- if err := m.save(); err != nil {
- t.Fatal(err)
- }
- edited := old
- edited.Action = "discard"
- if err := m.SaveRoutingFilter(&edited); err == nil || !strings.Contains(err.Error(), "applying routing policies") {
- t.Fatalf("apply failure: %v", err)
- }
- rules := m.ListRoutingFilters()
- if len(rules) != 1 || rules[0].Action != "accept" {
- t.Fatalf("memory not restored: %+v", rules)
- }
- data, err := os.ReadFile(path)
- if err != nil {
- t.Fatal(err)
- }
- var stored DynamicConfig
- if err = json.Unmarshal(data, &stored); err != nil {
- t.Fatal(err)
- }
- if len(stored.RoutingFilters) != 1 || stored.RoutingFilters[0].Action != "accept" {
- t.Fatalf("storage not restored: %+v", stored.RoutingFilters)
- }
- }
- func TestRoutingFilterSaveFailureRestoresMemory(t *testing.T) {
- root := t.TempDir()
- bad := filepath.Join(root, "dir")
- if err := os.Mkdir(bad, 0700); err != nil {
- t.Fatal(err)
- }
- old := RoutingFilterRule{ID: "rule", Chain: "x", Action: "accept"}
- m := &Manager{configPath: bad, config: DynamicConfig{RoutingFilters: []RoutingFilterRule{old}}}
- next := old
- next.Action = "discard"
- if err := m.SaveRoutingFilter(&next); err == nil {
- t.Fatal("save failure ignored")
- }
- if got := m.ListRoutingFilters(); len(got) != 1 || got[0].Action != "accept" {
- t.Fatalf("memory changed: %+v", got)
- }
- }
|