| // Copyright 2018 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 ( |
| "fmt" |
| "testing" |
| ) |
| |
| func TestMemAlloc(t *testing.T) { |
| t.Parallel() |
| type op struct { |
| addr uint64 |
| size int // if positive do noteAlloc, otherwise -- alloc |
| } |
| tests := [][]op{ |
| { |
| // Just sequential allocation. |
| {0, -1}, |
| {64, -64}, |
| {128, -65}, |
| {256, -16}, |
| {320, -8}, |
| }, |
| { |
| // First reserve some memory and then allocate. |
| {0, 1}, |
| {64, 63}, |
| {128, 64}, |
| {192, 65}, |
| {320, -1}, |
| {448, 1}, |
| {384, -1}, |
| {576, 1}, |
| {640, -128}, |
| }, |
| } |
| for ti, test := range tests { |
| test := test |
| t.Run(fmt.Sprint(ti), func(t *testing.T) { |
| ma := newMemAlloc(16 << 20) |
| for i, op := range test { |
| if op.size > 0 { |
| t.Logf("#%v: noteAlloc(%v, %v)", i, op.addr, op.size) |
| ma.noteAlloc(op.addr, uint64(op.size)) |
| continue |
| } |
| t.Logf("#%v: alloc(%v) = %v", i, -op.size, op.addr) |
| addr := ma.alloc(nil, uint64(-op.size)) |
| if addr != op.addr { |
| t.Fatalf("bad result %v", addr) |
| } |
| } |
| }) |
| } |
| } |
| |
| func TestVmaAlloc(t *testing.T) { |
| t.Parallel() |
| target, err := GetTarget("test", "64") |
| if err != nil { |
| t.Fatal(err) |
| } |
| r := newRand(target, randSource(t)) |
| va := newVmaAlloc(1000) |
| for i := 0; i < 30; i++ { |
| size := r.rand(4) + 1 |
| page := va.alloc(r, size) |
| t.Logf("alloc(%v) = %3v-%3v\n", size, page, page+size) |
| } |
| } |