aboutsummaryrefslogtreecommitdiff
path: root/mt4/client_test.go
blob: 2ff541703f62587cc37640b1e4f54f2fc79b8918 (plain) (blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
package mt4

import (
	"context"
	"net"
	"strings"
	"testing"
	"time"

	ic "go.popov.link/metatrader4/internal/conn"
	"go.popov.link/metatrader4/internal/proto"
)

// mockServer returns net.Pipe connections with server writing resp to client.
func mockServer(response string) (net.Conn, net.Conn) {
	server, client := net.Pipe()
	go func() {
		defer func() { _ = server.Close() }()
		buf := make([]byte, 1024)
		_, _ = server.Read(buf) // read request ignoring
		_, _ = server.Write([]byte(response))
	}()
	return client, server
}

func TestClientExecute(t *testing.T) {
	reqParams := map[string]string{"A": "1"}
	encoded, err := proto.EncodeParams(reqParams)
	if err != nil {
		t.Fatalf("encode params: %v", err)
	}
	resp := encoded
	clientConn, _ := mockServer(resp)

	c := &Client{addr: "", port: 0, autoClose: true, readTimeout: time.Second, writeTimeout: time.Second, dialTimeout: time.Second}
	c.c = ic.FromNetConn(clientConn)

	res, err := c.Execute(context.Background(), "CMD", reqParams)
	if err != nil {
		t.Fatalf("execute: %v", err)
	}
	if !strings.Contains(res, "1") {
		t.Fatalf("unexpected response %q", res)
	}
}