2 * PROJECT: ReactOS kernel-mode tests
3 * LICENSE: GPLv2+ - See COPYING in the top level directory
4 * PURPOSE: Kernel-Mode Test Suite for Device Queues
5 * PROGRAMMERS: Pavel Batusov, Moscow State Technical University
6 * Denis Volhonsky, Moscow State Technical University
7 * Alexandra Safonova, Moscow State Technical University
16 #define INSERT_COUNT 5
18 int Check_mem(void* a
, int n
, int size
)
21 for (i
= 0; i
< size
; i
++) {
22 if (*((unsigned char*)a
+ i
) != n
) {
29 void Test_Initialize()
31 PKDEVICE_QUEUE testing_queue
;
34 trace("******* Testing KeInitializeDeviceQueue ************\n");
35 DPRINT1("\nStart test for KeInitializeDeviceQueue function\n");
37 testing_queue
= ExAllocatePool(NonPagedPool
, sizeof(KDEVICE_QUEUE
));
39 testing_queue
->Busy
= TRUE
;
40 testing_queue
->Size
= 0;
42 KeInitializeDeviceQueue(testing_queue
);
44 /* Check for properly setting up fields */
45 ok(!testing_queue
->Busy
, "(Initialize testing) Test 1:\tExpected 'not busy' status\n");
46 DPRINT1("1 test complete\n");
48 ok(testing_queue
->Size
== sizeof(KDEVICE_QUEUE
), "(Initialize testing) Test 2:\tExpected another size for KDEVICE_QUEUE\n");
49 DPRINT1("2 test complete\n");
51 ok(testing_queue
->Type
== DeviceQueueObject
, "(Initialize testing) Test 3:\tExpected type == DeviceQueueObject\n");
52 DPRINT1("3 test complete\n");
54 /* Make sure it does not write outside allocated buffer */
55 double_queue
= ExAllocatePool(NonPagedPool
, sizeof(KDEVICE_QUEUE
) * 2);
57 memset(double_queue
, NUMBER
, sizeof(KDEVICE_QUEUE
) * 2);
58 KeInitializeDeviceQueue(double_queue
);
60 ok(Check_mem((void*)((char*)double_queue
+ sizeof(KDEVICE_QUEUE
)), NUMBER
, sizeof(KDEVICE_QUEUE
)), "(Initialize testing) Test 4:\tFunction uses someone else's memory \n");
61 DPRINT1("4 test complete\n");
63 //====================================================================
65 ExFreePool(testing_queue
);
66 ExFreePool(double_queue
);
68 DPRINT1("KeInitializeDeviceQueue test finished\n");
71 void Tests_Insert_And_Delete()
74 PKDEVICE_QUEUE testing_queue
;
75 PKDEVICE_QUEUE_ENTRY element
;
77 PKDEVICE_QUEUE_ENTRY
* elem_array
;
81 trace("******* Testing KeInsertDeviceQueue **************** \n");
82 DPRINT1("\nStart KeInsertDeviceQueue test\n");
84 testing_queue
= ExAllocatePool(NonPagedPool
, sizeof(KDEVICE_QUEUE
));
85 KeInitializeDeviceQueue(testing_queue
);
87 element
= ExAllocatePool(NonPagedPool
, sizeof(KDEVICE_QUEUE_ENTRY
));
89 /* Raise to dispatch level */
90 KeRaiseIrql(DISPATCH_LEVEL
, &OldIrql
);
92 KeInsertDeviceQueue(testing_queue
, element
);
93 ok(!element
->Inserted
, "Wrong 'Inserted' status\n");
94 DPRINT1("1 test complete\n");
97 elem_array
= ExAllocatePool(NonPagedPool
, sizeof(PKDEVICE_QUEUE_ENTRY
) * INSERT_COUNT
);
99 DPRINT1("Arrow of tests starting\n");
100 for (i
= 0; i
< INSERT_COUNT
; i
++) {
101 elem_array
[i
] = ExAllocatePool(NonPagedPool
, sizeof(KDEVICE_QUEUE_ENTRY
));
102 elem_array
[i
]->Inserted
= FALSE
;
103 elem_array
[i
]->SortKey
= i
;
104 KeInsertDeviceQueue(testing_queue
, elem_array
[i
]);
105 ok(elem_array
[i
]->Inserted
, "Element was not inserted\n");
107 DPRINT1("Arrow of tests complete\n");
109 ok(testing_queue
->Size
== sizeof(KDEVICE_QUEUE
), "Wrong size of queue\n");
111 /* Check how the queue was filled */
112 next
= &testing_queue
->DeviceListHead
;
114 DPRINT1("Arrow of tests starting\n");
115 for (i
= 0; i
< INSERT_COUNT
; i
++) {
117 key
= CONTAINING_RECORD(next
, KDEVICE_QUEUE_ENTRY
, DeviceListEntry
)->SortKey
;
118 ok(key
== i
, "Sort key was changed\n");
120 DPRINT1("Arrow of tests complete\n");
122 trace("****************************************************\n\n");
123 DPRINT1("KeInsertDeviceQueue test finish\n");
126 trace("******* Testing KeRemoveDeviceQueue **************** \n");
127 DPRINT1("\nStart KeRemoveDeviceQueue test\n");
129 PKDEVICE_QUEUE_ENTRY return_value
;
131 DPRINT1("Start deleting elements from queue\n");
132 for (i
= 0; i
< INSERT_COUNT
; i
++) {
133 return_value
= KeRemoveDeviceQueue(testing_queue
);
134 ok(return_value
== elem_array
[i
], "Returning element != head element\n");
135 ok(return_value
->Inserted
== FALSE
, "Returning element is still in queue\n");
136 next
= &testing_queue
->DeviceListHead
;
137 for (j
= i
+ 1; j
< INSERT_COUNT
; j
++) {
139 ok(CONTAINING_RECORD(next
, KDEVICE_QUEUE_ENTRY
, DeviceListEntry
)->SortKey
== j
, "Queue was damaged\n");
142 DPRINT1("Deleting finish. Queue must be empty\n");
144 ok(KeRemoveDeviceQueue(testing_queue
) == NULL
, "Queue is not empty\n");
145 ok(testing_queue
->Busy
== FALSE
, "Queue is busy\n");
147 trace("****************************************************\n\n");
148 DPRINT1("Finish KeRemoveDeviceQueue test\n");
150 //====================================================================
151 trace("******* Testing KeRemoveEntryDeviceQueue *********** \n");
152 DPRINT1("\nStart KeRemoveEntryDeviceQueue test\n");
154 DPRINT1("Filling queue\n");
155 for (i
= 0; i
< INSERT_COUNT
; i
++) {
156 elem_array
[i
]->SortKey
= i
;
157 elem_array
[i
]->Inserted
= FALSE
;
158 KeInsertDeviceQueue(testing_queue
, elem_array
[i
]);
161 //Delete half elements
162 DPRINT1("Deleting elements\n");
163 for (i
= 0; i
< INSERT_COUNT
/ 2; i
++) {
164 ok(KeRemoveEntryDeviceQueue(testing_queue
, elem_array
[i
* 2 + 1]), "Element is not deleted\n");
168 DPRINT1("Checking\n");
169 next
= &testing_queue
->DeviceListHead
;
170 for (i
= 0; i
< INSERT_COUNT
/ 2 + 1; i
++) {
171 ok(CONTAINING_RECORD(next
, KDEVICE_QUEUE_ENTRY
, DeviceListEntry
)->SortKey
== i
* 2, "Queue was damaged\n");
175 //Trying delete elements, which are not in this queue
176 DPRINT1("Trying delete nonexistent elements\n");
177 for (i
= 0; i
< INSERT_COUNT
/ 2; i
++) {
178 ok(!KeRemoveEntryDeviceQueue(testing_queue
, elem_array
[i
* 2 + 1]), "Wrong remove operation\n");
181 trace("****************************************************\n\n");
182 //Îñâîáîæäåíåè ïàìÿòè
183 //====================================================================
184 for (i
= 0; i
< INSERT_COUNT
; i
++) {
185 ExFreePool(elem_array
[i
]);
188 /* Return back to previous IRQL */
189 KeLowerIrql(OldIrql
);
191 ExFreePool(testing_queue
);
195 START_TEST(KeDeviceQueue
)
198 Tests_Insert_And_Delete();