109 lines
		
	
	
		
			2.7 KiB
		
	
	
	
		
			Go
		
	
	
	
			
		
		
	
	
			109 lines
		
	
	
		
			2.7 KiB
		
	
	
	
		
			Go
		
	
	
	
| package chrony
 | |
| 
 | |
| import (
 | |
| 	"fmt"
 | |
| 	"os"
 | |
| 	"os/exec"
 | |
| 	"testing"
 | |
| 
 | |
| 	"github.com/influxdata/telegraf/testutil"
 | |
| )
 | |
| 
 | |
| func TestGather(t *testing.T) {
 | |
| 	c := Chrony{
 | |
| 		path: "chronyc",
 | |
| 	}
 | |
| 	// overwriting exec commands with mock commands
 | |
| 	execCommand = fakeExecCommand
 | |
| 	defer func() { execCommand = exec.Command }()
 | |
| 	var acc testutil.Accumulator
 | |
| 
 | |
| 	err := c.Gather(&acc)
 | |
| 	if err != nil {
 | |
| 		t.Fatal(err)
 | |
| 	}
 | |
| 
 | |
| 	tags := map[string]string{
 | |
| 		"reference_id": "192.168.1.22",
 | |
| 		"leap_status":  "not synchronized",
 | |
| 		"stratum":      "3",
 | |
| 	}
 | |
| 	fields := map[string]interface{}{
 | |
| 		"system_time":     0.000020390,
 | |
| 		"last_offset":     0.000012651,
 | |
| 		"rms_offset":      0.000025577,
 | |
| 		"frequency":       -16.001,
 | |
| 		"residual_freq":   0.0,
 | |
| 		"skew":            0.006,
 | |
| 		"root_delay":      0.001655,
 | |
| 		"root_dispersion": 0.003307,
 | |
| 		"update_interval": 507.2,
 | |
| 	}
 | |
| 
 | |
| 	acc.AssertContainsTaggedFields(t, "chrony", fields, tags)
 | |
| 
 | |
| 	// test with dns lookup
 | |
| 	c.DNSLookup = true
 | |
| 	err = c.Gather(&acc)
 | |
| 	if err != nil {
 | |
| 		t.Fatal(err)
 | |
| 	}
 | |
| 	acc.AssertContainsTaggedFields(t, "chrony", fields, tags)
 | |
| 
 | |
| }
 | |
| 
 | |
| // fackeExecCommand is a helper function that mock
 | |
| // the exec.Command call (and call the test binary)
 | |
| func fakeExecCommand(command string, args ...string) *exec.Cmd {
 | |
| 	cs := []string{"-test.run=TestHelperProcess", "--", command}
 | |
| 	cs = append(cs, args...)
 | |
| 	cmd := exec.Command(os.Args[0], cs...)
 | |
| 	cmd.Env = []string{"GO_WANT_HELPER_PROCESS=1"}
 | |
| 	return cmd
 | |
| }
 | |
| 
 | |
| // TestHelperProcess isn't a real test. It's used to mock exec.Command
 | |
| // For example, if you run:
 | |
| // GO_WANT_HELPER_PROCESS=1 go test -test.run=TestHelperProcess -- chrony tracking
 | |
| // it returns below mockData.
 | |
| func TestHelperProcess(t *testing.T) {
 | |
| 	if os.Getenv("GO_WANT_HELPER_PROCESS") != "1" {
 | |
| 		return
 | |
| 	}
 | |
| 
 | |
| 	lookup := "Reference ID    : 192.168.1.22 (ntp.example.com)\n"
 | |
| 	noLookup := "Reference ID    : 192.168.1.22 (192.168.1.22)\n"
 | |
| 	mockData := `Stratum         : 3
 | |
| Ref time (UTC)  : Thu May 12 14:27:07 2016
 | |
| System time     : 0.000020390 seconds fast of NTP time
 | |
| Last offset     : +0.000012651 seconds
 | |
| RMS offset      : 0.000025577 seconds
 | |
| Frequency       : 16.001 ppm slow
 | |
| Residual freq   : -0.000 ppm
 | |
| Skew            : 0.006 ppm
 | |
| Root delay      : 0.001655 seconds
 | |
| Root dispersion : 0.003307 seconds
 | |
| Update interval : 507.2 seconds
 | |
| Leap status     : Not synchronized
 | |
| `
 | |
| 
 | |
| 	args := os.Args
 | |
| 
 | |
| 	// Previous arguments are tests stuff, that looks like :
 | |
| 	// /tmp/go-build970079519/…/_test/integration.test -test.run=TestHelperProcess --
 | |
| 	cmd, args := args[3], args[4:]
 | |
| 
 | |
| 	if cmd == "chronyc" {
 | |
| 		if args[0] == "tracking" {
 | |
| 			fmt.Fprint(os.Stdout, lookup+mockData)
 | |
| 		} else {
 | |
| 			fmt.Fprint(os.Stdout, noLookup+mockData)
 | |
| 		}
 | |
| 	} else {
 | |
| 		fmt.Fprint(os.Stdout, "command not found")
 | |
| 		os.Exit(1)
 | |
| 
 | |
| 	}
 | |
| 	os.Exit(0)
 | |
| }
 |