mirror of
https://github.com/safing/portmaster
synced 2025-09-02 02:29:12 +00:00
115 lines
2.4 KiB
Go
115 lines
2.4 KiB
Go
package crew
|
|
|
|
import (
|
|
"fmt"
|
|
"net"
|
|
"net/http"
|
|
"net/url"
|
|
"testing"
|
|
"time"
|
|
|
|
"github.com/safing/portmaster/service/intel"
|
|
"github.com/safing/portmaster/service/network"
|
|
"github.com/safing/portmaster/spn/cabin"
|
|
"github.com/safing/portmaster/spn/conf"
|
|
"github.com/safing/portmaster/spn/hub"
|
|
"github.com/safing/portmaster/spn/navigator"
|
|
"github.com/safing/portmaster/spn/terminal"
|
|
)
|
|
|
|
const (
|
|
testPadding = 8
|
|
testQueueSize = 10
|
|
)
|
|
|
|
func TestConnectOp(t *testing.T) {
|
|
t.Parallel()
|
|
|
|
if testing.Short() {
|
|
t.Skip("skipping test in short mode, as it interacts with the network")
|
|
}
|
|
|
|
// Create test terminal pair.
|
|
a, b, err := terminal.NewSimpleTestTerminalPair(0, 0,
|
|
&terminal.TerminalOpts{
|
|
FlowControl: terminal.FlowControlDFQ,
|
|
FlowControlSize: testQueueSize,
|
|
Padding: testPadding,
|
|
},
|
|
)
|
|
if err != nil {
|
|
t.Fatalf("failed to create test terminal pair: %s", err)
|
|
}
|
|
|
|
// Set up connect op.
|
|
b.GrantPermission(terminal.MayConnect)
|
|
conf.EnablePublicHub(true)
|
|
identity, err := cabin.CreateIdentity(module.Ctx, "test")
|
|
if err != nil {
|
|
t.Fatalf("failed to create identity: %s", err)
|
|
}
|
|
_, err = identity.MaintainAnnouncement(&hub.Announcement{
|
|
Transports: []string{
|
|
"tcp:17",
|
|
},
|
|
Exit: []string{
|
|
"+ * */80",
|
|
"- *",
|
|
},
|
|
}, true)
|
|
if err != nil {
|
|
t.Fatalf("failed to update identity: %s", err)
|
|
}
|
|
EnableConnecting(identity.Hub)
|
|
|
|
for i := 0; i < 1; i++ {
|
|
appConn, sluiceConn := net.Pipe()
|
|
_, tErr := NewConnectOp(&Tunnel{
|
|
connInfo: &network.Connection{
|
|
Entity: (&intel.Entity{
|
|
Protocol: 6,
|
|
Port: 80,
|
|
Domain: "orf.at.",
|
|
IP: net.IPv4(194, 232, 104, 142),
|
|
}).Init(0),
|
|
},
|
|
conn: sluiceConn,
|
|
dstTerminal: a,
|
|
dstPin: &navigator.Pin{
|
|
Hub: identity.Hub,
|
|
},
|
|
})
|
|
if tErr != nil {
|
|
t.Fatalf("failed to start connect op: %s", tErr)
|
|
}
|
|
|
|
// Send request.
|
|
requestURL, err := url.Parse("http://orf.at/")
|
|
if err != nil {
|
|
t.Fatalf("failed to parse request url: %s", err)
|
|
}
|
|
r := http.Request{
|
|
Method: http.MethodHead,
|
|
URL: requestURL,
|
|
}
|
|
err = r.Write(appConn)
|
|
if err != nil {
|
|
t.Fatalf("failed to write request: %s", err)
|
|
}
|
|
|
|
// Recv response.
|
|
data := make([]byte, 1500)
|
|
n, err := appConn.Read(data)
|
|
if err != nil {
|
|
t.Fatalf("failed to read request: %s", err)
|
|
}
|
|
if n == 0 {
|
|
t.Fatal("received empty reply")
|
|
}
|
|
|
|
t.Log("received data:")
|
|
fmt.Println(string(data[:n]))
|
|
|
|
time.Sleep(500 * time.Millisecond)
|
|
}
|
|
}
|