gitee.com/johng/gf@v1.4.7/third/golang.org/x/sys/windows/svc/svc_test.go (about) 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 "gitee.com/johng/gf/third/golang.org/x/sys/windows/svc" 18 "gitee.com/johng/gf/third/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, "gitee.com/johng/gf/third/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 }