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.
17 "golang.org/x/sys/windows/svc"
18 "golang.org/x/sys/windows/svc/mgr"
21 func getState(t *testing.T, s *mgr.Service) svc.State {
22 status, err := s.Query()
24 t.Fatalf("Query(%s) failed: %s", s.Name, err)
29 func testState(t *testing.T, s *mgr.Service, want svc.State) {
30 have := getState(t, s)
32 t.Fatalf("%s state is=%d want=%d", s.Name, have, want)
36 func waitState(t *testing.T, s *mgr.Service, want svc.State) {
38 have := getState(t, s)
43 t.Fatalf("%s state is=%d, waiting timeout", s.Name, have)
45 time.Sleep(300 * time.Millisecond)
49 func TestExample(t *testing.T) {
51 t.Skip("skipping test in short mode - it modifies system services")
54 const name = "myservice"
56 m, err := mgr.Connect()
58 t.Fatalf("SCM connection failed: %s", err)
62 dir, err := ioutil.TempDir("", "svc")
64 t.Fatalf("failed to create temp directory: %v", err)
66 defer os.RemoveAll(dir)
68 exepath := filepath.Join(dir, "a.exe")
69 o, err := exec.Command("go", "build", "-o", exepath, "golang.org/x/sys/windows/svc/example").CombinedOutput()
71 t.Fatalf("failed to build service program: %v\n%v", err, string(o))
74 s, err := m.OpenService(name)
79 t.Fatalf("Delete failed: %s", err)
83 s, err = m.CreateService(name, exepath, mgr.Config{DisplayName: "my service"}, "is", "auto-started")
85 t.Fatalf("CreateService(%s) failed: %v", name, err)
89 testState(t, s, svc.Stopped)
90 err = s.Start("is", "manual-started")
92 t.Fatalf("Start(%s) failed: %s", s.Name, err)
94 waitState(t, s, svc.Running)
95 time.Sleep(1 * time.Second)
97 // testing deadlock from issues 4.
98 _, err = s.Control(svc.Interrogate)
100 t.Fatalf("Control(%s) failed: %s", s.Name, err)
102 _, err = s.Control(svc.Interrogate)
104 t.Fatalf("Control(%s) failed: %s", s.Name, err)
106 time.Sleep(1 * time.Second)
108 _, err = s.Control(svc.Stop)
110 t.Fatalf("Control(%s) failed: %s", s.Name, err)
112 waitState(t, s, svc.Stopped)
116 t.Fatalf("Delete failed: %s", err)