diff --git a/windows/svc/example/main.go b/windows/svc/example/main.go index 2ea73301..62f94702 100644 --- a/windows/svc/example/main.go +++ b/windows/svc/example/main.go @@ -15,6 +15,7 @@ package main import ( + "flag" "fmt" "log" "os" @@ -33,8 +34,11 @@ func usage(errmsg string) { os.Exit(2) } +var svcName = "exampleservice" + func main() { - const svcName = "myservice" + flag.StringVar(&svcName, "name", svcName, "name of the service") + flag.Parse() inService, err := svc.IsWindowsService() if err != nil { @@ -55,7 +59,7 @@ func main() { runService(svcName, true) return case "install": - err = installService(svcName, "my service") + err = installService(svcName, "example service") case "remove": err = removeService(svcName) case "start": diff --git a/windows/svc/example/service.go b/windows/svc/example/service.go index c989abff..08d54b51 100644 --- a/windows/svc/example/service.go +++ b/windows/svc/example/service.go @@ -19,9 +19,9 @@ import ( var elog debug.Log -type myservice struct{} +type exampleService struct{} -func (m *myservice) Execute(args []string, r <-chan svc.ChangeRequest, changes chan<- svc.Status) (ssec bool, errno uint32) { +func (m *exampleService) Execute(args []string, r <-chan svc.ChangeRequest, changes chan<- svc.Status) (ssec bool, errno uint32) { const cmdsAccepted = svc.AcceptStop | svc.AcceptShutdown | svc.AcceptPauseAndContinue changes <- svc.Status{State: svc.StartPending} fasttick := time.Tick(500 * time.Millisecond) @@ -79,7 +79,7 @@ func runService(name string, isDebug bool) { if isDebug { run = debug.Run } - err = run(name, &myservice{}) + err = run(name, &exampleService{}) if err != nil { elog.Error(1, fmt.Sprintf("%s service failed: %v", name, err)) return diff --git a/windows/svc/mgr/mgr_test.go b/windows/svc/mgr/mgr_test.go index 6f849f3e..10d23107 100644 --- a/windows/svc/mgr/mgr_test.go +++ b/windows/svc/mgr/mgr_test.go @@ -227,25 +227,26 @@ func remove(t *testing.T, s *mgr.Service) { } func TestMyService(t *testing.T) { + if os.Getenv("GO_BUILDER_NAME") == "" { + // Don't install services on arbitrary users' machines. + t.Skip("skipping test that modifies system services: GO_BUILDER_NAME not set") + } if testing.Short() { - t.Skip("skipping test in short mode - it modifies system services") + t.Skip("skipping test in short mode that modifies system services") } - const name = "mymgrservice" + const name = "mgrtestservice" m, err := mgr.Connect() if err != nil { - if errno, ok := err.(syscall.Errno); ok && errno == syscall.ERROR_ACCESS_DENIED { - t.Skip("Skipping test: we don't have rights to manage services.") - } t.Fatalf("SCM connection failed: %s", err) } defer m.Disconnect() c := mgr.Config{ StartType: mgr.StartDisabled, - DisplayName: "my service", - Description: "my service is just a test", + DisplayName: "x-sys mgr test service", + Description: "x-sys mgr test service is just a test", Dependencies: []string{"LanmanServer", "W32Time"}, } @@ -288,14 +289,14 @@ func TestMyService(t *testing.T) { if err != nil { t.Fatalf("ListServices failed: %v", err) } - var myserviceIsInstalled bool + var serviceIsInstalled bool for _, sn := range svcnames { if sn == name { - myserviceIsInstalled = true + serviceIsInstalled = true break } } - if !myserviceIsInstalled { + if !serviceIsInstalled { t.Errorf("ListServices failed to find %q service", name) } diff --git a/windows/svc/svc_test.go b/windows/svc/svc_test.go index f7833adb..5d794e19 100644 --- a/windows/svc/svc_test.go +++ b/windows/svc/svc_test.go @@ -77,11 +77,15 @@ func stopAndDeleteIfInstalled(t *testing.T, m *mgr.Mgr, name string) { } func TestExample(t *testing.T) { - if testing.Short() && os.Getenv("GO_BUILDER_NAME") != "" { - t.Skip("skipping test in short mode - it modifies system services") + if os.Getenv("GO_BUILDER_NAME") == "" { + // Don't install services on arbitrary users' machines. + t.Skip("skipping test that modifies system services: GO_BUILDER_NAME not set") + } + if testing.Short() { + t.Skip("skipping test in short mode that modifies system services") } - const name = "myservice" + const name = "svctestservice" m, err := mgr.Connect() if err != nil { @@ -103,7 +107,7 @@ func TestExample(t *testing.T) { stopAndDeleteIfInstalled(t, m, name) - s, err := m.CreateService(name, exepath, mgr.Config{DisplayName: "my service"}, "is", "auto-started") + s, err := m.CreateService(name, exepath, mgr.Config{DisplayName: "x-sys svc test service"}, "-name", name) if err != nil { t.Fatalf("CreateService(%s) failed: %v", name, err) } @@ -141,7 +145,7 @@ func TestExample(t *testing.T) { t.Fatalf("Delete failed: %s", err) } - out, err := exec.Command("wevtutil.exe", "qe", "Application", "/q:*[System[Provider[@Name='myservice']]]", "/rd:true", "/c:10").CombinedOutput() + out, err := exec.Command("wevtutil.exe", "qe", "Application", "/q:*[System[Provider[@Name='"+name+"']]]", "/rd:true", "/c:10").CombinedOutput() if err != nil { t.Fatalf("wevtutil failed: %v\n%v", err, string(out)) } @@ -149,7 +153,7 @@ func TestExample(t *testing.T) { // Test context passing (see servicemain in sys_386.s and sys_amd64.s). want += "-123456" if !strings.Contains(string(out), want) { - t.Errorf("%q string does not contain %q", string(out), want) + t.Errorf("%q string does not contain %q", out, want) } }