// 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)