static void TestPhysicalFileSystem() { // try reading/writing various types of sectors // use CheckBytes() to compare what was written vs. read VolatileDisk disk = new VolatileDisk(1); disk.TurnOn(); // FREE_SECTOR FREE_SECTOR free1 = new FREE_SECTOR(disk.BytesPerSector); disk.WriteSector(0, free1.RawBytes); FREE_SECTOR free2 = FREE_SECTOR.CreateFromBytes(disk.ReadSector(0)); CheckBytes("Free1", free1, "free2", free2); Console.WriteLine("FREE_SECTOR successful"); // DRIVE_INFO int rootNodeAt = 1; DRIVE_INFO drive1 = new DRIVE_INFO(disk.BytesPerSector, rootNodeAt); disk.WriteSector(0, drive1.RawBytes); DRIVE_INFO drive2 = DRIVE_INFO.CreateFromBytes(disk.ReadSector(0)); CheckBytes("drive1", drive1, "drive2", drive2); Console.WriteLine("DRIVE_SECTOR successful"); // DIR_NODE DIR_NODE rootDir1 = new DIR_NODE(disk.BytesPerSector, 2, FSConstants.PATH_SEPARATOR.ToString(), 42); disk.WriteSector(rootNodeAt, rootDir1.RawBytes); DIR_NODE rootDir2 = DIR_NODE.CreateFromBytes(disk.ReadSector(rootNodeAt)); CheckBytes("rootDir1", rootDir1, "rootDir2", rootDir2); Console.WriteLine("DIR_NODE successful"); // FILE_NODE FILE_NODE file1 = new FILE_NODE(disk.BytesPerSector, 8, "file1", 1000); disk.WriteSector(5, file1.RawBytes); FILE_NODE file2 = FILE_NODE.CreateFromBytes(disk.ReadSector(5)); CheckBytes("file1", file1, "file2", file2); Console.WriteLine("FILE_NODE successful"); // DATA_SECTOR byte[] filedata = CreateTestBytes(new Random(), DATA_SECTOR.MaxDataLength(disk.BytesPerSector)); DATA_SECTOR data1 = new DATA_SECTOR(disk.BytesPerSector, 9, filedata); disk.WriteSector(8, data1.RawBytes); DATA_SECTOR data2 = DATA_SECTOR.CreateFromBytes(disk.ReadSector(8)); CheckBytes("data1", data1, "data2", data2); Console.WriteLine("DATA_SECTOR successful"); disk.TurnOff(); }
static void TestSecuritySystem() { try { VolatileDisk disk = new VolatileDisk(0); disk.TurnOn(); FileSystem fs = new SimpleFS(); fs.Format(disk); fs.Mount(disk, "/"); SecuritySystem security = new SimpleSecurity(fs, "passwd"); security.AddUser("steven"); if (security.NeedsPassword("steven")) { security.SetPassword("steven", "foobar42"); } int userID = security.Authenticate("steven", "foobar42"); Console.WriteLine("UserID " + userID.ToString()); Console.WriteLine("Username " + security.UserName(userID)); Console.WriteLine("Home Directory " + security.UserHomeDirectory(userID)); Console.WriteLine("Shell " + security.UserPreferredShell(userID)); // Try failure scenarios // Add user "steven" again TestSecurityException(() => { security.AddUser("steven"); }); // Password for no one TestSecurityException(() => { security.NeedsPassword("nope"); }); // Set password for invalid user TestSecurityException(() => { security.SetPassword("nope", "12345678"); }); // Set invalid password TestSecurityException(() => { security.SetPassword("steven", "hat"); }); // Authenticate invalid user TestSecurityException(() => { security.Authenticate("nope", "12345678"); }); // Authenticate invalid password TestSecurityException(() => { security.Authenticate("steven", "hat"); }); // invalid user ID TestSecurityException(() => { security.UserName(42); }); // invalid user ID TestSecurityException(() => { security.UserHomeDirectory(42); }); // invalid user ID TestSecurityException(() => { security.UserPreferredShell(42); }); // second security system SecuritySystem security2 = new SimpleSecurity(fs, "passwd"); security2.Authenticate("steven", "foobar42"); fs.Unmount("/"); disk.TurnOff(); } catch (Exception ex) { Console.WriteLine("Exception: " + ex.Message); } }
static void TestDisks() { // Sample test for VolatileDisk VolatileDisk disk = new VolatileDisk(1); disk.TurnOn(); byte[] testData = new byte[disk.BytesPerSector]; for (int i = 0; i < disk.BytesPerSector; i++) { testData[i] = (byte)(i % 256); } TestSector(disk, 0, testData); TestSector(disk, 1, testData); TestSector(disk, disk.SectorCount - 1, testData); disk.TurnOff(); }
static void TestVirtualFileSystem() { try { Random r = new Random(); VolatileDisk disk = new VolatileDisk(1); //PersistentDisk disk = new PersistentDisk(1, "disk1"); disk.TurnOn(); VirtualFS vfs = new VirtualFS(); vfs.Format(disk); vfs.Mount(disk, "/"); VirtualNode root = vfs.RootNode; VirtualNode dir1 = root.CreateDirectoryNode("dir1"); dir1.CreateDirectoryNode("foo"); dir1.CreateDirectoryNode("bar"); VirtualNode dir2 = root.CreateDirectoryNode("dir2"); dir2.CreateDirectoryNode("hah!"); VirtualNode file1 = dir1.CreateFileNode("file1"); TestFileWriteRead(file1, r, 0, 100); // 1 sector TestFileWriteRead(file1, r, 0, 500); // 2 sectors TestFileWriteRead(file1, r, 250, 500); // 3 sectors dir2.CreateFileNode("another"); vfs.Unmount("/"); vfs.Mount(disk, "/"); RecursivelyPrintNodes(vfs.RootNode); disk.TurnOff(); } catch (Exception ex) { Console.WriteLine("VFS test failed: " + ex.Message); Console.WriteLine(ex.StackTrace); } }
static void TestPhysicalFileSystem() { // try reading/writing various types of sectors // use CheckBytes() to compare what was written vs. read VolatileDisk disk = new VolatileDisk(1); disk.TurnOn(); // write free sector to disk FREE_SECTOR freeSector1 = new FREE_SECTOR(disk.BytesPerSector); disk.WriteSector(0, freeSector1.RawBytes); //read sector byte[] bytes = disk.ReadSector(0); FREE_SECTOR freeSector2 = FREE_SECTOR.CreateFromBytes(bytes); //check if what was read is what was written CheckBytes("free_sector1", freeSector1, "freeSector2", freeSector2); // write drive info sector to disk DRIVE_INFO diSector1 = new DRIVE_INFO(disk.BytesPerSector, 42); disk.WriteSector(0, diSector1.RawBytes); //read sector byte[] bytes2 = disk.ReadSector(0); DRIVE_INFO diSector2 = DRIVE_INFO.CreateFromBytes(bytes2); //check if what was read is what was written CheckBytes("diSector1", diSector1, "diSector2", diSector2); // TODO: DIR_NODE // TODO: FILE_NODE // TODO: DATA_SECTOR disk.TurnOff(); }
static void TestPhysicalFileSystem() { // try reading/writing various types of sectors // use CheckBytes() to compare what was written vs. read VolatileDisk disk = new VolatileDisk(1); disk.TurnOn(); // FREE_SECTOR // Initialize a FREE_SECTOR and write it to disk. FREE_SECTOR free1 = new FREE_SECTOR(disk.BytesPerSector); disk.WriteSector(0, free1.RawBytes); // REad the sector back and compare. byte[] freeBytes = disk.ReadSector(0); Console.WriteLine("Read sector 0, type = " + SECTOR.GetTypeFromBytes(freeBytes)); FREE_SECTOR free2 = FREE_SECTOR.CreateFromBytes(freeBytes); CheckBytes("Written Free sector", free1, "Read Free sector", free2); // TODO: DRIVE_INFO // TODO: DIR_NODE // TODO: FILE_NODE //FILE_NODE file1 = new FILE_NODE(disk.BytesPerSector, 11, "foo", 12); // DATA_SECTOR int datalen = DATA_SECTOR.MaxDataLength(disk.BytesPerSector); byte[] databytes = new byte[datalen]; DATA_SECTOR data1 = new DATA_SECTOR(disk.BytesPerSector, 42, databytes); disk.WriteSector(41, data1.RawBytes); disk.TurnOff(); }
static void TestLogicalFileSystem() { try { DiskDriver disk = new VolatileDisk(1); //DiskDriver disk = new PersistentDisk(1, "disk1"); disk.TurnOn(); FileSystem fs = new SimpleFS(); fs.Format(disk); fs.Mount(disk, "/"); Directory root = fs.GetRootDirectory(); Directory dir1 = root.CreateDirectory("dir1"); Directory dir2 = root.CreateDirectory("dir2"); Random r = new Random(); byte[] bytes1 = CreateTestBytes(r, 1000); File file2 = dir2.CreateFile("file2"); FileStream stream1 = file2.Open(); stream1.Write(0, bytes1); stream1.Close(); File file2_2 = (File)fs.Find("/dir2/file2"); FileStream stream2 = file2_2.Open(); byte[] bytes2 = stream2.Read(0, 1000); stream2.Close(); if (!Compare(bytes1, bytes2)) { throw new Exception("bytes read were not the same as written"); } ValidateBadPath(fs, ""); ValidateBadPath(fs, "//"); ValidateBadPath(fs, "/dir2/nope"); ValidateBadPath(fs, "dir2"); ValidateBadPath(fs, "nope"); ValidateBadPath(fs, "/dir2/file2/nope"); ValidatePath(fs, "/"); ValidatePath(fs, "/dir2"); ValidatePath(fs, "/dir1/"); Console.WriteLine("Printing all directories..."); RecursivelyPrintDirectories(root); Console.WriteLine(); Console.WriteLine("Moving file2 to dir1..."); file2.Move(dir1); Console.WriteLine("Printing all directories..."); RecursivelyPrintDirectories(root); Console.WriteLine(); Console.WriteLine("Renaming dir2 to renamed..."); dir2.Rename("renamed"); Console.WriteLine("Printing all directories..."); RecursivelyPrintDirectories(root); Console.WriteLine(); Console.WriteLine("Deleting renamed..."); dir2.Delete(); Console.WriteLine("Printing all directories..."); RecursivelyPrintDirectories(root); Console.WriteLine(); Console.WriteLine("Deleting dir1..."); dir1.Delete(); Console.WriteLine("Printing all directories..."); RecursivelyPrintDirectories(root); Console.WriteLine(); fs.Unmount("/"); disk.TurnOff(); Console.WriteLine("Logical file system success!"); } catch (Exception ex) { Console.WriteLine("LFS test failed: " + ex.Message); Console.WriteLine(ex.StackTrace); } }
static void TestVirtualFileSystem() { try { Random r = new Random(); VolatileDisk disk = new VolatileDisk(1); //PersistentDisk disk = new PersistentDisk(1, "disk1"); disk.TurnOn(); VirtualFS vfs = new VirtualFS(); vfs.Format(disk); vfs.Mount(disk, "/"); VirtualNode root = vfs.RootNode; VirtualNode dir1 = root.CreateDirectoryNode("dir1"); VirtualNode dir2 = root.CreateDirectoryNode("dir2"); dir2.CreateDirectoryNode("dir3"); dir1.CreateDirectoryNode("dir4"); dir2.CreateDirectoryNode("dir5"); VirtualNode file1 = dir1.CreateFileNode("file1"); VirtualNode file2 = dir1.CreateFileNode("file2"); VirtualNode file3 = dir2.CreateFileNode("file3"); VirtualNode file4 = dir2.CreateFileNode("file4"); TestFileWriteRead(file1, r, 0, 100); // 1 sector TestFileWriteRead(file1, r, 42, 77); TestFileWriteRead(file1, r, 0, 500); // 2 sectors TestFileWriteRead(file1, r, 250, 500); // 3 sectors TestFileWriteRead(file1, r, 275, 700); // 4 sectors RecursivelyPrintNodes(vfs.RootNode); Console.WriteLine("Rename!"); dir1 = vfs.RootNode.GetChild("dir1"); dir1.Rename("newdir1"); RecursivelyPrintNodes(vfs.RootNode); // Move something Console.WriteLine("Move!"); dir2 = vfs.RootNode.GetChild("dir2"); dir1.Move(dir2); RecursivelyPrintNodes(vfs.RootNode); // Make sure disk is correct Console.WriteLine("Unmount/mount!"); vfs.Unmount("/"); vfs.Mount(disk, "/"); RecursivelyPrintNodes(vfs.RootNode); // Delete Console.WriteLine("Delete file!"); VirtualNode file6 = vfs.RootNode.CreateFileNode("file6"); file6.Write(0, CreateTestBytes(r, 1000)); Console.WriteLine("File before deleting!"); RecursivelyPrintNodes(vfs.RootNode); file6.Delete(); Console.WriteLine("File after deleting!"); RecursivelyPrintNodes(vfs.RootNode); // Delete directory Console.WriteLine("Delete Directory!"); VirtualNode deleteDir2 = vfs.RootNode.GetChild("dir2"); VirtualNode deleteDir1 = deleteDir2.GetChild("newdir1"); //deleteDir2.Delete(); deleteDir1.Delete(); Console.WriteLine("...After deleting Directory!"); RecursivelyPrintNodes(vfs.RootNode); disk.TurnOff(); Console.WriteLine("TestVirtualFileSystem success!"); } catch (Exception ex) { Console.WriteLine("VFS test failed: " + ex.Message); Console.WriteLine(ex.StackTrace); } }