| // Copyright 2019 The Prometheus Authors |
| // Licensed under the Apache License, Version 2.0 (the "License"); |
| // you may not use this file except in compliance with the License. |
| // You may obtain a copy of the License at |
| // |
| // http://www.apache.org/licenses/LICENSE-2.0 |
| // |
| // Unless required by applicable law or agreed to in writing, software |
| // distributed under the License is distributed on an "AS IS" BASIS, |
| // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
| // See the License for the specific language governing permissions and |
| // limitations under the License. |
| |
| //go:build (aix || darwin || dragonfly || freebsd || linux || netbsd || openbsd || solaris) && !386 && !arm && !mips && !mipsle |
| // +build aix darwin dragonfly freebsd linux netbsd openbsd solaris |
| // +build !386 |
| // +build !arm |
| // +build !mips |
| // +build !mipsle |
| |
| package procfs |
| |
| import ( |
| "testing" |
| |
| "github.com/google/go-cmp/cmp" |
| "golang.org/x/sys/unix" |
| ) |
| |
| func TestProcMaps(t *testing.T) { |
| tsts64 := []*ProcMap{ |
| { |
| StartAddr: 0x55680ae1e000, |
| EndAddr: 0x55680ae20000, |
| Perms: &ProcMapPermissions{true, false, false, false, true}, |
| Offset: 0, |
| Dev: unix.Mkdev(0xfd, 0x01), |
| Inode: 47316994, |
| Pathname: "/bin/cat", |
| }, |
| { |
| StartAddr: 0x55680ae29000, |
| EndAddr: 0x55680ae2a000, |
| Perms: &ProcMapPermissions{true, true, true, true, false}, |
| Offset: 40960, |
| Dev: unix.Mkdev(0xfd, 0x01), |
| Inode: 47316994, |
| Pathname: "/bin/cat", |
| }, |
| { |
| StartAddr: 0x55680bed6000, |
| EndAddr: 0x55680bef7000, |
| Perms: &ProcMapPermissions{true, true, false, false, true}, |
| Offset: 0, |
| Dev: unix.Mkdev(0, 0), |
| Inode: 0, |
| Pathname: "[heap]", |
| }, |
| { |
| StartAddr: 0x7fdf964fc000, |
| EndAddr: 0x7fdf973f2000, |
| Perms: &ProcMapPermissions{true, false, false, false, true}, |
| Offset: 0, |
| Dev: unix.Mkdev(0xfd, 0x01), |
| Inode: 17432624, |
| Pathname: "/usr/lib/locale/locale-archive", |
| }, |
| { |
| StartAddr: 0x7fdf973f2000, |
| EndAddr: 0x7fdf97417000, |
| Perms: &ProcMapPermissions{true, false, false, false, true}, |
| Offset: 0, |
| Dev: unix.Mkdev(0xfd, 0x01), |
| Inode: 60571062, |
| Pathname: "/lib/x86_64-linux-gnu/libc-2.29.so", |
| }, |
| { |
| StartAddr: 0x7ffe9215c000, |
| EndAddr: 0x7ffe9217f000, |
| Perms: &ProcMapPermissions{true, true, false, false, true}, |
| Offset: 0, |
| Dev: 0, |
| Inode: 0, |
| Pathname: "[stack]", |
| }, |
| { |
| StartAddr: 0x7ffe921da000, |
| EndAddr: 0x7ffe921dd000, |
| Perms: &ProcMapPermissions{true, false, false, false, true}, |
| Offset: 0, |
| Dev: 0, |
| Inode: 0, |
| Pathname: "[vvar]", |
| }, |
| { |
| StartAddr: 0x7ffe921dd000, |
| EndAddr: 0x7ffe921de000, |
| Perms: &ProcMapPermissions{true, false, true, false, true}, |
| Offset: 0, |
| Dev: 0, |
| Inode: 0, |
| Pathname: "[vdso]", |
| }, |
| { |
| StartAddr: 0xffffffffff600000, |
| EndAddr: 0xffffffffff601000, |
| Perms: &ProcMapPermissions{false, false, true, false, true}, |
| Offset: 0, |
| Dev: 0, |
| Inode: 0, |
| Pathname: "[vsyscall]", |
| }, |
| } |
| |
| // 64-bit test pid and fixtures |
| tpid := 26232 |
| tsts := tsts64 |
| |
| p, err := getProcFixtures(t).Proc(tpid) |
| if err != nil { |
| t.Fatal(err) |
| } |
| |
| maps, err := p.ProcMaps() |
| if err != nil { |
| t.Fatal(err) |
| } |
| |
| if want, have := len(maps), len(tsts); want > have { |
| t.Errorf("want at least %d parsed proc/map entries, have %d", want, have) |
| } |
| |
| for idx, tst := range tsts { |
| want, got := tst, maps[idx] |
| if diff := cmp.Diff(want, got); diff != "" { |
| t.Fatalf("unexpected proc/map entry (-want +got):\n%s", diff) |
| } |
| } |
| |
| } |
| |
| var start, end uintptr |
| |
| func BenchmarkParseAddress(b *testing.B) { |
| b.ReportAllocs() |
| var ( |
| s, e uintptr |
| err error |
| ) |
| for i := 0; i < b.N; i++ { |
| s, e, err = parseAddresses("7f7d7469e000-7f7d746a0000") |
| if err != nil { |
| b.Fatal(err) |
| } |
| } |
| // Prevent the compiler from optimizing away benchmark code. |
| start = s |
| end = e |
| } |
| |
| var device uint64 |
| |
| func BenchmarkParseDevice(b *testing.B) { |
| b.ReportAllocs() |
| var ( |
| d uint64 |
| err error |
| ) |
| for i := 0; i < b.N; i++ { |
| d, err = parseDevice("00:22") |
| if err != nil { |
| b.Fatal(err) |
| } |
| } |
| // Prevent the compiler from optimizing away benchmark code. |
| device = d |
| } |