urlmon/tests: Make http protocol tests refractory to timing issues.
This commit is contained in:
parent
9f31fb2fd4
commit
0a9dfa0d27
|
@ -99,7 +99,6 @@ static LPCWSTR file_name, http_url, expect_wsz;
|
|||
static IInternetProtocol *http_protocol = NULL;
|
||||
static BOOL first_data_notif = FALSE, http_is_first = FALSE,
|
||||
http_post_test = FALSE;
|
||||
static HWND protocol_hwnd;
|
||||
static int state = 0;
|
||||
static DWORD bindf = 0;
|
||||
static IInternetBindInfo *prot_bind_info;
|
||||
|
@ -278,9 +277,35 @@ static ULONG WINAPI ProtocolSink_Release(IInternetProtocolSink *iface)
|
|||
|
||||
static HRESULT WINAPI ProtocolSink_Switch(IInternetProtocolSink *iface, PROTOCOLDATA *pProtocolData)
|
||||
{
|
||||
CHECK_EXPECT2(Switch);
|
||||
HRESULT hres;
|
||||
|
||||
CHECK_EXPECT(Switch);
|
||||
ok(pProtocolData != NULL, "pProtocolData == NULL\n");
|
||||
SendMessage(protocol_hwnd, WM_USER, 0, (LPARAM)pProtocolData);
|
||||
if (!state) {
|
||||
if (http_is_first) {
|
||||
CHECK_CALLED(ReportProgress_FINDINGRESOURCE);
|
||||
CHECK_CALLED(ReportProgress_CONNECTING);
|
||||
} else todo_wine {
|
||||
CHECK_NOT_CALLED(ReportProgress_FINDINGRESOURCE);
|
||||
CHECK_NOT_CALLED(ReportProgress_CONNECTING);
|
||||
}
|
||||
CHECK_CALLED(ReportProgress_SENDINGREQUEST);
|
||||
SET_EXPECT(OnResponse);
|
||||
SET_EXPECT(ReportProgress_MIMETYPEAVAILABLE);
|
||||
}
|
||||
|
||||
SET_EXPECT(ReportData);
|
||||
hres = IInternetProtocol_Continue(http_protocol, pProtocolData);
|
||||
ok(hres == S_OK, "Continue failed: %08x\n", hres);
|
||||
CHECK_CALLED(ReportData);
|
||||
|
||||
if (!state) {
|
||||
state = 1;
|
||||
CHECK_CALLED(OnResponse);
|
||||
CHECK_CALLED(ReportProgress_MIMETYPEAVAILABLE);
|
||||
}
|
||||
|
||||
SetEvent(event_complete);
|
||||
return S_OK;
|
||||
}
|
||||
|
||||
|
@ -418,8 +443,23 @@ static HRESULT WINAPI ProtocolSink_ReportData(IInternetProtocolSink *iface, DWOR
|
|||
"grcfBSCF = %08x\n", grfBSCF);
|
||||
}
|
||||
|
||||
if (!(bindf & BINDF_FROMURLMON))
|
||||
if(!(bindf & BINDF_FROMURLMON) &&
|
||||
!(grfBSCF & BSCF_LASTDATANOTIFICATION)) {
|
||||
if(!state) {
|
||||
state = 1;
|
||||
if(http_is_first) {
|
||||
CHECK_CALLED(ReportProgress_FINDINGRESOURCE);
|
||||
CHECK_CALLED(ReportProgress_CONNECTING);
|
||||
} else todo_wine {
|
||||
CHECK_NOT_CALLED(ReportProgress_FINDINGRESOURCE);
|
||||
CHECK_NOT_CALLED(ReportProgress_CONNECTING);
|
||||
}
|
||||
CHECK_CALLED(ReportProgress_SENDINGREQUEST);
|
||||
CHECK_CALLED(OnResponse);
|
||||
CHECK_CALLED(ReportProgress_RAWMIMETYPE);
|
||||
}
|
||||
SetEvent(event_complete);
|
||||
}
|
||||
}
|
||||
return S_OK;
|
||||
}
|
||||
|
@ -1216,20 +1256,21 @@ static void test_http_protocol_url(LPCWSTR url, BOOL is_first)
|
|||
(void**)&http_protocol);
|
||||
ok(hres == S_OK, "Could not get IInternetProtocol: %08x\n", hres);
|
||||
if(SUCCEEDED(hres)) {
|
||||
BYTE buf[512];
|
||||
BYTE buf[3600];
|
||||
DWORD cb;
|
||||
MSG msg;
|
||||
int *called = (bindf & BINDF_FROMURLMON) ? &called_Switch : &called_ReportData;
|
||||
|
||||
test_priority(http_protocol);
|
||||
|
||||
SET_EXPECT(ReportProgress_FINDINGRESOURCE);
|
||||
SET_EXPECT(ReportProgress_CONNECTING);
|
||||
SET_EXPECT(ReportProgress_SENDINGREQUEST);
|
||||
if(!(bindf & BINDF_FROMURLMON))
|
||||
{
|
||||
if(!(bindf & BINDF_FROMURLMON)) {
|
||||
SET_EXPECT(OnResponse);
|
||||
SET_EXPECT(ReportProgress_RAWMIMETYPE);
|
||||
SET_EXPECT(ReportData);
|
||||
} else {
|
||||
SET_EXPECT(Switch);
|
||||
}
|
||||
|
||||
if(!http_protocol_start(url, is_first))
|
||||
|
@ -1238,27 +1279,64 @@ static void test_http_protocol_url(LPCWSTR url, BOOL is_first)
|
|||
SET_EXPECT(ReportResult);
|
||||
expect_hrResult = S_OK;
|
||||
|
||||
hres = IInternetProtocol_Read(http_protocol, buf, 1, &cb);
|
||||
ok((!*called && hres == E_PENDING && cb==0) ||
|
||||
(*called && hres == S_OK && cb==1), "Read failed: %08x (%d bytes)\n", hres, cb);
|
||||
|
||||
WaitForSingleObject(event_complete, INFINITE);
|
||||
if(bindf & BINDF_FROMURLMON)
|
||||
{
|
||||
hres = IInternetProtocol_Read(http_protocol, buf, 2, &cb);
|
||||
ok(hres == E_PENDING, "Read failed: %08x, expected E_PENDING\n", hres);
|
||||
ok(!cb, "cb=%d, expected 0\n", cb);
|
||||
|
||||
SET_EXPECT(Switch);
|
||||
GetMessage(&msg, NULL, 0, 0);
|
||||
CHECK_CALLED(Switch);
|
||||
}
|
||||
else
|
||||
{
|
||||
WaitForSingleObject(event_complete, INFINITE);
|
||||
SendMessage(protocol_hwnd, WM_USER, 0, 0);
|
||||
}
|
||||
CHECK_CALLED(ReportData);
|
||||
|
||||
while(1) {
|
||||
if(bindf & BINDF_FROMURLMON)
|
||||
SET_EXPECT(Switch);
|
||||
else
|
||||
SET_EXPECT(ReportData);
|
||||
hres = IInternetProtocol_Read(http_protocol, buf, sizeof(buf), &cb);
|
||||
if(hres == E_PENDING) {
|
||||
hres = IInternetProtocol_Read(http_protocol, buf, 1, &cb);
|
||||
ok((!*called && hres == E_PENDING && cb==0) ||
|
||||
(*called && hres == S_OK && cb==1), "Read failed: %08x (%d bytes)\n", hres, cb);
|
||||
WaitForSingleObject(event_complete, INFINITE);
|
||||
if(bindf & BINDF_FROMURLMON)
|
||||
CHECK_CALLED(Switch);
|
||||
else
|
||||
CHECK_CALLED(ReportData);
|
||||
} else {
|
||||
if(bindf & BINDF_FROMURLMON)
|
||||
CHECK_NOT_CALLED(Switch);
|
||||
else
|
||||
CHECK_NOT_CALLED(ReportData);
|
||||
if(cb == 0) break;
|
||||
}
|
||||
}
|
||||
ok(hres == S_FALSE, "Read failed: %08x\n", hres);
|
||||
CHECK_CALLED(ReportResult);
|
||||
|
||||
hres = IInternetProtocol_LockRequest(http_protocol, 0);
|
||||
ok(hres == S_OK, "LockRequest failed: %08x\n", hres);
|
||||
|
||||
hres = IInternetProtocol_Read(http_protocol, buf, 1, &cb);
|
||||
ok(hres == S_FALSE, "Read failed: %08x\n", hres);
|
||||
|
||||
hres = IInternetProtocol_Terminate(http_protocol, 0);
|
||||
ok(hres == S_OK, "Terminate failed: %08x\n", hres);
|
||||
|
||||
/* This wait is to give the internet handles being freed in Terminate
|
||||
* enough time to actually terminate in all cases. Internet handles
|
||||
* terminate asynchronously and native reuses the main InternetOpen
|
||||
* handle. The only case in which this seems to be necessary is on
|
||||
* wine with native wininet and urlmon, resulting in the next time
|
||||
* test_http_protocol_url being called the first data notification actually
|
||||
* being an extra last data notification from the previous connection
|
||||
* about once out of every ten times. */
|
||||
Sleep(100);
|
||||
|
||||
hres = IInternetProtocol_UnlockRequest(http_protocol);
|
||||
ok(hres == S_OK, "UnlockRequest failed: %08x\n", hres);
|
||||
|
||||
IInternetProtocol_Release(http_protocol);
|
||||
}
|
||||
|
||||
|
@ -1289,106 +1367,6 @@ static void test_http_protocol(void)
|
|||
http_post_test = FALSE;
|
||||
}
|
||||
|
||||
static HRESULT http_protocol_read(void)
|
||||
{
|
||||
HRESULT hres;
|
||||
DWORD cb;
|
||||
BYTE buf[3600];
|
||||
|
||||
while(1) {
|
||||
hres = IInternetProtocol_Read(http_protocol, buf, sizeof(buf), &cb);
|
||||
if(!(bindf & BINDF_FROMURLMON) &&
|
||||
hres == E_PENDING) {
|
||||
WaitForSingleObject(event_complete, INFINITE);
|
||||
CHECK_CALLED(ReportData);
|
||||
SET_EXPECT(ReportData);
|
||||
} else if(cb == 0) break;
|
||||
}
|
||||
|
||||
return hres;
|
||||
}
|
||||
|
||||
static LRESULT WINAPI wnd_proc(HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam)
|
||||
{
|
||||
if(msg == WM_USER) {
|
||||
HRESULT hres;
|
||||
|
||||
if(!state) {
|
||||
if (http_is_first)
|
||||
{
|
||||
CHECK_CALLED(ReportProgress_FINDINGRESOURCE);
|
||||
CHECK_CALLED(ReportProgress_CONNECTING);
|
||||
}
|
||||
else todo_wine
|
||||
{
|
||||
CHECK_NOT_CALLED(ReportProgress_FINDINGRESOURCE);
|
||||
CHECK_NOT_CALLED(ReportProgress_CONNECTING);
|
||||
}
|
||||
CHECK_CALLED(ReportProgress_SENDINGREQUEST);
|
||||
if(!(bindf & BINDF_FROMURLMON))
|
||||
{
|
||||
CHECK_CALLED(OnResponse);
|
||||
CHECK_CALLED(ReportProgress_RAWMIMETYPE);
|
||||
CHECK_CALLED(ReportData);
|
||||
}
|
||||
else
|
||||
{
|
||||
SET_EXPECT(OnResponse);
|
||||
SET_EXPECT(ReportProgress_MIMETYPEAVAILABLE);
|
||||
}
|
||||
}
|
||||
SET_EXPECT(ReportData);
|
||||
|
||||
if (bindf & BINDF_FROMURLMON)
|
||||
{
|
||||
hres = IInternetProtocol_Continue(http_protocol, (PROTOCOLDATA*)lParam);
|
||||
ok(hres == S_OK, "Continue failed: %08x\n", hres);
|
||||
|
||||
CHECK_CALLED(ReportData);
|
||||
if(!state) {
|
||||
CHECK_CALLED(OnResponse);
|
||||
CHECK_CALLED(ReportProgress_MIMETYPEAVAILABLE);
|
||||
}
|
||||
}
|
||||
|
||||
hres = http_protocol_read();
|
||||
ok(hres == S_FALSE || hres == E_PENDING, "Read failed: %08x\n", hres);
|
||||
|
||||
if(hres == S_FALSE &&
|
||||
(bindf & BINDF_FROMURLMON))
|
||||
PostMessage(protocol_hwnd, WM_USER+1, 0, 0);
|
||||
|
||||
if(!state) {
|
||||
state = 1;
|
||||
|
||||
hres = IInternetProtocol_LockRequest(http_protocol, 0);
|
||||
ok(hres == S_OK, "LockRequest failed: %08x\n", hres);
|
||||
|
||||
hres = http_protocol_read();
|
||||
ok(hres == S_FALSE || hres == E_PENDING, "Read failed: %08x\n", hres);
|
||||
}
|
||||
}
|
||||
|
||||
return DefWindowProc(hwnd, msg, wParam, lParam);
|
||||
}
|
||||
|
||||
static HWND create_protocol_window(void)
|
||||
{
|
||||
static WNDCLASSEX wndclass = {
|
||||
sizeof(WNDCLASSEX),
|
||||
0,
|
||||
wnd_proc,
|
||||
0, 0, NULL, NULL, NULL, NULL, NULL,
|
||||
"ProtocolWindow",
|
||||
NULL
|
||||
};
|
||||
|
||||
RegisterClassEx(&wndclass);
|
||||
return CreateWindow("ProtocolWindow", "ProtocolWindow",
|
||||
WS_OVERLAPPEDWINDOW, CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT,
|
||||
CW_USEDEFAULT, NULL, NULL, NULL, NULL);
|
||||
}
|
||||
|
||||
static void test_mk_protocol(void)
|
||||
{
|
||||
IInternetProtocolInfo *protocol_info;
|
||||
|
@ -1555,14 +1533,12 @@ START_TEST(protocol)
|
|||
OleInitialize(NULL);
|
||||
|
||||
event_complete = CreateEvent(NULL, FALSE, FALSE, NULL);
|
||||
protocol_hwnd = create_protocol_window();
|
||||
|
||||
test_file_protocol();
|
||||
test_http_protocol();
|
||||
test_mk_protocol();
|
||||
test_CreateBinding();
|
||||
|
||||
DestroyWindow(protocol_hwnd);
|
||||
CloseHandle(event_complete);
|
||||
|
||||
OleUninitialize();
|
||||
|
|
Loading…
Reference in New Issue