public void QuotaInfo_Query_QuotaInformation_IsQuotaInfoSupported()
        {
            BaseTestSite.Log.Add(LogEntryKind.TestStep, "Test case steps:");
            MessageStatus status;

            //Step 1: Open Quota file
            BaseTestSite.Log.Add(LogEntryKind.TestStep, "1. Open Quota file " + this.fsaAdapter.QuotaFile);
            status = this.fsaAdapter.CreateFile(
                        this.fsaAdapter.QuotaFile,
                        FileAttribute.NORMAL,
                        CreateOptions.SYNCHRONOUS_IO_NONALERT,
                        FileAccess.FILE_READ_DATA | FileAccess.FILE_WRITE_DATA |
                        FileAccess.FILE_READ_ATTRIBUTES | FileAccess.FILE_WRITE_ATTRIBUTES | FileAccess.SYNCHRONIZE,
                        ShareAccess.FILE_SHARE_READ | ShareAccess.FILE_SHARE_WRITE,
                        CreateDisposition.OPEN);

            if (this.fsaAdapter.IsQuotaSupported == false)
            {
                this.fsaAdapter.AssertAreEqual(this.Manager, true,
                    (status == MessageStatus.OBJECT_PATH_NOT_FOUND || status == MessageStatus.OBJECT_NAME_NOT_FOUND),
                    "Quota file is not supported and expected to fail.");
                return;
            }

            //Step 2: Query Quota Information
            long byteCount;
            byte[] outputBuffer;
            BaseTestSite.Log.Add(LogEntryKind.TestStep, "2. Query Quota Information.");
            if (this.fsaAdapter.Transport == Transport.SMB)
            {
                SMB_QUERY_QUOTA_INFO smbQueryQuotaInfo = new SMB_QUERY_QUOTA_INFO();
                smbQueryQuotaInfo.ReturnSingleEntry = 0;
                smbQueryQuotaInfo.RestartScan = 1;
                smbQueryQuotaInfo.SidListLength = 0;
                smbQueryQuotaInfo.StartSidLength = 0;
                smbQueryQuotaInfo.StartSidOffset = 0;

                status = this.fsaAdapter.QueryFileQuotaInformation(smbQueryQuotaInfo, 2048, out byteCount, out outputBuffer);
            }
            else
            {
                SMB2_QUERY_QUOTA_INFO smb2QueryQuotaInfo = new SMB2_QUERY_QUOTA_INFO();
                smb2QueryQuotaInfo.ReturnSingle = 0;
                smb2QueryQuotaInfo.RestartScan = 1;
                smb2QueryQuotaInfo.Reserved = 0;
                smb2QueryQuotaInfo.SidListLength = 0;
                smb2QueryQuotaInfo.StartSidLength = 0;
                smb2QueryQuotaInfo.StartSidOffset = 0;

                status = this.fsaAdapter.QueryFileQuotaInformation(smb2QueryQuotaInfo, 2048, out byteCount, out outputBuffer);
            }

            //Step 3: Verify test result
            BaseTestSite.Log.Add(LogEntryKind.TestStep, "3. Verify returned NTStatus code.");
            this.fsaAdapter.AssertAreEqual(this.Manager, MessageStatus.SUCCESS, status,
                    "Quota is supported, status set to STATUS_SUCCESS.");
        }
        public void QuotaInfo_Set_QuotaInformation_IsQuotaInfoSupported()
        {
            BaseTestSite.Log.Add(LogEntryKind.TestStep, "Test case steps:");
            MessageStatus status;

            //Step 1: Open Quota file
            BaseTestSite.Log.Add(LogEntryKind.TestStep, "1. Open Quota file " + this.fsaAdapter.QuotaFile);
            status = this.fsaAdapter.CreateFile(
                        this.fsaAdapter.QuotaFile,
                        FileAttribute.NORMAL,
                        CreateOptions.SYNCHRONOUS_IO_NONALERT,
                        FileAccess.FILE_READ_DATA | FileAccess.FILE_WRITE_DATA |
                        FileAccess.FILE_READ_ATTRIBUTES | FileAccess.FILE_WRITE_ATTRIBUTES | FileAccess.SYNCHRONIZE,
                        ShareAccess.FILE_SHARE_READ | ShareAccess.FILE_SHARE_WRITE,
                        CreateDisposition.OPEN);

            if (this.fsaAdapter.IsQuotaSupported == false)
            {
                this.fsaAdapter.AssertAreEqual(this.Manager, true,
                    (status == MessageStatus.OBJECT_PATH_NOT_FOUND || status == MessageStatus.OBJECT_NAME_NOT_FOUND),
                    "Quota file is not supported and expected to fail.");
                return;
            }

            //Step 2: Query Quota Information
            long byteCount;
            byte[] outputBuffer;
            BaseTestSite.Log.Add(LogEntryKind.TestStep, "2. Query Quota Information.");
            if (this.fsaAdapter.Transport == Transport.SMB)
            {
                SMB_QUERY_QUOTA_INFO smbQueryQuotaInfo = new SMB_QUERY_QUOTA_INFO();
                smbQueryQuotaInfo.ReturnSingleEntry = 0;
                smbQueryQuotaInfo.RestartScan = 1;
                smbQueryQuotaInfo.SidListLength = 0;
                smbQueryQuotaInfo.StartSidLength = 0;
                smbQueryQuotaInfo.StartSidOffset = 0;

                status = this.fsaAdapter.QueryFileQuotaInformation(smbQueryQuotaInfo, 2048, out byteCount, out outputBuffer);
            }
            else
            {
                SMB2_QUERY_QUOTA_INFO smb2QueryQuotaInfo = new SMB2_QUERY_QUOTA_INFO();
                smb2QueryQuotaInfo.ReturnSingle = 0;
                smb2QueryQuotaInfo.RestartScan = 1;
                smb2QueryQuotaInfo.Reserved = 0;
                smb2QueryQuotaInfo.SidListLength = 0;
                smb2QueryQuotaInfo.StartSidLength = 0;
                smb2QueryQuotaInfo.StartSidOffset = 0;

                status = this.fsaAdapter.QueryFileQuotaInformation(smb2QueryQuotaInfo, 2048, out byteCount, out outputBuffer);
            }

            //Step 3: Set Quota Information
            FILE_QUOTA_INFORMATION[] fileQuotaInformationEntries = FsaUtility.UnmarshalFileQuotaInformation(outputBuffer);
            if (fileQuotaInformationEntries.Length > 0)
            {
                FILE_QUOTA_INFORMATION quotaEntry = fileQuotaInformationEntries[0];
                FILE_QUOTA_INFORMATION fileQuotaInfo = new FILE_QUOTA_INFORMATION();
                fileQuotaInfo.NextEntryOffset = 0;
                fileQuotaInfo.SidLength = (uint)quotaEntry.Sid.Length;
                fileQuotaInfo.ChangeTime = new _FILETIME();
                fileQuotaInfo.QuotaUsed = 0;
                fileQuotaInfo.QuotaThreshold = 1024 * 1024; //Set warning Level 1MB
                fileQuotaInfo.QuotaLimit = -1;
                fileQuotaInfo.Sid = quotaEntry.Sid;

                BaseTestSite.Log.Add(LogEntryKind.TestStep, "3. Set Quota Information.");
                status = this.fsaAdapter.SetFileQuotaInformation(fileQuotaInfo);

                //Step 4: Verify test result
                BaseTestSite.Log.Add(LogEntryKind.TestStep, "4. Verify returned NTStatus code.");
                this.fsaAdapter.AssertAreEqual(this.Manager, MessageStatus.SUCCESS, status,
                        "Quota is supported, status set to STATUS_SUCCESS.");
            }
        }