Skip to content

Commit 64601ea

Browse files
Add netblock anonymization verification test (#155)
* Add netblock anonymization verification test
1 parent fb96ef8 commit 64601ea

File tree

1 file changed

+122
-1
lines changed

1 file changed

+122
-1
lines changed

internal/triggertrace/triggertrace_test.go

Lines changed: 122 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -8,14 +8,18 @@ import (
88
"net"
99
"os"
1010
"path"
11+
"strings"
1112
"sync/atomic"
1213
"testing"
1314
"time"
1415

16+
"github.com/go-test/deep"
17+
"github.com/m-lab/go/anonymize"
1518
"github.com/m-lab/tcp-info/inetdiag"
1619
"github.com/m-lab/traceroute-caller/hopannotation"
1720
"github.com/m-lab/traceroute-caller/internal/ipcache"
1821
"github.com/m-lab/traceroute-caller/parser"
22+
"github.com/m-lab/traceroute-caller/tracer"
1923
"github.com/m-lab/uuid-annotator/annotator"
2024
)
2125

@@ -214,7 +218,7 @@ func TestClose(t *testing.T) {
214218
}
215219
}
216220

217-
func newHandler(t *testing.T, tracer *fakeTracer) (*Handler, error) {
221+
func newHandler(t *testing.T, tracer TracerWriter) (*Handler, error) {
218222
ipcCfg := ipcache.Config{
219223
EntryTimeout: 2 * time.Second,
220224
ScanPeriod: 1 * time.Second,
@@ -255,3 +259,120 @@ func fakeInterfaceAddrs() ([]net.Addr, error) {
255259
func fakeInterfaceAddrsBad() ([]net.Addr, error) {
256260
return nil, errors.New("forced inet.InterfaceAddrs error")
257261
}
262+
263+
// static trace definitions for testing anonymization.
264+
var (
265+
staticIPv4None = parser.Scamper1{
266+
Metadata: tracer.Metadata{UUID: "ndt-b9w8b_1667420871_00000000001EDE79"},
267+
CycleStart: parser.CyclestartLine{Type: "cycle-start", ListName: "default", ID: 0, Hostname: "ndt-b9w8b", StartTime: 1.671301854e+09},
268+
CycleStop: parser.CyclestopLine{Type: "cycle-stop", ListName: "default", ID: 0, Hostname: "ndt-b9w8b", StopTime: 1.671301856e+09},
269+
Tracelb: parser.TracelbLine{
270+
Type: "tracelb",
271+
Version: "0.1",
272+
Method: "icmp-echo",
273+
Src: "1.1.1.1",
274+
Dst: "4.4.4.4",
275+
Nodes: []parser.ScamperNode{
276+
{Addr: "2.2.2.2", Links: [][]parser.ScamperLink{{{Addr: "3.3.3.3"}}}},
277+
{Addr: "3.3.3.3", Links: [][]parser.ScamperLink{{{Addr: "4.4.4.2"}}}},
278+
{Addr: "4.4.4.2", Links: [][]parser.ScamperLink{{{Addr: "4.4.4.4"}}}},
279+
},
280+
},
281+
}
282+
283+
staticIPv6None = parser.Scamper1{
284+
Metadata: tracer.Metadata{UUID: "ndt-b9w8b_1667420871_00000000001EDE79"},
285+
CycleStart: parser.CyclestartLine{Type: "cycle-start", ListName: "default", ID: 0, Hostname: "ndt-b9w8b", StartTime: 1.671301854e+09},
286+
CycleStop: parser.CyclestopLine{Type: "cycle-stop", ListName: "default", ID: 0, Hostname: "ndt-b9w8b", StopTime: 1.671301856e+09},
287+
Tracelb: parser.TracelbLine{
288+
Type: "tracelb",
289+
Version: "0.1",
290+
Method: "icmp-echo",
291+
Src: "2001:1:1:1::1",
292+
Dst: "2006:4:4:4::4",
293+
Nodes: []parser.ScamperNode{
294+
{Addr: "2001:2:2:2::2", Links: [][]parser.ScamperLink{{{Addr: "2001:3:3:3::3"}}}},
295+
{Addr: "2001:3:3:3::3", Links: [][]parser.ScamperLink{{{Addr: "2006:4:4:4::2"}}}},
296+
{Addr: "2006:4:4:4::2", Links: [][]parser.ScamperLink{{{Addr: "2006:4:4:4::4"}}}},
297+
},
298+
},
299+
}
300+
)
301+
302+
type staticTracer struct {
303+
fakeTracer
304+
input *parser.Scamper1
305+
output *parser.Scamper1
306+
}
307+
308+
func (st *staticTracer) Trace(remoteIP, uuid string, t time.Time) ([]byte, error) {
309+
defer func() { atomic.AddInt32(&st.nTraces, 1) }()
310+
return st.input.MarshalJSONL(), nil
311+
}
312+
313+
func (st *staticTracer) WriteFile(uuid string, t time.Time, data []byte) error {
314+
p, err := parser.New("mda")
315+
if err != nil {
316+
return err
317+
}
318+
pd, err := p.ParseRawData(data)
319+
st.output = pd.(*parser.Scamper1)
320+
if err != nil {
321+
return err
322+
}
323+
return nil
324+
}
325+
326+
func TestAnonymize(t *testing.T) {
327+
// Construct netblock anonymized traces based on the v4 and v6 static traces.
328+
// Override Tracelb.Nodes to prevent modifying the original structure.
329+
staticIPv4Netblock := staticIPv4None
330+
staticIPv4Netblock.Tracelb.Dst = "4.4.4.0" // NETBLOCK
331+
staticIPv4Netblock.Tracelb.Nodes = []parser.ScamperNode{
332+
{Addr: "2.2.2.2", Links: [][]parser.ScamperLink{{{Addr: "3.3.3.3"}}}},
333+
{Addr: "3.3.3.3", Links: [][]parser.ScamperLink{{{Addr: "4.4.4.0"}}}}, // NETBLOCK
334+
{Addr: "4.4.4.0", Links: [][]parser.ScamperLink{{{Addr: "4.4.4.0"}}}}} // NETBLOCK
335+
336+
staticIPv6Netblock := staticIPv6None
337+
staticIPv6Netblock.Tracelb.Dst = "2006:4:4:4::" // NETBLOCK
338+
staticIPv6Netblock.Tracelb.Nodes = []parser.ScamperNode{
339+
{Addr: "2001:2:2:2::2", Links: [][]parser.ScamperLink{{{Addr: "2001:3:3:3::3"}}}},
340+
{Addr: "2001:3:3:3::3", Links: [][]parser.ScamperLink{{{Addr: "2006:4:4:4::"}}}}, // NETBLOCK
341+
{Addr: "2006:4:4:4::", Links: [][]parser.ScamperLink{{{Addr: "2006:4:4:4::"}}}}} // NETBLOCK
342+
343+
tests := []struct {
344+
name string
345+
method anonymize.Method
346+
input *parser.Scamper1
347+
want *parser.Scamper1
348+
}{
349+
{"ipv4-netblock-none", anonymize.None, &staticIPv4None, &staticIPv4None},
350+
{"ipv4-netblock-netblock", anonymize.Netblock, &staticIPv4None, &staticIPv4Netblock},
351+
{"ipv6-netblock-none", anonymize.None, &staticIPv6None, &staticIPv6None},
352+
{"ipv6-netblock-netblock", anonymize.Netblock, &staticIPv6None, &staticIPv6Netblock},
353+
}
354+
for _, tt := range tests {
355+
t.Run(tt.name, func(t *testing.T) {
356+
anonymize.IPAnonymizationFlag = tt.method
357+
st := &staticTracer{
358+
input: tt.input,
359+
}
360+
h, err := newHandler(t, st)
361+
if err != nil {
362+
t.Fatalf("NewHandler() = %v, want nil", err)
363+
}
364+
l := net.ParseIP(tt.input.Tracelb.Src)
365+
h.LocalIPs = []*net.IP{&l}
366+
h.done = make(chan struct{})
367+
sockID := &inetdiag.SockID{SrcIP: tt.input.Tracelb.Src, DstIP: tt.input.Tracelb.Dst}
368+
h.Open(context.TODO(), time.Now(), tt.name, sockID)
369+
h.Close(context.TODO(), time.Now(), tt.name)
370+
waitForTrace(t, h)
371+
372+
if diff := deep.Equal(st.output, tt.want); diff != nil {
373+
t.Errorf("Close() anonymize failed; got != want\n%s", strings.Join(diff, "\n"))
374+
}
375+
})
376+
}
377+
378+
}

0 commit comments

Comments
 (0)