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  }