github.com/apcera/util@v0.0.0-20180322191801-7a50bc84ee48/proc/proc_test.go (about)

     1  // Copyright 2013-2015 Apcera Inc. All rights reserved.
     2  
     3  package proc
     4  
     5  import (
     6  	"strings"
     7  	"testing"
     8  
     9  	tt "github.com/apcera/util/testtool"
    10  )
    11  
    12  func TestMountPoints(t *testing.T) {
    13  	testHelper := tt.StartTest(t)
    14  	defer testHelper.FinishTest()
    15  
    16  	// Test 1: Very basic /proc/mounts file. Ensure that each
    17  	//         field is properly parsed, the order is correct, etc.
    18  	MountProcFile = testHelper.WriteTempFile(strings.Join([]string{
    19  		"rootfs1 / rootfs2 rw 0 0",
    20  	}, "\n"))
    21  	if mp, err := MountPoints(); err != nil {
    22  		tt.Fatalf(t, "Error from MountPoints: %s", err)
    23  	} else if len(mp) != 1 {
    24  		tt.Fatalf(t, "Bad return value: %#v", mp)
    25  	} else if mp["/"].Dev != "rootfs1" {
    26  		tt.Fatalf(t, "invalid device: %s", mp["/"].Dev)
    27  	} else if mp["/"].Path != "/" {
    28  		tt.Fatalf(t, "invalid path: %s", mp["/"].Path)
    29  	} else if mp["/"].Fstype != "rootfs2" {
    30  		tt.Fatalf(t, "invalid file system type: %s", mp["/"].Fstype)
    31  	} else if mp["/"].Options != "rw" {
    32  		tt.Fatalf(t, "invalid options: %s", mp["/"].Options)
    33  	} else if mp["/"].Dump != 0 {
    34  		tt.Fatalf(t, "invalid dump value: %d", mp["/"].Dump)
    35  	} else if mp["/"].Fsck != 0 {
    36  		tt.Fatalf(t, "invalid fsck value: %d", mp["/"].Fsck)
    37  	}
    38  
    39  	// Test 2: Priority, two mounts in the same path. Ensure that
    40  	//         the last listed always wins.
    41  	MountProcFile = testHelper.WriteTempFile(strings.Join([]string{
    42  		"bad / bad bad 1 1",
    43  		"rootfs1 / rootfs2 rw 0 0",
    44  	}, "\n"))
    45  	if mp, err := MountPoints(); err != nil {
    46  		tt.Fatalf(t, "Error from MountPoints: %s", err)
    47  	} else if len(mp) != 1 {
    48  		tt.Fatalf(t, "Bad return value: %#v", mp)
    49  	} else if mp["/"].Dev != "rootfs1" {
    50  		tt.Fatalf(t, "invalid device: %s", mp["/"].Dev)
    51  	} else if mp["/"].Path != "/" {
    52  		tt.Fatalf(t, "invalid path: %s", mp["/"].Path)
    53  	} else if mp["/"].Fstype != "rootfs2" {
    54  		tt.Fatalf(t, "invalid file system type: %s", mp["/"].Fstype)
    55  	} else if mp["/"].Options != "rw" {
    56  		tt.Fatalf(t, "invalid options: %s", mp["/"].Options)
    57  	} else if mp["/"].Dump != 0 {
    58  		tt.Fatalf(t, "invalid dump value: %d", mp["/"].Dump)
    59  	} else if mp["/"].Fsck != 0 {
    60  		tt.Fatalf(t, "invalid fsck value: %d", mp["/"].Fsck)
    61  	}
    62  
    63  	// Test 3: Bad path value (relative or otherwise invalid.)
    64  	MountProcFile = testHelper.WriteTempFile(strings.Join([]string{
    65  		"dev badpath fstype options 0 0",
    66  	}, "\n"))
    67  	if _, err := MountPoints(); err == nil {
    68  		tt.Fatalf(t, "Expected an error from MountPoints()")
    69  	}
    70  
    71  	// Test 4: Bad dump value (not an int)
    72  	MountProcFile = testHelper.WriteTempFile(strings.Join([]string{
    73  		"dev / fstype options bad 0",
    74  	}, "\n"))
    75  	if _, err := MountPoints(); err == nil {
    76  		tt.Fatalf(t, "Expected an error from MountPoints()")
    77  	}
    78  
    79  	// Test 5: Bad dump value (negative)
    80  	MountProcFile = testHelper.WriteTempFile(strings.Join([]string{
    81  		"dev / fstype options -1 0",
    82  	}, "\n"))
    83  	if _, err := MountPoints(); err == nil {
    84  		tt.Fatalf(t, "Expected an error from MountPoints()")
    85  	}
    86  
    87  	// Test 6: Bad dump value (not an int)
    88  	MountProcFile = testHelper.WriteTempFile(strings.Join([]string{
    89  		"dev / fstype options 0 bad",
    90  	}, "\n"))
    91  	if _, err := MountPoints(); err == nil {
    92  		tt.Fatalf(t, "Expected an error from MountPoints()")
    93  	}
    94  
    95  	// Test 7: Bad dump value (negative)
    96  	MountProcFile = testHelper.WriteTempFile(strings.Join([]string{
    97  		"dev / fstype options 0 -1",
    98  	}, "\n"))
    99  	if _, err := MountPoints(); err == nil {
   100  		tt.Fatalf(t, "Expected an error from MountPoints()")
   101  	}
   102  
   103  	// Test 8: Too many columns.
   104  	MountProcFile = testHelper.WriteTempFile(strings.Join([]string{
   105  		"dev / fstype options 0 0 extra",
   106  	}, "\n"))
   107  	if _, err := MountPoints(); err == nil {
   108  		tt.Fatalf(t, "Expected an error from MountPoints()")
   109  	}
   110  }
   111  
   112  func TestInterfaceStats(t *testing.T) {
   113  	testHelper := tt.StartTest(t)
   114  	defer testHelper.FinishTest()
   115  
   116  	expect := func(expected InterfaceStat, returned InterfaceStat) {
   117  		if expected.Device != returned.Device {
   118  			tt.Fatalf(t, "Expected Device=%s, got %s",
   119  				expected.Device, returned.Device)
   120  		} else if expected.RxBytes != returned.RxBytes {
   121  			tt.Fatalf(t, "Expected RxBytes=%d, got %d",
   122  				expected.RxBytes, returned.RxBytes)
   123  		} else if expected.RxPackets != returned.RxPackets {
   124  			tt.Fatalf(t, "Expected RxPackets=%d, got %d",
   125  				expected.RxPackets, returned.RxPackets)
   126  		} else if expected.RxErrors != returned.RxErrors {
   127  			tt.Fatalf(t, "Expected RxErrors=%d, got %d",
   128  				expected.RxErrors, returned.RxErrors)
   129  		} else if expected.RxDrop != returned.RxDrop {
   130  			tt.Fatalf(t, "Expected RxDrop=%d, got %d",
   131  				expected.RxDrop, returned.RxDrop)
   132  		} else if expected.RxFifo != returned.RxFifo {
   133  			tt.Fatalf(t, "Expected RxFifo=%d, got %d",
   134  				expected.RxFifo, returned.RxFifo)
   135  		} else if expected.RxFrame != returned.RxFrame {
   136  			tt.Fatalf(t, "Expected RxFrame=%d, got %d",
   137  				expected.RxFrame, returned.RxFrame)
   138  		} else if expected.RxCompressed != returned.RxCompressed {
   139  			tt.Fatalf(t, "Expected RxCompressed=%d, got %d",
   140  				expected.RxCompressed, returned.RxCompressed)
   141  		} else if expected.RxMulticast != returned.RxMulticast {
   142  			tt.Fatalf(t, "Expected RxMulticast=%d, got %d",
   143  				expected.RxMulticast, returned.RxMulticast)
   144  		} else if expected.TxBytes != returned.TxBytes {
   145  			tt.Fatalf(t, "Expected TxBytes=%d, got %d",
   146  				expected.TxBytes, returned.TxBytes)
   147  		} else if expected.TxPackets != returned.TxPackets {
   148  			tt.Fatalf(t, "Expected TxPackets=%d, got %d",
   149  				expected.TxPackets, returned.TxPackets)
   150  		} else if expected.TxErrors != returned.TxErrors {
   151  			tt.Fatalf(t, "Expected TxErrors=%d, got %d",
   152  				expected.TxErrors, returned.TxErrors)
   153  		} else if expected.TxDrop != returned.TxDrop {
   154  			tt.Fatalf(t, "Expected TxDrop=%d, got %d",
   155  				expected.TxDrop, returned.TxDrop)
   156  		} else if expected.TxFifo != returned.TxFifo {
   157  			tt.Fatalf(t, "Expected TxFifo=%d, got %d",
   158  				expected.TxFifo, returned.TxFifo)
   159  		} else if expected.TxFrame != returned.TxFrame {
   160  			tt.Fatalf(t, "Expected TxFrame=%d, got %d",
   161  				expected.TxFrame, returned.TxFrame)
   162  		} else if expected.TxCompressed != returned.TxCompressed {
   163  			tt.Fatalf(t, "Expected TxCompressed=%d, got %d",
   164  				expected.TxCompressed, returned.TxCompressed)
   165  		} else if expected.TxMulticast != returned.TxMulticast {
   166  			tt.Fatalf(t, "Expected TxMulticast=%d, got %d",
   167  				expected.TxMulticast, returned.TxMulticast)
   168  		}
   169  	}
   170  
   171  	// -----------------------------
   172  	// Test 1: Real simple use case.
   173  	// -----------------------------
   174  
   175  	DeviceStatsFile = testHelper.WriteTempFile(strings.Join([]string{
   176  		"header 1",
   177  		"header 2",
   178  		"dev0: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16",
   179  	}, "\n"))
   180  	expected := InterfaceStat{
   181  		Device:       "dev0",
   182  		RxBytes:      1,
   183  		RxPackets:    2,
   184  		RxErrors:     3,
   185  		RxDrop:       4,
   186  		RxFifo:       5,
   187  		RxFrame:      6,
   188  		RxCompressed: 7,
   189  		RxMulticast:  8,
   190  		TxBytes:      9,
   191  		TxPackets:    10,
   192  		TxErrors:     11,
   193  		TxDrop:       12,
   194  		TxFifo:       13,
   195  		TxFrame:      14,
   196  		TxCompressed: 15,
   197  		TxMulticast:  16,
   198  	}
   199  	if stats, err := InterfaceStats(); err != nil {
   200  		tt.Fatalf(t, "Error from TestInterfaceStats: %s", err)
   201  	} else if len(stats) != 1 {
   202  		tt.Fatalf(t, "Bad return value: %#v", stats)
   203  	} else {
   204  		expect(expected, stats["dev0"])
   205  	}
   206  
   207  	// -----------------------------
   208  	// Test 2: Invalid format
   209  	// -----------------------------
   210  
   211  	DeviceStatsFile = testHelper.WriteTempFile(strings.Join([]string{
   212  		"header 1",
   213  		"header 2",
   214  		"dev0: NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN",
   215  	}, "\n"))
   216  	if _, err := InterfaceStats(); err == nil {
   217  		tt.Fatalf(t, "Expected error not returned.")
   218  	}
   219  }