public void BVT_FileLevelTrim() { uint treeId; FILEID fileId; PrepareFileForTrimming(out treeId, out fileId); FSCTL_FILE_LEVEL_TRIM_RANGE fileLevelTrimRange; Random random = new Random(); uint offset = (uint)random.Next(0, TestConfig.WriteBufferLengthInKb * 1024); uint length = (uint)random.Next(0, (int)(TestConfig.WriteBufferLengthInKb * 1024 - offset)); fileLevelTrimRange.Offset = offset; fileLevelTrimRange.Length = length; FSCTL_FILE_LEVEL_TRIM_INPUT fileLevelTrimInput; fileLevelTrimInput.Key = 0; fileLevelTrimInput.NumRanges = 1; fileLevelTrimInput.Ranges = new FSCTL_FILE_LEVEL_TRIM_RANGE[] { fileLevelTrimRange }; byte[] buffer = TypeMarshal.ToBytes <FSCTL_FILE_LEVEL_TRIM_INPUT>(fileLevelTrimInput); byte[] respOutput; status = client.FileLevelTrim( treeId, fileId, buffer, out respOutput, (header, response) => BaseTestSite.Assert.AreEqual( true, header.Status == Smb2Status.STATUS_SUCCESS || header.Status == Smb2Status.STATUS_NO_RANGES_PROCESSED, // The operation was successful, but no range was processed. "{0} should complete with STATUS_SUCCESS or STATUS_NO_RANGES_PROCESSED, actually server returns {1}.", header.Command, Smb2Status.GetStatusCode(header.Status))); if (status != Smb2Status.STATUS_NO_RANGES_PROCESSED && // Skip parsing the response when server returns STATUS_NO_RANGES_PROCESSED respOutput != null) // Skip parsing the response if no output buffer is returned { FSCTL_FILE_LEVEL_TRIM_OUTPUT fileLevelTrimOutput = TypeMarshal.ToStruct <FSCTL_FILE_LEVEL_TRIM_OUTPUT>(respOutput); BaseTestSite.Log.Add( LogEntryKind.Debug, "Number of ranges that were processed: {0}", fileLevelTrimOutput.NumRangesProcessed); } else { BaseTestSite.Log.Add(LogEntryKind.Debug, "No range was processed during this operation."); } status = client.Close(treeId, fileId); status = client.TreeDisconnect(treeId); status = client.LogOff(); }