mirror of
https://github.com/rwinkhart/sys.git
synced 2026-09-02 23:27:31 -04:00
On AIX, Stat_t's fields dealing with time are of type StTimespec while all other GOOS are using Timespec. StTimespec and Timespec are the same on ppc but not in ppc64. Therefore, values returned by ppc64 syscalls need to be adjusted in order to allow the use of Timespec instead of StTimespec. Fixes golang/go#32073 Change-Id: I0c212bf1741a27c49e995bf928d4941b6d583e54 Reviewed-on: https://go-review.googlesource.com/c/sys/+/177838 Reviewed-by: Brad Fitzpatrick <bradfitz@golang.org>
183 lines
3.9 KiB
Go
183 lines
3.9 KiB
Go
// Copyright 2018 The Go Authors. All rights reserved.
|
|
// Use of this source code is governed by a BSD-style
|
|
// license that can be found in the LICENSE file.
|
|
|
|
// +build aix
|
|
|
|
package unix_test
|
|
|
|
import (
|
|
"os"
|
|
"runtime"
|
|
"testing"
|
|
"time"
|
|
|
|
"golang.org/x/sys/unix"
|
|
)
|
|
|
|
func TestIoctlGetInt(t *testing.T) {
|
|
f, err := os.Open("/dev/random")
|
|
if err != nil {
|
|
t.Fatalf("failed to open device: %v", err)
|
|
}
|
|
defer f.Close()
|
|
|
|
v, err := unix.IoctlGetInt(int(f.Fd()), unix.RNDGETENTCNT)
|
|
if err != nil {
|
|
t.Fatalf("failed to perform ioctl: %v", err)
|
|
}
|
|
|
|
t.Logf("%d bits of entropy available", v)
|
|
}
|
|
|
|
func TestTime(t *testing.T) {
|
|
var ut unix.Time_t
|
|
ut2, err := unix.Time(&ut)
|
|
if err != nil {
|
|
t.Fatalf("Time: %v", err)
|
|
}
|
|
if ut != ut2 {
|
|
t.Errorf("Time: return value %v should be equal to argument %v", ut2, ut)
|
|
}
|
|
|
|
var now time.Time
|
|
|
|
for i := 0; i < 10; i++ {
|
|
ut, err = unix.Time(nil)
|
|
if err != nil {
|
|
t.Fatalf("Time: %v", err)
|
|
}
|
|
|
|
now = time.Now()
|
|
|
|
if int64(ut) == now.Unix() {
|
|
return
|
|
}
|
|
}
|
|
|
|
t.Errorf("Time: return value %v should be nearly equal to time.Now().Unix() %v", ut, now.Unix())
|
|
}
|
|
|
|
func TestUtime(t *testing.T) {
|
|
defer chtmpdir(t)()
|
|
|
|
touch(t, "file1")
|
|
|
|
buf := &unix.Utimbuf{
|
|
Modtime: 12345,
|
|
}
|
|
|
|
err := unix.Utime("file1", buf)
|
|
if err != nil {
|
|
t.Fatalf("Utime: %v", err)
|
|
}
|
|
|
|
fi, err := os.Stat("file1")
|
|
if err != nil {
|
|
t.Fatal(err)
|
|
}
|
|
|
|
if fi.ModTime().Unix() != 12345 {
|
|
t.Errorf("Utime: failed to change modtime: expected %v, got %v", 12345, fi.ModTime().Unix())
|
|
}
|
|
}
|
|
|
|
func TestUtimesNanoAt(t *testing.T) {
|
|
defer chtmpdir(t)()
|
|
|
|
symlink := "symlink1"
|
|
defer os.Remove(symlink)
|
|
err := os.Symlink("nonexisting", symlink)
|
|
if err != nil {
|
|
t.Fatal(err)
|
|
}
|
|
|
|
ts := []unix.Timespec{
|
|
{Sec: 1111, Nsec: 2222},
|
|
{Sec: 3333, Nsec: 4444},
|
|
}
|
|
err = unix.UtimesNanoAt(unix.AT_FDCWD, symlink, ts, unix.AT_SYMLINK_NOFOLLOW)
|
|
if err != nil {
|
|
t.Fatalf("UtimesNanoAt: %v", err)
|
|
}
|
|
|
|
var st unix.Stat_t
|
|
err = unix.Lstat(symlink, &st)
|
|
if err != nil {
|
|
t.Fatalf("Lstat: %v", err)
|
|
}
|
|
if runtime.GOARCH == "ppc64" {
|
|
if int64(st.Atim.Sec) != int64(ts[0].Sec) || st.Atim.Nsec != ts[0].Nsec {
|
|
t.Errorf("UtimesNanoAt: wrong atime: %v", st.Atim)
|
|
}
|
|
if int64(st.Mtim.Sec) != int64(ts[1].Sec) || st.Mtim.Nsec != ts[1].Nsec {
|
|
t.Errorf("UtimesNanoAt: wrong mtime: %v", st.Mtim)
|
|
}
|
|
} else {
|
|
if int32(st.Atim.Sec) != int32(ts[0].Sec) || int32(st.Atim.Nsec) != int32(ts[0].Nsec) {
|
|
t.Errorf("UtimesNanoAt: wrong atime: %v", st.Atim)
|
|
}
|
|
if int32(st.Mtim.Sec) != int32(ts[1].Sec) || int32(st.Mtim.Nsec) != int32(ts[1].Nsec) {
|
|
t.Errorf("UtimesNanoAt: wrong mtime: %v", st.Mtim)
|
|
}
|
|
}
|
|
}
|
|
|
|
func TestSelect(t *testing.T) {
|
|
_, err := unix.Select(0, nil, nil, nil, &unix.Timeval{Sec: 0, Usec: 0})
|
|
if err != nil {
|
|
t.Fatalf("Select: %v", err)
|
|
}
|
|
|
|
dur := 150 * time.Millisecond
|
|
tv := unix.NsecToTimeval(int64(dur))
|
|
start := time.Now()
|
|
_, err = unix.Select(0, nil, nil, nil, &tv)
|
|
took := time.Since(start)
|
|
if err != nil {
|
|
t.Fatalf("Select: %v", err)
|
|
}
|
|
|
|
if took < dur {
|
|
t.Errorf("Select: timeout should have been at least %v, got %v", dur, took)
|
|
}
|
|
}
|
|
|
|
func TestPselect(t *testing.T) {
|
|
if runtime.GOARCH == "ppc64" {
|
|
t.Skip("pselect issue with structure timespec on AIX 7.2 tl0, skipping test")
|
|
}
|
|
|
|
_, err := unix.Pselect(0, nil, nil, nil, &unix.Timespec{Sec: 0, Nsec: 0}, nil)
|
|
if err != nil {
|
|
t.Fatalf("Pselect: %v", err)
|
|
}
|
|
|
|
dur := 2500 * time.Microsecond
|
|
ts := unix.NsecToTimespec(int64(dur))
|
|
start := time.Now()
|
|
_, err = unix.Pselect(0, nil, nil, nil, &ts, nil)
|
|
took := time.Since(start)
|
|
if err != nil {
|
|
t.Fatalf("Pselect: %v", err)
|
|
}
|
|
|
|
if took < dur {
|
|
t.Errorf("Pselect: timeout should have been at least %v, got %v", dur, took)
|
|
}
|
|
}
|
|
|
|
// stringsFromByteSlice converts a sequence of attributes to a []string.
|
|
// On Linux, each entry is a NULL-terminated string.
|
|
func stringsFromByteSlice(buf []byte) []string {
|
|
var result []string
|
|
off := 0
|
|
for i, b := range buf {
|
|
if b == 0 {
|
|
result = append(result, string(buf[off:i]))
|
|
off = i + 1
|
|
}
|
|
}
|
|
return result
|
|
}
|