starter/service_test.go

110 lines
1.8 KiB
Go
Raw Normal View History

package starter_test
import (
"context"
"os"
"sync"
"testing"
"time"
"apigo.cc/go/log"
"apigo.cc/go/starter"
)
type mockService struct {
name string
startDelay time.Duration
stopDelay time.Duration
startErr error
stopErr error
healthErr error
startedAt time.Time
stoppedAt time.Time
reloadedAt time.Time
signalCaught os.Signal
startOrder int
stopOrder int
mu sync.Mutex
}
var (
orderMu sync.Mutex
globalOrder int
)
func resetOrder() {
orderMu.Lock()
defer orderMu.Unlock()
globalOrder = 0
}
func getOrder() int {
orderMu.Lock()
defer orderMu.Unlock()
globalOrder++
return globalOrder
}
func (s *mockService) Start(ctx context.Context, logger *log.Logger) error {
select {
case <-time.After(s.startDelay):
if s.startErr != nil {
return s.startErr
}
s.mu.Lock()
s.startedAt = time.Now()
s.startOrder = getOrder()
s.mu.Unlock()
return nil
case <-ctx.Done():
return ctx.Err()
}
}
func (s *mockService) Stop(ctx context.Context) error {
select {
case <-time.After(s.stopDelay):
if s.stopErr != nil {
return s.stopErr
}
s.mu.Lock()
s.stoppedAt = time.Now()
s.stopOrder = getOrder()
s.mu.Unlock()
return nil
case <-ctx.Done():
return ctx.Err()
}
}
func (s *mockService) Health() error {
return s.healthErr
}
func (s *mockService) Reload() error {
s.mu.Lock()
s.reloadedAt = time.Now()
s.mu.Unlock()
return nil
}
func (s *mockService) HandleUserSignal(sig os.Signal) bool {
s.mu.Lock()
s.signalCaught = sig
s.mu.Unlock()
return true
}
func TestServiceRegister(t *testing.T) {
resetOrder()
s1 := &mockService{name: "s1"}
starter.Register("s1", s1, 1, 0, 0)
}
func TestStarterBasics(t *testing.T) {
starter.SetAppInfo("TestApp", "1.0.1")
starter.AddCommand("custom", "desc", func() {
// custom cmd
})
}