93 lines
2.5 KiB
Go
93 lines
2.5 KiB
Go
// Package runtimemanagerstub provides an in-process ports.RuntimeManager
|
|
// implementation used by service-level and worker-level tests that do
|
|
// not need a real Redis connection. The stub records every published
|
|
// job and supports inject-on-error to simulate stream failures.
|
|
//
|
|
// Production code never wires this stub.
|
|
package runtimemanagerstub
|
|
|
|
import (
|
|
"context"
|
|
"errors"
|
|
"sync"
|
|
|
|
"galaxy/lobby/internal/ports"
|
|
)
|
|
|
|
// Publisher is a concurrency-safe in-memory ports.RuntimeManager.
|
|
type Publisher struct {
|
|
mu sync.Mutex
|
|
startErr error
|
|
stopErr error
|
|
startJobs []string
|
|
stopJobs []string
|
|
}
|
|
|
|
// NewPublisher constructs an empty Publisher.
|
|
func NewPublisher() *Publisher {
|
|
return &Publisher{}
|
|
}
|
|
|
|
// SetStartError makes the next PublishStartJob calls return err.
|
|
// Passing nil clears the override.
|
|
func (publisher *Publisher) SetStartError(err error) {
|
|
publisher.mu.Lock()
|
|
defer publisher.mu.Unlock()
|
|
publisher.startErr = err
|
|
}
|
|
|
|
// SetStopError makes the next PublishStopJob calls return err.
|
|
// Passing nil clears the override.
|
|
func (publisher *Publisher) SetStopError(err error) {
|
|
publisher.mu.Lock()
|
|
defer publisher.mu.Unlock()
|
|
publisher.stopErr = err
|
|
}
|
|
|
|
// StartJobs returns the ordered slice of game ids passed to
|
|
// PublishStartJob.
|
|
func (publisher *Publisher) StartJobs() []string {
|
|
publisher.mu.Lock()
|
|
defer publisher.mu.Unlock()
|
|
return append([]string(nil), publisher.startJobs...)
|
|
}
|
|
|
|
// StopJobs returns the ordered slice of game ids passed to
|
|
// PublishStopJob.
|
|
func (publisher *Publisher) StopJobs() []string {
|
|
publisher.mu.Lock()
|
|
defer publisher.mu.Unlock()
|
|
return append([]string(nil), publisher.stopJobs...)
|
|
}
|
|
|
|
// PublishStartJob records gameID and returns the configured error.
|
|
func (publisher *Publisher) PublishStartJob(ctx context.Context, gameID string) error {
|
|
if ctx == nil {
|
|
return errors.New("publish start job: nil context")
|
|
}
|
|
publisher.mu.Lock()
|
|
defer publisher.mu.Unlock()
|
|
if publisher.startErr != nil {
|
|
return publisher.startErr
|
|
}
|
|
publisher.startJobs = append(publisher.startJobs, gameID)
|
|
return nil
|
|
}
|
|
|
|
// PublishStopJob records gameID and returns the configured error.
|
|
func (publisher *Publisher) PublishStopJob(ctx context.Context, gameID string) error {
|
|
if ctx == nil {
|
|
return errors.New("publish stop job: nil context")
|
|
}
|
|
publisher.mu.Lock()
|
|
defer publisher.mu.Unlock()
|
|
if publisher.stopErr != nil {
|
|
return publisher.stopErr
|
|
}
|
|
publisher.stopJobs = append(publisher.stopJobs, gameID)
|
|
return nil
|
|
}
|
|
|
|
// Compile-time interface assertion.
|
|
var _ ports.RuntimeManager = (*Publisher)(nil)
|