mgr_test.go 3.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147
  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. "testing"
  12. "time"
  13. "golang.org/x/sys/windows/svc/mgr"
  14. )
  15. func TestOpenLanManServer(t *testing.T) {
  16. m, err := mgr.Connect()
  17. if err != nil {
  18. t.Fatalf("SCM connection failed: %s", err)
  19. }
  20. defer m.Disconnect()
  21. s, err := m.OpenService("LanmanServer")
  22. if err != nil {
  23. t.Fatalf("OpenService(lanmanserver) failed: %s", err)
  24. }
  25. defer s.Close()
  26. _, err = s.Config()
  27. if err != nil {
  28. t.Fatalf("Config failed: %s", err)
  29. }
  30. }
  31. func install(t *testing.T, m *mgr.Mgr, name, exepath string, c mgr.Config) {
  32. // Sometimes it takes a while for the service to get
  33. // removed after previous test run.
  34. for i := 0; ; i++ {
  35. s, err := m.OpenService(name)
  36. if err != nil {
  37. break
  38. }
  39. s.Close()
  40. if i > 10 {
  41. t.Fatalf("service %s already exists", name)
  42. }
  43. time.Sleep(300 * time.Millisecond)
  44. }
  45. s, err := m.CreateService(name, exepath, c)
  46. if err != nil {
  47. t.Fatalf("CreateService(%s) failed: %v", name, err)
  48. }
  49. defer s.Close()
  50. }
  51. func depString(d []string) string {
  52. if len(d) == 0 {
  53. return ""
  54. }
  55. for i := range d {
  56. d[i] = strings.ToLower(d[i])
  57. }
  58. ss := sort.StringSlice(d)
  59. ss.Sort()
  60. return strings.Join([]string(ss), " ")
  61. }
  62. func testConfig(t *testing.T, s *mgr.Service, should mgr.Config) mgr.Config {
  63. is, err := s.Config()
  64. if err != nil {
  65. t.Fatalf("Config failed: %s", err)
  66. }
  67. if should.DisplayName != is.DisplayName {
  68. t.Fatalf("config mismatch: DisplayName is %q, but should have %q", is.DisplayName, should.DisplayName)
  69. }
  70. if should.StartType != is.StartType {
  71. t.Fatalf("config mismatch: StartType is %v, but should have %v", is.StartType, should.StartType)
  72. }
  73. if should.Description != is.Description {
  74. t.Fatalf("config mismatch: Description is %q, but should have %q", is.Description, should.Description)
  75. }
  76. if depString(should.Dependencies) != depString(is.Dependencies) {
  77. t.Fatalf("config mismatch: Dependencies is %v, but should have %v", is.Dependencies, should.Dependencies)
  78. }
  79. return is
  80. }
  81. func remove(t *testing.T, s *mgr.Service) {
  82. err := s.Delete()
  83. if err != nil {
  84. t.Fatalf("Delete failed: %s", err)
  85. }
  86. }
  87. func TestMyService(t *testing.T) {
  88. if testing.Short() {
  89. t.Skip("skipping test in short mode - it modifies system services")
  90. }
  91. const name = "myservice"
  92. m, err := mgr.Connect()
  93. if err != nil {
  94. t.Fatalf("SCM connection failed: %s", err)
  95. }
  96. defer m.Disconnect()
  97. c := mgr.Config{
  98. StartType: mgr.StartDisabled,
  99. DisplayName: "my service",
  100. Description: "my service is just a test",
  101. Dependencies: []string{"LanmanServer", "W32Time"},
  102. }
  103. exename := os.Args[0]
  104. exepath, err := filepath.Abs(exename)
  105. if err != nil {
  106. t.Fatalf("filepath.Abs(%s) failed: %s", exename, err)
  107. }
  108. install(t, m, name, exepath, c)
  109. s, err := m.OpenService(name)
  110. if err != nil {
  111. t.Fatalf("service %s is not installed", name)
  112. }
  113. defer s.Close()
  114. c.BinaryPathName = exepath
  115. c = testConfig(t, s, c)
  116. c.StartType = mgr.StartManual
  117. err = s.UpdateConfig(c)
  118. if err != nil {
  119. t.Fatalf("UpdateConfig failed: %v", err)
  120. }
  121. testConfig(t, s, c)
  122. remove(t, s)
  123. }