github.com/cellofellow/gopkg@v0.0.0-20140722061823-eec0544a62ad/osext/winsvc/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 package svc_test 6 7 import ( 8 "chai2010.gopkg/osext/winsvc/mgr" 9 "chai2010.gopkg/osext/winsvc/svc" 10 "io/ioutil" 11 "os" 12 "os/exec" 13 "path/filepath" 14 "testing" 15 "time" 16 ) 17 18 func getState(t *testing.T, s *mgr.Service) svc.State { 19 status, err := s.Query() 20 if err != nil { 21 t.Fatalf("Query(%s) failed: %s", s.Name, err) 22 } 23 return status.State 24 } 25 26 func testState(t *testing.T, s *mgr.Service, want svc.State) { 27 have := getState(t, s) 28 if have != want { 29 t.Fatalf("%s state is=%d want=%d", s.Name, have, want) 30 } 31 } 32 33 func waitState(t *testing.T, s *mgr.Service, want svc.State) { 34 for i := 0; ; i++ { 35 have := getState(t, s) 36 if have == want { 37 return 38 } 39 if i > 10 { 40 t.Fatalf("%s state is=%d, waiting timeout", s.Name, have) 41 } 42 time.Sleep(300 * time.Millisecond) 43 } 44 } 45 46 func TestExample(t *testing.T) { 47 const name = "myservice" 48 49 m, err := mgr.Connect() 50 if err != nil { 51 t.Fatalf("SCM connection failed: %s", err) 52 } 53 defer m.Disconnect() 54 55 dir, err := ioutil.TempDir("", "svc") 56 if err != nil { 57 t.Fatalf("failed to create temp directory: %v", err) 58 } 59 defer os.RemoveAll(dir) 60 61 exepath := filepath.Join(dir, "a.exe") 62 o, err := exec.Command("go", "build", "-o", exepath, "chai2010.gopkg/osext/winsvc/example").CombinedOutput() 63 if err != nil { 64 t.Fatalf("failed to build service program: %v\n%v", err, string(o)) 65 } 66 67 s, err := m.OpenService(name) 68 if err == nil { 69 err = s.Delete() 70 if err != nil { 71 s.Close() 72 t.Fatalf("Delete failed: %s", err) 73 } 74 s.Close() 75 } 76 s, err = m.CreateService(name, exepath, mgr.Config{DisplayName: "my service"}) 77 if err != nil { 78 t.Fatalf("CreateService(%s) failed: %v", name, err) 79 } 80 defer s.Close() 81 82 testState(t, s, svc.Stopped) 83 err = s.Start(nil) 84 if err != nil { 85 t.Fatalf("Start(%s) failed: %s", s.Name, err) 86 } 87 waitState(t, s, svc.Running) 88 time.Sleep(1 * time.Second) 89 _, err = s.Control(svc.Stop) 90 if err != nil { 91 t.Fatalf("Control(%s) failed: %s", s.Name, err) 92 } 93 waitState(t, s, svc.Stopped) 94 95 err = s.Delete() 96 if err != nil { 97 t.Fatalf("Delete failed: %s", err) 98 } 99 }