kernel32/tests: Add more tests for the InitOnce functions.

This commit is contained in:
Alexandre Julliard 2013-08-27 20:17:28 +02:00
parent 3f4b06edf1
commit af89610364
2 changed files with 160 additions and 15 deletions

View File

@ -1164,7 +1164,7 @@ static void test_initonce(void)
if (!pInitOnceInitialize || !pInitOnceExecuteOnce) if (!pInitOnceInitialize || !pInitOnceExecuteOnce)
{ {
skip("one-time initialization API not supported\n"); todo_wine win_skip("one-time initialization API not supported\n");
return; return;
} }
@ -1177,7 +1177,7 @@ static void test_initonce(void)
g_initcallback_ret = TRUE; g_initcallback_ret = TRUE;
g_initctxt = NULL; g_initctxt = NULL;
ret = pInitOnceExecuteOnce(&initonce, initonce_callback, (void*)0xdeadbeef, &g_initctxt); ret = pInitOnceExecuteOnce(&initonce, initonce_callback, (void*)0xdeadbeef, &g_initctxt);
ok(ret, "got wrong ret value %d\n", ret); ok(ret, "wrong ret %d err %u\n", ret, GetLastError());
ok(initonce.Ptr == (void*)0x2, "got %p\n", initonce.Ptr); ok(initonce.Ptr == (void*)0x2, "got %p\n", initonce.Ptr);
ok(g_initctxt == NULL, "got %p\n", g_initctxt); ok(g_initctxt == NULL, "got %p\n", g_initctxt);
ok(g_initcallback_called, "got %d\n", g_initcallback_called); ok(g_initcallback_called, "got %d\n", g_initcallback_called);
@ -1186,7 +1186,7 @@ static void test_initonce(void)
g_initctxt = NULL; g_initctxt = NULL;
g_initcallback_called = FALSE; g_initcallback_called = FALSE;
ret = pInitOnceExecuteOnce(&initonce, initonce_callback, (void*)0xdeadbeef, &g_initctxt); ret = pInitOnceExecuteOnce(&initonce, initonce_callback, (void*)0xdeadbeef, &g_initctxt);
ok(ret, "got wrong ret value %d\n", ret); ok(ret, "wrong ret %d err %u\n", ret, GetLastError());
ok(initonce.Ptr == (void*)0x2, "got %p\n", initonce.Ptr); ok(initonce.Ptr == (void*)0x2, "got %p\n", initonce.Ptr);
ok(g_initctxt == NULL, "got %p\n", g_initctxt); ok(g_initctxt == NULL, "got %p\n", g_initctxt);
ok(!g_initcallback_called, "got %d\n", g_initcallback_called); ok(!g_initcallback_called, "got %d\n", g_initcallback_called);
@ -1196,7 +1196,7 @@ static void test_initonce(void)
/* 2 lower order bits should never be used, you'll get a crash in result */ /* 2 lower order bits should never be used, you'll get a crash in result */
g_initctxt = (void*)0xFFFFFFF0; g_initctxt = (void*)0xFFFFFFF0;
ret = pInitOnceExecuteOnce(&initonce, initonce_callback, (void*)0xdeadbeef, &g_initctxt); ret = pInitOnceExecuteOnce(&initonce, initonce_callback, (void*)0xdeadbeef, &g_initctxt);
ok(ret, "got wrong ret value %d\n", ret); ok(ret, "wrong ret %d err %u\n", ret, GetLastError());
ok(initonce.Ptr == (void*)0xFFFFFFF2, "got %p\n", initonce.Ptr); ok(initonce.Ptr == (void*)0xFFFFFFF2, "got %p\n", initonce.Ptr);
ok(g_initctxt == (void*)0xFFFFFFF0, "got %p\n", g_initctxt); ok(g_initctxt == (void*)0xFFFFFFF0, "got %p\n", g_initctxt);
ok(g_initcallback_called, "got %d\n", g_initcallback_called); ok(g_initcallback_called, "got %d\n", g_initcallback_called);
@ -1206,18 +1206,19 @@ static void test_initonce(void)
g_initcallback_called = FALSE; g_initcallback_called = FALSE;
g_initctxt = NULL; g_initctxt = NULL;
pInitOnceInitialize(&initonce); pInitOnceInitialize(&initonce);
SetLastError( 0xdeadbeef );
ret = pInitOnceExecuteOnce(&initonce, initonce_callback, (void*)0xdeadbeef, &g_initctxt); ret = pInitOnceExecuteOnce(&initonce, initonce_callback, (void*)0xdeadbeef, &g_initctxt);
ok(!ret, "got wrong ret value %d\n", ret); ok(!ret && GetLastError() == 0xdeadbeef, "got wrong ret value %d err %u\n", ret, GetLastError());
ok(initonce.Ptr == NULL, "got %p\n", initonce.Ptr); ok(initonce.Ptr == NULL, "got %p\n", initonce.Ptr);
ok(g_initctxt == NULL, "got %p\n", g_initctxt); ok(g_initctxt == NULL, "got %p\n", g_initctxt);
ok(g_initcallback_called, "got %d\n", g_initcallback_called); ok(g_initcallback_called, "got %d\n", g_initcallback_called);
/* blocking initialzation without a callback */ /* blocking initialization without a callback */
pInitOnceInitialize(&initonce); pInitOnceInitialize(&initonce);
g_initctxt = NULL; g_initctxt = NULL;
pending = FALSE; pending = FALSE;
ret = pInitOnceBeginInitialize(&initonce, 0, &pending, &g_initctxt); ret = pInitOnceBeginInitialize(&initonce, 0, &pending, &g_initctxt);
ok(ret, "got wrong ret value %d\n", ret); ok(ret, "wrong ret %d err %u\n", ret, GetLastError());
ok(pending, "got %d\n", pending); ok(pending, "got %d\n", pending);
ok(initonce.Ptr == (void*)1, "got %p\n", initonce.Ptr); ok(initonce.Ptr == (void*)1, "got %p\n", initonce.Ptr);
ok(g_initctxt == NULL, "got %p\n", g_initctxt); ok(g_initctxt == NULL, "got %p\n", g_initctxt);
@ -1225,22 +1226,166 @@ static void test_initonce(void)
g_initctxt = NULL; g_initctxt = NULL;
pending = 0xf; pending = 0xf;
SetLastError( 0xdeadbeef );
ret = pInitOnceBeginInitialize(&initonce, INIT_ONCE_CHECK_ONLY, &pending, &g_initctxt); ret = pInitOnceBeginInitialize(&initonce, INIT_ONCE_CHECK_ONLY, &pending, &g_initctxt);
ok(!ret, "got wrong ret value %d\n", ret); ok(!ret && GetLastError() == ERROR_GEN_FAILURE, "wrong ret %d err %u\n", ret, GetLastError());
ok(pending == 0xf, "got %d\n", pending); ok(pending == 0xf, "got %d\n", pending);
ok(initonce.Ptr == (void*)1, "got %p\n", initonce.Ptr); ok(initonce.Ptr == (void*)1, "got %p\n", initonce.Ptr);
ok(g_initctxt == NULL, "got %p\n", g_initctxt); ok(g_initctxt == NULL, "got %p\n", g_initctxt);
g_initctxt = (void*)0xdeadbee0; g_initctxt = (void*)0xdeadbee0;
SetLastError( 0xdeadbeef );
ret = pInitOnceComplete(&initonce, INIT_ONCE_INIT_FAILED, g_initctxt); ret = pInitOnceComplete(&initonce, INIT_ONCE_INIT_FAILED, g_initctxt);
ok(!ret, "got wrong ret value %d\n", ret); ok(!ret && GetLastError() == ERROR_INVALID_PARAMETER, "wrong ret %d err %u\n", ret, GetLastError());
ok(initonce.Ptr == (void*)1, "got %p\n", initonce.Ptr); ok(initonce.Ptr == (void*)1, "got %p\n", initonce.Ptr);
/* once failed already */ /* once failed already */
g_initctxt = (void*)0xdeadbee0; g_initctxt = (void*)0xdeadbee0;
ret = pInitOnceComplete(&initonce, 0, g_initctxt); ret = pInitOnceComplete(&initonce, 0, g_initctxt);
ok(ret, "got wrong ret value %d\n", ret); ok(ret, "wrong ret %d err %u\n", ret, GetLastError());
ok(initonce.Ptr == (void*)0xdeadbee2, "got %p\n", initonce.Ptr); ok(initonce.Ptr == (void*)0xdeadbee2, "got %p\n", initonce.Ptr);
pInitOnceInitialize(&initonce);
SetLastError( 0xdeadbeef );
ret = pInitOnceComplete(&initonce, INIT_ONCE_INIT_FAILED, NULL);
ok(!ret && GetLastError() == ERROR_GEN_FAILURE, "wrong ret %d err %u\n", ret, GetLastError());
ok(initonce.Ptr == NULL, "got %p\n", initonce.Ptr);
SetLastError( 0xdeadbeef );
ret = pInitOnceComplete(&initonce, INIT_ONCE_INIT_FAILED | INIT_ONCE_ASYNC, NULL);
ok(!ret && GetLastError() == ERROR_INVALID_PARAMETER, "wrong ret %d err %u\n", ret, GetLastError());
ok(initonce.Ptr == NULL, "got %p\n", initonce.Ptr);
ret = pInitOnceBeginInitialize(&initonce, 0, &pending, &g_initctxt);
ok(ret, "wrong ret %d err %u\n", ret, GetLastError());
ok(pending, "got %d\n", pending);
ok(initonce.Ptr == (void*)1, "got %p\n", initonce.Ptr);
SetLastError( 0xdeadbeef );
ret = pInitOnceBeginInitialize(&initonce, INIT_ONCE_ASYNC, &pending, &g_initctxt);
ok(!ret && GetLastError() == ERROR_INVALID_PARAMETER, "wrong ret %d err %u\n", ret, GetLastError());
SetLastError( 0xdeadbeef );
ret = pInitOnceComplete(&initonce, INIT_ONCE_INIT_FAILED | INIT_ONCE_ASYNC, NULL);
ok(!ret && GetLastError() == ERROR_INVALID_PARAMETER, "wrong ret %d err %u\n", ret, GetLastError());
ok(initonce.Ptr == (void*)1, "got %p\n", initonce.Ptr);
SetLastError( 0xdeadbeef );
ret = pInitOnceComplete(&initonce, 0, (void *)0xdeadbeef);
ok(!ret && GetLastError() == ERROR_INVALID_PARAMETER, "wrong ret %d err %u\n", ret, GetLastError());
ok(initonce.Ptr == (void*)1, "got %p\n", initonce.Ptr);
ret = pInitOnceComplete(&initonce, INIT_ONCE_INIT_FAILED, NULL);
ok(ret, "wrong ret %d err %u\n", ret, GetLastError());
ok(initonce.Ptr == NULL, "got %p\n", initonce.Ptr);
pInitOnceInitialize(&initonce);
ret = pInitOnceBeginInitialize(&initonce, INIT_ONCE_ASYNC, &pending, &g_initctxt);
ok(ret, "wrong ret %d err %u\n", ret, GetLastError());
ok(pending, "got %d\n", pending);
ok(initonce.Ptr == (void*)3, "got %p\n", initonce.Ptr);
SetLastError( 0xdeadbeef );
ret = pInitOnceBeginInitialize(&initonce, 0, &pending, &g_initctxt);
ok(!ret && GetLastError() == ERROR_INVALID_PARAMETER, "wrong ret %d err %u\n", ret, GetLastError());
ret = pInitOnceBeginInitialize(&initonce, INIT_ONCE_ASYNC, &pending, &g_initctxt);
ok(ret, "wrong ret %d err %u\n", ret, GetLastError());
ok(pending, "got %d\n", pending);
ok(initonce.Ptr == (void*)3, "got %p\n", initonce.Ptr);
SetLastError( 0xdeadbeef );
ret = pInitOnceComplete(&initonce, INIT_ONCE_INIT_FAILED, NULL);
ok(!ret && GetLastError() == ERROR_INVALID_PARAMETER, "wrong ret %d err %u\n", ret, GetLastError());
ok(initonce.Ptr == (void*)3, "got %p\n", initonce.Ptr);
SetLastError( 0xdeadbeef );
ret = pInitOnceComplete(&initonce, INIT_ONCE_INIT_FAILED | INIT_ONCE_ASYNC, NULL);
ok(!ret && GetLastError() == ERROR_INVALID_PARAMETER, "wrong ret %d err %u\n", ret, GetLastError());
ok(initonce.Ptr == (void*)3, "got %p\n", initonce.Ptr);
SetLastError( 0xdeadbeef );
ret = pInitOnceComplete(&initonce, INIT_ONCE_ASYNC, (void *)0xdeadbeef);
ok(!ret && GetLastError() == ERROR_INVALID_PARAMETER, "wrong ret %d err %u\n", ret, GetLastError());
ok(initonce.Ptr == (void*)3, "got %p\n", initonce.Ptr);
ret = pInitOnceComplete(&initonce, INIT_ONCE_ASYNC, (void *)0xdeadbee0);
ok(ret, "wrong ret %d err %u\n", ret, GetLastError());
ok(initonce.Ptr == (void*)0xdeadbee2, "got %p\n", initonce.Ptr);
SetLastError( 0xdeadbeef );
ret = pInitOnceComplete(&initonce, INIT_ONCE_INIT_FAILED | INIT_ONCE_ASYNC, NULL);
ok(!ret && GetLastError() == ERROR_INVALID_PARAMETER, "wrong ret %d err %u\n", ret, GetLastError());
ok(initonce.Ptr == (void*)0xdeadbee2, "got %p\n", initonce.Ptr);
pInitOnceInitialize(&initonce);
ret = pInitOnceBeginInitialize(&initonce, 0, &pending, &g_initctxt);
ok(ret, "wrong ret %d err %u\n", ret, GetLastError());
ok(pending, "got %d\n", pending);
ok(initonce.Ptr == (void*)1, "got %p\n", initonce.Ptr);
/* test INIT_ONCE_CHECK_ONLY */
pInitOnceInitialize(&initonce);
SetLastError( 0xdeadbeef );
ret = pInitOnceBeginInitialize(&initonce, INIT_ONCE_CHECK_ONLY, &pending, &g_initctxt);
ok(!ret && GetLastError() == ERROR_GEN_FAILURE, "wrong ret %d err %u\n", ret, GetLastError());
SetLastError( 0xdeadbeef );
ret = pInitOnceBeginInitialize(&initonce, INIT_ONCE_CHECK_ONLY|INIT_ONCE_ASYNC, &pending, &g_initctxt);
ok(!ret && GetLastError() == ERROR_INVALID_PARAMETER, "wrong ret %d err %u\n", ret, GetLastError());
ret = pInitOnceBeginInitialize(&initonce, 0, &pending, &g_initctxt);
ok(ret, "wrong ret %d err %u\n", ret, GetLastError());
ok(pending, "got %d\n", pending);
ok(initonce.Ptr == (void*)1, "got %p\n", initonce.Ptr);
SetLastError( 0xdeadbeef );
ret = pInitOnceBeginInitialize(&initonce, INIT_ONCE_CHECK_ONLY, &pending, &g_initctxt);
ok(!ret && GetLastError() == ERROR_GEN_FAILURE, "wrong ret %d err %u\n", ret, GetLastError());
SetLastError( 0xdeadbeef );
ret = pInitOnceBeginInitialize(&initonce, INIT_ONCE_CHECK_ONLY|INIT_ONCE_ASYNC, &pending, &g_initctxt);
ok(!ret && GetLastError() == ERROR_INVALID_PARAMETER, "wrong ret %d err %u\n", ret, GetLastError());
ret = pInitOnceComplete(&initonce, 0, (void *)0xdeadbee0);
ok(ret, "wrong ret %d err %u\n", ret, GetLastError());
ok(initonce.Ptr == (void*)0xdeadbee2, "got %p\n", initonce.Ptr);
ret = pInitOnceBeginInitialize(&initonce, INIT_ONCE_CHECK_ONLY, &pending, &g_initctxt);
ok(ret, "got wrong ret value %d err %u\n", ret, GetLastError());
ok(!pending, "got %d\n", pending);
ok(initonce.Ptr == (void*)0xdeadbee2, "got %p\n", initonce.Ptr);
ok(g_initctxt == (void*)0xdeadbee0, "got %p\n", initonce.Ptr);
SetLastError( 0xdeadbeef );
ret = pInitOnceBeginInitialize(&initonce, INIT_ONCE_CHECK_ONLY|INIT_ONCE_ASYNC, &pending, &g_initctxt);
ok(!ret && GetLastError() == ERROR_INVALID_PARAMETER, "wrong ret %d err %u\n", ret, GetLastError());
pInitOnceInitialize(&initonce);
ret = pInitOnceBeginInitialize(&initonce, INIT_ONCE_ASYNC, &pending, &g_initctxt);
ok(ret, "wrong ret %d err %u\n", ret, GetLastError());
ok(pending, "got %d\n", pending);
ok(initonce.Ptr == (void*)3, "got %p\n", initonce.Ptr);
SetLastError( 0xdeadbeef );
ret = pInitOnceBeginInitialize(&initonce, INIT_ONCE_CHECK_ONLY, &pending, &g_initctxt);
ok(!ret && GetLastError() == ERROR_GEN_FAILURE, "wrong ret %d err %u\n", ret, GetLastError());
SetLastError( 0xdeadbeef );
ret = pInitOnceBeginInitialize(&initonce, INIT_ONCE_CHECK_ONLY|INIT_ONCE_ASYNC, &pending, &g_initctxt);
ok(!ret && GetLastError() == ERROR_INVALID_PARAMETER, "wrong ret %d err %u\n", ret, GetLastError());
ret = pInitOnceComplete(&initonce, INIT_ONCE_ASYNC, (void *)0xdeadbee0);
ok(ret, "wrong ret %d err %u\n", ret, GetLastError());
ok(initonce.Ptr == (void*)0xdeadbee2, "got %p\n", initonce.Ptr);
ret = pInitOnceBeginInitialize(&initonce, INIT_ONCE_CHECK_ONLY, &pending, &g_initctxt);
ok(ret, "got wrong ret value %d err %u\n", ret, GetLastError());
ok(!pending, "got %d\n", pending);
ok(initonce.Ptr == (void*)0xdeadbee2, "got %p\n", initonce.Ptr);
ok(g_initctxt == (void*)0xdeadbee0, "got %p\n", initonce.Ptr);
SetLastError( 0xdeadbeef );
ret = pInitOnceBeginInitialize(&initonce, INIT_ONCE_CHECK_ONLY|INIT_ONCE_ASYNC, &pending, &g_initctxt);
ok(!ret && GetLastError() == ERROR_INVALID_PARAMETER, "wrong ret %d err %u\n", ret, GetLastError());
} }
static CONDITION_VARIABLE buffernotempty = CONDITION_VARIABLE_INIT; static CONDITION_VARIABLE buffernotempty = CONDITION_VARIABLE_INIT;

View File

@ -855,7 +855,7 @@ static DWORD WINAPI keyed_event_thread( void *arg )
LARGE_INTEGER timeout; LARGE_INTEGER timeout;
OBJECT_ATTRIBUTES attr; OBJECT_ATTRIBUTES attr;
UNICODE_STRING str; UNICODE_STRING str;
int i; ULONG_PTR i;
attr.Length = sizeof(attr); attr.Length = sizeof(attr);
attr.RootDirectory = 0; attr.RootDirectory = 0;
@ -874,12 +874,12 @@ static DWORD WINAPI keyed_event_thread( void *arg )
status = pNtWaitForKeyedEvent( handle, (void *)(i * 2), 0, NULL ); status = pNtWaitForKeyedEvent( handle, (void *)(i * 2), 0, NULL );
else else
status = pNtReleaseKeyedEvent( handle, (void *)(i * 2), 0, NULL ); status = pNtReleaseKeyedEvent( handle, (void *)(i * 2), 0, NULL );
ok( status == STATUS_SUCCESS, "%i: failed %x\n", i, status ); ok( status == STATUS_SUCCESS, "%li: failed %x\n", i, status );
Sleep( 20 - i ); Sleep( 20 - i );
} }
status = pNtReleaseKeyedEvent( handle, (void *)0x1234, 0, NULL ); status = pNtReleaseKeyedEvent( handle, (void *)0x1234, 0, NULL );
ok( status == STATUS_SUCCESS, "%i: failed %x\n", i, status ); ok( status == STATUS_SUCCESS, "NtReleaseKeyedEvent %x\n", status );
timeout.QuadPart = -10000; timeout.QuadPart = -10000;
status = pNtWaitForKeyedEvent( handle, (void *)0x5678, 0, &timeout ); status = pNtWaitForKeyedEvent( handle, (void *)0x5678, 0, &timeout );
@ -898,7 +898,7 @@ static void test_keyed_events(void)
HANDLE handle, event, thread; HANDLE handle, event, thread;
NTSTATUS status; NTSTATUS status;
LARGE_INTEGER timeout; LARGE_INTEGER timeout;
int i; ULONG_PTR i;
if (!pNtCreateKeyedEvent) if (!pNtCreateKeyedEvent)
{ {
@ -953,7 +953,7 @@ static void test_keyed_events(void)
status = pNtReleaseKeyedEvent( handle, (void *)(i * 2), 0, NULL ); status = pNtReleaseKeyedEvent( handle, (void *)(i * 2), 0, NULL );
else else
status = pNtWaitForKeyedEvent( handle, (void *)(i * 2), 0, NULL ); status = pNtWaitForKeyedEvent( handle, (void *)(i * 2), 0, NULL );
ok( status == STATUS_SUCCESS, "%i: failed %x\n", i, status ); ok( status == STATUS_SUCCESS, "%li: failed %x\n", i, status );
Sleep( i ); Sleep( i );
} }
status = pNtWaitForKeyedEvent( handle, (void *)0x1234, 0, &timeout ); status = pNtWaitForKeyedEvent( handle, (void *)0x1234, 0, &timeout );