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  }