blob: a753aeea583d66e549faa192421f9134d5febc20 [file] [log] [blame]
Dan Willemsen38f2dba2016-07-08 14:54:35 -07001// Copyright 2012 The Go Authors. All rights reserved.
Brent Austinba3052e2015-04-21 16:08:23 -07002// Use of this source code is governed by a BSD-style
3// license that can be found in the LICENSE file.
4
5package runtime_test
6
7import (
8 . "runtime"
9 "syscall"
10 "testing"
Dan Willemsena3223282018-02-27 19:41:43 -080011 "time"
Dan Willemsen38f2dba2016-07-08 14:54:35 -070012 "unsafe"
Brent Austinba3052e2015-04-21 16:08:23 -070013)
14
15var pid, tid int
16
17func init() {
18 // Record pid and tid of init thread for use during test.
19 // The call to LockOSThread is just to exercise it;
20 // we can't test that it does anything.
21 // Instead we're testing that the conditions are good
22 // for how it is used in init (must be on main thread).
23 pid, tid = syscall.Getpid(), syscall.Gettid()
24 LockOSThread()
Dan Willemsena3223282018-02-27 19:41:43 -080025
26 sysNanosleep = func(d time.Duration) {
27 // Invoke a blocking syscall directly; calling time.Sleep()
28 // would deschedule the goroutine instead.
29 ts := syscall.NsecToTimespec(d.Nanoseconds())
30 for {
31 if err := syscall.Nanosleep(&ts, &ts); err != syscall.EINTR {
32 return
33 }
34 }
35 }
Brent Austinba3052e2015-04-21 16:08:23 -070036}
37
38func TestLockOSThread(t *testing.T) {
39 if pid != tid {
40 t.Fatalf("pid=%d but tid=%d", pid, tid)
41 }
42}
Dan Willemsen38f2dba2016-07-08 14:54:35 -070043
Patrice Arruda748609c2020-06-25 12:12:21 -070044// Test that error values are negative.
45// Use a misaligned pointer to get -EINVAL.
Dan Willemsen38f2dba2016-07-08 14:54:35 -070046func TestMincoreErrorSign(t *testing.T) {
47 var dst byte
Patrice Arruda748609c2020-06-25 12:12:21 -070048 v := Mincore(Add(unsafe.Pointer(new(int32)), 1), 1, &dst)
Dan Willemsen38f2dba2016-07-08 14:54:35 -070049
50 const EINVAL = 0x16
51 if v != -EINVAL {
52 t.Errorf("mincore = %v, want %v", v, -EINVAL)
53 }
54}
Dan Willemsenc7413322018-08-27 23:21:26 -070055
56func TestEpollctlErrorSign(t *testing.T) {
Patrice Arruda748609c2020-06-25 12:12:21 -070057 v := Epollctl(-1, 1, -1, unsafe.Pointer(&EpollEvent{}))
Dan Willemsenc7413322018-08-27 23:21:26 -070058
59 const EBADF = 0x09
60 if v != -EBADF {
61 t.Errorf("epollctl = %v, want %v", v, -EBADF)
62 }
63}
Dan Willemsenbc60c3c2021-12-15 01:09:00 -080064
65func TestKernelStructSize(t *testing.T) {
66 // Check that the Go definitions of structures exchanged with the kernel are
67 // the same size as what the kernel defines.
68 if have, want := unsafe.Sizeof(Siginfo{}), uintptr(SiginfoMaxSize); have != want {
69 t.Errorf("Go's siginfo struct is %d bytes long; kernel expects %d", have, want)
70 }
71 if have, want := unsafe.Sizeof(Sigevent{}), uintptr(SigeventMaxSize); have != want {
72 t.Errorf("Go's sigevent struct is %d bytes long; kernel expects %d", have, want)
73 }
74}