public override void AnalyzeChunking(RootNodeObject rootNode, ITestSite site)
{
List<IntermediateNodeObject> cloneList = new List<IntermediateNodeObject>(rootNode.IntermediateNodeObjectList);
while (cloneList.Count != 0)
{
IntermediateNodeObject nodeObject = cloneList.First();
byte[] content = nodeObject.DataNodeObjectData.ObjectData;
if (cloneList.Count == 1)
{
if (content.Length > 1048576)
{
throw new NotImplementedException("If the final chunk is larger than 1MB, the signature method is not implemented.");
}
// Only final chunk left
SignatureObject expect = this.GetSHA1Signature(content);
if (!expect.Equals(nodeObject.Signature))
{
site.Assert.Fail("For the Zip file, final part chunk expect the signature {0}, actual signature {1}", expect.ToString(), nodeObject.Signature.ToString());
}
// Verify the less than 1MB final part related requirements
if (SharedContext.Current.IsMsFsshttpRequirementsCaptured)
{
MsfsshttpdCapture.VerifySmallFinalChunk(SharedContext.Current.Site);
}
}
else
{
if (ZipHeader.IsFileHeader(content, 0))
{
byte[] dataFileSignatureBytes;
byte[] header = this.AnalyzeFileHeader(content, 0, out dataFileSignatureBytes);
int headerLength = header.Length;
int compressedSize = (int)this.GetCompressedSize(dataFileSignatureBytes);
if (headerLength + compressedSize <= 4096)
{
IntermediateNodeObject expectNode = new IntermediateNodeObject.IntermediateNodeObjectBuilder().Build(content, this.GetSingleChunkSignature(header, dataFileSignatureBytes));
if (!expectNode.Signature.Equals(nodeObject.Signature))
{
site.Assert.Fail("For the Zip file, when zip file is less than 4096, expect the signature {0}, actual signature {1}", expectNode.Signature.ToString(), nodeObject.Signature.ToString());
}
// Verify the zip file less than 4096 bytes
MsfsshttpdCapture.VerifyZipFileLessThan4096Bytes(SharedContext.Current.Site);
}
else
{
SignatureObject expectHeader = this.GetSHA1Signature(header);
if (!expectHeader.Equals(nodeObject.Signature))
{
site.Assert.Fail("For the Zip file header, expect the signature {0}, actual signature {1}", expectHeader.ToString(), nodeObject.Signature.ToString());
}
// Remove the header node
cloneList.RemoveAt(0);
// Then expect the next is file content node
nodeObject = cloneList.First();
// Here having something need to be distinguished between the MOSS2010 and MOSS2013
if (nodeObject.DataNodeObjectData == null && nodeObject.IntermediateNodeObjectList != null)
{
// This situation could most happens for MOSS2010, we fake intermediate node instead of the root node when the zip file size is larger than 1M.
// In the current stage, this kind of signature algorithm is not mentioned in the open specification, so leave this verify blank.
}
else if (nodeObject.DataNodeObjectData != null)
{
site.Assert.AreEqual<ulong>(
(ulong)compressedSize,
nodeObject.DataSize.DataSize,
"The Data Size of the Intermediate Node Object MUST be the total number of bytes represented by the chunk.");
SignatureObject contentSignature = new SignatureObject();
contentSignature.SignatureData = new BinaryItem(dataFileSignatureBytes);
if (!contentSignature.Equals(nodeObject.Signature))
{
site.Assert.Fail("For the Zip file content, expect the signature {0}, actual signature {1}", contentSignature.ToString(), nodeObject.Signature.ToString());
}
// Verify the zip file larger than 4096 bytes and less than 1MB.
if (SharedContext.Current.IsMsFsshttpRequirementsCaptured)
{
MsfsshttpdCapture.VerifyZipFileHeaderAndContentSignature(SharedContext.Current.Site);
MsfsshttpdCapture.VerifyIntermediateNodeForZipFileChunk(SharedContext.Current.Site);
}
}
else
{
throw new InvalidOperationException("The DataNodeObjectData and IntermediateNodeObjectList cannot be null at the same time.");
}
}
}
}
cloneList.RemoveAt(0);
}
}