125 lines
		
	
	
		
			2.4 KiB
		
	
	
	
		
			Go
		
	
	
	
			
		
		
	
	
			125 lines
		
	
	
		
			2.4 KiB
		
	
	
	
		
			Go
		
	
	
	
| package minecraft
 | |
| 
 | |
| import (
 | |
| 	"testing"
 | |
| 	"time"
 | |
| 
 | |
| 	"github.com/influxdata/telegraf"
 | |
| 	"github.com/influxdata/telegraf/testutil"
 | |
| 	"github.com/stretchr/testify/require"
 | |
| )
 | |
| 
 | |
| type MockClient struct {
 | |
| 	ConnectF func() error
 | |
| 	PlayersF func() ([]string, error)
 | |
| 	ScoresF  func(player string) ([]Score, error)
 | |
| }
 | |
| 
 | |
| func (c *MockClient) Connect() error {
 | |
| 	return c.ConnectF()
 | |
| }
 | |
| 
 | |
| func (c *MockClient) Players() ([]string, error) {
 | |
| 	return c.PlayersF()
 | |
| }
 | |
| 
 | |
| func (c *MockClient) Scores(player string) ([]Score, error) {
 | |
| 	return c.ScoresF(player)
 | |
| }
 | |
| 
 | |
| func TestGather(t *testing.T) {
 | |
| 	now := time.Unix(0, 0)
 | |
| 
 | |
| 	tests := []struct {
 | |
| 		name    string
 | |
| 		client  *MockClient
 | |
| 		metrics []telegraf.Metric
 | |
| 		err     error
 | |
| 	}{
 | |
| 		{
 | |
| 			name: "no players",
 | |
| 			client: &MockClient{
 | |
| 				ConnectF: func() error {
 | |
| 					return nil
 | |
| 				},
 | |
| 				PlayersF: func() ([]string, error) {
 | |
| 					return []string{}, nil
 | |
| 				},
 | |
| 			},
 | |
| 			metrics: []telegraf.Metric{},
 | |
| 		},
 | |
| 		{
 | |
| 			name: "one player without scores",
 | |
| 			client: &MockClient{
 | |
| 				ConnectF: func() error {
 | |
| 					return nil
 | |
| 				},
 | |
| 				PlayersF: func() ([]string, error) {
 | |
| 					return []string{"Etho"}, nil
 | |
| 				},
 | |
| 				ScoresF: func(player string) ([]Score, error) {
 | |
| 					switch player {
 | |
| 					case "Etho":
 | |
| 						return []Score{}, nil
 | |
| 					default:
 | |
| 						panic("unknown player")
 | |
| 					}
 | |
| 				},
 | |
| 			},
 | |
| 			metrics: []telegraf.Metric{},
 | |
| 		},
 | |
| 		{
 | |
| 			name: "one player with scores",
 | |
| 			client: &MockClient{
 | |
| 				ConnectF: func() error {
 | |
| 					return nil
 | |
| 				},
 | |
| 				PlayersF: func() ([]string, error) {
 | |
| 					return []string{"Etho"}, nil
 | |
| 				},
 | |
| 				ScoresF: func(player string) ([]Score, error) {
 | |
| 					switch player {
 | |
| 					case "Etho":
 | |
| 						return []Score{{Name: "jumps", Value: 42}}, nil
 | |
| 					default:
 | |
| 						panic("unknown player")
 | |
| 					}
 | |
| 				},
 | |
| 			},
 | |
| 			metrics: []telegraf.Metric{
 | |
| 				testutil.MustMetric(
 | |
| 					"minecraft",
 | |
| 					map[string]string{
 | |
| 						"player": "Etho",
 | |
| 						"server": "example.org:25575",
 | |
| 						"source": "example.org",
 | |
| 						"port":   "25575",
 | |
| 					},
 | |
| 					map[string]interface{}{
 | |
| 						"jumps": 42,
 | |
| 					},
 | |
| 					now,
 | |
| 				),
 | |
| 			},
 | |
| 		},
 | |
| 	}
 | |
| 	for _, tt := range tests {
 | |
| 		t.Run(tt.name, func(t *testing.T) {
 | |
| 			plugin := &Minecraft{
 | |
| 				Server:   "example.org",
 | |
| 				Port:     "25575",
 | |
| 				Password: "xyzzy",
 | |
| 				client:   tt.client,
 | |
| 			}
 | |
| 
 | |
| 			var acc testutil.Accumulator
 | |
| 			acc.TimeFunc = func() time.Time { return now }
 | |
| 
 | |
| 			err := plugin.Gather(&acc)
 | |
| 
 | |
| 			require.Equal(t, tt.err, err)
 | |
| 			testutil.RequireMetricsEqual(t, tt.metrics, acc.GetTelegrafMetrics())
 | |
| 		})
 | |
| 	}
 | |
| }
 |