OSDN Git Service

new repo
[bytom/vapor.git] / vendor / golang.org / x / sys / windows / svc / svc_test.go
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
5 // +build windows
6
7 package svc_test
8
9 import (
10         "io/ioutil"
11         "os"
12         "os/exec"
13         "path/filepath"
14         "testing"
15         "time"
16
17         "golang.org/x/sys/windows/svc"
18         "golang.org/x/sys/windows/svc/mgr"
19 )
20
21 func getState(t *testing.T, s *mgr.Service) svc.State {
22         status, err := s.Query()
23         if err != nil {
24                 t.Fatalf("Query(%s) failed: %s", s.Name, err)
25         }
26         return status.State
27 }
28
29 func testState(t *testing.T, s *mgr.Service, want svc.State) {
30         have := getState(t, s)
31         if have != want {
32                 t.Fatalf("%s state is=%d want=%d", s.Name, have, want)
33         }
34 }
35
36 func waitState(t *testing.T, s *mgr.Service, want svc.State) {
37         for i := 0; ; i++ {
38                 have := getState(t, s)
39                 if have == want {
40                         return
41                 }
42                 if i > 10 {
43                         t.Fatalf("%s state is=%d, waiting timeout", s.Name, have)
44                 }
45                 time.Sleep(300 * time.Millisecond)
46         }
47 }
48
49 func TestExample(t *testing.T) {
50         if testing.Short() {
51                 t.Skip("skipping test in short mode - it modifies system services")
52         }
53
54         const name = "myservice"
55
56         m, err := mgr.Connect()
57         if err != nil {
58                 t.Fatalf("SCM connection failed: %s", err)
59         }
60         defer m.Disconnect()
61
62         dir, err := ioutil.TempDir("", "svc")
63         if err != nil {
64                 t.Fatalf("failed to create temp directory: %v", err)
65         }
66         defer os.RemoveAll(dir)
67
68         exepath := filepath.Join(dir, "a.exe")
69         o, err := exec.Command("go", "build", "-o", exepath, "golang.org/x/sys/windows/svc/example").CombinedOutput()
70         if err != nil {
71                 t.Fatalf("failed to build service program: %v\n%v", err, string(o))
72         }
73
74         s, err := m.OpenService(name)
75         if err == nil {
76                 err = s.Delete()
77                 if err != nil {
78                         s.Close()
79                         t.Fatalf("Delete failed: %s", err)
80                 }
81                 s.Close()
82         }
83         s, err = m.CreateService(name, exepath, mgr.Config{DisplayName: "my service"}, "is", "auto-started")
84         if err != nil {
85                 t.Fatalf("CreateService(%s) failed: %v", name, err)
86         }
87         defer s.Close()
88
89         testState(t, s, svc.Stopped)
90         err = s.Start("is", "manual-started")
91         if err != nil {
92                 t.Fatalf("Start(%s) failed: %s", s.Name, err)
93         }
94         waitState(t, s, svc.Running)
95         time.Sleep(1 * time.Second)
96
97         // testing deadlock from issues 4.
98         _, err = s.Control(svc.Interrogate)
99         if err != nil {
100                 t.Fatalf("Control(%s) failed: %s", s.Name, err)
101         }
102         _, err = s.Control(svc.Interrogate)
103         if err != nil {
104                 t.Fatalf("Control(%s) failed: %s", s.Name, err)
105         }
106         time.Sleep(1 * time.Second)
107
108         _, err = s.Control(svc.Stop)
109         if err != nil {
110                 t.Fatalf("Control(%s) failed: %s", s.Name, err)
111         }
112         waitState(t, s, svc.Stopped)
113
114         err = s.Delete()
115         if err != nil {
116                 t.Fatalf("Delete failed: %s", err)
117         }
118 }