github.com/safing/portbase@v0.19.5/modules/subsystems/subsystems_test.go (about) 1 package subsystems 2 3 import ( 4 "os" 5 "testing" 6 "time" 7 8 "github.com/safing/portbase/config" 9 _ "github.com/safing/portbase/database/dbmodule" 10 "github.com/safing/portbase/dataroot" 11 "github.com/safing/portbase/modules" 12 ) 13 14 func TestSubsystems(t *testing.T) { //nolint:paralleltest // Too much interference expected. 15 // tmp dir for data root (db & config) 16 tmpDir, err := os.MkdirTemp("", "portbase-testing-") 17 // initialize data dir 18 if err == nil { 19 err = dataroot.Initialize(tmpDir, 0o0755) 20 } 21 // handle setup error 22 if err != nil { 23 t.Fatal(err) 24 } 25 26 // register 27 28 baseModule := modules.Register("base", nil, nil, nil) 29 Register( 30 "base", 31 "Base", 32 "Framework Groundwork", 33 baseModule, 34 "config:base", 35 nil, 36 ) 37 38 feature1 := modules.Register("feature1", nil, nil, nil) 39 Register( 40 "feature-one", 41 "Feature One", 42 "Provides feature one", 43 feature1, 44 "config:feature1", 45 &config.Option{ 46 Name: "Enable Feature One", 47 Key: "config:subsystems/feature1", 48 Description: "This option enables feature 1", 49 OptType: config.OptTypeBool, 50 DefaultValue: false, 51 }, 52 ) 53 sub1 := DefaultManager.subsys["feature-one"] 54 55 feature2 := modules.Register("feature2", nil, nil, nil) 56 Register( 57 "feature-two", 58 "Feature Two", 59 "Provides feature two", 60 feature2, 61 "config:feature2", 62 &config.Option{ 63 Name: "Enable Feature One", 64 Key: "config:subsystems/feature2", 65 Description: "This option enables feature 2", 66 OptType: config.OptTypeBool, 67 DefaultValue: false, 68 }, 69 ) 70 71 // start 72 err = modules.Start() 73 if err != nil { 74 t.Fatal(err) 75 } 76 77 // test 78 79 // let module fail 80 feature1.Error("test-fail", "Test Fail", "Testing Fail") 81 time.Sleep(10 * time.Millisecond) 82 if sub1.FailureStatus != modules.FailureError { 83 t.Fatal("error did not propagate") 84 } 85 86 // resolve 87 feature1.Resolve("test-fail") 88 time.Sleep(10 * time.Millisecond) 89 if sub1.FailureStatus != modules.FailureNone { 90 t.Fatal("error resolving did not propagate") 91 } 92 93 // update settings 94 err = config.SetConfigOption("config:subsystems/feature2", true) 95 if err != nil { 96 t.Fatal(err) 97 return 98 } 99 time.Sleep(200 * time.Millisecond) 100 if !feature2.Enabled() { 101 t.Fatal("failed to enable feature2") 102 } 103 if feature2.Status() != modules.StatusOnline { 104 t.Fatal("feature2 did not start") 105 } 106 107 // update settings 108 err = config.SetConfigOption("config:subsystems/feature2", false) 109 if err != nil { 110 t.Fatal(err) 111 return 112 } 113 time.Sleep(200 * time.Millisecond) 114 if feature2.Enabled() { 115 t.Fatal("failed to disable feature2") 116 } 117 if feature2.Status() != modules.StatusOffline { 118 t.Fatal("feature2 did not stop") 119 } 120 121 // clean up and exit 122 _ = os.RemoveAll(tmpDir) 123 }