github.com/mackerelio/mackerel-agent-plugins@v0.89.3/mackerel-plugin-linux/lib/linux_test.go (about)

     1  package mplinux
     2  
     3  import (
     4  	"bytes"
     5  	"fmt"
     6  	"os"
     7  	"reflect"
     8  	"testing"
     9  
    10  	"github.com/stretchr/testify/assert"
    11  )
    12  
    13  func TestCollectWho(t *testing.T) {
    14  	_, err := os.Stat("/usr/bin/who")
    15  	if err != nil {
    16  		return
    17  	}
    18  	p := make(map[string]interface{})
    19  
    20  	assert.Nil(t, collectWho(&p))
    21  }
    22  
    23  func TestParseWho(t *testing.T) {
    24  	stub := `test0  pts/48       2014-09-30 08:00 (192.168.24.123)
    25  test1  pts/48       2014-09-30 08:59 (192.168.24.123)
    26  test2  pts/48       2014-09-30 09:00 (192.168.24.123)`
    27  	stat := make(map[string]interface{})
    28  
    29  	err := parseWho(stub, &stat)
    30  	assert.Nil(t, err)
    31  	assert.EqualValues(t, stat["users"], 3)
    32  }
    33  
    34  func TestParseWho2(t *testing.T) {
    35  	stub := ""
    36  	stat := make(map[string]interface{})
    37  
    38  	err := parseWho(stub, &stat)
    39  	assert.Nil(t, err)
    40  	assert.EqualValues(t, stat["users"], 0)
    41  }
    42  
    43  func TestGetWho(t *testing.T) {
    44  	_, err := os.Stat("/usr/sbin/who")
    45  	if err != nil {
    46  		return
    47  	}
    48  
    49  	ret, err := getWho()
    50  	assert.Nil(t, err)
    51  	assert.NotNil(t, ret)
    52  }
    53  
    54  func TestCollectStat(t *testing.T) {
    55  	path := "/proc/stat"
    56  	_, err := os.Stat(path)
    57  	if err != nil {
    58  		return
    59  	}
    60  	p := make(map[string]interface{})
    61  
    62  	assert.Nil(t, collectProcStat(path, &p))
    63  }
    64  
    65  func TestParseProcStat(t *testing.T) {
    66  	stub := `intr 614818624 122 8 0 0 1 0 0 0 1 0 0 0 123 0 0 0 0 0 0 0 0 0 0 0 4846888 0 44650320 253 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
    67   ctxt 879305394
    68   btime 1409212617
    69   processes 1959410`
    70  	stat := make(map[string]interface{})
    71  
    72  	err := parseProcStat(bytes.NewBufferString(stub), &stat)
    73  	assert.Nil(t, err)
    74  	assert.EqualValues(t, stat["interrupts"], 614818624)
    75  	assert.EqualValues(t, stat["context_switches"], 879305394)
    76  	assert.EqualValues(t, stat["forks"], 1959410)
    77  }
    78  
    79  func TestCollectNetworkStat(t *testing.T) {
    80  	_, err := os.Stat("/usr/sbin/ss")
    81  	if err != nil {
    82  		return
    83  	}
    84  	p := make(map[string]interface{})
    85  
    86  	assert.Nil(t, collectNetworkStat(&p))
    87  }
    88  
    89  func TestParseSs(t *testing.T) {
    90  	testCases := []struct {
    91  		name   string
    92  		input  string
    93  		expect map[string]interface{}
    94  	}{
    95  		{
    96  			name: "Cent6",
    97  			input: `State      Recv-Q Send-Q                       Local Address:Port                         Peer Address:Port 
    98  LISTEN     0      128                                     :::45103                                  :::*     
    99  LISTEN     0      128                                     :::111                                    :::* 
   100  TIME-WAIT  0      0                         ::ffff:127.0.0.1:80                       ::ffff:127.0.0.1:50082 
   101  ESTAB      0      0                              10.0.25.101:60826                         10.0.25.104:5672  `,
   102  			expect: map[string]interface{}{
   103  				"LISTEN":    2.0,
   104  				"TIME-WAIT": 1.0,
   105  				"ESTAB":     1.0,
   106  			},
   107  		},
   108  		{
   109  			name: "Cent7",
   110  			input: `Netid State      Recv-Q Send-Q                                      Local Address:Port                                        Peer Address:Port
   111  nl    UNCONN     0      0                                                      18:0                                                       *
   112  p_raw UNCONN     0      0                                                       *:em2                                                     *
   113  u_dgr UNCONN     0      0                                                /dev/log 10549                                                  * 0
   114  u_dgr LISTEN     0      0                                       /run/udev/control 8552                                                   * 0
   115  u_str LISTEN     0      10                                  /var/run/acpid.socket 9649                                                   * 0
   116  u_str ESTAB      0      0                                    @/com/ubuntu/upstart 10582                                                  * 1887`,
   117  
   118  			expect: map[string]interface{}{
   119  				"LISTEN": 2.0,
   120  				"UNCONN": 3.0,
   121  				"ESTAB":  1.0,
   122  			},
   123  		},
   124  		{
   125  			name: "Cent7 overstuffed",
   126  			input: `NetidState      Recv-Q Send-Q                                      Local Address:Port                                        Peer Address:Port
   127  nl   UNCONN     0      0                                                      18:0                                                       *
   128  p_rawUNCONN     0      0                                                       *:em2                                                     *
   129  u_dgrUNCONN     0      0                                                /dev/log 10549                                                  * 0
   130  u_dgrLISTEN     0      0                                       /run/udev/control 8552                                                   * 0
   131  u_strLISTEN     0      10                                  /var/run/acpid.socket 9649                                                   * 0
   132  u_strESTAB      0      0                                    @/com/ubuntu/upstart 10582                                                  * 1887`,
   133  			expect: map[string]interface{}{
   134  				"LISTEN": 2.0,
   135  				"UNCONN": 3.0,
   136  				"ESTAB":  1.0,
   137  			},
   138  		},
   139  	}
   140  
   141  	for _, tc := range testCases {
   142  		t.Run(tc.name, func(t *testing.T) {
   143  			out := make(map[string]interface{})
   144  			err := parseSs(bytes.NewBufferString(tc.input), &out)
   145  			if err != nil {
   146  				t.Errorf("error should be nil but: %s", err)
   147  			}
   148  			if !reflect.DeepEqual(out, tc.expect) {
   149  				t.Errorf("something went wrong:\n   out: %v\nexpect: %v", out, tc.expect)
   150  			}
   151  		})
   152  	}
   153  }
   154  func TestCollectProcVmstat(t *testing.T) {
   155  	path := "/proc/vmstat"
   156  	_, err := os.Stat(path)
   157  	if err != nil {
   158  		return
   159  	}
   160  	p := make(map[string]interface{})
   161  
   162  	assert.Nil(t, collectProcVmstat(path, &p))
   163  }
   164  
   165  func TestParseProcVmstat(t *testing.T) {
   166  	stub := `pgpgin 770294
   167  pgpgout 31351354
   168  pswpin 0
   169  pswpout 113`
   170  	stat := make(map[string]interface{})
   171  
   172  	err := parseProcVmstat(bytes.NewBufferString(stub), &stat)
   173  	assert.Nil(t, err)
   174  	assert.EqualValues(t, stat["pgpgin"], 770294)
   175  	assert.EqualValues(t, stat["pgpgout"], 31351354)
   176  	assert.EqualValues(t, stat["pswpin"], 0)
   177  	assert.EqualValues(t, stat["pswpout"], 113)
   178  }
   179  
   180  func TestCollectDiskStats(t *testing.T) {
   181  	path := "/sys"
   182  
   183  	_, err := os.Stat(path)
   184  	if err != nil {
   185  		return
   186  	}
   187  	p := make(map[string]interface{})
   188  
   189  	assert.Nil(t, collectDiskStats(path, &p))
   190  }
   191  
   192  func TestParseDiskStat(t *testing.T) {
   193  	name := "testdevice"
   194  	stub := `  36049      277  3702446    36470  1165021   131631 15197712  1648460        0   771090  1684180`
   195  	stat := make(map[string]interface{})
   196  
   197  	err := parseDiskStat(name, stub, &stat)
   198  	assert.Nil(t, err)
   199  	assert.EqualValues(t, stat[fmt.Sprintf("iotime_%s", name)], 771090)
   200  	assert.EqualValues(t, stat[fmt.Sprintf("iotime_weighted_%s", name)], 1684180)
   201  	assert.EqualValues(t, stat[fmt.Sprintf("tsreading_%s", name)], 36470)
   202  	assert.EqualValues(t, stat[fmt.Sprintf("tswriting_%s", name)], 1648460)
   203  }
   204  
   205  func TestParseDiskStat_Kernel4_18(t *testing.T) {
   206  	name := "testdevice"
   207  	stub := `   28994        0   304494    16115    10063    42070  1546600    41730        0     3434    55235        0        0        0        0`
   208  	stat := make(map[string]interface{})
   209  
   210  	err := parseDiskStat(name, stub, &stat)
   211  	assert.Nil(t, err)
   212  	assert.EqualValues(t, stat[fmt.Sprintf("iotime_%s", name)], 3434)
   213  	assert.EqualValues(t, stat[fmt.Sprintf("iotime_weighted_%s", name)], 55235)
   214  	assert.EqualValues(t, stat[fmt.Sprintf("tsreading_%s", name)], 16115)
   215  	assert.EqualValues(t, stat[fmt.Sprintf("tswriting_%s", name)], 41730)
   216  }
   217  
   218  func TestCollectVirtualDevice(t *testing.T) {
   219  	cases := []struct {
   220  		name     string
   221  		expected bool
   222  	}{
   223  		{
   224  			name:     "loop0",
   225  			expected: false,
   226  		},
   227  		{
   228  			name:     "dm-3",
   229  			expected: false,
   230  		},
   231  		{
   232  			name:     "fioa", // ioDrive(FusionIO) #1
   233  			expected: true,
   234  		},
   235  		{
   236  			name:     "fioz", // ioDrive(FusionIO) #26
   237  			expected: true,
   238  		},
   239  		{
   240  			name:     "fioaa", // ioDrive(FusionIO) #27
   241  			expected: true,
   242  		},
   243  	}
   244  
   245  	for _, c := range cases {
   246  		assert.EqualValues(t, c.expected, collectVirtualDevice.Match([]byte(c.name)))
   247  	}
   248  }