Exemple #1
0
        public void FillFileSystemTest()
        {
            ConfigurationTest.Initialize();
            Random r = new Random(1234);

            using (var io = ConfigurationTest.CreateMemoryIO()) {
                FileSystem fs = FileSystem.Create(io);

                byte[] data = new byte[1024 * 1024];

                Directory d = fs.RootDirectory;
                File      f = fs.CreateFile(d, "TEST");
                int       totalBytesWritten = 0;
                using (FileIO fio = new FileIO(fs, f)) {
                    int bytesWritten = 0;
                    do
                    {
                        r.NextBytes(data);
                        bytesWritten       = fio.WriteFile(data, f.Length);
                        totalBytesWritten += bytesWritten;
                    } while (bytesWritten != 0);
                }

                fs.Dispose();

                CryptoSettings cryptoSettings = Configuration.CryptoSettings;
                Options        options        = Configuration.Options;
                Configuration.Reset();
                Configuration.CryptoSettings = cryptoSettings;
                Configuration.Options        = options;

                fs = FileSystem.Mount(io);

                r = new Random(1234);
                f = fs.GetContainedFiles(fs.RootDirectory)["TEST"];
                Assert.AreEqual(f.Length, totalBytesWritten);
                int    totalBytesRead = 0;
                byte[] compare        = new byte[1024 * 1024];
                using (FileIO fio = new FileIO(fs, f)) {
                    int bytesRead = 0;
                    do
                    {
                        r.NextBytes(data);
                        bytesRead       = fio.ReadFile(compare, totalBytesRead);
                        totalBytesRead += bytesRead;
                        for (int i = 0; i < bytesRead; i++)
                        {
                            Assert.AreEqual(compare[i], data[i]);
                        }
                    } while (bytesRead != 0);
                }

                Assert.AreEqual(totalBytesRead, totalBytesWritten);

                fs.Dispose();
            }
        }
Exemple #2
0
        public void FileDeleteTest()
        {
            ConfigurationTest.Initialize();
            Random r = new Random(1234);

            using (var io = ConfigurationTest.CreateMemoryIO()) {
                FileSystem fs = FileSystem.Create(io);

                byte[] data = new byte[1024 * 1024];
                r.NextBytes(data);

                Directory d = fs.RootDirectory;
                File      f = fs.CreateFile(d, "TEST");
                using (FileIO fio = new FileIO(fs, f)) {
                    Assert.AreEqual(data.Length, fio.WriteFile(data, 0));
                }

                fs.Dispose();

                CryptoSettings cryptoSettings = Configuration.CryptoSettings;
                Options        options        = Configuration.Options;
                Configuration.Reset();
                Configuration.CryptoSettings = cryptoSettings;
                Configuration.Options        = options;

                fs = FileSystem.Mount(io);
                byte[] data2 = new byte[data.Length];

                File f2 = fs.GetContainedFiles(fs.RootDirectory)["TEST"];

                fs.RemoveFile(f2);

                Assert.AreEqual(0, (from s in fs.ClusterStates where (s & ClusterState.Used) != 0 && (s & ClusterState.System) == 0 select s).Count());
                Assert.AreEqual(0, fs.GetContainedFiles(fs.RootDirectory).Count);

                fs.Dispose();
            }
        }
Exemple #3
0
        public void FileIOTest()
        {
            ConfigurationTest.Initialize();
            Random r = new Random(1234);

            using (var io = ConfigurationTest.CreateMemoryIO()) {
                FileSystem fs = FileSystem.Create(io);

                byte[] data = new byte[1024 * 1024];
                r.NextBytes(data);

                Directory d = fs.RootDirectory;
                File      f = fs.CreateFile(d, "TEST");
                using (FileIO fio = new FileIO(fs, f)) {
                    Assert.AreEqual(data.Length, fio.WriteFile(data, 0));
                    for (int j = 0; j < 100; j++)
                    {
                        switch (r.Next(3))
                        {
                        case 0: {
                            // Internal Overwrite
                            int offset = r.Next(data.Length);
                            int count  = r.Next(data.Length - offset);
                            if (count != 0)
                            {
                                byte[] newData = new byte[count];
                                r.NextBytes(newData);
                                Assert.AreEqual(newData.Length, fio.WriteFile(newData, offset));
                                Buffer.BlockCopy(newData, 0, data, offset, count);
                                Assert.AreEqual(data.Length, f.Length);
                            }
                            break;
                        }

                        case 1: {
                            // Append
                            int count = r.Next(2 * 1024 * 1024 - (int)f.Length);
                            if (count != 0)
                            {
                                int    offset  = (int)f.Length;
                                byte[] newData = new byte[count];
                                r.NextBytes(newData);
                                Assert.AreEqual(newData.Length, fio.WriteFile(newData, offset));
                                byte[] dt = new byte[count + data.Length];
                                Buffer.BlockCopy(data, 0, dt, 0, offset);
                                Buffer.BlockCopy(newData, 0, dt, offset, count);
                                data = dt;
                                Assert.AreEqual(data.Length, f.Length);
                            }
                            break;
                        }

                        case 2: {
                            // Set Length
                            int count = r.Next(2 * 1024 * 1024);
                            fio.SetEndOfFile(count);
                            byte[] newData = new byte[count];
                            Buffer.BlockCopy(data, 0, newData, 0, Math.Min(count, data.Length));
                            data = newData;
                            Assert.AreEqual(data.Length, f.Length);
                            break;
                        }
                        }
                    }
                }

                int length   = (int)f.Length;
                int clusters = length <= FileHeaderCluster.DataSize ? 1 :
                               (length - FileHeaderCluster.DataSize + FileDataCluster.DataSize - 1) / FileDataCluster.DataSize + 1;
                Assert.AreEqual(clusters, (from s in fs.ClusterStates where (s & ClusterState.Used) != 0 && (s & ClusterState.System) == 0 select s).Count());

                fs.Dispose();

                CryptoSettings cryptoSettings = Configuration.CryptoSettings;
                Options        options        = Configuration.Options;
                Configuration.Reset();
                Configuration.CryptoSettings = cryptoSettings;
                Configuration.Options        = options;

                fs = FileSystem.Mount(io);
                byte[] data2 = new byte[data.Length];

                File f2 = fs.GetContainedFiles(fs.RootDirectory)["TEST"];
                Assert.AreEqual(f.Length, f2.Length);
                using (FileIO fio = new FileIO(fs, f2)) {
                    Assert.AreEqual(data2.Length, fio.ReadFile(data2, 0));
                    Assert.AreEqual(0, fio.ReadFile(data2, data2.Length));
                }

                Assert.IsTrue(data.SequenceEqual(data2));

                length   = (int)f2.Length;
                clusters = length <= FileHeaderCluster.DataSize ? 1 :
                           (length - FileHeaderCluster.DataSize + FileDataCluster.DataSize - 1) / FileDataCluster.DataSize + 1;
                Assert.AreEqual(clusters, (from s in fs.ClusterStates where (s & ClusterState.Used) != 0 && (s & ClusterState.System) == 0 select s).Count());

                using (FileIO fio = new FileIO(fs, f2)) {
                    fio.SetEndOfFile(0);
                }

                Assert.AreEqual(0, f2.Length);
                Assert.AreEqual(0, (from s in fs.ClusterStates where (s & ClusterState.Used) != 0 && (s & ClusterState.System) == 0 select s).Count());

                fs.Dispose();

                Configuration.Reset();
                Configuration.CryptoSettings = cryptoSettings;
                Configuration.Options        = options;

                fs = FileSystem.Mount(io);
                File f3 = fs.GetContainedFiles(fs.RootDirectory)["TEST"];
                Assert.AreEqual(0, f3.Length);
                Assert.AreEqual(0, (from s in fs.ClusterStates where (s & ClusterState.Used) != 0 && (s & ClusterState.System) == 0 select s).Count());
            }
        }
Exemple #4
0
        public void FileSystemCreateTest()
        {
            ConfigurationTest.Initialize();
            Random r = new Random(1234);

            using (var io = ConfigurationTest.CreateMemoryIO()) {
                FileSystem fs = FileSystem.Create(io);
                fs.Flush();

                ClusterState[] clusterStateArray = new ClusterState[Configuration.Geometry.DataClustersPerTrack * Configuration.Geometry.TrackCount];
                for (int i = 0; i < clusterStateArray.Length; i++)
                {
                    if ((fs.GetClusterState(i) & ClusterState.System) == 0)
                    {
                        ClusterState c = (ClusterState)r.Next(16);
                        clusterStateArray[i] = c;
                        fs.SetClusterState(i, c);
                    }
                    else
                    {
                        clusterStateArray[i] = fs.GetClusterState(i);
                    }
                }

                int[] nextClusterArray = new int[Configuration.Geometry.DataClustersPerTrack * Configuration.Geometry.TrackCount];
                for (int i = 0; i < nextClusterArray.Length; i++)
                {
                    if ((fs.GetClusterState(i) & ClusterState.System) == 0)
                    {
                        int c = r.Next();
                        nextClusterArray[i] = c;
                        fs.SetNextClusterAddress(i, c);
                    }
                    else
                    {
                        nextClusterArray[i] = fs.GetNextClusterAddress(i);
                    }
                }

                int[] bytesUsedArray = new int[Configuration.Geometry.DataClustersPerTrack * Configuration.Geometry.TrackCount];
                for (int i = 0; i < bytesUsedArray.Length; i++)
                {
                    if ((fs.GetClusterState(i) & ClusterState.System) == 0)
                    {
                        int c = r.Next();
                        bytesUsedArray[i] = c;
                        fs.SetBytesUsed(i, c);
                    }
                    else
                    {
                        bytesUsedArray[i] = fs.GetBytesUsed(i);
                    }
                }

                DateTime[] verifyTimeArray = new DateTime[Configuration.Geometry.ClustersPerTrack * Configuration.Geometry.TrackCount];
                for (int i = 0; i < verifyTimeArray.Length; i++)
                {
                    if (i >= Configuration.Geometry.DataClustersPerTrack * Configuration.Geometry.TrackCount ||
                        (fs.GetClusterState(i) & ClusterState.System) == 0)
                    {
                        DateTime c = new DateTime(r.Next());
                        verifyTimeArray[i] = c;
                        fs.SetVerifyTime(i, c);
                    }
                    else
                    {
                        verifyTimeArray[i] = fs.GetVerifyTime(i);
                    }
                }

                fs.Dispose();

                string         volumeName     = Configuration.VolumeName;
                Geometry       geometry       = Configuration.Geometry;
                CryptoSettings cryptoSettings = Configuration.CryptoSettings;
                Options        options        = Configuration.Options;
                Guid           guid           = Configuration.FileSystemID;
                Configuration.Reset();

                Configuration.CryptoSettings = cryptoSettings;
                Configuration.Options        = options;

                fs = FileSystem.Mount(io);

                Assert.AreEqual(volumeName, Configuration.VolumeName);
                Assert.AreEqual(geometry, Configuration.Geometry);
                Assert.AreEqual(guid, Configuration.FileSystemID);

                for (int i = 0; i < clusterStateArray.Length; i++)
                {
                    Assert.AreEqual(clusterStateArray[i], fs.GetClusterState(i));
                }

                for (int i = 0; i < nextClusterArray.Length; i++)
                {
                    Assert.AreEqual(nextClusterArray[i], fs.GetNextClusterAddress(i));
                }

                for (int i = 0; i < bytesUsedArray.Length; i++)
                {
                    Assert.AreEqual(bytesUsedArray[i], fs.GetBytesUsed(i));
                }

                for (int i = 0; i < verifyTimeArray.Length; i++)
                {
                    Assert.AreEqual(verifyTimeArray[i], fs.GetVerifyTime(i));
                }

                fs.Dispose();
            }
        }
Exemple #5
0
        public void FileSystemPopulate()
        {
            ConfigurationTest.Initialize();
            Random r = new Random(1234);

            using (var io = ConfigurationTest.CreateMemoryIO()) {
                FileSystem fs = FileSystem.Create(io);
                fs.Flush();

                SortedList <int, DirInfo>  dirs  = new SortedList <int, DirInfo>();
                SortedList <int, FileInfo> files = new SortedList <int, FileInfo>();

                Directory d = fs.RootDirectory;
                dirs.Add(fs.RootDirectory.ID, new DirInfo(d));

                for (int i = 0; i < 1000; i++)
                {
                    var parent = dirs.Values[r.Next(dirs.Count)];
                    d = fs.CreateDirectory(parent.Directory, $"dir{nextID}");
                    nextID++;

                    DirInfo info = new DirInfo(d);
                    dirs.Add(d.ID, info);
                    dirs[d.ParentID].Subdirs.Add(d.ID);

                    FileSystemAccessRule accessRule = new FileSystemAccessRule(
                        WindowsIdentity.GetCurrent().User, FileSystemRights.FullControl, InheritanceFlags.None,
                        PropagationFlags.None, AccessControlType.Allow);
                    fs.AddAccessRule(d, accessRule);
                    info.AccessRules.Add(accessRule);

                    FileSystemAuditRule auditRule = new FileSystemAuditRule(
                        WindowsIdentity.GetCurrent().User, FileSystemRights.FullControl, InheritanceFlags.None,
                        PropagationFlags.None, AuditFlags.Success);
                    fs.AddAuditRule(d, auditRule);
                    info.AuditRules.Add(auditRule);
                }

                for (int i = 0; i < 1000; i++)
                {
                    var  parent = dirs.Values[r.Next(dirs.Count)];
                    File f      = fs.CreateFile(parent.Directory, $"file{nextID}");
                    nextID++;

                    FileInfo info = new FileInfo(f);
                    files.Add(f.ID, info);
                    dirs[f.ParentID].Files.Add(f.ID);

                    FileSystemAccessRule accessRule = new FileSystemAccessRule(
                        WindowsIdentity.GetCurrent().User, FileSystemRights.FullControl, InheritanceFlags.None,
                        PropagationFlags.None, AccessControlType.Allow);
                    fs.AddAccessRule(f, accessRule);
                    info.AccessRules.Add(accessRule);

                    FileSystemAuditRule auditRule = new FileSystemAuditRule(
                        WindowsIdentity.GetCurrent().User, FileSystemRights.FullControl, InheritanceFlags.None,
                        PropagationFlags.None, AuditFlags.Success);
                    fs.AddAuditRule(f, auditRule);
                    info.AuditRules.Add(auditRule);
                }

                checkDirectories(fs, fs.RootDirectory, dirs, files);
                fs.Dispose();

                CryptoSettings cryptoSettings = Configuration.CryptoSettings;
                Options        options        = Configuration.Options;
                Configuration.Reset();
                Configuration.CryptoSettings = cryptoSettings;
                Configuration.Options        = options;

                fs = FileSystem.Mount(io);
                checkDirectories(fs, fs.RootDirectory, dirs, files);
            }
        }
Exemple #6
0
        public void IntClusterTableTest()
        {
            ConfigurationTest.Initialize();

            using (var io = ConfigurationTest.CreateMemoryIO()) {
                SimpleClusterIO cio = new SimpleClusterIO(io);

                Random r = new Random();

                ClusterTable <int> ct = new ClusterTable <int>(
                    new int[] { 2, 4 },
                    sizeof(int),
                    (address) => new IntArrayCluster(address)
                {
                    Type = ClusterType.BytesUsedTable
                });

                ClusterTable <int> ct2 = new ClusterTable <int>(
                    new int[] { 2, 4 },
                    sizeof(int),
                    (address) => new IntArrayCluster(address)
                {
                    Type = ClusterType.BytesUsedTable
                });

                ct.Flush(cio);
                ct2.Load(cio);

                // Check that the cluster is written and everything is zeroed

                DataBlock b      = new DataBlock(io.Bytes, 2 * Configuration.Geometry.BytesPerCluster, Configuration.Geometry.BytesPerCluster);
                int       offset = verifyProperties(b, ClusterType.BytesUsedTable, 4);
                for (int i = 0; i < ArrayCluster.CalculateElementCount(sizeof(int)); i++)
                {
                    Assert.AreEqual(b.ToInt32(offset + i * sizeof(int)), 0);
                }

                b      = new DataBlock(io.Bytes, 4 * Configuration.Geometry.BytesPerCluster, Configuration.Geometry.BytesPerCluster);
                offset = verifyProperties(b, ClusterType.BytesUsedTable, Constants.NoAddress);
                for (int i = 0; i < ArrayCluster.CalculateElementCount(sizeof(int)); i++)
                {
                    Assert.AreEqual(b.ToInt32(offset + i * sizeof(int)), 0);
                }

                for (int i = 0; i < ct2.Count; i++)
                {
                    Assert.AreEqual(ct2[i], 0);
                }

                // Now randomize the contents
                for (int i = 0; i < ct.Count; i++)
                {
                    ct[i] = r.Next();
                }
                ct.Flush(cio);

                b      = new DataBlock(io.Bytes, 2 * Configuration.Geometry.BytesPerCluster, Configuration.Geometry.BytesPerCluster);
                offset = verifyProperties(b, ClusterType.BytesUsedTable, 4);
                int index = 0;
                for (int i = 0; i < ArrayCluster.CalculateElementCount(sizeof(int)); i++, index++)
                {
                    Assert.AreEqual(b.ToInt32(offset + i * sizeof(int)), ct[index]);
                }

                b      = new DataBlock(io.Bytes, 4 * Configuration.Geometry.BytesPerCluster, Configuration.Geometry.BytesPerCluster);
                offset = verifyProperties(b, ClusterType.BytesUsedTable, Constants.NoAddress);
                for (int i = 0; i < ArrayCluster.CalculateElementCount(sizeof(int)); i++, index++)
                {
                    Assert.AreEqual(b.ToInt32(offset + i * sizeof(int)), ct[index]);
                }

                ct2.Load(cio);
                for (int i = 0; i < ct2.Count; i++)
                {
                    Assert.AreEqual(ct2[i], ct[i]);
                }

                // Add a cluster
                ct.AddCluster(7);
                ct2.AddCluster(7);
                ct.Flush(cio);

                // Make sure that next cluster is updated
                b = new DataBlock(io.Bytes, 4 * Configuration.Geometry.BytesPerCluster, Configuration.Geometry.BytesPerCluster);
                verifyProperties(b, ClusterType.BytesUsedTable, 7);

                // check the new cluster and assure everything is zero
                b      = new DataBlock(io.Bytes, 7 * Configuration.Geometry.BytesPerCluster, Configuration.Geometry.BytesPerCluster);
                offset = verifyProperties(b, ClusterType.BytesUsedTable, Constants.NoAddress);
                for (int i = 0; i < ArrayCluster.CalculateElementCount(sizeof(int)); i++)
                {
                    Assert.AreEqual(b.ToInt32(offset + i * sizeof(int)), 0);
                }

                ct2.Load(cio);
                for (int i = 0; i < ct2.Count; i++)
                {
                    Assert.AreEqual(ct2[i], ct[i]);
                }

                Assert.AreEqual(ct2.Count, 3 * ArrayCluster.CalculateElementCount(sizeof(int)));

                // Remove a cluster
                ct.RemoveLastCluster();
                ct.Flush(cio);

                // Make sure that the last cluster is updated
                b = new DataBlock(io.Bytes, 4 * Configuration.Geometry.BytesPerCluster, Configuration.Geometry.BytesPerCluster);
                verifyProperties(b, ClusterType.BytesUsedTable, Constants.NoAddress);
            }
        }