Merge "RIC:1060: Change in PTL"
[ric-plt/sdlgo.git] / internal / cli / statistics_test.go
1 /*
2    Copyright (c) 2021 AT&T Intellectual Property.
3    Copyright (c) 2018-2021 Nokia.
4
5    Licensed under the Apache License, Version 2.0 (the "License");
6    you may not use this file except in compliance with the License.
7    You may obtain a copy of the License at
8
9        http://www.apache.org/licenses/LICENSE-2.0
10
11    Unless required by applicable law or agreed to in writing, software
12    distributed under the License is distributed on an "AS IS" BASIS,
13    WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14    See the License for the specific language governing permissions and
15    limitations under the License.
16 */
17
18 /*
19  * This source code is part of the near-RT RIC (RAN Intelligent Controller)
20  * platform project (RICP).
21  */
22
23 package cli_test
24
25 import (
26         "bytes"
27         "errors"
28         "gerrit.o-ran-sc.org/r/ric-plt/sdlgo/internal/cli"
29         "gerrit.o-ran-sc.org/r/ric-plt/sdlgo/internal/mocks"
30         "gerrit.o-ran-sc.org/r/ric-plt/sdlgo/internal/sdlgoredis"
31         "github.com/stretchr/testify/assert"
32         "testing"
33 )
34
35 var columnNamesOut = `CLUSTER  ROLE     ADDRESS            STATISTICS
36 `
37 var primaryOut = `0        Primary  192.168.10.1:6379  UptimeInDays:1
38                                      ConnectedClients:1
39                                      ClientRecentMaxInputBuffer:2
40                                      ClientRecentMaxOutputBuffer:0
41                                      UsedMemory:2073528
42                                      UsedMemoryHuman:1.98M
43                                      UsedMemoryRss:13721600
44                                      UsedMemoryRssHuman:13.09M
45                                      UsedMemoryPeak:6706008
46                                      UsedMemoryPeakHuman:6.40M
47                                      UsedMemoryPeakPerc:30.92%
48                                      MemFragmentationRatio:6.66
49                                      MemFragmentationBytes:11379232
50                                      TotalConnectionsReceived:566
51                                      TotalCommandsProcessed:3635063
52                                      SyncFull:2
53                                      SyncPartialOk:21
54                                      SyncPartialErr:0
55                                      PubsubChannels:1
56                                      UsedCpuSys:1457.472805
57                                      UsedCpuUser:861.060018
58                                      CmdstatReplconf:calls=1090183 usec:2790911 usecPerCall:2.56
59                                      CmdstatKeys:calls=20 usec:233 usecPerCall:11.65
60                                      CmdstatRole:calls=2 usec:84 usecPerCall:42.00
61                                      CmdstatPsync:calls=23 usec:3582 usecPerCall:155.74
62                                      CmdstatMset:calls=4 usec:30 usecPerCall:7.50
63                                      CmdstatPublish:calls=804867 usec:12965499 usecPerCall:16.11
64                                      CmdstatInfo:calls=164255 usec:57935065 usecPerCall:352.71
65                                      CmdstatPing:calls=1582493 usec:3466844 usecPerCall:2.19
66                                      CmdstatClient:calls=6 usec:11 usecPerCall:2.17
67                                      CmdstatCommand:calls=482 usec:1462633 usecPerCall:3034.51
68                                      CmdstatSubscribe:calls=3 usec:11 usecPerCall:3.67
69                                      CmdstatMonitor:calls=3 usec:6 usecPerCall:2.00
70                                      Db0:keys=123
71 `
72 var replicaOut = `0        Replica  192.168.10.2:6379  UptimeInDays:2
73                                      ConnectedClients:8
74                                      ClientRecentMaxInputBuffer:3
75                                      ClientRecentMaxOutputBuffer:1
76                                      UsedMemory:2135768
77                                      UsedMemoryHuman:2.04M
78                                      UsedMemoryRss:13721720
79                                      UsedMemoryRssHuman:12.48M
80                                      UsedMemoryPeak:6706009
81                                      UsedMemoryPeakHuman:6.41M
82                                      UsedMemoryPeakPerc:30.93%
83                                      MemFragmentationRatio:6.67
84                                      MemFragmentationBytes:11379233
85                                      TotalConnectionsReceived:567
86                                      TotalCommandsProcessed:3635064
87                                      SyncFull:0
88                                      SyncPartialOk:0
89                                      SyncPartialErr:0
90                                      PubsubChannels:1
91                                      UsedCpuSys:1457.472806
92                                      UsedCpuUser:861.060019
93                                      CmdstatRole:calls=1 usec:3 usecPerCall:32.00
94                                      CmdstatMset:calls=3 usec:14 usecPerCall:7.51
95                                      CmdstatPublish:calls=804868 usec:12965498 usecPerCall:16.15
96                                      CmdstatInfo:calls=164256 usec:57935066 usecPerCall:352.72
97                                      CmdstatPing:calls=1582494 usec:3466845 usecPerCall:2.20
98                                      CmdstatCommand:calls=483 usec:1462634 usecPerCall:3034.52
99                                      CmdstatSubscribe:calls=3 usec:12 usecPerCall:3.68
100                                      CmdstatMonitor:calls=6 usec:11 usecPerCall:2.11
101                                      CmdstatConfig:calls=2 usec:1462 usecPerCall:146.74
102                                      CmdstatSlaveof:calls=1 usec:412 usecPerCall:412.00
103                                      Db0:keys=123
104 `
105
106 var statsMock *statisticsMock
107
108 type statisticsMock struct {
109         dbIface      *mocks.MockDB
110         dbErr        error
111         dbStatistics sdlgoredis.DbStatistics
112 }
113
114 func newStatisticsDatabaseMock() *cli.Database {
115         db := &cli.Database{}
116         statsMock.dbIface = new(mocks.MockDB)
117         statsMock.dbIface.On("Statistics").Return(&statsMock.dbStatistics, statsMock.dbErr)
118         db.Instances = append(db.Instances, statsMock.dbIface)
119         return db
120 }
121
122 func setupStatisticsMockDb() {
123         if statsMock == nil {
124                 statsMock = new(statisticsMock)
125         }
126         statsMock.dbStatistics.Stats = []*sdlgoredis.DbStatisticsInfo{}
127 }
128
129 func setupStatisticsTestcase(tb testing.TB) func(tb testing.TB) {
130         setupStatisticsMockDb()
131
132         return func(tb testing.TB) {
133                 statsMock.dbStatistics.Stats = nil
134         }
135 }
136
137 func setupStatisticsMockDbWithPrimaryInfo() {
138         statsMock.dbStatistics.Stats = append(statsMock.dbStatistics.Stats,
139                 &sdlgoredis.DbStatisticsInfo{
140                         IPAddr: "192.168.10.1",
141                         Port:   "6379",
142                         Info: &sdlgoredis.DbInfo{
143                                 Fields: sdlgoredis.DbInfoFields{
144                                         PrimaryRole: true,
145                                         Server: sdlgoredis.ServerInfoFields{
146                                                 UptimeInDays: 1,
147                                         },
148                                         Clients: sdlgoredis.ClientsInfoFields{
149                                                 ConnectedClients:            1,
150                                                 ClientRecentMaxInputBuffer:  2,
151                                                 ClientRecentMaxOutputBuffer: 0,
152                                         },
153                                         Memory: sdlgoredis.MeroryInfoFields{
154                                                 UsedMemory:            2073528,
155                                                 UsedMemoryHuman:       "1.98M",
156                                                 UsedMemoryRss:         13721600,
157                                                 UsedMemoryRssHuman:    "13.09M",
158                                                 UsedMemoryPeak:        6706008,
159                                                 UsedMemoryPeakHuman:   "6.40M",
160                                                 UsedMemoryPeakPerc:    "30.92%",
161                                                 MemFragmentationRatio: 6.66,
162                                                 MemFragmentationBytes: 11379232,
163                                         },
164                                         Stats: sdlgoredis.StatsInfoFields{
165                                                 TotalConnectionsReceived: 566,
166                                                 TotalCommandsProcessed:   3635063,
167                                                 SyncFull:                 2,
168                                                 SyncPartialOk:            21,
169                                                 SyncPartialErr:           0,
170                                                 PubsubChannels:           1,
171                                         },
172                                         Cpu: sdlgoredis.CpuInfoFields{
173                                                 UsedCpuSys:  1457.472805,
174                                                 UsedCpuUser: 861.060018,
175                                         },
176                                         Commandstats: sdlgoredis.CommandstatsInfoFields{
177                                                 CmdstatReplconf: sdlgoredis.CommandstatsValues{
178                                                         Calls:       1090183,
179                                                         Usec:        2790911,
180                                                         UsecPerCall: 2.56,
181                                                 },
182                                                 CmdstatKeys: sdlgoredis.CommandstatsValues{
183                                                         Calls:       20,
184                                                         Usec:        233,
185                                                         UsecPerCall: 11.65,
186                                                 },
187                                                 CmdstatRole: sdlgoredis.CommandstatsValues{
188                                                         Calls:       2,
189                                                         Usec:        84,
190                                                         UsecPerCall: 42.00,
191                                                 },
192                                                 CmdstatConfig: sdlgoredis.CommandstatsValues{},
193                                                 CmdstatPsync: sdlgoredis.CommandstatsValues{
194                                                         Calls:       23,
195                                                         Usec:        3582,
196                                                         UsecPerCall: 155.74,
197                                                 },
198                                                 CmdstatMset: sdlgoredis.CommandstatsValues{
199                                                         Calls:       4,
200                                                         Usec:        30,
201                                                         UsecPerCall: 7.50,
202                                                 },
203                                                 CmdstatPublish: sdlgoredis.CommandstatsValues{
204                                                         Calls:       804867,
205                                                         Usec:        12965499,
206                                                         UsecPerCall: 16.11,
207                                                 },
208                                                 CmdstatInfo: sdlgoredis.CommandstatsValues{
209                                                         Calls:       164255,
210                                                         Usec:        57935065,
211                                                         UsecPerCall: 352.71,
212                                                 },
213                                                 CmdstatPing: sdlgoredis.CommandstatsValues{
214                                                         Calls:       1582493,
215                                                         Usec:        3466844,
216                                                         UsecPerCall: 2.19,
217                                                 },
218                                                 CmdstatClient: sdlgoredis.CommandstatsValues{
219                                                         Calls:       6,
220                                                         Usec:        11,
221                                                         UsecPerCall: 2.17,
222                                                 },
223                                                 CmdstatCommand: sdlgoredis.CommandstatsValues{
224                                                         Calls:       482,
225                                                         Usec:        1462633,
226                                                         UsecPerCall: 3034.51,
227                                                 },
228                                                 CmdstatSubscribe: sdlgoredis.CommandstatsValues{
229                                                         Calls:       3,
230                                                         Usec:        11,
231                                                         UsecPerCall: 3.67,
232                                                 },
233                                                 CmdstatMonitor: sdlgoredis.CommandstatsValues{
234                                                         Calls:       3,
235                                                         Usec:        6,
236                                                         UsecPerCall: 2.00,
237                                                 },
238                                                 CmdstatSlaveof: sdlgoredis.CommandstatsValues{},
239                                         },
240                                         Keyspace: sdlgoredis.KeyspaceInfoFields{
241                                                 Db: sdlgoredis.KeyspaceValues{
242                                                         Keys: 123,
243                                                 },
244                                         },
245                                 },
246                         },
247                 },
248         )
249 }
250
251 func setupStatisticsMockDbWithReplicaInfo() {
252         statsMock.dbStatistics.Stats = append(statsMock.dbStatistics.Stats,
253                 &sdlgoredis.DbStatisticsInfo{
254                         IPAddr: "192.168.10.2",
255                         Port:   "6379",
256                         Info: &sdlgoredis.DbInfo{
257                                 Fields: sdlgoredis.DbInfoFields{
258                                         PrimaryRole: false,
259                                         Server: sdlgoredis.ServerInfoFields{
260                                                 UptimeInDays: 2,
261                                         },
262                                         Clients: sdlgoredis.ClientsInfoFields{
263                                                 ConnectedClients:            8,
264                                                 ClientRecentMaxInputBuffer:  3,
265                                                 ClientRecentMaxOutputBuffer: 1,
266                                         },
267                                         Memory: sdlgoredis.MeroryInfoFields{
268                                                 UsedMemory:            2135768,
269                                                 UsedMemoryHuman:       "2.04M",
270                                                 UsedMemoryRss:         13721720,
271                                                 UsedMemoryRssHuman:    "12.48M",
272                                                 UsedMemoryPeak:        6706009,
273                                                 UsedMemoryPeakHuman:   "6.41M",
274                                                 UsedMemoryPeakPerc:    "30.93%",
275                                                 MemFragmentationRatio: 6.67,
276                                                 MemFragmentationBytes: 11379233,
277                                         },
278                                         Stats: sdlgoredis.StatsInfoFields{
279                                                 TotalConnectionsReceived: 567,
280                                                 TotalCommandsProcessed:   3635064,
281                                                 SyncFull:                 0,
282                                                 SyncPartialOk:            0,
283                                                 SyncPartialErr:           0,
284                                                 PubsubChannels:           1,
285                                         },
286                                         Cpu: sdlgoredis.CpuInfoFields{
287                                                 UsedCpuSys:  1457.472806,
288                                                 UsedCpuUser: 861.060019,
289                                         },
290                                         Commandstats: sdlgoredis.CommandstatsInfoFields{
291                                                 CmdstatReplconf: sdlgoredis.CommandstatsValues{},
292                                                 CmdstatKeys:     sdlgoredis.CommandstatsValues{},
293                                                 CmdstatRole: sdlgoredis.CommandstatsValues{
294                                                         Calls:       1,
295                                                         Usec:        3,
296                                                         UsecPerCall: 32.00,
297                                                 },
298                                                 CmdstatConfig: sdlgoredis.CommandstatsValues{
299                                                         Calls:       2,
300                                                         Usec:        1462,
301                                                         UsecPerCall: 146.74,
302                                                 },
303                                                 CmdstatPsync: sdlgoredis.CommandstatsValues{},
304                                                 CmdstatMset: sdlgoredis.CommandstatsValues{
305                                                         Calls:       3,
306                                                         Usec:        14,
307                                                         UsecPerCall: 7.51,
308                                                 },
309                                                 CmdstatPublish: sdlgoredis.CommandstatsValues{
310                                                         Calls:       804868,
311                                                         Usec:        12965498,
312                                                         UsecPerCall: 16.15,
313                                                 },
314                                                 CmdstatInfo: sdlgoredis.CommandstatsValues{
315                                                         Calls:       164256,
316                                                         Usec:        57935066,
317                                                         UsecPerCall: 352.72,
318                                                 },
319                                                 CmdstatPing: sdlgoredis.CommandstatsValues{
320                                                         Calls:       1582494,
321                                                         Usec:        3466845,
322                                                         UsecPerCall: 2.20,
323                                                 },
324                                                 CmdstatClient: sdlgoredis.CommandstatsValues{},
325                                                 CmdstatCommand: sdlgoredis.CommandstatsValues{
326                                                         Calls:       483,
327                                                         Usec:        1462634,
328                                                         UsecPerCall: 3034.52,
329                                                 },
330                                                 CmdstatSubscribe: sdlgoredis.CommandstatsValues{
331                                                         Calls:       3,
332                                                         Usec:        12,
333                                                         UsecPerCall: 3.68,
334                                                 },
335                                                 CmdstatMonitor: sdlgoredis.CommandstatsValues{
336                                                         Calls:       6,
337                                                         Usec:        11,
338                                                         UsecPerCall: 2.11,
339                                                 },
340                                                 CmdstatSlaveof: sdlgoredis.CommandstatsValues{
341                                                         Calls:       1,
342                                                         Usec:        412,
343                                                         UsecPerCall: 412.00,
344                                                 },
345                                         },
346                                         Keyspace: sdlgoredis.KeyspaceInfoFields{
347                                                 Db: sdlgoredis.KeyspaceValues{
348                                                         Keys: 123,
349                                                 },
350                                         },
351                                 },
352                         },
353                 },
354         )
355 }
356
357 func runStatisticsCli() (string, error) {
358         buf := new(bytes.Buffer)
359         cmd := cli.NewStatisticsCmd(newStatisticsDatabaseMock)
360         cmd.SetOut(buf)
361
362         err := cmd.Execute()
363
364         return buf.String(), err
365 }
366
367 func TestCliStatisticsCanShowHelp(t *testing.T) {
368         var expOkErr error
369         expHelp := "Usage:\n  " + "statistics [flags]"
370         expNokErr := errors.New("unknown flag: --some-unknown-flag")
371         expArgCntErr := errors.New("accepts 0 arg(s), received 1")
372         tests := []struct {
373                 args      string
374                 expErr    error
375                 expOutput string
376         }{
377                 {args: "-h", expErr: expOkErr, expOutput: expHelp},
378                 {args: "--help", expErr: expOkErr, expOutput: expHelp},
379                 {args: "--some-unknown-flag", expErr: expNokErr, expOutput: expHelp},
380                 {args: "some-extra-argument", expErr: expArgCntErr, expOutput: expHelp},
381         }
382
383         for _, test := range tests {
384                 buf := new(bytes.Buffer)
385                 cmd := cli.NewStatisticsCmd(newStatisticsDatabaseMock)
386                 cmd.SetOut(buf)
387                 cmd.SetArgs([]string{test.args})
388
389                 err := cmd.Execute()
390
391                 stdout := buf.String()
392                 assert.Equal(t, test.expErr, err)
393                 assert.Contains(t, stdout, test.expOutput)
394         }
395 }
396
397 func TestCliStatisticsShowOnlyColumnsNames(t *testing.T) {
398         teardownTest := setupStatisticsTestcase(t)
399         defer teardownTest(t)
400
401         expOut := "CLUSTER  ROLE  ADDRESS  STATISTICS\n"
402
403         stdout, err := runStatisticsCli()
404
405         assert.Nil(t, err)
406         assert.Equal(t, expOut, stdout)
407 }
408
409 func TestCliStatisticsShowPrimaryInfo(t *testing.T) {
410         teardownTest := setupStatisticsTestcase(t)
411         defer teardownTest(t)
412
413         setupStatisticsMockDbWithPrimaryInfo()
414         expOut := columnNamesOut + primaryOut
415
416         stdout, err := runStatisticsCli()
417
418         assert.Nil(t, err)
419         assert.Equal(t, expOut, stdout)
420 }
421
422 func TestCliStatisticsShowPrimaryAndReplicaInfo(t *testing.T) {
423         teardownTest := setupStatisticsTestcase(t)
424         defer teardownTest(t)
425
426         setupStatisticsMockDbWithPrimaryInfo()
427         setupStatisticsMockDbWithReplicaInfo()
428         expOut := columnNamesOut + primaryOut + replicaOut
429
430         stdout, err := runStatisticsCli()
431
432         assert.Nil(t, err)
433         assert.Equal(t, expOut, stdout)
434 }
435
436 func TestCliStatisticsRaisesError(t *testing.T) {
437         teardownTest := setupStatisticsTestcase(t)
438         defer teardownTest(t)
439
440         expErr := errors.New("Boom!")
441         expOut := "Usage:\n  statistics [flags]"
442         statsMock.dbErr = errors.New("Boom!")
443
444         stdout, err := runStatisticsCli()
445
446         assert.Equal(t, expErr, err)
447         assert.Contains(t, stdout, expOut)
448 }