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  }