public void SafePSIDArrayCtorTest() { var sids = new[] { SafePSID.Current, SafePSID.Everyone }; SafePSIDArray safeArr = null; Assert.That(() => safeArr = new SafePSIDArray((SafePSID[])null), Throws.ArgumentNullException); Assert.That(() => safeArr = new SafePSIDArray(new SafePSID[0]), Throws.Nothing); Assert.That(safeArr.Count, Is.Zero); Assert.That(() => safeArr = new SafePSIDArray(sids), Throws.Nothing); Assert.That(safeArr.Count, Is.EqualTo(sids.Length)); Assert.That(() => safeArr = new SafePSIDArray(Array.ConvertAll(sids, s => (PSID)s)), Throws.Nothing); Assert.That(safeArr.Count, Is.EqualTo(sids.Length)); Assert.That(EqualSid(safeArr[0], SafePSID.Current), Is.True); Assert.That(EqualSid(safeArr[1], SafePSID.Everyone), Is.True); Assert.That(() => safeArr[2], Throws.Exception); Assert.That(safeArr, Is.EquivalentTo(sids)); }
public void SafePSIDArrayCtorTest2() { // Build in-memory SID array var sids = new[] { SafePSID.Current, SafePSID.Everyone }; SafePSIDArray safeArr = null; Assert.That(() => safeArr = new SafePSIDArray(IntPtr.Zero, 0), Throws.Nothing); Assert.That(safeArr.Count, Is.Zero); // Unowned var ptr = Build(); Assert.That(() => safeArr = new SafePSIDArray(ptr, sids.Length, false), Throws.Nothing); Assert.That(safeArr.Count, Is.EqualTo(sids.Length)); foreach (var psid in ptr.ToIEnum <IntPtr>(sids.Length)) { Kernel32.LocalFree(psid); } Kernel32.LocalFree(ptr); safeArr.Dispose(); // Owned ptr = Build(); Assert.That(() => safeArr = new SafePSIDArray(ptr, sids.Length, true), Throws.Nothing); Assert.That(safeArr.Count, Is.EqualTo(sids.Length)); safeArr.Dispose(); IntPtr Build() { var len = sids.Length * IntPtr.Size + sids.Sum(p => p.Length); var mem = Kernel32.LocalAlloc(Kernel32.LMEM.LPTR, sids.Length * IntPtr.Size); for (var i = 0; i < sids.Length; i++) { var sid = sids[i]; var psid = Kernel32.LocalAlloc(Kernel32.LMEM.LPTR, sid.Length); Marshal.Copy(sid.GetBinaryForm(), 0, (IntPtr)psid, sid.Length); Marshal.WriteIntPtr((IntPtr)mem, i * IntPtr.Size, (IntPtr)psid); } return((IntPtr)mem); } }