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  }