msrc
/
MultiService_test.go
361 строка · 10.0 Кб
1package msrc
2
3import (
4"context"
5"sync"
6"testing"
7"time"
8
9"github.com/pkg/errors"
10"github.com/sirupsen/logrus"
11"gitlab.systems-fd.com/packages/golang/helpers/h"
12)
13
14func Test_multiServiceServer_Run(t *testing.T) {
15type fields struct {
16services map[string]ServiceInterface
17servicesComplete map[string]bool
18serviceStopFunc *h.SyncValueStruct[context.CancelFunc]
19servicesIsWorkMx *sync.Mutex
20logger *logrus.Entry
21}
22tests := []struct {
23name string
24fields fields
25wantErr bool
26isRunCalled bool
27}{
28{
29name: "Тестирование отсутствия ошибки, если сервис ее не возвращает",
30fields: fields{
31services: map[string]ServiceInterface{
32"test-1": &serviceMock{
33RunIsCalled: false,
34ShutdownIsCalled: false,
35RunResult: nil,
36RunStat: false,
37},
38"test-2": &serviceMock{
39RunIsCalled: false,
40ShutdownIsCalled: false,
41RunResult: nil,
42RunStat: false,
43},
44},
45servicesComplete: map[string]bool{},
46serviceStopFunc: h.SyncValue[context.CancelFunc](func() {}),
47servicesIsWorkMx: &sync.Mutex{},
48logger: logrus.WithField("prefix", `test`),
49},
50wantErr: false,
51isRunCalled: true,
52},
53{
54name: "Тестирование наличия ошибки, если сервис ее возвращает",
55fields: fields{
56services: map[string]ServiceInterface{
57"test-1": &serviceMock{
58RunIsCalled: false,
59ShutdownIsCalled: false,
60RunResult: errors.New("Test error"),
61RunStat: false,
62},
63"test-2": &serviceMock{
64RunIsCalled: false,
65ShutdownIsCalled: false,
66RunResult: nil,
67RunStat: false,
68},
69},
70servicesComplete: map[string]bool{},
71serviceStopFunc: h.SyncValue[context.CancelFunc](func() {}),
72servicesIsWorkMx: &sync.Mutex{},
73logger: logrus.WithField("prefix", `test`),
74},
75wantErr: true,
76isRunCalled: true,
77},
78}
79for _, tt := range tests {
80t.Run(tt.name, func(t *testing.T) {
81m := &multiServiceServer{
82services: tt.fields.services,
83servicesComplete: tt.fields.servicesComplete,
84serviceStopFunc: tt.fields.serviceStopFunc,
85servicesIsWorkMx: tt.fields.servicesIsWorkMx,
86isServicesRun: h.SyncValue[bool](false),
87isShutdownInProgress: h.SyncValue[bool](false),
88logger: tt.fields.logger,
89}
90if err := m.Run(); (err != nil) != tt.wantErr {
91t.Errorf("Run() error = %v, wantErr %v", err, tt.wantErr)
92}
93
94for _, s := range tt.fields.services {
95if service, ok := s.(*serviceMock); ok {
96if service.RunIsCalled != tt.isRunCalled {
97t.Errorf("Run() isRunCalled = %v, want %v", service.RunIsCalled, tt.isRunCalled)
98}
99}
100}
101})
102}
103}
104
105func Test_multiServiceServer_IsServicesRun(t *testing.T) {
106type fields struct {
107services map[string]ServiceInterface
108servicesComplete map[string]bool
109serviceStopFunc *h.SyncValueStruct[context.CancelFunc]
110servicesIsWorkMx *sync.Mutex
111logger *logrus.Entry
112}
113tests := []struct {
114name string
115fields fields
116}{
117{
118name: "Тестирование правильности возвращения результата проверки статуса запуска",
119fields: fields{
120services: map[string]ServiceInterface{
121"test-1": &serviceMock{
122RunIsCalled: false,
123ShutdownIsCalled: false,
124RunResult: nil,
125RunStat: false,
126},
127"test-2": &serviceMock{
128RunIsCalled: false,
129ShutdownIsCalled: false,
130RunResult: nil,
131RunStat: false,
132},
133"test-3": &serviceMock{
134RunIsCalled: false,
135ShutdownIsCalled: false,
136RunResult: nil,
137RunStat: false,
138},
139},
140servicesComplete: map[string]bool{},
141serviceStopFunc: h.SyncValue[context.CancelFunc](func() {}),
142servicesIsWorkMx: &sync.Mutex{},
143logger: logrus.WithField("prefix", `test`),
144},
145},
146}
147for _, tt := range tests {
148t.Run(tt.name, func(t *testing.T) {
149m := &multiServiceServer{
150services: tt.fields.services,
151servicesComplete: tt.fields.servicesComplete,
152serviceStopFunc: tt.fields.serviceStopFunc,
153servicesIsWorkMx: tt.fields.servicesIsWorkMx,
154isServicesRun: h.SyncValue[bool](false),
155isShutdownInProgress: h.SyncValue[bool](false),
156logger: tt.fields.logger,
157}
158
159testServices := func(flagStatus bool) {
160if flagStatus != m.IsServicesRun() {
161t.Errorf("IsServicesRun() flag = %v, want %v", m.IsServicesRun(), flagStatus)
162}
163}
164
165testServices(false)
166
167_ = m.Run()
168go func() {
169testServices(true)
170}()
171
172time.Sleep(300 * time.Millisecond)
173
174testServices(true)
175})
176}
177}
178
179func Test_multiServiceServer_IsServicesAlive(t *testing.T) {
180type fields struct {
181services map[string]ServiceInterface
182servicesComplete map[string]bool
183serviceStopFunc *h.SyncValueStruct[context.CancelFunc]
184servicesIsWorkMx *sync.Mutex
185logger *logrus.Entry
186}
187tests := []struct {
188name string
189fields fields
190}{
191{
192name: "Тестирование правильности возвращения результата проверки статуса рабочести",
193fields: fields{
194services: map[string]ServiceInterface{
195"test-1": &serviceMock{
196RunIsCalled: false,
197ShutdownIsCalled: false,
198RunResult: nil,
199RunStat: false,
200},
201"test-2": &serviceMock{
202RunIsCalled: false,
203ShutdownIsCalled: false,
204RunResult: nil,
205RunStat: false,
206},
207"test-3": &serviceMock{
208RunIsCalled: false,
209ShutdownIsCalled: false,
210RunResult: nil,
211RunStat: false,
212},
213},
214servicesComplete: map[string]bool{},
215serviceStopFunc: h.SyncValue[context.CancelFunc](func() {}),
216servicesIsWorkMx: &sync.Mutex{},
217logger: logrus.WithField("prefix", `test`),
218},
219},
220}
221for _, tt := range tests {
222t.Run(tt.name, func(t *testing.T) {
223m := &multiServiceServer{
224services: tt.fields.services,
225servicesComplete: tt.fields.servicesComplete,
226serviceStopFunc: tt.fields.serviceStopFunc,
227servicesIsWorkMx: tt.fields.servicesIsWorkMx,
228isServicesRun: h.SyncValue[bool](false),
229isShutdownInProgress: h.SyncValue[bool](false),
230logger: tt.fields.logger,
231}
232
233testServices := func(flagStatus bool) {
234if flagStatus != m.IsServicesAlive() {
235t.Errorf("IsServicesAlive() flag = %v, want %v", m.IsServicesAlive(), flagStatus)
236}
237}
238
239testServices(false)
240
241go func() {
242time.Sleep(100 * time.Millisecond)
243
244testServices(true)
245}()
246_ = m.Run()
247
248time.Sleep(300 * time.Millisecond)
249
250testServices(false)
251})
252}
253}
254
255func Test_multiServiceServer_Stop(t *testing.T) {
256type fields struct {
257services map[string]ServiceInterface
258servicesComplete map[string]bool
259serviceStopFunc *h.SyncValueStruct[context.CancelFunc]
260servicesIsWorkMx *sync.Mutex
261logger *logrus.Entry
262wait int
263}
264tests := []struct {
265name string
266fields fields
267isShutdownCalled bool
268}{
269{
270name: "Тестирование правильности работы остановки сервиса",
271fields: fields{
272services: map[string]ServiceInterface{
273"test-1": &serviceMock{
274RunIsCalled: false,
275ShutdownIsCalled: false,
276RunResult: nil,
277RunStat: false,
278},
279"test-2": &serviceMock{
280RunIsCalled: false,
281ShutdownIsCalled: false,
282RunResult: nil,
283RunStat: false,
284},
285"test-3": &serviceMock{
286RunIsCalled: false,
287ShutdownIsCalled: false,
288RunResult: nil,
289RunStat: false,
290},
291},
292servicesComplete: map[string]bool{},
293serviceStopFunc: h.SyncValue[context.CancelFunc](func() {}),
294servicesIsWorkMx: &sync.Mutex{},
295logger: logrus.WithField("prefix", `test`),
296wait: 800,
297},
298isShutdownCalled: false,
299},
300{
301name: "Тестирование правильности работы остановки сервиса",
302fields: fields{
303services: map[string]ServiceInterface{
304"test-1": &serviceMock{
305RunIsCalled: false,
306ShutdownIsCalled: false,
307RunResult: nil,
308RunStat: false,
309},
310"test-2": &serviceMock{
311RunIsCalled: false,
312ShutdownIsCalled: false,
313RunResult: nil,
314RunStat: false,
315},
316"test-3": &serviceMock{
317RunIsCalled: false,
318ShutdownIsCalled: false,
319RunResult: nil,
320RunStat: false,
321},
322},
323servicesComplete: map[string]bool{},
324serviceStopFunc: h.SyncValue[context.CancelFunc](func() {}),
325servicesIsWorkMx: &sync.Mutex{},
326logger: logrus.WithField("prefix", `test`),
327wait: 100,
328},
329isShutdownCalled: true,
330},
331}
332for _, tt := range tests {
333t.Run(tt.name, func(t *testing.T) {
334m := &multiServiceServer{
335services: tt.fields.services,
336servicesComplete: tt.fields.servicesComplete,
337serviceStopFunc: tt.fields.serviceStopFunc,
338servicesIsWorkMx: tt.fields.servicesIsWorkMx,
339isServicesRun: h.SyncValue[bool](false),
340isShutdownInProgress: h.SyncValue[bool](false),
341logger: tt.fields.logger,
342}
343
344go func() {
345time.Sleep(time.Duration(tt.fields.wait) * time.Millisecond)
346
347m.Stop()
348}()
349
350_ = m.Run()
351
352for _, s := range tt.fields.services {
353if service, ok := s.(*serviceMock); ok {
354if service.ShutdownIsCalled != tt.isShutdownCalled {
355t.Errorf("Stop() isShutdownCalled = %v, want %v", service.ShutdownIsCalled, tt.isShutdownCalled)
356}
357}
358}
359})
360}
361}
362