Skip to content

Commit 0fc2b3b

Browse files
committed
api: improve test coverage
1 parent c0df911 commit 0fc2b3b

File tree

8 files changed

+299
-4
lines changed

8 files changed

+299
-4
lines changed

api/apiclient/client.go

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -127,6 +127,15 @@ func (c *Client) AuthRequests() ([]entity.AuthRequest, error) {
127127
return authRequests, nil
128128
}
129129

130+
func (c *Client) BlockedPeers() ([]config.BlockedPeer, error) {
131+
blocked := make([]config.BlockedPeer, 0)
132+
err := c.sendGetRequest(api.GetBlockedPeersPath, &blocked)
133+
if err != nil {
134+
return nil, err
135+
}
136+
return blocked, nil
137+
}
138+
130139
func (c *Client) UpdatePeerSettings(request entity.UpdatePeerSettingsRequest) error {
131140
return c.sendPostRequest(api.UpdatePeerSettingsPath, request, nil)
132141
}

api/debug_test.go

Lines changed: 28 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,28 @@
1+
package api
2+
3+
import (
4+
"testing"
5+
)
6+
7+
func Test_byteCountIEC(t *testing.T) {
8+
cases := []struct {
9+
input int64
10+
want string
11+
}{
12+
{0, "0 B"},
13+
{1, "1 B"},
14+
{1023, "1023 B"},
15+
{1024, "1.0 KiB"},
16+
{1536, "1.5 KiB"},
17+
{1024 * 1024, "1.0 MiB"},
18+
{1024 * 1024 * 1024, "1.0 GiB"},
19+
{4 * 1024 * 1024 * 1024, "4.0 GiB"},
20+
}
21+
22+
for _, tc := range cases {
23+
got := byteCountIEC(tc.input)
24+
if got != tc.want {
25+
t.Errorf("byteCountIEC(%d) = %q, want %q", tc.input, got, tc.want)
26+
}
27+
}
28+
}

api/metrics.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -38,7 +38,7 @@ func convertBytesToIECUnits(bytesSize float64) string {
3838
bytesSize /= unit
3939
idx++
4040
}
41-
label := IECUnits[idx] //nolint:gosec
41+
label := IECUnits[idx]
4242

4343
bytesSize = math.Round(bytesSize*100) / 100
4444
bFormatted := strconv.FormatFloat(bytesSize, 'f', -1, 64)

api/peers.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -314,7 +314,7 @@ func (h *Handler) RemovePeer(c echo.Context) (err error) {
314314
// @Router /peers/get_blocked [GET]
315315
func (h *Handler) GetBlockedPeers(c echo.Context) (err error) {
316316
h.conf.RLock()
317-
result := make([]config.BlockedPeer, 0)
317+
result := make([]config.BlockedPeer, 0, len(h.conf.BlockedPeers))
318318

319319
for _, blockedPeer := range h.conf.BlockedPeers {
320320
result = append(result, blockedPeer)

api_handlers_test.go

Lines changed: 177 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,177 @@
1+
package awl
2+
3+
import (
4+
"encoding/json"
5+
"fmt"
6+
"net/http"
7+
"strings"
8+
"testing"
9+
10+
"github.com/anywherelan/awl/api"
11+
"github.com/anywherelan/awl/config"
12+
"github.com/anywherelan/awl/entity"
13+
)
14+
15+
func TestExportServerConfiguration(t *testing.T) {
16+
ts := NewTestSuite(t)
17+
18+
peer1 := ts.NewTestPeer(false)
19+
20+
resp, err := http.Get(fmt.Sprintf("http://%s%s", peer1.app.Api.Address(), api.ExportServerConfigPath))
21+
ts.NoError(err)
22+
defer resp.Body.Close()
23+
24+
ts.Equal(http.StatusOK, resp.StatusCode)
25+
ts.Contains(resp.Header.Get("Content-Type"), "application/json")
26+
27+
var cfg config.Config
28+
err = json.NewDecoder(resp.Body).Decode(&cfg)
29+
ts.NoError(err)
30+
ts.Equal(peer1.PeerID(), cfg.P2pNode.PeerID)
31+
}
32+
33+
func TestUpdateMySettings(t *testing.T) {
34+
ts := NewTestSuite(t)
35+
36+
peer1 := ts.NewTestPeer(false)
37+
38+
err := peer1.api.UpdateMySettings("new-test-name")
39+
ts.NoError(err)
40+
41+
info, err := peer1.api.PeerInfo()
42+
ts.NoError(err)
43+
ts.Equal("new-test-name", info.Name)
44+
}
45+
46+
func TestGetP2pDebugInfo(t *testing.T) {
47+
ts := NewTestSuite(t)
48+
49+
peer1 := ts.NewTestPeer(false)
50+
51+
debugInfo, err := peer1.api.P2pDebugInfo()
52+
ts.NoError(err)
53+
ts.NotEmpty(debugInfo.General.Version)
54+
ts.NotEmpty(debugInfo.General.Uptime)
55+
ts.GreaterOrEqual(debugInfo.Connections.ConnectedPeersCount, 0)
56+
ts.GreaterOrEqual(debugInfo.Connections.OpenConnectionsCount, 0)
57+
ts.GreaterOrEqual(debugInfo.Connections.OpenStreamsCount, int64(0))
58+
ts.NotEmpty(debugInfo.DHT.Reachability)
59+
}
60+
61+
func TestGetDebugLog(t *testing.T) {
62+
ts := NewTestSuite(t)
63+
64+
peer1 := ts.NewTestPeer(false)
65+
66+
// Generate some log entries via API calls
67+
for range 5 {
68+
_, _ = peer1.api.PeerInfo()
69+
}
70+
71+
allLogs, err := peer1.api.ApplicationLog(0, false)
72+
ts.NoError(err)
73+
ts.NotEmpty(allLogs)
74+
75+
// Request last 1 line
76+
oneLog, err := peer1.api.ApplicationLog(1, false)
77+
ts.NoError(err)
78+
ts.NotEmpty(oneLog)
79+
lines := strings.Split(strings.TrimRight(oneLog, "\n"), "\n")
80+
ts.Len(lines, 1)
81+
82+
// Request first 1 line
83+
firstLog, err := peer1.api.ApplicationLog(1, true)
84+
ts.NoError(err)
85+
ts.NotEmpty(firstLog)
86+
firstLines := strings.Split(strings.TrimRight(firstLog, "\n"), "\n")
87+
ts.Len(firstLines, 1)
88+
}
89+
90+
func TestSendFriendRequest_ErrorCases(t *testing.T) {
91+
ts := NewTestSuite(t)
92+
93+
peer1 := ts.NewTestPeer(false)
94+
95+
t.Run("SelfAdd", func(t *testing.T) {
96+
err := peer1.api.SendFriendRequest(peer1.PeerID(), "self", "")
97+
ts.Error(err)
98+
ts.ErrorContains(err, "You can't add yourself")
99+
})
100+
101+
t.Run("InvalidPeerID", func(t *testing.T) {
102+
err := peer1.api.SendFriendRequest("not-a-valid-peer-id", "alias", "")
103+
ts.Error(err)
104+
ts.ErrorContains(err, "Invalid hex-encoded multihash")
105+
})
106+
}
107+
108+
func TestAcceptFriend_ErrorCases(t *testing.T) {
109+
ts := NewTestSuite(t)
110+
111+
peer1 := ts.NewTestPeer(false)
112+
peer2 := ts.NewTestPeer(false)
113+
114+
t.Run("NoPendingRequest", func(t *testing.T) {
115+
err := peer1.api.ReplyFriendRequest(peer2.PeerID(), "peer_2", false, "")
116+
ts.Error(err)
117+
ts.ErrorContains(err, "Peer did not send you friend request")
118+
})
119+
120+
t.Run("SelfAdd", func(t *testing.T) {
121+
err := peer1.api.ReplyFriendRequest(peer1.PeerID(), "self", false, "")
122+
ts.Error(err)
123+
ts.ErrorContains(err, "You can't add yourself")
124+
})
125+
126+
t.Run("InvalidPeerID", func(t *testing.T) {
127+
err := peer1.api.ReplyFriendRequest("bad-peer-id", "alias", false, "")
128+
ts.Error(err)
129+
ts.ErrorContains(err, "Invalid hex-encoded multihash")
130+
})
131+
}
132+
133+
func TestRemovePeer_PeerNotFound(t *testing.T) {
134+
ts := NewTestSuite(t)
135+
136+
peer1 := ts.NewTestPeer(false)
137+
peer2 := ts.NewTestPeer(false)
138+
139+
// peer2 is not a known peer of peer1
140+
err := peer1.api.RemovePeer(peer2.PeerID())
141+
ts.Error(err)
142+
ts.ErrorContains(err, "peer not found")
143+
}
144+
145+
func TestUpdatePeerSettings_ErrorCases(t *testing.T) {
146+
ts := NewTestSuite(t)
147+
148+
peer1 := ts.NewTestPeer(false)
149+
peer2 := ts.NewTestPeer(false)
150+
151+
t.Run("PeerNotFound", func(t *testing.T) {
152+
err := peer1.api.UpdatePeerSettings(entity.UpdatePeerSettingsRequest{
153+
PeerID: peer2.PeerID(),
154+
Alias: "peer_2",
155+
DomainName: "peer2.awl",
156+
IPAddr: "10.66.0.2",
157+
})
158+
ts.Error(err)
159+
ts.ErrorContains(err, "peer not found")
160+
})
161+
162+
t.Run("InvalidDomainName", func(t *testing.T) {
163+
ts.makeFriends(peer1, peer2)
164+
165+
peer2Config, err := peer1.api.KnownPeerConfig(peer2.PeerID())
166+
ts.NoError(err)
167+
168+
err = peer1.api.UpdatePeerSettings(entity.UpdatePeerSettingsRequest{
169+
PeerID: peer2.PeerID(),
170+
Alias: peer2Config.Alias,
171+
DomainName: "invalid domain!",
172+
IPAddr: peer2Config.IPAddr,
173+
})
174+
ts.Error(err)
175+
ts.ErrorContains(err, "invalid domain name")
176+
})
177+
}

application_test.go

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -115,6 +115,11 @@ func TestDeclinePeerFriendRequest(t *testing.T) {
115115
ts.Len(peer2.app.AuthStatus.GetIngoingAuthRequests(), 0)
116116
_, blockedPeerExists := peer2.app.Conf.GetBlockedPeer(peer1.PeerID())
117117
ts.True(blockedPeerExists)
118+
119+
blocked, err := peer2.api.BlockedPeers()
120+
ts.NoError(err)
121+
ts.Len(blocked, 1)
122+
ts.Equal(peer1.PeerID(), blocked[0].PeerID)
118123
}
119124

120125
func TestAutoAcceptFriendRequest(t *testing.T) {

config/other.go

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -61,7 +61,7 @@ func init() {
6161

6262
func CalcAppDataDir() string {
6363
if envDir := os.Getenv(AppDataDirEnvKey); envDir != "" {
64-
err := os.MkdirAll(envDir, dirsPerm)
64+
err := os.MkdirAll(envDir, dirsPerm) //nolint:gosec
6565
if err != nil {
6666
logger.Errorf("could not create data directory from env: %v", err)
6767
}
@@ -258,7 +258,7 @@ func ChownFileIfNeeded(path string) {
258258
if runtime.GOOS != "linux" || LinuxFilesOwnerUID == 0 {
259259
return
260260
}
261-
err := os.Chown(path, LinuxFilesOwnerUID, LinuxFilesOwnerUID)
261+
err := os.Chown(path, LinuxFilesOwnerUID, LinuxFilesOwnerUID) //nolint:gosec
262262
if err != nil {
263263
logger.Errorf("Chown file '%s': %v", path, err)
264264
}

protocol/protocol_test.go

Lines changed: 76 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,76 @@
1+
package protocol
2+
3+
import (
4+
"bytes"
5+
"testing"
6+
7+
"github.com/stretchr/testify/require"
8+
)
9+
10+
func TestSendReceiveStatus(t *testing.T) {
11+
cases := []PeerStatusInfo{
12+
{Name: "alice", Declined: false, AllowUsingAsExitNode: false},
13+
{Name: "bob", Declined: true, AllowUsingAsExitNode: true},
14+
{Name: "", Declined: false, AllowUsingAsExitNode: false},
15+
}
16+
17+
for _, want := range cases {
18+
var buf bytes.Buffer
19+
require.NoError(t, SendStatus(&buf, want))
20+
got, err := ReceiveStatus(&buf)
21+
require.NoError(t, err)
22+
require.Equal(t, want, got)
23+
}
24+
}
25+
26+
func TestSendReceiveAuth(t *testing.T) {
27+
cases := []AuthPeer{
28+
{Name: "alice"},
29+
{Name: ""},
30+
}
31+
32+
for _, want := range cases {
33+
var buf bytes.Buffer
34+
require.NoError(t, SendAuth(&buf, want))
35+
got, err := ReceiveAuth(&buf)
36+
require.NoError(t, err)
37+
require.Equal(t, want, got)
38+
}
39+
}
40+
41+
func TestSendReceiveAuthResponse(t *testing.T) {
42+
cases := []AuthPeerResponse{
43+
{Confirmed: true, Declined: false},
44+
{Confirmed: false, Declined: true},
45+
{Confirmed: false, Declined: false},
46+
}
47+
48+
for _, want := range cases {
49+
var buf bytes.Buffer
50+
require.NoError(t, SendAuthResponse(&buf, want))
51+
got, err := ReceiveAuthResponse(&buf)
52+
require.NoError(t, err)
53+
require.Equal(t, want, got)
54+
}
55+
}
56+
57+
func TestAppendPacketToBuf(t *testing.T) {
58+
packet := []byte{1, 2, 3, 4, 5}
59+
buf := AppendPacketToBuf(nil, packet)
60+
61+
require.Len(t, buf, 8+len(packet))
62+
63+
length, err := ReadUint64(bytes.NewReader(buf))
64+
require.NoError(t, err)
65+
require.Equal(t, uint64(len(packet)), length)
66+
require.Equal(t, packet, buf[8:])
67+
}
68+
69+
func TestAppendPacketToBuf_EmptyPacket(t *testing.T) {
70+
buf := AppendPacketToBuf(nil, []byte{})
71+
require.Len(t, buf, 8)
72+
73+
length, err := ReadUint64(bytes.NewReader(buf))
74+
require.NoError(t, err)
75+
require.Equal(t, uint64(0), length)
76+
}

0 commit comments

Comments
 (0)