github.com/safing/portbase@v0.19.5/modules/worker_test.go (about)

     1  package modules
     2  
     3  import (
     4  	"context"
     5  	"errors"
     6  	"sync"
     7  	"testing"
     8  	"time"
     9  )
    10  
    11  var (
    12  	wModule = initNewModule("worker test module", nil, nil, nil)
    13  	errTest = errors.New("test error")
    14  )
    15  
    16  func TestWorker(t *testing.T) { //nolint:paralleltest // Too much interference expected.
    17  	// test basic functionality
    18  	err := wModule.RunWorker("test worker", func(ctx context.Context) error {
    19  		return nil
    20  	})
    21  	if err != nil {
    22  		t.Errorf("worker failed (should not): %s", err)
    23  	}
    24  
    25  	// test returning an error
    26  	err = wModule.RunWorker("test worker", func(ctx context.Context) error {
    27  		return errTest
    28  	})
    29  	if !errors.Is(err, errTest) {
    30  		t.Errorf("worker failed with unexpected error: %s", err)
    31  	}
    32  
    33  	// test service functionality
    34  	failCnt := 0
    35  	var sWTestGroup sync.WaitGroup
    36  	sWTestGroup.Add(1)
    37  	wModule.StartServiceWorker("test service-worker", 2*time.Millisecond, func(ctx context.Context) error {
    38  		failCnt++
    39  		t.Logf("service-worker test run #%d", failCnt)
    40  		if failCnt >= 3 {
    41  			sWTestGroup.Done()
    42  			return nil
    43  		}
    44  		return errTest
    45  	})
    46  	// wait for service-worker to complete test
    47  	sWTestGroup.Wait()
    48  	if failCnt != 3 {
    49  		t.Errorf("service-worker failed to restart")
    50  	}
    51  
    52  	// test panic recovery
    53  	err = wModule.RunWorker("test worker", func(ctx context.Context) error {
    54  		var a []byte
    55  		_ = a[0]
    56  		return nil
    57  	})
    58  	t.Logf("panic error message: %s", err)
    59  	panicked, mErr := IsPanic(err)
    60  	if !panicked {
    61  		t.Errorf("failed to return *ModuleError, got %+v", err)
    62  	} else {
    63  		t.Logf("panic stack trace:\n%s", mErr.StackTrace)
    64  	}
    65  }