122 lines
3.6 KiB
Go
122 lines
3.6 KiB
Go
|
|
//go:build windows
|
||
|
|
// +build windows
|
||
|
|
|
||
|
|
package staros
|
||
|
|
|
||
|
|
import (
|
||
|
|
"errors"
|
||
|
|
"syscall"
|
||
|
|
"testing"
|
||
|
|
|
||
|
|
"b612.me/win32api"
|
||
|
|
)
|
||
|
|
|
||
|
|
func TestWindowsNetConnectionTypes(t *testing.T) {
|
||
|
|
tcp, udp, err := windowsNetConnectionTypes("")
|
||
|
|
if err != nil {
|
||
|
|
t.Fatal(err)
|
||
|
|
}
|
||
|
|
if !tcp || !udp {
|
||
|
|
t.Fatalf("empty types should request tcp and udp, got tcp=%v udp=%v", tcp, udp)
|
||
|
|
}
|
||
|
|
|
||
|
|
tcp, udp, err = windowsNetConnectionTypes("all")
|
||
|
|
if err != nil {
|
||
|
|
t.Fatal(err)
|
||
|
|
}
|
||
|
|
if !tcp || !udp {
|
||
|
|
t.Fatalf("all types should request tcp and udp, got tcp=%v udp=%v", tcp, udp)
|
||
|
|
}
|
||
|
|
|
||
|
|
tcp, udp, err = windowsNetConnectionTypes("tcp")
|
||
|
|
if err != nil {
|
||
|
|
t.Fatal(err)
|
||
|
|
}
|
||
|
|
if !tcp || udp {
|
||
|
|
t.Fatalf("tcp types mismatch: tcp=%v udp=%v", tcp, udp)
|
||
|
|
}
|
||
|
|
|
||
|
|
tcp, udp, err = windowsNetConnectionTypes("TCP,UDP")
|
||
|
|
if err != nil {
|
||
|
|
t.Fatal(err)
|
||
|
|
}
|
||
|
|
if !tcp || !udp {
|
||
|
|
t.Fatalf("mixed tcp/udp types mismatch: tcp=%v udp=%v", tcp, udp)
|
||
|
|
}
|
||
|
|
|
||
|
|
tcp, udp, err = windowsNetConnectionTypes("udp")
|
||
|
|
if err != nil {
|
||
|
|
t.Fatal(err)
|
||
|
|
}
|
||
|
|
if tcp || !udp {
|
||
|
|
t.Fatalf("udp types mismatch: tcp=%v udp=%v", tcp, udp)
|
||
|
|
}
|
||
|
|
|
||
|
|
if _, _, err = windowsNetConnectionTypes("unix"); !errors.Is(err, ERR_UNSUPPORTED) {
|
||
|
|
t.Fatalf("unix should be unsupported on windows, got %v", err)
|
||
|
|
}
|
||
|
|
if _, _, err = windowsNetConnectionTypes("tcp,unix"); !errors.Is(err, ERR_UNSUPPORTED) {
|
||
|
|
t.Fatalf("mixed unix request should be unsupported on windows, got %v", err)
|
||
|
|
}
|
||
|
|
if _, _, err = windowsNetConnectionTypes("all,unix"); !errors.Is(err, ERR_UNSUPPORTED) {
|
||
|
|
t.Fatalf("all plus unix request should be unsupported on windows, got %v", err)
|
||
|
|
}
|
||
|
|
if _, _, err = windowsNetConnectionTypes("raw"); err == nil {
|
||
|
|
t.Fatal("unknown type should return error")
|
||
|
|
}
|
||
|
|
}
|
||
|
|
|
||
|
|
func TestWindowsIPv4FromDWORD(t *testing.T) {
|
||
|
|
if got := windowsIPv4FromDWORD(0x0100007f); got != "127.0.0.1" {
|
||
|
|
t.Fatalf("unexpected localhost conversion: %s", got)
|
||
|
|
}
|
||
|
|
}
|
||
|
|
|
||
|
|
func TestWindowsTCPState(t *testing.T) {
|
||
|
|
cases := map[win32api.MIB_TCP_STATE]string{
|
||
|
|
win32api.MIB_TCP_STATE_ESTAB: TCP_STATE[TCP_ESTABLISHED],
|
||
|
|
win32api.MIB_TCP_STATE_LISTEN: TCP_STATE[TCP_LISTEN],
|
||
|
|
win32api.MIB_TCP_STATE_SYN_SENT: TCP_STATE[TCP_SYN_SENT],
|
||
|
|
win32api.MIB_TCP_STATE_SYN_RCVD: TCP_STATE[TCP_SYN_RECV],
|
||
|
|
win32api.MIB_TCP_STATE_FIN_WAIT1: TCP_STATE[TCP_FIN_WAIT1],
|
||
|
|
win32api.MIB_TCP_STATE_FIN_WAIT2: TCP_STATE[TCP_FIN_WAIT2],
|
||
|
|
win32api.MIB_TCP_STATE_TIME_WAIT: TCP_STATE[TCP_TIME_WAIT],
|
||
|
|
win32api.MIB_TCP_STATE_CLOSED: TCP_STATE[TCP_CLOSE],
|
||
|
|
win32api.MIB_TCP_STATE_CLOSE_WAIT: TCP_STATE[TCP_CLOSE_WAIT],
|
||
|
|
win32api.MIB_TCP_STATE_LAST_ACK: TCP_STATE[TCP_LAST_ACK],
|
||
|
|
win32api.MIB_TCP_STATE_CLOSING: TCP_STATE[TCP_CLOSING],
|
||
|
|
}
|
||
|
|
for state, want := range cases {
|
||
|
|
if got := windowsTCPState(state); got != want {
|
||
|
|
t.Fatalf("state %d mismatch: got=%s want=%s", state, got, want)
|
||
|
|
}
|
||
|
|
}
|
||
|
|
if got := windowsTCPState(win32api.MIB_TCP_STATE(0)); got != TCP_STATE[TCP_UNKNOWN] {
|
||
|
|
t.Fatalf("unknown state mismatch: %s", got)
|
||
|
|
}
|
||
|
|
}
|
||
|
|
|
||
|
|
func TestIsOptionalWindowsNetTableError(t *testing.T) {
|
||
|
|
if !isOptionalWindowsNetTableError(windowsErrorNotSupported) {
|
||
|
|
t.Fatal("ERROR_NOT_SUPPORTED should be optional")
|
||
|
|
}
|
||
|
|
if isOptionalWindowsNetTableError(syscall.EINVAL) {
|
||
|
|
t.Fatal("EINVAL should not be optional")
|
||
|
|
}
|
||
|
|
}
|
||
|
|
|
||
|
|
func TestAttachWindowsProcess(t *testing.T) {
|
||
|
|
conn := NetConn{}
|
||
|
|
cache := map[int64]*Process{}
|
||
|
|
attachWindowsProcess(&conn, 123, false, cache)
|
||
|
|
if conn.Pid != 0 || conn.Process != nil {
|
||
|
|
t.Fatalf("analysePid=false should not populate process fields: %#v", conn)
|
||
|
|
}
|
||
|
|
|
||
|
|
conn = NetConn{}
|
||
|
|
attachWindowsProcess(&conn, 0, true, cache)
|
||
|
|
if conn.Pid != 0 || conn.Process != nil {
|
||
|
|
t.Fatalf("pid 0 should not populate process fields: %#v", conn)
|
||
|
|
}
|
||
|
|
}
|