xamarin-macios/tests/monotouch-test/CoreMedia/BlockBufferTest.cs

328 строки
14 KiB
C#

//
// Unit tests for CMBlockBuffer
//
// Authors:
// Sebastien Pouliot <sebastien@xamarin.com>
//
// Copyright 2014 Xamarin Inc. All rights reserved.
//
using System;
using System.Runtime.InteropServices;
using System.Reflection;
using Foundation;
using CoreMedia;
using NUnit.Framework;
namespace MonoTouchFixtures.CoreMedia {
[TestFixture]
[Preserve (AllMembers = true)]
public class BlockBufferTest {
[Test]
public void CreateEmpty ()
{
CMBlockBufferError err;
using (var bb = CMBlockBuffer.CreateEmpty (16, CMBlockBufferFlags.AssureMemoryNow, out err)) {
Assert.That (err, Is.EqualTo (CMBlockBufferError.None), "error");
Assert.That (bb.DataLength, Is.EqualTo ((nuint) 0), "DataLength");
}
}
[Test]
public void CMBlockBufferCustomBlockSource ()
{
var type = typeof (CMCustomBlockAllocator).GetNestedType ("CMBlockBufferCustomBlockSource", BindingFlags.NonPublic);
Assert.NotNull (type, "CMBlockBufferCustomBlockSource");
// it's 28 (not 32) bytes when executed on 64bits iOS, which implies it's packed to 4 bytes
#pragma warning disable IL3050 // Using member 'System.Runtime.InteropServices.Marshal.SizeOf(Type)' which has 'RequiresDynamicCodeAttribute' can break functionality when AOT compiling. Marshalling code for the object might not be available. Use the SizeOf<T> overload instead.
Assert.That (Marshal.SizeOf (type), Is.EqualTo (4 + 3 * IntPtr.Size), "Size");
#pragma warning restore IL3050
}
[Test]
public void AppendMemoryBlockTest ()
{
CMBlockBufferError err1;
CMBlockBufferError err2;
using (var bb = CMBlockBuffer.FromMemoryBlock (IntPtr.Zero, 16, null, 0, 5, CMBlockBufferFlags.AssureMemoryNow, out err1)) {
Assert.That (err1, Is.EqualTo (CMBlockBufferError.None), "FromMemoryBlock error");
Assert.That (bb.DataLength, Is.EqualTo ((nuint) 5), "FromMemoryBlock DataLength");
var ptr = Marshal.AllocHGlobal (16);
err2 = bb.AppendMemoryBlock (ptr, 16, null, 0, 5, CMBlockBufferFlags.AssureMemoryNow);
Assert.That (err2, Is.EqualTo (CMBlockBufferError.None), "AppendMemoryBlock error");
Assert.That (bb.DataLength, Is.EqualTo ((nuint) 10), "AppendMemoryBlock DataLength");
}
using (var bb = CMBlockBuffer.FromMemoryBlock (IntPtr.Zero, 16, new CMCustomBlockAllocator (), 0, 5, CMBlockBufferFlags.AssureMemoryNow, out err1)) {
Assert.That (err1, Is.EqualTo (CMBlockBufferError.None), "FromMemoryBlock error");
Assert.That (bb.DataLength, Is.EqualTo ((nuint) 5), "FromMemoryBlock DataLength");
var ptr = Marshal.AllocHGlobal (16);
err2 = bb.AppendMemoryBlock (ptr, 16, new CMCustomBlockAllocator (), 0, 5, CMBlockBufferFlags.AssureMemoryNow);
Assert.That (err2, Is.EqualTo (CMBlockBufferError.None), "AppendMemoryBlock error");
Assert.That (bb.DataLength, Is.EqualTo ((nuint) 10), "AppendMemoryBlock DataLength");
}
allocateCalled = false;
freeCalled = false;
using (var allocator = new CustomAllocator (this))
using (var bb = CMBlockBuffer.FromMemoryBlock (IntPtr.Zero, 16, new CMCustomBlockAllocator (), 0, 5, CMBlockBufferFlags.AssureMemoryNow, out err1)) {
Assert.That (err1, Is.EqualTo (CMBlockBufferError.None), "FromMemoryBlock error");
Assert.That (bb.DataLength, Is.EqualTo ((nuint) 5), "FromMemoryBlock DataLength");
var ptr = Marshal.AllocHGlobal (16);
err2 = bb.AppendMemoryBlock (ptr, 16, allocator, 0, 5, CMBlockBufferFlags.AssureMemoryNow);
Assert.That (err2, Is.EqualTo (CMBlockBufferError.None), "AppendMemoryBlock error");
Assert.That (bb.DataLength, Is.EqualTo ((nuint) 10), "FromMemoryBlock DataLength");
}
Assert.IsTrue (freeCalled, "FromMemoryBlock FreeCalled");
}
public bool allocateCalled;
public bool freeCalled;
[Test]
public void FromMemoryBlockAndContiguousTest ()
{
CMBlockBufferError err1;
CMBlockBufferError err2;
using (var bb = CMBlockBuffer.FromMemoryBlock (IntPtr.Zero, 16, null, 0, 5, CMBlockBufferFlags.AssureMemoryNow, out err1))
using (var bc = CMBlockBuffer.CreateContiguous (bb, null, 0, 5, CMBlockBufferFlags.AssureMemoryNow, out err2)) {
Assert.That (err1, Is.EqualTo (CMBlockBufferError.None), "FromMemoryBlock error");
Assert.That (err2, Is.EqualTo (CMBlockBufferError.None), "CreateContiguous error");
Assert.That (bb.DataLength, Is.EqualTo ((nuint) 5), "FromMemoryBlock DataLength");
Assert.That (bc.DataLength, Is.EqualTo ((nuint) 5), "CreateContiguous DataLength");
}
using (var allocator = new CMCustomBlockAllocator ())
using (var bb = CMBlockBuffer.FromMemoryBlock (IntPtr.Zero, 16, allocator, 0, 5, CMBlockBufferFlags.AssureMemoryNow, out err1))
using (var bc = CMBlockBuffer.CreateContiguous (bb, allocator, 0, 5, CMBlockBufferFlags.AssureMemoryNow, out err2)) {
Assert.That (err1, Is.EqualTo (CMBlockBufferError.None), "FromMemoryBlock error");
Assert.That (err2, Is.EqualTo (CMBlockBufferError.None), "CreateContiguous error");
Assert.That (bb.DataLength, Is.EqualTo ((nuint) 5), "FromMemoryBlock DataLength");
Assert.That (bc.DataLength, Is.EqualTo ((nuint) 5), "CreateContiguous DataLength");
}
using (var allocator = new CustomAllocator (this))
using (var bb = CMBlockBuffer.FromMemoryBlock (IntPtr.Zero, 16, allocator, 0, 5, CMBlockBufferFlags.AssureMemoryNow, out err1)) {
Assert.That (err1, Is.EqualTo (CMBlockBufferError.None), "FromMemoryBlock error");
Assert.That (bb.DataLength, Is.EqualTo ((nuint) 5), "FromMemoryBlock DataLength");
Assert.IsTrue (allocateCalled, "FromMemoryBlock AllocateCalled");
}
Assert.IsTrue (freeCalled, "FromMemoryBlock FreeCalled");
}
class CustomAllocator : CMCustomBlockAllocator {
BlockBufferTest test;
public CustomAllocator (BlockBufferTest bufferTest)
{
test = bufferTest;
}
public override IntPtr Allocate (nuint sizeInBytes)
{
test.allocateCalled = true;
return base.Allocate (sizeInBytes);
}
public override void Free (IntPtr doomedMemoryBlock, nuint sizeInBytes)
{
test.freeCalled = true;
base.Free (doomedMemoryBlock, sizeInBytes);
}
}
[Test]
public void FromMemoryBlockWithManagedMemory ()
{
byte [] data = new byte [32768];
GCHandle pinned = GCHandle.Alloc (data, GCHandleType.Pinned);
IntPtr pointer = pinned.AddrOfPinnedObject ();
CMBlockBufferError err;
using (var buf = CMBlockBuffer.FromMemoryBlock (pointer, (uint) data.Length, null, 0, (uint) data.Length, CMBlockBufferFlags.AssureMemoryNow, out err)) {
Assert.That (err, Is.EqualTo (CMBlockBufferError.None), "CMBlockBufferError");
// dispose called before unpinning (ok)
}
pinned.Free ();
}
[Test]
public void FromMemoryBlockWithByteArrayTest ()
{
byte [] data = new byte [32768];
CMBlockBufferError err;
using (var buf = CMBlockBuffer.FromMemoryBlock (data, 0, CMBlockBufferFlags.AssureMemoryNow, out err)) {
Assert.That (err, Is.EqualTo (CMBlockBufferError.None), "CMBlockBufferError");
// dispose called before unpinning (ok)
}
}
[Test]
public void AppendMemoryBlockWithManagedMemory ()
{
byte [] data = new byte [32768];
byte [] data2 = new byte [32768];
GCHandle pinned = GCHandle.Alloc (data, GCHandleType.Pinned);
GCHandle pinned2 = GCHandle.Alloc (data2, GCHandleType.Pinned);
IntPtr pointer = pinned.AddrOfPinnedObject ();
IntPtr pointer2 = pinned2.AddrOfPinnedObject ();
CMBlockBufferError err;
using (var buf = CMBlockBuffer.FromMemoryBlock (pointer, (uint) data.Length, null, 0, (uint) data.Length, CMBlockBufferFlags.AssureMemoryNow, out err)) {
Assert.That (err, Is.EqualTo (CMBlockBufferError.None), $"CMBlockBufferError 1: {err}");
err = buf.AppendMemoryBlock (pointer2, (uint) data2.Length, null, 0, (uint) data2.Length, CMBlockBufferFlags.AssureMemoryNow);
Assert.That (err, Is.EqualTo (CMBlockBufferError.None), $"CMBlockBufferError 2: {err}");
}
pinned2.Free ();
pinned.Free ();
}
[Test]
public void AppendMemoryBlockWithByteArrayTest ()
{
byte [] data = new byte [32768];
byte [] data2 = new byte [32768];
CMBlockBufferError err;
using (var buf = CMBlockBuffer.FromMemoryBlock (data, 0, CMBlockBufferFlags.AssureMemoryNow, out err)) {
Assert.That (err, Is.EqualTo (CMBlockBufferError.None), $"CMBlockBufferError 1: {err}");
err = buf.AppendMemoryBlock (data2, 0, CMBlockBufferFlags.AssureMemoryNow);
Assert.That (err, Is.EqualTo (CMBlockBufferError.None), $"CMBlockBufferError 2: {err}");
}
}
[Test]
public void CopyDataBytesTest ()
{
byte [] data = new byte [] { 0x0, 0x1, 0x2, 0x3, 0x4 };
byte [] destData = new byte [data.Length];
GCHandle pinned = GCHandle.Alloc (data, GCHandleType.Pinned);
GCHandle destPinned = GCHandle.Alloc (destData, GCHandleType.Pinned);
IntPtr pointer = pinned.AddrOfPinnedObject ();
IntPtr destPointer = destPinned.AddrOfPinnedObject ();
CMBlockBufferError err;
using (var buf = CMBlockBuffer.FromMemoryBlock (pointer, (uint) data.Length, null, 0, (uint) data.Length, CMBlockBufferFlags.AssureMemoryNow, out err)) {
Assert.That (err, Is.EqualTo (CMBlockBufferError.None), $"CMBlockBufferError 1: {err}");
err = buf.CopyDataBytes (0, (uint) data.Length, destPointer);
Assert.That (err, Is.EqualTo (CMBlockBufferError.None), $"CMBlockBufferError 2: {err}");
for (int i = 0; i < data.Length; i++)
Assert.AreEqual (data [0], destData [0], $"CMBlockBuffer CopyDataBytesTest iteration: {i}");
}
pinned.Free ();
destPinned.Free ();
}
[Test]
public void CopyDataBytesUsingManagedArrayTest ()
{
byte [] data = new byte [] { 0x0, 0x1, 0x2, 0x3, 0x4 };
byte [] destData;
CMBlockBufferError err;
using (var buf = CMBlockBuffer.FromMemoryBlock (data, 0, CMBlockBufferFlags.AssureMemoryNow, out err)) {
Assert.That (err, Is.EqualTo (CMBlockBufferError.None), $"CMBlockBufferError 1: {err}");
err = buf.CopyDataBytes (0, (uint) data.Length, out destData);
Assert.That (err, Is.EqualTo (CMBlockBufferError.None), $"CMBlockBufferError 2: {err}");
for (int i = 0; i < data.Length; i++)
Assert.AreEqual (data [0], destData [0], $"CMBlockBuffer CopyDataBytesUsingManagedArrayTest iteration: {i}");
}
}
[Test]
public void ReplaceDataBytesTest ()
{
byte [] data = new byte [] { 0x0, 0x1, 0x2, 0x3, 0x4 };
byte [] replaceData = new byte [] { 0x5, 0x5, 0x5, 0x5, 0x5 };
GCHandle pinned = GCHandle.Alloc (data, GCHandleType.Pinned);
GCHandle replacePinned = GCHandle.Alloc (replaceData, GCHandleType.Pinned);
IntPtr pointer = pinned.AddrOfPinnedObject ();
IntPtr replacePointer = replacePinned.AddrOfPinnedObject ();
CMBlockBufferError err;
using (var buf = CMBlockBuffer.FromMemoryBlock (pointer, (uint) data.Length, null, 0, (uint) data.Length, CMBlockBufferFlags.AssureMemoryNow, out err)) {
Assert.That (err, Is.EqualTo (CMBlockBufferError.None), $"CMBlockBufferError 1: {err}");
err = buf.ReplaceDataBytes (replacePointer, 0, (uint) replaceData.Length);
Assert.That (err, Is.EqualTo (CMBlockBufferError.None), $"CMBlockBufferError 2: {err}");
for (int i = 0; i < data.Length; i++)
Assert.AreEqual (0x5, data [0], $"CMBlockBuffer ReplaceDataBytesTest iteration: {i}");
}
pinned.Free ();
replacePinned.Free ();
}
[Test]
public void ReplaceDataBytesManagedTest ()
{
byte [] data = new byte [] { 0x0, 0x1, 0x2, 0x3, 0x4 };
byte [] replaceData = new byte [] { 0x5, 0x5, 0x5, 0x5, 0x5 };
CMBlockBufferError err;
using (var buf = CMBlockBuffer.FromMemoryBlock (data, 0, CMBlockBufferFlags.AssureMemoryNow, out err)) {
Assert.That (err, Is.EqualTo (CMBlockBufferError.None), $"CMBlockBufferError 1: {err}");
err = buf.ReplaceDataBytes (replaceData, 0);
Assert.That (err, Is.EqualTo (CMBlockBufferError.None), $"CMBlockBufferError 2: {err}");
for (int i = 0; i < data.Length; i++)
Assert.AreEqual (0x5, data [0], $"CMBlockBuffer ReplaceDataBytesManagedTest iteration: {i}");
}
}
[Test]
public void AccessDataBytesTest ()
{
byte [] data = new byte [] { 0x0, 0x1, 0x2, 0x3, 0x4, 0x5, 0x6, 0x7, 0x8, 0x9 };
byte [] tempBuffer = new byte [5];
GCHandle pinned = GCHandle.Alloc (data, GCHandleType.Pinned);
GCHandle tempBufferPinned = GCHandle.Alloc (tempBuffer, GCHandleType.Pinned);
IntPtr pointer = pinned.AddrOfPinnedObject ();
IntPtr tempBufferPtr = pinned.AddrOfPinnedObject ();
CMBlockBufferError err;
using (var buf = CMBlockBuffer.FromMemoryBlock (pointer, (uint) data.Length, null, 0, (uint) data.Length, CMBlockBufferFlags.AssureMemoryNow, out err)) {
Assert.That (err, Is.EqualTo (CMBlockBufferError.None), $"CMBlockBufferError 1: {err}");
IntPtr outPtr = IntPtr.Zero;
err = buf.AccessDataBytes (5, 5, tempBufferPtr, ref outPtr);
Assert.That (err, Is.EqualTo (CMBlockBufferError.None), $"CMBlockBufferError 2: {err}");
Marshal.Copy (outPtr, tempBuffer, 0, 5);
for (int i = 0; i < tempBuffer.Length; i++)
Assert.AreEqual ((byte) (i + 5), tempBuffer [i], $"CMBlockBuffer AccessDataBytesTest iteration: {i}");
}
pinned.Free ();
tempBufferPinned.Free ();
}
[Test]
public void GetDataPointerTest ()
{
byte [] data = new byte [] { 0x0, 0x1, 0x2, 0x3, 0x4, 0x5, 0x6, 0x7, 0x8, 0x9 };
byte [] tempBuffer = new byte [5];
GCHandle pinned = GCHandle.Alloc (data, GCHandleType.Pinned);
IntPtr pointer = pinned.AddrOfPinnedObject ();
CMBlockBufferError err;
using (var buf = CMBlockBuffer.FromMemoryBlock (pointer, (uint) data.Length, null, 0, (uint) data.Length, CMBlockBufferFlags.AssureMemoryNow, out err)) {
Assert.That (err, Is.EqualTo (CMBlockBufferError.None), $"CMBlockBufferError 1: {err}");
IntPtr outPtr = IntPtr.Zero;
nuint lengthAtOffset;
nuint totalLength;
err = buf.GetDataPointer (5, out lengthAtOffset, out totalLength, ref outPtr);
Assert.That (err, Is.EqualTo (CMBlockBufferError.None), $"CMBlockBufferError 2: {err}");
Marshal.Copy (outPtr, tempBuffer, 0, (int) lengthAtOffset);
for (int i = 0; i < tempBuffer.Length; i++)
Assert.AreEqual ((byte) (i + 5), tempBuffer [i], $"CMBlockBuffer GetDataPointerTest iteration: {i}");
}
pinned.Free ();
}
}
}