~nskaggs/+junk/xenial-test

« back to all changes in this revision

Viewing changes to src/github.com/gabriel-samfira/sys/windows/svc/mgr/mgr_test.go

  • Committer: Nicholas Skaggs
  • Date: 2016-10-24 20:56:05 UTC
  • Revision ID: nicholas.skaggs@canonical.com-20161024205605-z8lta0uvuhtxwzwl
Initi with beta15

Show diffs side-by-side

added added

removed removed

Lines of Context:
 
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 mgr_test
 
8
 
 
9
import (
 
10
        "os"
 
11
        "path/filepath"
 
12
        "sort"
 
13
        "strings"
 
14
        "testing"
 
15
        "time"
 
16
 
 
17
        "github.com/gabriel-samfira/sys/windows/svc/mgr"
 
18
)
 
19
 
 
20
func TestOpenLanManServer(t *testing.T) {
 
21
        m, err := mgr.Connect()
 
22
        if err != nil {
 
23
                t.Fatalf("SCM connection failed: %s", err)
 
24
        }
 
25
        defer m.Disconnect()
 
26
 
 
27
        s, err := m.OpenService("LanmanServer")
 
28
        if err != nil {
 
29
                t.Fatalf("OpenService(lanmanserver) failed: %s", err)
 
30
        }
 
31
        defer s.Close()
 
32
 
 
33
        _, err = s.Config()
 
34
        if err != nil {
 
35
                t.Fatalf("Config failed: %s", err)
 
36
        }
 
37
}
 
38
 
 
39
func install(t *testing.T, m *mgr.Mgr, name, exepath string, c mgr.Config) {
 
40
        // Sometimes it takes a while for the service to get
 
41
        // removed after previous test run.
 
42
        for i := 0; ; i++ {
 
43
                s, err := m.OpenService(name)
 
44
                if err != nil {
 
45
                        break
 
46
                }
 
47
                s.Close()
 
48
 
 
49
                if i > 10 {
 
50
                        t.Fatalf("service %s already exists", name)
 
51
                }
 
52
                time.Sleep(300 * time.Millisecond)
 
53
        }
 
54
 
 
55
        s, err := m.CreateService(name, exepath, c)
 
56
        if err != nil {
 
57
                t.Fatalf("CreateService(%s) failed: %v", name, err)
 
58
        }
 
59
        defer s.Close()
 
60
}
 
61
 
 
62
func depString(d []string) string {
 
63
        if len(d) == 0 {
 
64
                return ""
 
65
        }
 
66
        for i := range d {
 
67
                d[i] = strings.ToLower(d[i])
 
68
        }
 
69
        ss := sort.StringSlice(d)
 
70
        ss.Sort()
 
71
        return strings.Join([]string(ss), " ")
 
72
}
 
73
 
 
74
func testConfig(t *testing.T, s *mgr.Service, should mgr.Config) mgr.Config {
 
75
        is, err := s.Config()
 
76
        if err != nil {
 
77
                t.Fatalf("Config failed: %s", err)
 
78
        }
 
79
        if should.DisplayName != is.DisplayName {
 
80
                t.Fatalf("config mismatch: DisplayName is %q, but should have %q", is.DisplayName, should.DisplayName)
 
81
        }
 
82
        if should.StartType != is.StartType {
 
83
                t.Fatalf("config mismatch: StartType is %v, but should have %v", is.StartType, should.StartType)
 
84
        }
 
85
        if should.Description != is.Description {
 
86
                t.Fatalf("config mismatch: Description is %q, but should have %q", is.Description, should.Description)
 
87
        }
 
88
        if depString(should.Dependencies) != depString(is.Dependencies) {
 
89
                t.Fatalf("config mismatch: Dependencies is %v, but should have %v", is.Dependencies, should.Dependencies)
 
90
        }
 
91
        return is
 
92
}
 
93
 
 
94
func remove(t *testing.T, s *mgr.Service) {
 
95
        err := s.Delete()
 
96
        if err != nil {
 
97
                t.Fatalf("Delete failed: %s", err)
 
98
        }
 
99
}
 
100
 
 
101
func TestMyService(t *testing.T) {
 
102
        if testing.Short() {
 
103
                t.Skip("skipping test in short mode - it modifies system services")
 
104
        }
 
105
 
 
106
        const name = "myservice"
 
107
 
 
108
        m, err := mgr.Connect()
 
109
        if err != nil {
 
110
                t.Fatalf("SCM connection failed: %s", err)
 
111
        }
 
112
        defer m.Disconnect()
 
113
 
 
114
        c := mgr.Config{
 
115
                StartType:    mgr.StartDisabled,
 
116
                DisplayName:  "my service",
 
117
                Description:  "my service is just a test",
 
118
                Dependencies: []string{"LanmanServer", "W32Time"},
 
119
        }
 
120
 
 
121
        exename := os.Args[0]
 
122
        exepath, err := filepath.Abs(exename)
 
123
        if err != nil {
 
124
                t.Fatalf("filepath.Abs(%s) failed: %s", exename, err)
 
125
        }
 
126
 
 
127
        install(t, m, name, exepath, c)
 
128
 
 
129
        s, err := m.OpenService(name)
 
130
        if err != nil {
 
131
                t.Fatalf("service %s is not installed", name)
 
132
        }
 
133
        defer s.Close()
 
134
 
 
135
        c.BinaryPathName = exepath
 
136
        c = testConfig(t, s, c)
 
137
 
 
138
        c.StartType = mgr.StartManual
 
139
        err = s.UpdateConfig(c)
 
140
        if err != nil {
 
141
                t.Fatalf("UpdateConfig failed: %v", err)
 
142
        }
 
143
 
 
144
        testConfig(t, s, c)
 
145
 
 
146
        remove(t, s)
 
147
}