mirror of
https://github.com/weaveworks/scope.git
synced 2026-07-16 03:49:52 +00:00
194 lines
4.0 KiB
Go
194 lines
4.0 KiB
Go
package endpoint
|
|
|
|
import (
|
|
"bufio"
|
|
"io"
|
|
"strings"
|
|
"testing"
|
|
"time"
|
|
|
|
"github.com/weaveworks/scope/test"
|
|
)
|
|
|
|
// Obtained though conntrack -E -p tcp -o id and then tweaked
|
|
const streamedFlowsSource = `[DESTROY] tcp 6 src=10.0.0.1 dst=127.0.0.1 sport=36826 dport=28106 src=10.0.0.2 dst=127.0.0.2 sport=28107 dport=36826 [ASSURED] id=347275904
|
|
[NEW] tcp 6 120 SYN_SENT src=10.0.0.1 dst=127.0.0.1 sport=36898 dport=28107 [UNREPLIED] src=10.0.0.2 dst=127.0.0.2 sport=28107 dport=36898 id=347275904
|
|
[UPDATE] tcp 6 60 SYN_RECV src=10.0.0.1 dst=127.0.0.1 sport=36898 dport=28107 src=10.0.0.2 dst=127.0.0.2 sport=28107 dport=36898 id=347275904
|
|
[UPDATE] tcp 6 432000 ESTABLISHED src=10.0.0.1 dst=127.0.0.1 sport=36898 dport=28107 src=10.0.0.2 dst=127.0.0.2 sport=28107 dport=36898 [ASSURED] id=347275904`
|
|
|
|
var wantStreamedFlows = []flow{
|
|
{
|
|
Type: destroyType,
|
|
Original: meta{
|
|
Layer3: layer3{
|
|
SrcIP: "10.0.0.1",
|
|
DstIP: "127.0.0.1",
|
|
},
|
|
Layer4: layer4{
|
|
SrcPort: 36826,
|
|
DstPort: 28106,
|
|
Proto: "tcp",
|
|
},
|
|
},
|
|
Reply: meta{
|
|
Layer3: layer3{
|
|
SrcIP: "10.0.0.2",
|
|
DstIP: "127.0.0.2",
|
|
},
|
|
Layer4: layer4{
|
|
SrcPort: 28107,
|
|
DstPort: 36826,
|
|
Proto: "tcp",
|
|
},
|
|
},
|
|
Independent: meta{
|
|
ID: 347275904,
|
|
},
|
|
},
|
|
{
|
|
Type: newType,
|
|
Original: meta{
|
|
Layer3: layer3{
|
|
SrcIP: "10.0.0.1",
|
|
DstIP: "127.0.0.1",
|
|
},
|
|
Layer4: layer4{
|
|
SrcPort: 36898,
|
|
DstPort: 28107,
|
|
Proto: "tcp",
|
|
},
|
|
},
|
|
Reply: meta{
|
|
Layer3: layer3{
|
|
SrcIP: "10.0.0.2",
|
|
DstIP: "127.0.0.2",
|
|
},
|
|
Layer4: layer4{
|
|
SrcPort: 28107,
|
|
DstPort: 36898,
|
|
Proto: "tcp",
|
|
},
|
|
},
|
|
Independent: meta{
|
|
ID: 347275904,
|
|
State: "SYN_SENT",
|
|
},
|
|
},
|
|
{
|
|
Type: updateType,
|
|
Original: meta{
|
|
Layer3: layer3{
|
|
SrcIP: "10.0.0.1",
|
|
DstIP: "127.0.0.1",
|
|
},
|
|
Layer4: layer4{
|
|
SrcPort: 36898,
|
|
DstPort: 28107,
|
|
Proto: "tcp",
|
|
},
|
|
},
|
|
Reply: meta{
|
|
Layer3: layer3{
|
|
SrcIP: "10.0.0.2",
|
|
DstIP: "127.0.0.2",
|
|
},
|
|
Layer4: layer4{
|
|
SrcPort: 28107,
|
|
DstPort: 36898,
|
|
Proto: "tcp",
|
|
},
|
|
},
|
|
Independent: meta{
|
|
ID: 347275904,
|
|
State: "SYN_RECV",
|
|
},
|
|
},
|
|
{
|
|
Type: updateType,
|
|
Original: meta{
|
|
Layer3: layer3{
|
|
SrcIP: "10.0.0.1",
|
|
DstIP: "127.0.0.1",
|
|
},
|
|
Layer4: layer4{
|
|
SrcPort: 36898,
|
|
DstPort: 28107,
|
|
Proto: "tcp",
|
|
},
|
|
},
|
|
Reply: meta{
|
|
Layer3: layer3{
|
|
SrcIP: "10.0.0.2",
|
|
DstIP: "127.0.0.2",
|
|
},
|
|
Layer4: layer4{
|
|
SrcPort: 28107,
|
|
DstPort: 36898,
|
|
Proto: "tcp",
|
|
},
|
|
},
|
|
Independent: meta{
|
|
ID: 347275904,
|
|
State: "ESTABLISHED",
|
|
},
|
|
},
|
|
}
|
|
|
|
func testFlowDecoding(t *testing.T, source string, want []flow, decoder func(scanner *bufio.Scanner) (flow, error)) {
|
|
scanner := bufio.NewScanner(strings.NewReader(source))
|
|
d := time.Millisecond * 100
|
|
for _, wantFlow := range want {
|
|
haveFlow, err := decoder(scanner)
|
|
if err != nil {
|
|
t.Fatalf("Unexpected decoding error: %v", err)
|
|
}
|
|
test.Poll(t, d, wantFlow, func() interface{} { return haveFlow })
|
|
}
|
|
|
|
if _, err := decodeStreamedFlow(scanner); err != io.EOF {
|
|
t.Fatalf("Unexpected error value on empty input: %v", err)
|
|
}
|
|
}
|
|
|
|
func TestStreamedFlowDecoding(t *testing.T) {
|
|
testFlowDecoding(t, streamedFlowsSource, wantStreamedFlows, decodeStreamedFlow)
|
|
}
|
|
|
|
// Obtained through conntrack -L -p tcp -o id
|
|
const dumpedFlowsSource = `tcp 6 431998 ESTABLISHED src=10.0.2.2 dst=10.0.2.15 sport=49911 dport=22 src=10.0.2.15 dst=10.0.2.2 sport=22 dport=49911 [ASSURED] mark=0 use=1 id=2993966208`
|
|
|
|
var wantDumpedFlows = []flow{
|
|
{
|
|
Original: meta{
|
|
Layer3: layer3{
|
|
SrcIP: "10.0.2.2",
|
|
DstIP: "10.0.2.15",
|
|
},
|
|
Layer4: layer4{
|
|
SrcPort: 49911,
|
|
DstPort: 22,
|
|
Proto: "tcp",
|
|
},
|
|
},
|
|
Reply: meta{
|
|
Layer3: layer3{
|
|
SrcIP: "10.0.2.15",
|
|
DstIP: "10.0.2.2",
|
|
},
|
|
Layer4: layer4{
|
|
SrcPort: 22,
|
|
DstPort: 49911,
|
|
Proto: "tcp",
|
|
},
|
|
},
|
|
Independent: meta{
|
|
ID: 2993966208,
|
|
State: "ESTABLISHED",
|
|
},
|
|
},
|
|
}
|
|
|
|
func TestDumpedFlowDecoding(t *testing.T) {
|
|
testFlowDecoding(t, dumpedFlowsSource, wantDumpedFlows, decodeDumpedFlow)
|
|
}
|