1314817Sngie/*	$NetBSD: t_quota2_1.c,v 1.5 2017/01/13 21:30:39 christos Exp $	*/
2272343Sngie
3272343Sngie/*
4272343Sngie * Basic tests for quota2
5272343Sngie */
6272343Sngie
7272343Sngie#include <atf-c.h>
8272343Sngie
9272343Sngie#include "../common/h_fsmacros.h"
10272343Sngie
11272343Sngie#include <sys/types.h>
12272343Sngie#include <sys/mount.h>
13272343Sngie
14272343Sngie#include <stdlib.h>
15272343Sngie
16272343Sngie#include <ufs/ufs/ufsmount.h>
17272343Sngie
18272343Sngie#include <rump/rump.h>
19272343Sngie#include <rump/rump_syscalls.h>
20272343Sngie
21314817Sngie#include "h_macros.h"
22272343Sngie
23272343Sngiestatic void
24272343Sngiedo_quota(const atf_tc_t *tc, int n, const char *newfs_opts, int log)
25272343Sngie{
26272343Sngie	int i;
27272343Sngie	char buf[1024];
28272343Sngie	int res;
29272343Sngie	int fd;
30272343Sngie	struct ufs_args uargs;
31272343Sngie
32272343Sngie	snprintf(buf, sizeof(buf), "newfs -q user -q group -F -s 4000 -n %d "
33272343Sngie	    "%s %s", (n + 3),  newfs_opts, FSTEST_IMGNAME);
34272343Sngie        if (system(buf) == -1)
35272343Sngie                atf_tc_fail_errno("cannot create file system");
36272343Sngie
37272343Sngie	rump_init();
38272343Sngie	if (rump_sys_mkdir(FSTEST_MNTNAME, 0777) == -1)
39272343Sngie		atf_tc_fail_errno("mount point create");
40272343Sngie
41272343Sngie	rump_pub_etfs_register("/diskdev", FSTEST_IMGNAME, RUMP_ETFS_BLK);
42272343Sngie
43272343Sngie	uargs.fspec = __UNCONST("/diskdev");
44272343Sngie	if (rump_sys_mount(MOUNT_FFS, FSTEST_MNTNAME, (log) ? MNT_LOG : 0,
45272343Sngie	    &uargs, sizeof(uargs)) == -1)
46272343Sngie		atf_tc_fail_errno("mount ffs %s", FSTEST_MNTNAME);
47272343Sngie
48272343Sngie	atf_tc_expect_pass();
49272343Sngie	FSTEST_ENTER();
50272343Sngie	RL(rump_sys_chown(".", 0, 0));
51272343Sngie	for (i = 0 ; i < n; i++) {
52272343Sngie		sprintf(buf, "file%d", i);
53272343Sngie		RL(fd = rump_sys_open(buf, O_CREAT | O_RDWR, 0755));
54272343Sngie		sprintf(buf, "test file no %d", i);
55272343Sngie		RL(rump_sys_write(fd, buf, strlen(buf)));
56272343Sngie		RL(rump_sys_fchown(fd, i, i+80000));
57272343Sngie		rump_sys_close(fd);
58272343Sngie	}
59272343Sngie	FSTEST_EXIT();
60272343Sngie	if (rump_sys_unmount(FSTEST_MNTNAME, 0) != 0) {
61272343Sngie		rump_pub_vfs_mount_print(FSTEST_MNTNAME, 1);
62272343Sngie		atf_tc_fail_errno("unmount failed");
63272343Sngie	}
64272343Sngie	snprintf(buf, 1024, "fsck_ffs -fn -F %s",  FSTEST_IMGNAME);
65272343Sngie	res = system(buf);
66272343Sngie	if (res != 0)
67272343Sngie		atf_tc_fail("fsck returned %d", res);
68272343Sngie}
69272343Sngie
70272343Sngie#define DECL_TEST(nent, newops, name, descr, log) \
71272343SngieATF_TC(quota_##name);							\
72272343Sngie									\
73272343SngieATF_TC_HEAD(quota_##name, tc)						\
74272343Sngie{									\
75272343Sngie	atf_tc_set_md_var(tc, "descr",					\
76272343Sngie	    "test quotas with %d users and groups, %s",			\
77272343Sngie	    nent, descr);						\
78272343Sngie}									\
79272343Sngie									\
80272343SngieATF_TC_BODY(quota_##name, tc)						\
81272343Sngie{									\
82272343Sngie	do_quota(tc, nent, newops, log);				\
83272343Sngie}
84272343Sngie
85272343SngieDECL_TEST(40, "-O1 -B le", 40_O1_le, "UFS1 little-endian", 0)
86272343SngieDECL_TEST(40, "-O1 -B be", 40_O1_be, "UFS1 big-endian", 0)
87272343Sngie
88272343SngieDECL_TEST(40, "-O2 -B le", 40_O2_le, "UFS2 little-endian", 0)
89272343SngieDECL_TEST(40, "-O2 -B be", 40_O2_be, "UFS2 big-endian", 0)
90272343Sngie
91272343SngieDECL_TEST(40, "-O1", 40_O1_log, "UFS1 log", 1)
92272343SngieDECL_TEST(40, "-O2", 40_O2_log, "UFS2 log", 1)
93272343Sngie
94272343SngieDECL_TEST(1000, "-O1 -B le", 1000_O1_le, "UFS1 little-endian", 0)
95272343SngieDECL_TEST(1000, "-O1 -B be", 1000_O1_be, "UFS1 big-endian", 0)
96272343Sngie
97272343SngieDECL_TEST(1000, "-O2 -B le", 1000_O2_le, "UFS2 little-endian", 0)
98272343SngieDECL_TEST(1000, "-O2 -B be", 1000_O2_be, "UFS2 big-endian", 0)
99272343Sngie
100272343SngieATF_TP_ADD_TCS(tp)
101272343Sngie{
102272343Sngie
103272343Sngie	ATF_TP_ADD_TC(tp, quota_40_O1_le);
104272343Sngie	ATF_TP_ADD_TC(tp, quota_40_O1_be);
105272343Sngie	ATF_TP_ADD_TC(tp, quota_40_O2_le);
106272343Sngie	ATF_TP_ADD_TC(tp, quota_40_O2_be);
107272343Sngie	ATF_TP_ADD_TC(tp, quota_40_O1_log);
108272343Sngie	ATF_TP_ADD_TC(tp, quota_40_O2_log);
109272343Sngie	ATF_TP_ADD_TC(tp, quota_1000_O1_le);
110272343Sngie	ATF_TP_ADD_TC(tp, quota_1000_O1_be);
111272343Sngie	ATF_TP_ADD_TC(tp, quota_1000_O2_le);
112272343Sngie	ATF_TP_ADD_TC(tp, quota_1000_O2_be);
113272343Sngie	return atf_no_error();
114272343Sngie}
115