2 Copyright (c) 2021 AT&T Intellectual Property.
3 Copyright (c) 2018-2021 Nokia.
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
9 http://www.apache.org/licenses/LICENSE-2.0
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.
19 * This source code is part of the near-RT RIC (RAN Intelligent Controller)
20 * platform project (RICP).
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"
35 var columnNamesOut = `CLUSTER ROLE ADDRESS STATISTICS
37 var primaryOut = `0 Primary 192.168.10.1:6379 UptimeInDays:1
39 ClientRecentMaxInputBuffer:2
40 ClientRecentMaxOutputBuffer:0
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
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
72 var replicaOut = `0 Replica 192.168.10.2:6379 UptimeInDays:2
74 ClientRecentMaxInputBuffer:3
75 ClientRecentMaxOutputBuffer:1
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
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
106 var statsMock *statisticsMock
108 type statisticsMock struct {
109 dbIface *mocks.MockDB
111 dbStatistics sdlgoredis.DbStatistics
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)
122 func setupStatisticsMockDb() {
123 if statsMock == nil {
124 statsMock = new(statisticsMock)
126 statsMock.dbStatistics.Stats = []*sdlgoredis.DbStatisticsInfo{}
129 func setupStatisticsTestcase(tb testing.TB) func(tb testing.TB) {
130 setupStatisticsMockDb()
132 return func(tb testing.TB) {
133 statsMock.dbStatistics.Stats = nil
137 func setupStatisticsMockDbWithPrimaryInfo() {
138 statsMock.dbStatistics.Stats = append(statsMock.dbStatistics.Stats,
139 &sdlgoredis.DbStatisticsInfo{
140 IPAddr: "192.168.10.1",
142 Info: &sdlgoredis.DbInfo{
143 Fields: sdlgoredis.DbInfoFields{
145 Server: sdlgoredis.ServerInfoFields{
148 Clients: sdlgoredis.ClientsInfoFields{
150 ClientRecentMaxInputBuffer: 2,
151 ClientRecentMaxOutputBuffer: 0,
153 Memory: sdlgoredis.MeroryInfoFields{
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,
164 Stats: sdlgoredis.StatsInfoFields{
165 TotalConnectionsReceived: 566,
166 TotalCommandsProcessed: 3635063,
172 Cpu: sdlgoredis.CpuInfoFields{
173 UsedCpuSys: 1457.472805,
174 UsedCpuUser: 861.060018,
176 Commandstats: sdlgoredis.CommandstatsInfoFields{
177 CmdstatReplconf: sdlgoredis.CommandstatsValues{
182 CmdstatKeys: sdlgoredis.CommandstatsValues{
187 CmdstatRole: sdlgoredis.CommandstatsValues{
192 CmdstatConfig: sdlgoredis.CommandstatsValues{},
193 CmdstatPsync: sdlgoredis.CommandstatsValues{
198 CmdstatMset: sdlgoredis.CommandstatsValues{
203 CmdstatPublish: sdlgoredis.CommandstatsValues{
208 CmdstatInfo: sdlgoredis.CommandstatsValues{
213 CmdstatPing: sdlgoredis.CommandstatsValues{
218 CmdstatClient: sdlgoredis.CommandstatsValues{
223 CmdstatCommand: sdlgoredis.CommandstatsValues{
226 UsecPerCall: 3034.51,
228 CmdstatSubscribe: sdlgoredis.CommandstatsValues{
233 CmdstatMonitor: sdlgoredis.CommandstatsValues{
238 CmdstatSlaveof: sdlgoredis.CommandstatsValues{},
240 Keyspace: sdlgoredis.KeyspaceInfoFields{
241 Db: sdlgoredis.KeyspaceValues{
251 func setupStatisticsMockDbWithReplicaInfo() {
252 statsMock.dbStatistics.Stats = append(statsMock.dbStatistics.Stats,
253 &sdlgoredis.DbStatisticsInfo{
254 IPAddr: "192.168.10.2",
256 Info: &sdlgoredis.DbInfo{
257 Fields: sdlgoredis.DbInfoFields{
259 Server: sdlgoredis.ServerInfoFields{
262 Clients: sdlgoredis.ClientsInfoFields{
264 ClientRecentMaxInputBuffer: 3,
265 ClientRecentMaxOutputBuffer: 1,
267 Memory: sdlgoredis.MeroryInfoFields{
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,
278 Stats: sdlgoredis.StatsInfoFields{
279 TotalConnectionsReceived: 567,
280 TotalCommandsProcessed: 3635064,
286 Cpu: sdlgoredis.CpuInfoFields{
287 UsedCpuSys: 1457.472806,
288 UsedCpuUser: 861.060019,
290 Commandstats: sdlgoredis.CommandstatsInfoFields{
291 CmdstatReplconf: sdlgoredis.CommandstatsValues{},
292 CmdstatKeys: sdlgoredis.CommandstatsValues{},
293 CmdstatRole: sdlgoredis.CommandstatsValues{
298 CmdstatConfig: sdlgoredis.CommandstatsValues{
303 CmdstatPsync: sdlgoredis.CommandstatsValues{},
304 CmdstatMset: sdlgoredis.CommandstatsValues{
309 CmdstatPublish: sdlgoredis.CommandstatsValues{
314 CmdstatInfo: sdlgoredis.CommandstatsValues{
319 CmdstatPing: sdlgoredis.CommandstatsValues{
324 CmdstatClient: sdlgoredis.CommandstatsValues{},
325 CmdstatCommand: sdlgoredis.CommandstatsValues{
328 UsecPerCall: 3034.52,
330 CmdstatSubscribe: sdlgoredis.CommandstatsValues{
335 CmdstatMonitor: sdlgoredis.CommandstatsValues{
340 CmdstatSlaveof: sdlgoredis.CommandstatsValues{
346 Keyspace: sdlgoredis.KeyspaceInfoFields{
347 Db: sdlgoredis.KeyspaceValues{
357 func runStatisticsCli() (string, error) {
358 buf := new(bytes.Buffer)
359 cmd := cli.NewStatisticsCmd(newStatisticsDatabaseMock)
364 return buf.String(), err
367 func TestCliStatisticsCanShowHelp(t *testing.T) {
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")
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},
383 for _, test := range tests {
384 buf := new(bytes.Buffer)
385 cmd := cli.NewStatisticsCmd(newStatisticsDatabaseMock)
387 cmd.SetArgs([]string{test.args})
391 stdout := buf.String()
392 assert.Equal(t, test.expErr, err)
393 assert.Contains(t, stdout, test.expOutput)
397 func TestCliStatisticsShowOnlyColumnsNames(t *testing.T) {
398 teardownTest := setupStatisticsTestcase(t)
399 defer teardownTest(t)
401 expOut := "CLUSTER ROLE ADDRESS STATISTICS\n"
403 stdout, err := runStatisticsCli()
406 assert.Equal(t, expOut, stdout)
409 func TestCliStatisticsShowPrimaryInfo(t *testing.T) {
410 teardownTest := setupStatisticsTestcase(t)
411 defer teardownTest(t)
413 setupStatisticsMockDbWithPrimaryInfo()
414 expOut := columnNamesOut + primaryOut
416 stdout, err := runStatisticsCli()
419 assert.Equal(t, expOut, stdout)
422 func TestCliStatisticsShowPrimaryAndReplicaInfo(t *testing.T) {
423 teardownTest := setupStatisticsTestcase(t)
424 defer teardownTest(t)
426 setupStatisticsMockDbWithPrimaryInfo()
427 setupStatisticsMockDbWithReplicaInfo()
428 expOut := columnNamesOut + primaryOut + replicaOut
430 stdout, err := runStatisticsCli()
433 assert.Equal(t, expOut, stdout)
436 func TestCliStatisticsRaisesError(t *testing.T) {
437 teardownTest := setupStatisticsTestcase(t)
438 defer teardownTest(t)
440 expErr := errors.New("Boom!")
441 expOut := "Usage:\n statistics [flags]"
442 statsMock.dbErr = errors.New("Boom!")
444 stdout, err := runStatisticsCli()
446 assert.Equal(t, expErr, err)
447 assert.Contains(t, stdout, expOut)