Author: pschweitzer
Date: Wed Aug 10 20:50:36 2016
New Revision: 72192

URL: http://svn.reactos.org/svn/reactos?rev=72192&view=rev
Log:
[KMTESTS:FSRTL]
Add a stress test for tunnel cache implementation, where we have fun adding 
duplicated entries.
It doesn't seem to go well.
These tests are also known as "Learn your English ordinals", or as "Learn how 
to count in English". My pleasure.

CORE-11819

Modified:
    trunk/rostests/kmtests/ntos_fsrtl/FsRtlTunnel.c

Modified: trunk/rostests/kmtests/ntos_fsrtl/FsRtlTunnel.c
URL: 
http://svn.reactos.org/svn/reactos/trunk/rostests/kmtests/ntos_fsrtl/FsRtlTunnel.c?rev=72192&r1=72191&r2=72192&view=diff
==============================================================================
--- trunk/rostests/kmtests/ntos_fsrtl/FsRtlTunnel.c     [iso-8859-1] (original)
+++ trunk/rostests/kmtests/ntos_fsrtl/FsRtlTunnel.c     [iso-8859-1] Wed Aug 10 
20:50:36 2016
@@ -121,6 +121,116 @@
     FsRtlDeleteKeyFromTunnelCache(T, a);
 }
 
+static
+void DuplicatesTest()
+{
+    UNICODE_STRING ShortName, LongName, OutShort, OutLong, ShortName2, 
LongName2;
+    ULONG First, Second, OutLength, OutData;
+    PTUNNEL Tunnel;
+    PVOID Buffer;
+
+    First = 1;
+    Second = 2;
+    RtlInitUnicodeString(&ShortName, L"LONGFI~1.TXT");
+    RtlInitUnicodeString(&LongName, L"Longfilename.txt");
+    RtlInitUnicodeString(&ShortName2, L"LONGFI~2.TXT");
+    RtlInitUnicodeString(&LongName2, L"Longfilenamr.txt");
+    Tunnel = ExAllocatePool(NonPagedPool, sizeof(TUNNEL));
+    RtlZeroMemory(Tunnel, sizeof(TUNNEL));
+    OutShort.MaximumLength = 13 * sizeof(WCHAR);
+    OutShort.Buffer = ExAllocatePool(PagedPool, OutShort.MaximumLength);
+    OutLong.MaximumLength = 17 * sizeof(WCHAR);
+    OutLong.Buffer = Buffer = ExAllocatePool(PagedPool, OutLong.MaximumLength);
+
+    FsRtlInitializeTunnelCache(Tunnel);
+    FsRtlAddToTunnelCache(Tunnel, 1, &ShortName, &LongName, TRUE, 
sizeof(ULONG), &First);
+    ok_bool_true(FsRtlFindInTunnelCache(Tunnel, 1, &ShortName, &OutShort, 
&OutLong, &OutLength, &OutData), "First call");
+    ok_eq_ulong(OutLength, sizeof(ULONG));
+    ok_eq_ulong(OutData, 1);
+    ok_eq_pointer(OutLong.Buffer, Buffer);
+
+    FsRtlAddToTunnelCache(Tunnel, 1, &ShortName, &LongName, TRUE, 
sizeof(ULONG), &Second);
+    ok_bool_true(FsRtlFindInTunnelCache(Tunnel, 1, &ShortName, &OutShort, 
&OutLong, &OutLength, &OutData), "Second call");
+    ok_eq_ulong(OutLength, sizeof(ULONG));
+    ok_eq_ulong(OutData, 2);
+    ok_eq_pointer(OutLong.Buffer, Buffer);
+
+    OutLong.MaximumLength = 13 * sizeof(WCHAR);
+    ok_bool_true(FsRtlFindInTunnelCache(Tunnel, 1, &ShortName, &OutShort, 
&OutLong, &OutLength, &OutData), "Third call");
+    ok_eq_ulong(OutLength, sizeof(ULONG));
+    ok_eq_ulong(OutData, 2);
+    ok(OutLong.Buffer != Buffer, "Buffer didn't get reallocated!\n");
+    ok_eq_uint(OutLong.MaximumLength, 16 * sizeof(WCHAR));
+
+    FsRtlDeleteKeyFromTunnelCache(Tunnel, 1);
+    ok_bool_false(FsRtlFindInTunnelCache(Tunnel, 1, &ShortName, &OutShort, 
&OutLong, &OutLength, &OutData), "Fourth call");
+
+    FsRtlAddToTunnelCache(Tunnel, 1, &ShortName, &LongName, TRUE, 
sizeof(ULONG), &First);
+    ok_bool_true(FsRtlFindInTunnelCache(Tunnel, 1, &ShortName, &OutShort, 
&OutLong, &OutLength, &OutData), "Fifth call");
+    ok_eq_ulong(OutLength, sizeof(ULONG));
+    ok_eq_ulong(OutData, 1);
+
+    FsRtlAddToTunnelCache(Tunnel, 1, &ShortName2, &LongName2, TRUE, 
sizeof(ULONG), &First);
+    ok_bool_true(FsRtlFindInTunnelCache(Tunnel, 1, &ShortName, &OutShort, 
&OutLong, &OutLength, &OutData), "Sixth call");
+    ok_eq_ulong(OutLength, sizeof(ULONG));
+    ok_eq_ulong(OutData, 1);
+    ok_bool_true(FsRtlFindInTunnelCache(Tunnel, 1, &ShortName2, &OutShort, 
&OutLong, &OutLength, &OutData), "Seventh call");
+    ok_eq_ulong(OutLength, sizeof(ULONG));
+    ok_eq_ulong(OutData, 1);
+
+    FsRtlAddToTunnelCache(Tunnel, 1, &ShortName, &LongName, TRUE, 
sizeof(ULONG), &Second);
+    ok_bool_true(FsRtlFindInTunnelCache(Tunnel, 1, &ShortName, &OutShort, 
&OutLong, &OutLength, &OutData), "Eighth call");
+    ok_eq_ulong(OutLength, sizeof(ULONG));
+    ok_eq_ulong(OutData, 2);
+    ok_bool_true(FsRtlFindInTunnelCache(Tunnel, 1, &ShortName2, &OutShort, 
&OutLong, &OutLength, &OutData), "Ninth call");
+    ok_eq_ulong(OutLength, sizeof(ULONG));
+    ok_eq_ulong(OutData, 1);
+
+    FsRtlAddToTunnelCache(Tunnel, 1, &ShortName2, &LongName2, TRUE, 
sizeof(ULONG), &Second);
+    ok_bool_true(FsRtlFindInTunnelCache(Tunnel, 1, &ShortName, &OutShort, 
&OutLong, &OutLength, &OutData), "Tenth call");
+    ok_eq_ulong(OutLength, sizeof(ULONG));
+    ok_eq_ulong(OutData, 2);
+    ok_bool_true(FsRtlFindInTunnelCache(Tunnel, 1, &ShortName2, &OutShort, 
&OutLong, &OutLength, &OutData), "Eleventh call");
+    ok_eq_ulong(OutLength, sizeof(ULONG));
+    ok_eq_ulong(OutData, 2);
+
+    FsRtlDeleteKeyFromTunnelCache(Tunnel, 1);
+    ok_bool_false(FsRtlFindInTunnelCache(Tunnel, 1, &ShortName, &OutShort, 
&OutLong, &OutLength, &OutData), "Twelfth call");
+    ok_bool_false(FsRtlFindInTunnelCache(Tunnel, 1, &ShortName2, &OutShort, 
&OutLong, &OutLength, &OutData), "Thirteenth call");
+
+    FsRtlAddToTunnelCache(Tunnel, 1, &ShortName, &LongName, TRUE, 
sizeof(ULONG), &First);
+    ok_bool_true(FsRtlFindInTunnelCache(Tunnel, 1, &ShortName, &OutShort, 
&OutLong, &OutLength, &OutData), "Fourteenth call");
+    ok_eq_ulong(OutLength, sizeof(ULONG));
+    ok_eq_ulong(OutData, 1);
+
+    FsRtlAddToTunnelCache(Tunnel, 1, &ShortName, &LongName, TRUE, 
sizeof(ULONG), &Second);
+    ok_bool_true(FsRtlFindInTunnelCache(Tunnel, 1, &ShortName, &OutShort, 
&OutLong, &OutLength, &OutData), "Fifteenth call");
+    ok_eq_ulong(OutLength, sizeof(ULONG));
+    ok_eq_ulong(OutData, 2);
+
+    FsRtlAddToTunnelCache(Tunnel, 1, &ShortName2, &LongName2, TRUE, 
sizeof(ULONG), &First);
+    ok_bool_true(FsRtlFindInTunnelCache(Tunnel, 1, &ShortName, &OutShort, 
&OutLong, &OutLength, &OutData), "Sixteenth call");
+    ok_eq_ulong(OutLength, sizeof(ULONG));
+    ok_eq_ulong(OutData, 2);
+    ok_bool_true(FsRtlFindInTunnelCache(Tunnel, 1, &ShortName2, &OutShort, 
&OutLong, &OutLength, &OutData), "Seventeenth call");
+    ok_eq_ulong(OutLength, sizeof(ULONG));
+    ok_eq_ulong(OutData, 1);
+
+    FsRtlAddToTunnelCache(Tunnel, 1, &ShortName2, &LongName2, TRUE, 
sizeof(ULONG), &Second);
+    ok_bool_true(FsRtlFindInTunnelCache(Tunnel, 1, &ShortName, &OutShort, 
&OutLong, &OutLength, &OutData), "Eighteenth call");
+    ok_eq_ulong(OutLength, sizeof(ULONG));
+    ok_eq_ulong(OutData, 2);
+    ok_bool_true(FsRtlFindInTunnelCache(Tunnel, 1, &ShortName2, &OutShort, 
&OutLong, &OutLength, &OutData), "Nineteenth call");
+    ok_eq_ulong(OutLength, sizeof(ULONG));
+    ok_eq_ulong(OutData, 2);
+
+    FsRtlDeleteTunnelCache(Tunnel);
+    ExFreePool(OutShort.Buffer);
+    ExFreePool(OutLong.Buffer);
+    ExFreePool(Buffer);
+    ExFreePool(Tunnel);
+}
+
 START_TEST(FsRtlTunnel)
 {
     PUNICODE_STRING s_name;
@@ -183,4 +293,6 @@
 
     ExFreePool(Tb);
     ExFreePool(T);
-}
+
+    DuplicatesTest();
+}


Reply via email to