Source file src/runtime/runtime_linux_test.go

     1  // Copyright 2012 The Go Authors. All rights reserved.
     2  // Use of this source code is governed by a BSD-style
     3  // license that can be found in the LICENSE file.
     4  
     5  package runtime_test
     6  
     7  import (
     8  	. "runtime"
     9  	"syscall"
    10  	"testing"
    11  	"time"
    12  	"unsafe"
    13  )
    14  
    15  var pid, tid int
    16  
    17  func 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()
    25  
    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  	}
    36  }
    37  
    38  func TestLockOSThread(t *testing.T) {
    39  	if pid != tid {
    40  		t.Fatalf("pid=%d but tid=%d", pid, tid)
    41  	}
    42  }
    43  
    44  // Test that error values are negative.
    45  // Use a misaligned pointer to get -EINVAL.
    46  func TestMincoreErrorSign(t *testing.T) {
    47  	var dst byte
    48  	v := Mincore(Add(unsafe.Pointer(new(int32)), 1), 1, &dst)
    49  
    50  	const EINVAL = 0x16
    51  	if v != -EINVAL {
    52  		t.Errorf("mincore = %v, want %v", v, -EINVAL)
    53  	}
    54  }
    55  
    56  func TestEpollctlErrorSign(t *testing.T) {
    57  	v := Epollctl(-1, 1, -1, unsafe.Pointer(&EpollEvent{}))
    58  
    59  	const EBADF = 0x09
    60  	if v != -EBADF {
    61  		t.Errorf("epollctl = %v, want %v", v, -EBADF)
    62  	}
    63  }
    64  
    65  func 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  }
    75  

View as plain text