mgr_test.go 3.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169
  1. // Copyright 2012 The Go Authors. All rights reserved.
  2. // Use of this source code is governed by a BSD-style
  3. // license that can be found in the LICENSE file.
  4. // +build windows
  5. package mgr_test
  6. import (
  7. "os"
  8. "path/filepath"
  9. "sort"
  10. "strings"
  11. "syscall"
  12. "testing"
  13. "time"
  14. "golang.org/x/sys/windows/svc/mgr"
  15. )
  16. func TestOpenLanManServer(t *testing.T) {
  17. m, err := mgr.Connect()
  18. if err != nil {
  19. if errno, ok := err.(syscall.Errno); ok && errno == syscall.ERROR_ACCESS_DENIED {
  20. t.Skip("Skipping test: we don't have rights to manage services.")
  21. }
  22. t.Fatalf("SCM connection failed: %s", err)
  23. }
  24. defer m.Disconnect()
  25. s, err := m.OpenService("LanmanServer")
  26. if err != nil {
  27. t.Fatalf("OpenService(lanmanserver) failed: %s", err)
  28. }
  29. defer s.Close()
  30. _, err = s.Config()
  31. if err != nil {
  32. t.Fatalf("Config failed: %s", err)
  33. }
  34. }
  35. func install(t *testing.T, m *mgr.Mgr, name, exepath string, c mgr.Config) {
  36. // Sometimes it takes a while for the service to get
  37. // removed after previous test run.
  38. for i := 0; ; i++ {
  39. s, err := m.OpenService(name)
  40. if err != nil {
  41. break
  42. }
  43. s.Close()
  44. if i > 10 {
  45. t.Fatalf("service %s already exists", name)
  46. }
  47. time.Sleep(300 * time.Millisecond)
  48. }
  49. s, err := m.CreateService(name, exepath, c)
  50. if err != nil {
  51. t.Fatalf("CreateService(%s) failed: %v", name, err)
  52. }
  53. defer s.Close()
  54. }
  55. func depString(d []string) string {
  56. if len(d) == 0 {
  57. return ""
  58. }
  59. for i := range d {
  60. d[i] = strings.ToLower(d[i])
  61. }
  62. ss := sort.StringSlice(d)
  63. ss.Sort()
  64. return strings.Join([]string(ss), " ")
  65. }
  66. func testConfig(t *testing.T, s *mgr.Service, should mgr.Config) mgr.Config {
  67. is, err := s.Config()
  68. if err != nil {
  69. t.Fatalf("Config failed: %s", err)
  70. }
  71. if should.DisplayName != is.DisplayName {
  72. t.Fatalf("config mismatch: DisplayName is %q, but should have %q", is.DisplayName, should.DisplayName)
  73. }
  74. if should.StartType != is.StartType {
  75. t.Fatalf("config mismatch: StartType is %v, but should have %v", is.StartType, should.StartType)
  76. }
  77. if should.Description != is.Description {
  78. t.Fatalf("config mismatch: Description is %q, but should have %q", is.Description, should.Description)
  79. }
  80. if depString(should.Dependencies) != depString(is.Dependencies) {
  81. t.Fatalf("config mismatch: Dependencies is %v, but should have %v", is.Dependencies, should.Dependencies)
  82. }
  83. return is
  84. }
  85. func remove(t *testing.T, s *mgr.Service) {
  86. err := s.Delete()
  87. if err != nil {
  88. t.Fatalf("Delete failed: %s", err)
  89. }
  90. }
  91. func TestMyService(t *testing.T) {
  92. if testing.Short() {
  93. t.Skip("skipping test in short mode - it modifies system services")
  94. }
  95. const name = "myservice"
  96. m, err := mgr.Connect()
  97. if err != nil {
  98. if errno, ok := err.(syscall.Errno); ok && errno == syscall.ERROR_ACCESS_DENIED {
  99. t.Skip("Skipping test: we don't have rights to manage services.")
  100. }
  101. t.Fatalf("SCM connection failed: %s", err)
  102. }
  103. defer m.Disconnect()
  104. c := mgr.Config{
  105. StartType: mgr.StartDisabled,
  106. DisplayName: "my service",
  107. Description: "my service is just a test",
  108. Dependencies: []string{"LanmanServer", "W32Time"},
  109. }
  110. exename := os.Args[0]
  111. exepath, err := filepath.Abs(exename)
  112. if err != nil {
  113. t.Fatalf("filepath.Abs(%s) failed: %s", exename, err)
  114. }
  115. install(t, m, name, exepath, c)
  116. s, err := m.OpenService(name)
  117. if err != nil {
  118. t.Fatalf("service %s is not installed", name)
  119. }
  120. defer s.Close()
  121. c.BinaryPathName = exepath
  122. c = testConfig(t, s, c)
  123. c.StartType = mgr.StartManual
  124. err = s.UpdateConfig(c)
  125. if err != nil {
  126. t.Fatalf("UpdateConfig failed: %v", err)
  127. }
  128. testConfig(t, s, c)
  129. svcnames, err := m.ListServices()
  130. if err != nil {
  131. t.Fatalf("ListServices failed: %v", err)
  132. }
  133. var myserviceIsInstalled bool
  134. for _, sn := range svcnames {
  135. if sn == name {
  136. myserviceIsInstalled = true
  137. break
  138. }
  139. }
  140. if !myserviceIsInstalled {
  141. t.Errorf("ListServices failed to find %q service", name)
  142. }
  143. remove(t, s)
  144. }