1// Copyright 2020 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//go:build zos && s390x
6// +build zos,s390x
7
8package unix_test
9
10import (
11	"os"
12	"testing"
13	"unsafe"
14
15	"golang.org/x/sys/unix"
16)
17
18func TestFstatfs(t *testing.T) {
19
20	wd, err := os.Getwd()
21	if err != nil {
22		t.Fatal(err)
23	}
24	file, err := os.Open(wd)
25	if err != nil {
26		t.Fatal(err)
27	}
28
29	//Query Statfs_t and Statvfs_t from wd, check content
30	var stat unix.Statfs_t
31	err = unix.Fstatfs(int(file.Fd()), &stat)
32	if err != nil {
33		t.Fatal(err)
34	}
35	var stat_v unix.Statvfs_t
36	err = unix.Fstatvfs(int(file.Fd()), &stat_v)
37	if stat.Bsize != stat_v.Bsize ||
38		stat.Blocks != stat_v.Blocks ||
39		stat.Bfree != stat_v.Bfree ||
40		stat.Bavail != stat_v.Bavail ||
41		stat.Files != stat_v.Files ||
42		stat.Ffree != stat_v.Ffree ||
43		stat.Fsid != stat_v.Fsid ||
44		stat.Namelen != stat_v.Namemax ||
45		stat.Frsize != stat_v.Frsize ||
46		stat.Flags != stat_v.Flag {
47		t.Errorf("Mismatching fields in Statfs_t and Statvfs_t.\nStatfs_t = %+v\nStatvfs_t = %+v", stat, stat_v)
48	}
49
50	//Initialize W_Mntent, find corresponding device and check filesystem type
51	var mnt_ent_buffer struct {
52		header       unix.W_Mnth
53		filesys_info [128]unix.W_Mntent
54	}
55	var buffer_size int = int(unsafe.Sizeof(mnt_ent_buffer))
56	var fs_count int = -1
57	for fs_count < 0 {
58		fs_count, err = unix.W_Getmntent((*byte)(unsafe.Pointer(&mnt_ent_buffer)), buffer_size)
59		if err != nil {
60			t.Fatal(err)
61		}
62		for i := 0; i < fs_count; i++ {
63			if stat.Fsid == uint64(mnt_ent_buffer.filesys_info[i].Dev) {
64				correct_type := uint32(mnt_ent_buffer.filesys_info[i].Fstname[0])
65				if stat.Type != correct_type {
66					t.Errorf("File system type is 0x%x. Should be 0x%x instead", stat.Type, correct_type)
67				}
68				return
69			}
70		}
71	}
72
73}
74