-
Notifications
You must be signed in to change notification settings - Fork 85
/
mockserver_test.go
140 lines (116 loc) · 3.09 KB
/
mockserver_test.go
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
package opc
import (
// "log"
// "fmt"
"math/rand"
"sync"
"time"
)
func init() {
rand.Seed(time.Now().UnixNano())
}
//Embedded type for mock servers
type emptyServer struct{}
func (es *emptyServer) Add(...string) error { return nil }
func (es *emptyServer) Remove(string) {}
func (es *emptyServer) Write(string, interface{}) error { return nil }
func (es *emptyServer) Close() {}
func (es *emptyServer) Tags() []string { return []string{} }
//OpcMockServerStatic implements an OPC Server that returns the index value plus 1 for each tag.
type OpcMockServerStatic struct {
*emptyServer
TagList []string
}
func (oms *OpcMockServerStatic) ReadItem(tag string) Item {
items := oms.Read()
return items[tag]
}
func (oms *OpcMockServerStatic) Read() map[string]Item {
answer := make(map[string]Item)
for i, tag := range oms.TagList {
answer[tag] = Item{float64(i) + 1.0, OPCQualityGood, time.Now()}
}
return answer
}
//OpcMockServerRandom implements an OPC Server that returns a random value for each tag.
type OpcMockServerRandom struct {
*emptyServer
TagList []string
}
func (oms *OpcMockServerRandom) ReadItem(tag string) Item {
items := oms.Read()
return items[tag]
}
func (oms *OpcMockServerRandom) Read() map[string]Item {
answer := make(map[string]Item)
for _, tag := range oms.TagList {
answer[tag] = Item{rand.Float64(), OPCQualityGood, time.Now()}
}
return answer
}
//OpcMockServerWakeUp implements an OPC Server that returns 1.0 for a certain duration then a random value for each tag.
type OpcMockServerWakeUp struct {
*emptyServer
TagList []string
AtSleep bool
mu sync.Mutex
}
func (oms *OpcMockServerWakeUp) WakeUpAfter(sleep time.Duration) {
oms.AtSleep = true
go func() {
time.Sleep(sleep)
oms.mu.Lock()
oms.AtSleep = false
oms.mu.Unlock()
}()
}
func (oms *OpcMockServerWakeUp) ReadItem(tag string) Item {
items := oms.Read()
return items[tag]
}
func (oms *OpcMockServerWakeUp) Read() map[string]Item {
answer := make(map[string]Item)
oms.mu.Lock()
defer oms.mu.Unlock()
for _, tag := range oms.TagList {
if oms.AtSleep {
answer[tag] = Item{1.0, OPCQualityGood, time.Now()}
} else {
answer[tag] = Item{rand.Float64(), OPCQualityGood, time.Now()}
}
}
return answer
}
//FallAsleep Server, sets to 2.0 after time period (opposite of WakeUp server)
type OpcMockServerFallAsleep struct {
*emptyServer
TagList []string
AtSleep bool
mu sync.Mutex
}
func (oms *OpcMockServerFallAsleep) FallAsleepAfter(sleep time.Duration) {
oms.AtSleep = false
go func() {
time.Sleep(sleep)
oms.mu.Lock()
oms.AtSleep = true
oms.mu.Unlock()
}()
}
func (oms *OpcMockServerFallAsleep) ReadItem(tag string) Item {
items := oms.Read()
return items[tag]
}
func (oms *OpcMockServerFallAsleep) Read() map[string]Item {
answer := make(map[string]Item)
oms.mu.Lock()
defer oms.mu.Unlock()
for _, tag := range oms.TagList {
if oms.AtSleep {
answer[tag] = Item{2.0, OPCQualityGood, time.Now()}
} else {
answer[tag] = Item{rand.Float64(), OPCQualityGood, time.Now()}
}
}
return answer
}