github.com/influxdata/telegraf@v1.30.3/internal/snmp/translator_netsnmp_mocks_test.go (about) 1 package snmp 2 3 import ( 4 "fmt" 5 "os" 6 "os/exec" 7 "strings" 8 "testing" 9 ) 10 11 type mockedCommandResult struct { 12 stdout string 13 stderr string 14 exitError bool 15 } 16 17 func mockExecCommand(arg0 string, args ...string) *exec.Cmd { 18 args = append([]string{"-test.run=TestMockExecCommand", "--", arg0}, args...) 19 cmd := exec.Command(os.Args[0], args...) 20 cmd.Stderr = os.Stderr // so the test output shows errors 21 return cmd 22 } 23 24 // This is not a real test. This is just a way of mocking out commands. 25 // 26 // Idea based on https://github.com/golang/go/blob/7c31043/src/os/exec/exec_test.go#L568 27 func TestMockExecCommand(_ *testing.T) { 28 var cmd []string //nolint:prealloc // Pre-allocated this slice would break the algorithm 29 for _, arg := range os.Args { 30 if arg == "--" { 31 cmd = []string{} 32 continue 33 } 34 if cmd == nil { 35 continue 36 } 37 cmd = append(cmd, arg) 38 } 39 if cmd == nil { 40 return 41 } 42 43 cmd0 := strings.Join(cmd, "\000") 44 mcr, ok := mockedCommandResults[cmd0] 45 if !ok { 46 cv := fmt.Sprintf("%#v", cmd)[8:] // trim `[]string` prefix 47 fmt.Fprintf( 48 os.Stderr, 49 "Unmocked command. Please add the following to `mockedCommands` in snmp_mocks_generate.go, and then run `go generate`:\n\t%s,\n", 50 cv, 51 ) 52 //nolint:revive // error code is important for this "test" 53 os.Exit(1) 54 } 55 fmt.Printf("%s", mcr.stdout) 56 fmt.Fprintf(os.Stderr, "%s", mcr.stderr) 57 if mcr.exitError { 58 //nolint:revive // error code is important for this "test" 59 os.Exit(1) 60 } 61 //nolint:revive // error code is important for this "test" 62 os.Exit(0) 63 } 64 65 func init() { 66 execCommand = mockExecCommand 67 } 68 69 // BEGIN GO GENERATE CONTENT 70 var mockedCommandResults = map[string]mockedCommandResult{ 71 "snmptranslate\x00-Td\x00-Ob\x00-m\x00all\x00.1.0.0.0": { 72 stdout: "TEST::testTable\ntestTable OBJECT-TYPE\n -- FROM\tTEST\n MAX-ACCESS\tnot-accessible\n STATUS\tcurrent\n::= { iso(1) 0 testOID(0) 0 }\n", 73 stderr: "", 74 exitError: false, 75 }, 76 "snmptranslate\x00-Td\x00-Ob\x00-m\x00all\x00.1.0.0.1.1": { 77 stdout: "TEST::hostname\nhostname OBJECT-TYPE\n -- FROM\tTEST\n SYNTAX\tOCTET STRING\n MAX-ACCESS\tread-only\n " + 78 "STATUS\tcurrent\n::= { iso(1) 0 testOID(0) 1 1 }\n", 79 stderr: "", 80 exitError: false, 81 }, 82 "snmptranslate\x00-Td\x00-Ob\x00-m\x00all\x00.1.0.0.1.2": { 83 stdout: "TEST::1.2\nanonymous#1 OBJECT-TYPE\n -- FROM\tTEST\n::= { iso(1) 0 testOID(0) 1 2 }\n", 84 stderr: "", 85 exitError: false, 86 }, 87 "snmptranslate\x00-Td\x00-Ob\x00-m\x00all\x001.0.0.1.1": { 88 stdout: "TEST::hostname\nhostname OBJECT-TYPE\n -- FROM\tTEST\n SYNTAX\tOCTET STRING\n MAX-ACCESS\tread-only\n " + 89 "STATUS\tcurrent\n::= { iso(1) 0 testOID(0) 1 1 }\n", 90 stderr: "", 91 exitError: false, 92 }, 93 "snmptranslate\x00-Td\x00-Ob\x00-m\x00all\x00.1.0.0.0.1.1": { 94 stdout: "TEST::server\nserver OBJECT-TYPE\n -- FROM\tTEST\n SYNTAX\tOCTET STRING\n MAX-ACCESS\tread-only\n " + 95 "STATUS\tcurrent\n::= { iso(1) 0 testOID(0) testTable(0) testTableEntry(1) 1 }\n", 96 stderr: "", 97 exitError: false, 98 }, 99 "snmptranslate\x00-Td\x00-Ob\x00-m\x00all\x00.1.0.0.0.1.1.0": { 100 stdout: "TEST::server.0\nserver OBJECT-TYPE\n -- FROM\tTEST\n SYNTAX\tOCTET STRING\n MAX-ACCESS\tread-only\n " + 101 "STATUS\tcurrent\n::= { iso(1) 0 testOID(0) testTable(0) testTableEntry(1) server(1) 0 }\n", 102 stderr: "", 103 exitError: false, 104 }, 105 "snmptranslate\x00-Td\x00-Ob\x00-m\x00all\x00.1.0.0.0.1.5": { 106 stdout: "TEST::testTableEntry.5\ntestTableEntry OBJECT-TYPE\n -- FROM\tTEST\n MAX-ACCESS\tnot-accessible\n " + 107 "STATUS\tcurrent\n INDEX\t\t{ server }\n::= { iso(1) 0 testOID(0) testTable(0) testTableEntry(1) 5 }\n", 108 stderr: "", 109 exitError: false, 110 }, 111 "snmptranslate\x00-Td\x00-Ob\x00-m\x00all\x00.1.2.3": { 112 stdout: "iso.2.3\niso OBJECT-TYPE\n -- FROM\t#-1\n::= { iso(1) 2 3 }\n", 113 stderr: "", 114 exitError: false, 115 }, 116 "snmptranslate\x00-Td\x00-Ob\x00-m\x00all\x00.1.0.0.0.1.7": { 117 stdout: "TEST::testTableEntry.7\ntestTableEntry OBJECT-TYPE\n -- FROM\tTEST\n MAX-ACCESS\tnot-accessible\n " + 118 "STATUS\tcurrent\n INDEX\t\t{ server }\n::= { iso(1) std(0) testOID(0) testTable(0) testTableEntry(1) 7 }\n", 119 stderr: "", 120 exitError: false, 121 }, 122 "snmptranslate\x00-Td\x00-Ob\x00.iso.2.3": { 123 stdout: "iso.2.3\niso OBJECT-TYPE\n -- FROM\t#-1\n::= { iso(1) 2 3 }\n", 124 stderr: "", 125 exitError: false, 126 }, 127 "snmptranslate\x00-Td\x00-Ob\x00-m\x00all\x00.999": {stdout: ".999\n [TRUNCATED]\n", stderr: "", exitError: false}, 128 "snmptranslate\x00-Td\x00-Ob\x00TEST::server": { 129 stdout: "TEST::server\nserver OBJECT-TYPE\n -- FROM\tTEST\n SYNTAX\tOCTET STRING\n MAX-ACCESS\tread-only\n " + 130 "STATUS\tcurrent\n::= { iso(1) 0 testOID(0) testTable(0) testTableEntry(1) 1 }\n", 131 stderr: "", 132 exitError: false, 133 }, 134 "snmptranslate\x00-Td\x00-Ob\x00TEST::server.0": { 135 stdout: "TEST::server.0\nserver OBJECT-TYPE\n -- FROM\tTEST\n SYNTAX\tOCTET STRING\n MAX-ACCESS\tread-only\n " + 136 "STATUS\tcurrent\n::= { iso(1) 0 testOID(0) testTable(0) testTableEntry(1) server(1) 0 }\n", 137 stderr: "", 138 exitError: false, 139 }, 140 "snmptranslate\x00-Td\x00-Ob\x00TEST::testTable": { 141 stdout: "TEST::testTable\ntestTable OBJECT-TYPE\n -- FROM\tTEST\n MAX-ACCESS\tnot-accessible\n STATUS\tcurrent\n::= { iso(1) 0 testOID(0) 0 }\n", 142 stderr: "", 143 exitError: false, 144 }, 145 "snmptranslate\x00-Td\x00-Ob\x00TEST::connections": { 146 stdout: "TEST::connections\nconnections OBJECT-TYPE\n -- FROM\tTEST\n SYNTAX\tINTEGER\n MAX-ACCESS\tread-only\n " + 147 "STATUS\tcurrent\n::= { iso(1) 0 testOID(0) testTable(0) testTableEntry(1) 2 }\n", 148 stderr: "", 149 exitError: false, 150 }, 151 "snmptranslate\x00-Td\x00-Ob\x00TEST::latency": { 152 stdout: "TEST::latency\nlatency OBJECT-TYPE\n -- FROM\tTEST\n SYNTAX\tOCTET STRING\n MAX-ACCESS\tread-only\n " + 153 "STATUS\tcurrent\n::= { iso(1) 0 testOID(0) testTable(0) testTableEntry(1) 3 }\n", 154 stderr: "", 155 exitError: false, 156 }, 157 "snmptranslate\x00-Td\x00-Ob\x00TEST::description": { 158 stdout: "TEST::description\ndescription OBJECT-TYPE\n -- FROM\tTEST\n SYNTAX\tOCTET STRING\n MAX-ACCESS\tread-only\n " + 159 "STATUS\tcurrent\n::= { iso(1) 0 testOID(0) testTable(0) testTableEntry(1) 4 }\n", 160 stderr: "", 161 exitError: false, 162 }, 163 "snmptranslate\x00-Td\x00-Ob\x00TEST::hostname": { 164 stdout: "TEST::hostname\nhostname OBJECT-TYPE\n -- FROM\tTEST\n SYNTAX\tOCTET STRING\n MAX-ACCESS\tread-only\n " + 165 "STATUS\tcurrent\n::= { iso(1) 0 testOID(0) 1 1 }\n", 166 stderr: "", 167 exitError: false, 168 }, 169 "snmptranslate\x00-Td\x00-Ob\x00IF-MIB::ifPhysAddress.1": { 170 stdout: "IF-MIB::ifPhysAddress.1\nifPhysAddress OBJECT-TYPE\n -- FROM\tIF-MIB\n -- TEXTUAL CONVENTION PhysAddress\n SYNTAX\tOCTET STRING\n " + 171 "DISPLAY-HINT\t\"1x:\"\n MAX-ACCESS\tread-only\n STATUS\tcurrent\n DESCRIPTION\t\"The interface's address at its protocol sub-layer. " + 172 "For\n example, for an 802.x interface, this object normally\n contains a MAC address. " + 173 "The interface's media-specific MIB\n must define the bit and byte ordering and the format of the\n " + 174 "value of this object. For interfaces which do not have such\n an address (e.g., a serial line), " + 175 "this object should contain\n an octet string of zero length.\"\n::= " + 176 "{ iso(1) org(3) dod(6) internet(1) mgmt(2) mib-2(1) interfaces(2) ifTable(2) ifEntry(1) ifPhysAddress(6) 1 }\n", 177 stderr: "", 178 exitError: false, 179 }, 180 "snmptranslate\x00-Td\x00-Ob\x00BRIDGE-MIB::dot1dTpFdbAddress.1": { 181 stdout: "BRIDGE-MIB::dot1dTpFdbAddress.1\ndot1dTpFdbAddress OBJECT-TYPE\n -- FROM\tBRIDGE-MIB\n -- TEXTUAL CONVENTION MacAddress\n " + 182 "SYNTAX\tOCTET STRING (6) \n DISPLAY-HINT\t\"1x:\"\n MAX-ACCESS\tread-only\n STATUS\tcurrent\n DESCRIPTION\t\"" + 183 "A unicast MAC address for which the bridge has\n forwarding and/or filtering information.\"\n::= " + 184 "{ iso(1) org(3) dod(6) internet(1) mgmt(2) mib-2(1) dot1dBridge(17) dot1dTp(4) dot1dTpFdbTable(3) dot1dTpFdbEntry(1) dot1dTpFdbAddress(1) 1 }\n", 185 stderr: "", 186 exitError: false, 187 }, 188 "snmptranslate\x00-Td\x00-Ob\x00TCP-MIB::tcpConnectionLocalAddress.1": { 189 stdout: "TCP-MIB::tcpConnectionLocalAddress.1\ntcpConnectionLocalAddress OBJECT-TYPE\n -- FROM\tTCP-MIB\n -- " + 190 "TEXTUAL CONVENTION InetAddress\n SYNTAX\tOCTET STRING (0..255) \n MAX-ACCESS\tnot-accessible\n " + 191 "STATUS\tcurrent\n DESCRIPTION\t\"The local IP address for this TCP connection. " + 192 "The type\n of this address is determined by the value of\n tcpConnectionLocalAddressType.\n\n " + 193 "As this object is used in the index for the\n tcpConnectionTable, implementors should be\n " + 194 "careful not to create entries that would result in OIDs\n with more than 128 subidentifiers; " + 195 "otherwise the information\n cannot be accessed by using SNMPv1, SNMPv2c, or SNMPv3.\"\n" + 196 "::= { iso(1) org(3) dod(6) internet(1) mgmt(2) mib-2(1) tcp(6) tcpConnectionTable(19) tcpConnectionEntry(1) tcpConnectionLocalAddress(2) 1 }\n", 197 stderr: "", 198 exitError: false, 199 }, 200 "snmptranslate\x00-Td\x00TEST::testTable.1": { 201 stdout: "TEST::testTableEntry\ntestTableEntry OBJECT-TYPE\n -- FROM\tTEST\n MAX-ACCESS\tnot-accessible\n " + 202 "STATUS\tcurrent\n INDEX\t\t{ server }\n::= { iso(1) 0 testOID(0) testTable(0) 1 }\n", 203 stderr: "", 204 exitError: false, 205 }, 206 "snmptable\x00-Ch\x00-Cl\x00-c\x00public\x00127.0.0.1\x00TEST::testTable": { 207 stdout: "server connections latency description \nTEST::testTable: No entries\n", 208 stderr: "", 209 exitError: false, 210 }, 211 }