示例#1
0
        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();
        }
示例#2
0
        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);
            }
        }
示例#3
0
        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();
        }
示例#4
0
        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);
            }
        }
示例#5
0
        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();
        }
示例#6
0
        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();
        }
示例#7
0
        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);
            }
        }
示例#8
0
        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);
            }
        }