int main() { struct stat statusBuf; Error error; DB db; File* file1; File* file2; File* file3; File* file4; int i; const int num = 100; int j[num]; // create buffer manager bufMgr = new BufMgr(num); // create dummy files lstat("test.1", &statusBuf); if (errno == ENOENT) errno = 0; else (void)db.destroyFile("test.1"); lstat("test.2", &statusBuf); if (errno == ENOENT) errno = 0; else (void)db.destroyFile("test.2"); lstat("test.3", &statusBuf); if (errno == ENOENT) errno = 0; else (void)db.destroyFile("test.3"); lstat("test.4", &statusBuf); if (errno == ENOENT) errno = 0; else (void)db.destroyFile("test.4"); CALL(db.createFile("test.1")); ASSERT(db.createFile("test.1") == FILEEXISTS); CALL(db.createFile("test.2")); CALL(db.createFile("test.3")); CALL(db.createFile("test.4")); CALL(db.openFile("test.1", file1)); CALL(db.openFile("test.2", file2)); CALL(db.openFile("test.3", file3)); CALL(db.openFile("test.4", file4)); // test buffer manager Page* page; Page* page2; Page* page3; char cmp[PAGESIZE]; int pageno, pageno2, pageno3; cout << "Allocating pages in a file..." << endl; for (i = 0; i < num; i++) { CALL(bufMgr->allocPage(file1, j[i], page)); sprintf((char*)page, "test.1 Page %d %7.1f", j[i], (float)j[i]); CALL(bufMgr->unPinPage(file1, j[i], true)); } cout <<"Test passed"<<endl<<endl; cout << "Reading pages back..." << endl; for (i = 0; i < num; i++) { CALL(bufMgr->readPage(file1, j[i], page)); sprintf((char*)&cmp, "test.1 Page %d %7.1f", j[i], (float)j[i]); ASSERT(memcmp(page, &cmp, strlen((char*)&cmp)) == 0); CALL(bufMgr->unPinPage(file1, j[i], false)); } cout<< "Test passed"<<endl<<endl; cout << "Writing and reading back multiple files..." << endl; cout << "Expected Result: "; cout << "The output will consist of the file name, page number, and a value."<<endl; cout << "The page number and the value should match."<<endl<<endl; for (i = 0; i < num/3; i++) { CALL(bufMgr->allocPage(file2, pageno2, page2)); sprintf((char*)page2, "test.2 Page %d %7.1f", pageno2, (float)pageno2); CALL(bufMgr->allocPage(file3, pageno3, page3)); sprintf((char*)page3, "test.3 Page %d %7.1f", pageno3, (float)pageno3); pageno = j[random() % num]; CALL(bufMgr->readPage(file1, pageno, page)); sprintf((char*)&cmp, "test.1 Page %d %7.1f", pageno, (float)pageno); ASSERT(memcmp(page, &cmp, strlen((char*)&cmp)) == 0); cout << (char*)page << endl; CALL(bufMgr->readPage(file2, pageno2, page2)); sprintf((char*)&cmp, "test.2 Page %d %7.1f", pageno2, (float)pageno2); ASSERT(memcmp(page2, &cmp, strlen((char*)&cmp)) == 0); CALL(bufMgr->readPage(file3, pageno3, page3)); sprintf((char*)&cmp, "test.3 Page %d %7.1f", pageno3, (float)pageno3); ASSERT(memcmp(page3, &cmp, strlen((char*)&cmp)) == 0); CALL(bufMgr->unPinPage(file1, pageno, true)); } for (i = 0; i < num/3; i++) { CALL(bufMgr->unPinPage(file2, i+1, true)); CALL(bufMgr->unPinPage(file2, i+1, true)); CALL(bufMgr->unPinPage(file3, i+1, true)); CALL(bufMgr->unPinPage(file3, i+1, true)); } cout << "Test passed" << endl<<endl; #ifdef DEBUGBUF bufMgr->printSelf(); #endif cout << "\nReading \"test.1\"...\n"; cout << "Expected Result: "; cout << "Pages in order. Values matching page number.\n\n"; for (i = 1; i < num/3; i++) { CALL(bufMgr->readPage(file1, i, page2)); sprintf((char*)&cmp, "test.1 Page %d %7.1f", i, (float)i); ASSERT(memcmp(page2, &cmp, strlen((char*)&cmp)) == 0); CALL(bufMgr->unPinPage(file1, i, false)); } cout << "Test passed" <<endl<<endl; cout << "\nReading \"test.2\"...\n"; cout << "Expected Result: "; cout << "Pages in order. Values matching page number.\n\n"; for (i = 1; i < num/3; i++) { CALL(bufMgr->readPage(file2, i, page2)); sprintf((char*)&cmp, "test.2 Page %d %7.1f", i, (float)i); ASSERT(memcmp(page2, &cmp, strlen((char*)&cmp)) == 0); cout << (char*)page2 << endl; CALL(bufMgr->unPinPage(file2, i, false)); } cout << "Test passed" <<endl<<endl; cout << "\nReading \"test.3\"...\n"; cout << "Expected Result: "; cout << "Pages in order. Values matching page number.\n\n"; for (i = 1; i < num/3; i++) { CALL(bufMgr->readPage(file3, i, page3)); sprintf((char*)&cmp, "test.3 Page %d %7.1f", i, (float)i); ASSERT(memcmp(page3, &cmp, strlen((char*)&cmp)) == 0); cout << (char*)page3 << endl; CALL(bufMgr->unPinPage(file3, i, false)); } cout << "Test passed" <<endl<<endl; cout << "\nTesting error condition...\n\n"; cout << "Expected Result: Error statments followed by the \"Test passed\" statement."<<endl; Status status; FAIL(status = bufMgr->readPage(file4, 1, page)); error.print(status); cout << "Test passed" <<endl<<endl; CALL(bufMgr->allocPage(file4, i, page)); CALL(bufMgr->unPinPage(file4, i, true)); FAIL(status = bufMgr->unPinPage(file4, i, false)); error.print(status); cout << "Test passed" <<endl<<endl; for (i = 0; i < num; i++) { CALL(bufMgr->allocPage(file4, j[i], page)); sprintf((char*)page, "test.4 Page %d %7.1f", j[i], (float)j[i]); } int tmp; FAIL(status = bufMgr->allocPage(file4, tmp, page)); error.print(status); cout << "Test passed" <<endl<<endl; for (i = 0; i < num; i++) CALL(bufMgr->unPinPage(file4, i+2, true)); cout << "\nReading \"test.1\"...\n"; cout << "Expected Result: "; cout << "Pages in order. Values matching page number.\n\n"; for (i = 1; i < num; i++) { CALL(bufMgr->readPage(file1, i, page)); sprintf((char*)&cmp, "test.1 Page %d %7.1f", i, (float)i); ASSERT(memcmp(page, &cmp, strlen((char*)&cmp)) == 0); cout << (char*)page << endl; } cout << "Test passed" <<endl<<endl; cout << "flushing file with pages still pinned. Should generate an error" << endl; FAIL(status = bufMgr->flushFile(file1)); error.print(status); cout << "Test passed"<<endl<<endl; for (i = 1; i < num; i++) CALL(bufMgr->unPinPage(file1, i, true)); CALL(bufMgr->flushFile(file1)); CALL(db.closeFile(file1)); CALL(db.closeFile(file2)); CALL(db.closeFile(file3)); CALL(db.closeFile(file4)); CALL(db.destroyFile("test.1")); CALL(db.destroyFile("test.2")); CALL(db.destroyFile("test.3")); CALL(db.destroyFile("test.4")); delete bufMgr; cout << endl << "Passed all tests." << endl; return (1); }