github.com/influxdata/telegraf@v1.30.3/internal/snmp/translator_netsnmp_mocks_generate.go (about)

     1  //go:build generate
     2  
     3  package main
     4  
     5  import (
     6  	"bufio"
     7  	"bytes"
     8  	"fmt"
     9  	"os"
    10  	"os/exec"
    11  	"strings"
    12  )
    13  
    14  // This file is a generator used to generate the mocks for the commands used by the tests.
    15  
    16  // These are the commands to be mocked.
    17  var mockedCommands = [][]string{
    18  	{"snmptranslate", "-Td", "-Ob", "-m", "all", ".1.0.0.0"},
    19  	{"snmptranslate", "-Td", "-Ob", "-m", "all", ".1.0.0.1.1"},
    20  	{"snmptranslate", "-Td", "-Ob", "-m", "all", ".1.0.0.1.2"},
    21  	{"snmptranslate", "-Td", "-Ob", "-m", "all", "1.0.0.1.1"},
    22  	{"snmptranslate", "-Td", "-Ob", "-m", "all", ".1.0.0.0.1.1"},
    23  	{"snmptranslate", "-Td", "-Ob", "-m", "all", ".1.0.0.0.1.1.0"},
    24  	{"snmptranslate", "-Td", "-Ob", "-m", "all", ".1.0.0.0.1.5"},
    25  	{"snmptranslate", "-Td", "-Ob", "-m", "all", ".1.2.3"},
    26  	{"snmptranslate", "-Td", "-Ob", "-m", "all", ".1.0.0.0.1.7"},
    27  	{"snmptranslate", "-Td", "-Ob", ".iso.2.3"},
    28  	{"snmptranslate", "-Td", "-Ob", "-m", "all", ".999"},
    29  	{"snmptranslate", "-Td", "-Ob", "TEST::server"},
    30  	{"snmptranslate", "-Td", "-Ob", "TEST::server.0"},
    31  	{"snmptranslate", "-Td", "-Ob", "TEST::testTable"},
    32  	{"snmptranslate", "-Td", "-Ob", "TEST::connections"},
    33  	{"snmptranslate", "-Td", "-Ob", "TEST::latency"},
    34  	{"snmptranslate", "-Td", "-Ob", "TEST::description"},
    35  	{"snmptranslate", "-Td", "-Ob", "TEST::hostname"},
    36  	{"snmptranslate", "-Td", "-Ob", "IF-MIB::ifPhysAddress.1"},
    37  	{"snmptranslate", "-Td", "-Ob", "BRIDGE-MIB::dot1dTpFdbAddress.1"},
    38  	{"snmptranslate", "-Td", "-Ob", "TCP-MIB::tcpConnectionLocalAddress.1"},
    39  	{"snmptranslate", "-Td", "TEST::testTable.1"},
    40  	{"snmptable", "-Ch", "-Cl", "-c", "public", "127.0.0.1", "TEST::testTable"},
    41  }
    42  
    43  type mockedCommandResult struct {
    44  	stdout    string
    45  	stderr    string
    46  	exitError bool
    47  }
    48  
    49  func main() {
    50  	if err := generate(); err != nil {
    51  		fmt.Fprintf(os.Stderr, "error: %s\n", err)
    52  		os.Exit(1)
    53  	}
    54  }
    55  
    56  func generate() error {
    57  	f, err := os.OpenFile("snmp_mocks_test.go", os.O_RDWR, 0644)
    58  	if err != nil {
    59  		return err
    60  	}
    61  	br := bufio.NewReader(f)
    62  	var i int64
    63  	for l, err := br.ReadString('\n'); err == nil; l, err = br.ReadString('\n') {
    64  		i += int64(len(l))
    65  		if l == "// BEGIN GO GENERATE CONTENT\n" {
    66  			break
    67  		}
    68  	}
    69  	f.Truncate(i)
    70  	f.Seek(i, 0)
    71  
    72  	fmt.Fprintf(f, "var mockedCommandResults = map[string]mockedCommandResult{\n")
    73  
    74  	for _, cmd := range mockedCommands {
    75  		ec := exec.Command(cmd[0], cmd[1:]...)
    76  		out := bytes.NewBuffer(nil)
    77  		err := bytes.NewBuffer(nil)
    78  		ec.Stdout = out
    79  		ec.Stderr = err
    80  		ec.Env = []string{
    81  			"MIBDIRS=+./testdata",
    82  		}
    83  
    84  		var mcr mockedCommandResult
    85  		if err := ec.Run(); err != nil {
    86  			if err, ok := err.(*exec.ExitError); !ok {
    87  				mcr.exitError = true
    88  			} else {
    89  				return fmt.Errorf("executing %v: %s", cmd, err)
    90  			}
    91  		}
    92  		mcr.stdout = string(out.Bytes())
    93  		mcr.stderr = string(err.Bytes())
    94  		cmd0 := strings.Join(cmd, "\000")
    95  		mcrv := fmt.Sprintf("%#v", mcr)[5:] // trim `main.` prefix
    96  		fmt.Fprintf(f, "%#v: %s,\n", cmd0, mcrv)
    97  	}
    98  	f.Write([]byte("}\n"))
    99  	f.Close()
   100  
   101  	return exec.Command("gofmt", "-w", "translator_netsnmp_mocks_test.go").Run()
   102  }