1// BasicTest.cpp
2
3#include <stdio.h>
4#include <stdlib.h>
5#include <unistd.h>
6
7#include <set>
8using std::set;
9
10#include "BasicTest.h"
11
12// count_available_fds
13static
14int32
15count_available_fds()
16{
17	set<int> fds;
18	int fd;
19	while ((fd = dup(1)) != -1)
20		fds.insert(fd);
21	for (set<int>::iterator it = fds.begin(); it != fds.end(); it++)
22		close(*it);
23	return fds.size();
24}
25
26// constructor
27BasicTest::BasicTest()
28		 : BTestCase(),
29		   fSubTestNumber(0),
30		   fAvailableFDs(0)
31{
32}
33
34// setUp
35void
36BasicTest::setUp()
37{
38	BTestCase::setUp();
39	fAvailableFDs = count_available_fds();
40	SaveCWD();
41	fSubTestNumber = 0;
42}
43
44// tearDown
45void
46BasicTest::tearDown()
47{
48	RestoreCWD();
49	int32 availableFDs = count_available_fds();
50	if (availableFDs != fAvailableFDs) {
51		printf("WARNING: Number of available file descriptors has changed "
52			   "during test: %ld -> %ld\n", fAvailableFDs, availableFDs);
53		fAvailableFDs = availableFDs;
54	}
55	BTestCase::tearDown();
56}
57
58// execCommand
59//
60// Calls system() with the supplied string.
61void
62BasicTest::execCommand(const string &cmdLine)
63{
64	system(cmdLine.c_str());
65}
66
67// dumpStat
68void
69BasicTest::dumpStat(struct stat &st)
70{
71	printf("stat:\n");
72	printf("  st_dev    : %lx\n", st.st_dev);
73	printf("  st_ino    : %Lx\n", st.st_ino);
74	printf("  st_mode   : %x\n", st.st_mode);
75	printf("  st_nlink  : %x\n", st.st_nlink);
76	printf("  st_uid    : %x\n", st.st_uid);
77	printf("  st_gid    : %x\n", st.st_gid);
78	printf("  st_size   : %lld\n", st.st_size);
79	printf("  st_blksize: %ld\n", st.st_blksize);
80	printf("  st_atime  : %lx\n", st.st_atime);
81	printf("  st_mtime  : %lx\n", st.st_mtime);
82	printf("  st_ctime  : %lx\n", st.st_ctime);
83	printf("  st_crtime : %lx\n", st.st_crtime);
84}
85
86// createVolume
87void
88BasicTest::createVolume(string imageFile, string mountPoint, int32 megs,
89						bool makeMountPoint)
90{
91	char megsString[16];
92	sprintf(megsString, "%ld", megs);
93	execCommand(string("dd if=/dev/zero of=") + imageFile
94					+ " bs=1M count=" + megsString
95					+ " &> /dev/null"
96				+ " ; mkbfs " + imageFile
97					+ " > /dev/null"
98				+ " ; sync"
99				+ (makeMountPoint ? " ; mkdir " + mountPoint : "")
100				+ " ; mount " + imageFile + " " + mountPoint);
101}
102
103// deleteVolume
104void
105BasicTest::deleteVolume(string imageFile, string mountPoint,
106						bool deleteMountPoint)
107{
108	execCommand(string("sync")
109				+ " ; unmount " + mountPoint
110				+ (deleteMountPoint ? " ; rmdir " + mountPoint : "")
111				+ " ; rm " + imageFile);
112}
113
114