diff --git a/api/services.go b/api/services.go index 42630e219f517214d9d494284d12f243b43a30b3..54288eada7350254940b53f37c673a3599726b71 100644 --- a/api/services.go +++ b/api/services.go @@ -101,6 +101,8 @@ func (s *services) stop() error { return errors.WithMessage(err, "Failed to stop services") } + s.state = Stopped + return nil } diff --git a/api/services_test.go b/api/services_test.go new file mode 100644 index 0000000000000000000000000000000000000000..bfc1f3b71786f6ad711076aace4fca5f41e7b4fc --- /dev/null +++ b/api/services_test.go @@ -0,0 +1,122 @@ +/////////////////////////////////////////////////////////////////////////////// +// Copyright © 2020 xx network SEZC // +// // +// Use of this source code is governed by a license that can be found in the // +// LICENSE file // +/////////////////////////////////////////////////////////////////////////////// + +package api + +import ( + "errors" + "gitlab.com/elixxir/client/stoppable" + "reflect" + "testing" + "time" +) + +// Unit test +func TestNewServices(t *testing.T) { + expected := &services{ + services: make([]Service, 0), + stoppable: stoppable.NewMulti("services"), + state: Stopped, + } + + received := newServices() + + if !reflect.DeepEqual(expected, received) { + t.Fatalf("Unexpected value in constructor (newServices): "+ + "\n\tExpected: %v"+ + "\n\tReceived: %v", expected, received) + } +} + +// Unit test +func TestServices_Add(t *testing.T) { + mockService := func() (stoppable.Stoppable, error) { + return nil, nil + } + + mockServices := newServices() + + err := mockServices.add(mockService) + if err != nil { + t.Fatalf("Failed to add mock service to services: %v", err) + } + + err = mockServices.start(500 * time.Millisecond) + if err != nil { + t.Fatalf("Failed to start mock services: %v", err) + } + + // Add a doomed to fail process + mockServiceErr := func() (stoppable.Stoppable, error) { + return nil, errors.New("Expected failure case") + } + + err = mockServices.add(mockServiceErr) + if err == nil { + t.Fatalf("Expected error case: " + + "Service should have started and failed") + } +} + +func TestServices_Start(t *testing.T) { + mockService := func() (stoppable.Stoppable, error) { + return nil, nil + } + + mockServices := newServices() + + err := mockServices.add(mockService) + if err != nil { + t.Fatalf("Failed to add mock service to services: %v", err) + } + + err = mockServices.start(500) + if err != nil { + t.Fatalf("Failed to start mock services: %v", err) + } + + // Try and start again should error + err = mockServices.start(500 * time.Millisecond) + if err == nil { + t.Fatalf("Should fail when calling start with running processes") + } +} + +func TestServices_Stop(t *testing.T) { + mockService := func() (stoppable.Stoppable, error) { + return stoppable.NewSingle("test"), nil + } + + mockServices := newServices() + + err := mockServices.add(mockService) + if err != nil { + t.Fatalf("Failed to add mock service to services: %v", err) + } + + err = mockServices.stop() + if err == nil { + t.Fatalf("Should error when calling " + + "stop on non-running service") + } + + err = mockServices.start(500) + if err != nil { + t.Fatalf("Failed to start mock services: %v", err) + } + + err = mockServices.stop() + if err != nil { + t.Fatalf("Should not error when calling stop; %v", err) + } + + err = mockServices.stop() + if err == nil { + t.Fatalf("Should error when stopping a stopped service") + } + +}