110 lines
1.8 KiB
Go
110 lines
1.8 KiB
Go
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
|
|
})
|
|
}
|