From b57c1a6878190abd6ed63e285e13b03a4fbac7a3 Mon Sep 17 00:00:00 2001 From: Valentin Popov Date: Wed, 4 Jun 2025 13:09:26 +0400 Subject: [PATCH] Added GitHub Actions (#4) --- .github/workflows/ci.yml | 52 ++++++++++++++++++++++++++++++++++++++++ internal/conn/conn.go | 16 +++++++++---- mt4/client.go | 8 +++---- mt4/client_test.go | 6 ++--- 4 files changed, 70 insertions(+), 12 deletions(-) create mode 100644 .github/workflows/ci.yml diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml new file mode 100644 index 0000000..07e7b97 --- /dev/null +++ b/.github/workflows/ci.yml @@ -0,0 +1,52 @@ +name: CI + +on: + push: + branches: [ master ] + pull_request: + branches: [ master ] + +jobs: + test: + name: Test + runs-on: ubuntu-latest + steps: + - name: Check out code + uses: actions/checkout@v4 + - name: Set up Go + uses: actions/setup-go@v5 + with: + go-version: '1.24.2' + - name: Cache Go modules + uses: actions/cache@v4 + with: + path: | + ~/.cache/go-build + ~/go/pkg/mod + key: ${{ runner.os }}-go-${{ hashFiles('**/go.sum') }} + restore-keys: | + ${{ runner.os }}-go- + - name: Download dependencies + run: go mod download + - name: Verify dependencies + run: go mod verify + - name: Run go vet + run: go vet ./... + - name: Run tests + run: go test -race -coverprofile=coverage.out -covermode=atomic ./... + + lint: + name: Lint + runs-on: ubuntu-latest + steps: + - name: Check out code + uses: actions/checkout@v4 + - name: Set up Go + uses: actions/setup-go@v5 + with: + go-version: '1.24.2' + - name: Run golangci-lint + uses: golangci/golangci-lint-action@v8 + with: + version: latest + args: --timeout=5m \ No newline at end of file diff --git a/internal/conn/conn.go b/internal/conn/conn.go index a1da6f1..0bf3ae6 100644 --- a/internal/conn/conn.go +++ b/internal/conn/conn.go @@ -32,9 +32,13 @@ func (c *Conn) Close() error { func (c *Conn) Send(ctx context.Context, data []byte, timeout time.Duration) error { if dl, ok := ctx.Deadline(); ok { - c.netConn.SetWriteDeadline(dl) + if err := c.netConn.SetWriteDeadline(dl); err != nil { + return err + } } else { - c.netConn.SetWriteDeadline(time.Now().Add(timeout)) + if err := c.netConn.SetWriteDeadline(time.Now().Add(timeout)); err != nil { + return err + } } _, err := c.netConn.Write(data) return err @@ -42,9 +46,13 @@ func (c *Conn) Send(ctx context.Context, data []byte, timeout time.Duration) err func (c *Conn) Receive(ctx context.Context, timeout time.Duration) ([]byte, error) { if dl, ok := ctx.Deadline(); ok { - c.netConn.SetReadDeadline(dl) + if err := c.netConn.SetReadDeadline(dl); err != nil { + return nil, err + } } else { - c.netConn.SetReadDeadline(time.Now().Add(timeout)) + if err := c.netConn.SetReadDeadline(time.Now().Add(timeout)); err != nil { + return nil, err + } } return io.ReadAll(c.netConn) } diff --git a/mt4/client.go b/mt4/client.go index 8a5f388..74fceee 100644 --- a/mt4/client.go +++ b/mt4/client.go @@ -3,7 +3,6 @@ package mt4 import ( "context" "fmt" - "net" "time" "go.popov.link/metatrader4/internal/conn" @@ -18,7 +17,6 @@ type Client struct { readTimeout time.Duration writeTimeout time.Duration autoClose bool - dialer net.Dialer c *conn.Conn } @@ -86,7 +84,7 @@ func (c *Client) Execute(ctx context.Context, command string, params map[string] encoded, err := proto.EncodeParams(params) if err != nil { if c.autoClose { - c.Close() + _ = c.Close() } return "", err } @@ -94,14 +92,14 @@ func (c *Client) Execute(ctx context.Context, command string, params map[string] if err := c.c.Send(ctx, req, c.writeTimeout); err != nil { if c.autoClose { - c.Close() + _ = c.Close() } return "", fmt.Errorf("send: %w", err) } respBytes, err := c.c.Receive(ctx, c.readTimeout) if c.autoClose { - c.Close() + _ = c.Close() } if err != nil { return "", fmt.Errorf("receive: %w", err) diff --git a/mt4/client_test.go b/mt4/client_test.go index 9644c9a..2ff5417 100644 --- a/mt4/client_test.go +++ b/mt4/client_test.go @@ -15,10 +15,10 @@ import ( func mockServer(response string) (net.Conn, net.Conn) { server, client := net.Pipe() go func() { - defer server.Close() + defer func() { _ = server.Close() }() buf := make([]byte, 1024) - server.Read(buf) // read request ignoring - server.Write([]byte(response)) + _, _ = server.Read(buf) // read request ignoring + _, _ = server.Write([]byte(response)) }() return client, server }