// Copyright 2015 syzkaller project authors. All rights reserved. // Use of this source code is governed by Apache 2 LICENSE that can be found in the LICENSE file. package prog import ( "testing" ) func TestParseSingle(t *testing.T) { t.Parallel() target, err := GetTarget("linux", "amd64") if err != nil { t.Fatal(err) } const execLog = `getpid() gettid() ` entries := target.ParseLog([]byte(execLog)) if len(entries) != 1 { t.Fatalf("got %v programs, want 1", len(entries)) } ent := entries[0] if ent.Start != 0 { t.Fatalf("start offset %v, want 0", ent.Start) } if ent.End != len(execLog) { t.Fatalf("end offset %v, want %v", ent.End, len(execLog)) } if ent.Proc != 0 { t.Fatalf("proc %v, want 0", ent.Proc) } if ent.Fault || ent.FaultCall != 0 || ent.FaultNth != 0 { t.Fatalf("fault injection enabled") } want := "getpid-gettid" got := ent.P.String() if got != want { t.Fatalf("bad program: %s, want %s", got, want) } } func TestParseMulti(t *testing.T) { t.Parallel() target, err := GetTarget("linux", "amd64") if err != nil { t.Fatal(err) } entries := target.ParseLog([]byte(execLog)) if len(entries) != 5 { for i, ent := range entries { t.Logf("program #%v: %v\n", i, ent.P) } t.Fatalf("got %v programs, want 5", len(entries)) } off := 0 for _, ent := range entries { if off > ent.Start || ent.Start > ent.End || ent.End > len(execLog) { t.Fatalf("bad offsets") } } if entries[0].Proc != 0 || entries[1].Proc != 1 || entries[2].Proc != 2 || entries[3].Proc != 33 || entries[4].Proc != 9 { t.Fatalf("bad procs") } for i, ent := range entries { if ent.Fault || ent.FaultCall != 0 || ent.FaultNth != 0 { t.Fatalf("prog %v has fault injection enabled", i) } } if s := entries[0].P.String(); s != "getpid-gettid" { t.Fatalf("bad program 0: %s", s) } if s := entries[1].P.String(); s != "getpid-gettid-munlockall" { t.Fatalf("bad program 0: %s", s) } if s := entries[2].P.String(); s != "getpid-gettid" { t.Fatalf("bad program 1: %s", s) } if s := entries[3].P.String(); s != "gettid-getpid" { t.Fatalf("bad program 2: %s", s) } if s := entries[4].P.String(); s != "munlockall" { t.Fatalf("bad program 3: %s", s) } } const execLog = ` getpid() gettid() 2015/12/21 12:18:05 executing program 1: getpid() [ 2351.935478] Modules linked in: gettid() munlockall() 2015/12/21 12:18:05 executing program 2: [ 2351.935478] Modules linked in: getpid() gettid() 2015/12/21 12:18:05 executing program 33: gettid() getpid() [ 2351.935478] Modules linked in: 2015/12/21 12:18:05 executing program 9: munlockall() ` func TestParseFault(t *testing.T) { t.Parallel() target, err := GetTarget("linux", "amd64") if err != nil { t.Fatal(err) } const execLog = `2015/12/21 12:18:05 executing program 1 (fault-call:1 fault-nth:55): gettid() getpid() ` entries := target.ParseLog([]byte(execLog)) if len(entries) != 1 { t.Fatalf("got %v programs, want 1", len(entries)) } ent := entries[0] if !ent.Fault { t.Fatalf("fault injection is not enabled") } if ent.FaultCall != 1 { t.Fatalf("fault call: got %v, want 1", ent.FaultCall) } if ent.FaultNth != 55 { t.Fatalf("fault nth: got %v, want 55", ent.FaultNth) } want := "gettid-getpid" got := ent.P.String() if got != want { t.Fatalf("bad program: %s, want %s", got, want) } }