github.com/Pankov404/juju@v0.0.0-20150703034450-be266991dceb/service/windows/service_windows_test.go (about)

     1  // Copyright 2015 Cloudbase Solutions
     2  // Copyright 2015 Canonical Ltd.
     3  // Licensed under the AGPLv3, see LICENCE file for details.
     4  
     5  // +build !linux windows
     6  
     7  package windows_test
     8  
     9  import (
    10  	"github.com/gabriel-samfira/sys/windows/svc"
    11  	"github.com/juju/errors"
    12  	"github.com/juju/testing"
    13  	jc "github.com/juju/testing/checkers"
    14  	gc "gopkg.in/check.v1"
    15  
    16  	"github.com/juju/juju/service/common"
    17  	"github.com/juju/juju/service/windows"
    18  	coretesting "github.com/juju/juju/testing"
    19  )
    20  
    21  type serviceManagerSuite struct {
    22  	coretesting.BaseSuite
    23  
    24  	stub       *testing.Stub
    25  	passwdStub *testing.Stub
    26  	conn       *windows.StubMgr
    27  	getPasswd  *windows.StubGetPassword
    28  
    29  	name string
    30  	conf common.Conf
    31  
    32  	mgr windows.ServiceManager
    33  
    34  	execPath string
    35  }
    36  
    37  var _ = gc.Suite(&serviceManagerSuite{})
    38  
    39  func (s *serviceManagerSuite) SetUpTest(c *gc.C) {
    40  	s.BaseSuite.SetUpTest(c)
    41  	var err error
    42  	s.execPath = `C:\juju\bin\jujud.exe`
    43  	s.stub = &testing.Stub{}
    44  	s.passwdStub = &testing.Stub{}
    45  	s.conn = windows.PatchMgrConnect(s, s.stub)
    46  	s.getPasswd = windows.PatchGetPassword(s, s.passwdStub)
    47  
    48  	// Set up the service.
    49  	s.name = "machine-1"
    50  	s.conf = common.Conf{
    51  		Desc:      "service for " + s.name,
    52  		ExecStart: s.execPath + " " + s.name,
    53  	}
    54  
    55  	s.mgr, err = windows.NewServiceManager()
    56  	c.Assert(err, gc.IsNil)
    57  
    58  	// Clear services
    59  	s.conn.Clear()
    60  }
    61  
    62  func (s *serviceManagerSuite) TestCreate(c *gc.C) {
    63  	s.getPasswd.SetPasswd("fake")
    64  	err := s.mgr.Create(s.name, s.conf)
    65  	c.Assert(err, gc.IsNil)
    66  
    67  	c.Assert(s.getPasswd.Calls(), gc.HasLen, 1)
    68  
    69  	exists := s.conn.Exists(s.name)
    70  	c.Assert(exists, jc.IsTrue)
    71  
    72  	svcs := s.conn.List()
    73  	c.Assert(svcs, gc.HasLen, 1)
    74  
    75  	m, ok := s.mgr.(*windows.SvcManager)
    76  	c.Assert(ok, jc.IsTrue)
    77  
    78  	cfg, err := m.Config(s.name)
    79  	c.Assert(err, gc.IsNil)
    80  	c.Assert(cfg.ServiceStartName, gc.Equals, windows.JujudUser)
    81  
    82  	running, err := s.mgr.Running(s.name)
    83  	c.Assert(err, gc.IsNil)
    84  	c.Assert(running, jc.IsFalse)
    85  }
    86  
    87  func (s *serviceManagerSuite) TestCreateInvalidPassword(c *gc.C) {
    88  	passwdError := errors.New("Failed to get password")
    89  	s.passwdStub.SetErrors(passwdError)
    90  
    91  	err := s.mgr.Create(s.name, s.conf)
    92  	c.Assert(errors.Cause(err), gc.Equals, passwdError)
    93  
    94  	c.Assert(s.getPasswd.Calls(), gc.HasLen, 1)
    95  
    96  	exists := s.conn.Exists(s.name)
    97  	c.Assert(exists, jc.IsFalse)
    98  }
    99  
   100  func (s *serviceManagerSuite) TestCreateInvalidUser(c *gc.C) {
   101  	s.getPasswd.SetPasswd("fake")
   102  
   103  	err := s.mgr.Create(s.name, s.conf)
   104  	c.Assert(err, gc.IsNil)
   105  
   106  	c.Assert(s.getPasswd.Calls(), gc.HasLen, 1)
   107  
   108  	m, ok := s.mgr.(*windows.SvcManager)
   109  	c.Assert(ok, jc.IsTrue)
   110  
   111  	cfg, err := m.Config(s.name)
   112  
   113  	c.Assert(err, gc.IsNil)
   114  	c.Assert(cfg.ServiceStartName, gc.Equals, windows.JujudUser)
   115  }
   116  
   117  func (s *serviceManagerSuite) TestCreateAlreadyExists(c *gc.C) {
   118  	err := s.mgr.Create(s.name, s.conf)
   119  	c.Assert(err, gc.IsNil)
   120  	exists := s.conn.Exists(s.name)
   121  	c.Assert(exists, jc.IsTrue)
   122  	err = s.mgr.Create(s.name, s.conf)
   123  	c.Assert(errors.Cause(err), gc.Equals, windows.ERROR_SERVICE_EXISTS)
   124  }
   125  
   126  func (s *serviceManagerSuite) TestCreateMultipleServices(c *gc.C) {
   127  	err := s.mgr.Create("test-service", common.Conf{})
   128  	c.Assert(err, gc.IsNil)
   129  	exists := s.conn.Exists("test-service")
   130  	c.Assert(exists, jc.IsTrue)
   131  
   132  	err = s.mgr.Create("another-test-service", common.Conf{})
   133  	c.Assert(err, gc.IsNil)
   134  	exists = s.conn.Exists("another-test-service")
   135  	c.Assert(exists, jc.IsTrue)
   136  
   137  	svcs := s.conn.List()
   138  	c.Assert(svcs, gc.HasLen, 2)
   139  }
   140  
   141  func (s *serviceManagerSuite) TestStart(c *gc.C) {
   142  	windows.AddService(s.name, s.execPath, s.stub, svc.Status{State: svc.Stopped})
   143  
   144  	err := s.mgr.Start(s.name)
   145  	c.Assert(err, gc.IsNil)
   146  
   147  	running, err := s.mgr.Running(s.name)
   148  	c.Assert(err, gc.IsNil)
   149  	c.Assert(running, jc.IsTrue)
   150  }
   151  
   152  func (s *serviceManagerSuite) TestStartTwice(c *gc.C) {
   153  	windows.AddService(s.name, s.execPath, s.stub, svc.Status{State: svc.Stopped})
   154  
   155  	err := s.mgr.Start(s.name)
   156  	c.Assert(err, gc.IsNil)
   157  
   158  	err = s.mgr.Start(s.name)
   159  	c.Assert(err, gc.IsNil)
   160  
   161  	running, err := s.mgr.Running(s.name)
   162  	c.Assert(err, gc.IsNil)
   163  	c.Assert(running, jc.IsTrue)
   164  }
   165  
   166  func (s *serviceManagerSuite) TestStartStop(c *gc.C) {
   167  	windows.AddService(s.name, s.execPath, s.stub, svc.Status{State: svc.Stopped})
   168  
   169  	err := s.mgr.Start(s.name)
   170  	c.Assert(err, gc.IsNil)
   171  
   172  	running, err := s.mgr.Running(s.name)
   173  	c.Assert(err, gc.IsNil)
   174  	c.Assert(running, jc.IsTrue)
   175  
   176  	err = s.mgr.Stop(s.name)
   177  	c.Assert(err, gc.IsNil)
   178  
   179  	running, err = s.mgr.Running(s.name)
   180  	c.Assert(err, gc.IsNil)
   181  	c.Assert(running, jc.IsFalse)
   182  }
   183  
   184  func (s *serviceManagerSuite) TestStop(c *gc.C) {
   185  	windows.AddService(s.name, s.execPath, s.stub, svc.Status{State: svc.Running})
   186  
   187  	running, err := s.mgr.Running(s.name)
   188  	c.Assert(err, gc.IsNil)
   189  	c.Assert(running, jc.IsTrue)
   190  
   191  	err = s.mgr.Stop(s.name)
   192  	c.Assert(err, gc.IsNil)
   193  
   194  	running, err = s.mgr.Running(s.name)
   195  	c.Assert(err, gc.IsNil)
   196  	c.Assert(running, jc.IsFalse)
   197  }
   198  
   199  func (s *serviceManagerSuite) TestDelete(c *gc.C) {
   200  	windows.AddService(s.name, s.execPath, s.stub, svc.Status{State: svc.Running})
   201  
   202  	err := s.mgr.Delete(s.name)
   203  	c.Assert(err, gc.IsNil)
   204  	exists := s.conn.Exists(s.name)
   205  	c.Assert(exists, jc.IsFalse)
   206  }
   207  
   208  func (s *serviceManagerSuite) TestDeleteInexistent(c *gc.C) {
   209  	exists := s.conn.Exists(s.name)
   210  	c.Assert(exists, jc.IsFalse)
   211  
   212  	err := s.mgr.Delete(s.name)
   213  	c.Assert(errors.Cause(err), gc.Equals, windows.ERROR_SERVICE_DOES_NOT_EXIST)
   214  }