From eeb3e86f38ab659ddc68a3e97e893eb1b07c5e0a Mon Sep 17 00:00:00 2001 From: Juan Lang Date: Tue, 1 Mar 2011 10:56:00 -0800 Subject: [PATCH] wininet/tests: Test retrieving http requests from cache. --- dlls/wininet/tests/http.c | 91 +++++++++++++++++++++++++++++++++++++++ 1 file changed, 91 insertions(+) diff --git a/dlls/wininet/tests/http.c b/dlls/wininet/tests/http.c index a8c843a56da..95a57797484 100644 --- a/dlls/wininet/tests/http.c +++ b/dlls/wininet/tests/http.c @@ -1202,6 +1202,19 @@ static void test_http_cache(void) ok(file != INVALID_HANDLE_VALUE, "Could not create file: %u\n", GetLastError()); CloseHandle(file); + /* Send the same request, requiring it to be retrieved from the cache */ + request = HttpOpenRequest(connect, "GET", "/hello.html", NULL, NULL, NULL, INTERNET_FLAG_FROM_CACHE, 0); + + ret = HttpSendRequest(request, NULL, 0, NULL, 0); + ok(ret, "HttpSendRequest failed\n"); + + size = sizeof(buf); + ret = InternetReadFile(request, buf, sizeof(buf), &size); + ok(ret, "InternetReadFile failed: %u\n", GetLastError()); + ok(size == 100, "size = %u\n", size); + + ok(InternetCloseHandle(request), "Close request handle failed\n"); + request = HttpOpenRequestA(connect, NULL, "/", NULL, NULL, types, INTERNET_FLAG_NO_CACHE_WRITE, 0); ok(request != NULL, "Failed to open request handle err %u\n", GetLastError()); @@ -1602,6 +1615,7 @@ static const char page1[] = struct server_info { HANDLE hEvent; int port; + int num_testH_retrievals; }; static DWORD CALLBACK server_thread(LPVOID param) @@ -1792,6 +1806,17 @@ static DWORD CALLBACK server_thread(LPVOID param) { send(c, page1, sizeof page1-1, 0); } + if (strstr(buffer, "GET /testH")) + { + si->num_testH_retrievals++; + if (!strstr(buffer, "Content-Length: 0")) + { + send(c, okmsg, sizeof okmsg-1, 0); + send(c, page1, sizeof page1-1, 0); + } + else + send(c, notokmsg, sizeof notokmsg-1, 0); + } shutdown(c, 2); closesocket(c); @@ -2575,6 +2600,70 @@ static void test_options(int port) InternetCloseHandle(ses); } +static void test_url_caching(int port, int *num_retrievals) +{ + HINTERNET hi, hc, hr; + DWORD r, count; + char buffer[0x100]; + + ok(*num_retrievals == 0, "expected 0 retrievals prior to test\n"); + + hi = InternetOpen(NULL, INTERNET_OPEN_TYPE_DIRECT, NULL, NULL, 0); + ok(hi != NULL, "open failed\n"); + + hc = InternetConnect(hi, "localhost", port, NULL, NULL, INTERNET_SERVICE_HTTP, 0, 0); + ok(hc != NULL, "connect failed\n"); + + /* Pre-load the cache: */ + hr = HttpOpenRequest(hc, "GET", "/testH", NULL, NULL, NULL, 0, 0); + ok(hr != NULL, "HttpOpenRequest failed\n"); + + r = HttpSendRequest(hr, NULL, 0, NULL, 0); + ok(r, "HttpSendRequest failed\n"); + + ok(*num_retrievals == 1, "expected 1 retrievals\n"); + + count = 0; + memset(buffer, 0, sizeof buffer); + SetLastError(0xdeadbeef); + r = InternetReadFile(hr, buffer, sizeof buffer, &count); + ok(r, "InternetReadFile failed %u\n", GetLastError()); + ok(count == sizeof page1 - 1, "count was wrong\n"); + ok(!memcmp(buffer, page1, sizeof page1), "http data wrong\n"); + + InternetCloseHandle(hr); + + /* Send the same request, requiring it to be retrieved from the cache */ + hr = HttpOpenRequest(hc, "GET", "/testH", NULL, NULL, NULL, INTERNET_FLAG_FROM_CACHE, 0); + ok(hr != NULL, "HttpOpenRequest failed\n"); + + r = HttpSendRequest(hr, NULL, 0, NULL, 0); + /* Older Windows versions succeed with this request, newer ones fail with + * ERROR_FILE_NOT_FOUND. Accept either, as the older version allows us + * to verify that the server isn't contacted. + */ + if (!r) + ok(GetLastError() == ERROR_FILE_NOT_FOUND, + "expected ERROR_FILE_NOT_FOUND, got %d\n", GetLastError()); + else + { + /* The server shouldn't be contacted for this request. */ + todo_wine + ok(*num_retrievals == 1, "expected 1 retrievals\n"); + + count = 0; + memset(buffer, 0, sizeof buffer); + SetLastError(0xdeadbeef); + r = InternetReadFile(hr, buffer, sizeof buffer, &count); + ok(r, "InternetReadFile failed %u\n", GetLastError()); + ok(count == sizeof page1 - 1, "count was wrong\n"); + ok(!memcmp(buffer, page1, sizeof page1), "http data wrong\n"); + } + + InternetCloseHandle(hc); + InternetCloseHandle(hi); +} + static void test_http_connection(void) { struct server_info si; @@ -2583,6 +2672,7 @@ static void test_http_connection(void) si.hEvent = CreateEvent(NULL, 0, 0, NULL); si.port = 7531; + si.num_testH_retrievals = 0; hThread = CreateThread(NULL, 0, server_thread, (LPVOID) &si, 0, &id); ok( hThread != NULL, "create thread failed\n"); @@ -2611,6 +2701,7 @@ static void test_http_connection(void) test_HttpSendRequestW(si.port); test_last_error(si.port); test_options(si.port); + test_url_caching(si.port, &si.num_testH_retrievals); /* send the basic request again to shutdown the server thread */ test_basic_request(si.port, "GET", "/quit");