@@ -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) {
255259func 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