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 }