winetest: Allow sending the report to another server.
Francois Gouget
fgouget at codeweavers.com
Fri Feb 10 09:42:48 CST 2017
This makes it possible to send the reports to both the official server
and a test server.
Signed-off-by: Francois Gouget <fgouget at codeweavers.com>
---
For instance sending the reports of the tests I run on my VMs to my test
server in addition to the official one.
programs/winetest/main.c | 22 +++++++++++-----
programs/winetest/send.c | 62 ++++++++++++++++++++++++++++++++++++++------
programs/winetest/winetest.h | 2 +-
3 files changed, 71 insertions(+), 15 deletions(-)
diff --git a/programs/winetest/main.c b/programs/winetest/main.c
index 9d2c95a31c2..c8ff1026638 100644
--- a/programs/winetest/main.c
+++ b/programs/winetest/main.c
@@ -1231,6 +1231,7 @@ usage (void)
" -q quiet mode, no output at all\n"
" -o FILE put report into FILE, do not submit\n"
" -s FILE submit FILE, do not run tests\n"
+" -S URL URL to submit the results to\n"
" -t TAG include TAG of characters [-.0-9a-zA-Z] in the report\n"
" -u URL include TestBot URL in the report\n"
" -x DIR Extract tests to DIR (default: .\\wct) and exit\n");
@@ -1241,7 +1242,7 @@ int main( int argc, char *argv[] )
BOOL (WINAPI *pIsWow64Process)(HANDLE hProcess, PBOOL Wow64Process);
char *logname = NULL, *outdir = NULL;
const char *extract = NULL;
- const char *cp, *submit = NULL;
+ const char *cp, *submit = NULL, *submiturl = NULL;
int reset_env = 1;
int poweroff = 0;
int interactive = 1;
@@ -1312,9 +1313,13 @@ int main( int argc, char *argv[] )
usage();
exit( 2 );
}
- if (tag)
- report (R_WARNING, "ignoring tag for submission");
- send_file (submit);
+ break;
+ case 'S':
+ if (!(submiturl = argv[++i]))
+ {
+ usage();
+ exit( 2 );
+ }
break;
case 'o':
if (!(logname = argv[++i]))
@@ -1362,7 +1367,12 @@ int main( int argc, char *argv[] )
exit (2);
}
}
- if (!submit && !extract) {
+ if (submit) {
+ if (tag)
+ report (R_WARNING, "ignoring tag for submission");
+ send_file (submiturl, submit);
+
+ } else if (!extract) {
int is_win9x = (GetVersion() & 0x80000000) != 0;
report (R_STATUS, "Starting up");
@@ -1428,7 +1438,7 @@ int main( int argc, char *argv[] )
if (build_id[0] && nr_of_skips <= SKIP_LIMIT && failures <= FAILURES_LIMIT &&
!nr_native_dlls && !is_win9x &&
report (R_ASK, MB_YESNO, "Do you want to submit the test results?") == IDYES)
- if (!send_file (logname) && !DeleteFileA(logname))
+ if (!send_file (submiturl, logname) && !DeleteFileA(logname))
report (R_WARNING, "Can't remove logfile: %u", GetLastError());
} else run_tests (logname, outdir);
report (R_STATUS, "Finished - %u failures", failures);
diff --git a/programs/winetest/send.c b/programs/winetest/send.c
index a419b166222..1b0b94a9baa 100644
--- a/programs/winetest/send.c
+++ b/programs/winetest/send.c
@@ -121,7 +121,7 @@ send_str (SOCKET s, ...)
}
static int
-send_file_direct (const char *name)
+send_file_direct (const char * url, const char *name)
{
SOCKET s;
HANDLE file;
@@ -139,6 +139,11 @@ send_file_direct (const char *name)
CONTENT_HEADERS
"\r\n";
+ if (url) {
+ report (R_WARNING, "Can't submit to an alternative URL");
+ return 0;
+ }
+
s = open_http (SERVER_NAME);
if (s == INVALID_SOCKET) return 1;
@@ -243,7 +248,7 @@ send_file_direct (const char *name)
}
static int
-send_file_wininet (const char *name)
+send_file_wininet (const char *url, const char *name)
{
int ret = 0;
HMODULE wininet_mod = NULL;
@@ -264,6 +269,7 @@ send_file_wininet (const char *name)
HINTERNET request = NULL;
INTERNET_BUFFERSA buffers_in = { 0 };
char buffer[BUFLEN+1];
+ URL_COMPONENTSA uc = { 0 };
static const char extra_headers[] =
CONTENT_HEADERS;
@@ -283,6 +289,38 @@ send_file_wininet (const char *name)
pInternetWriteFile == NULL || pInternetReadFile == NULL || pInternetCloseHandle == NULL) {
goto done;
}
+ if (url) {
+ BOOL (WINAPI *pInternetCrackUrlA)(const char *url, DWORD url_length, DWORD flags, URL_COMPONENTSA *ret_comp);
+ pInternetCrackUrlA = (void *)GetProcAddress(wininet_mod, "InternetCrackUrlA");
+ if (pInternetCrackUrlA == NULL)
+ goto done;
+ uc.dwStructSize = sizeof(uc);
+ uc.dwSchemeLength = uc.dwHostNameLength = uc.dwUserNameLength =
+ uc.dwPasswordLength = uc.dwUrlPathLength = uc.dwExtraInfoLength =
+ strlen(url) + 1;
+ uc.lpszScheme = heap_alloc (uc.dwSchemeLength);
+ uc.lpszHostName = heap_alloc (uc.dwHostNameLength);
+ uc.lpszUserName = heap_alloc (uc.dwUserNameLength);
+ uc.lpszPassword = heap_alloc (uc.dwPasswordLength);
+ uc.lpszUrlPath = heap_alloc (uc.dwUrlPathLength);
+ uc.lpszExtraInfo = heap_alloc (uc.dwExtraInfoLength);
+ if (!pInternetCrackUrlA(url, 0, 0, &uc)) {
+ report (R_WARNING, "Can't parse submit URL '%s'", url);
+ goto done;
+ }
+ if ((uc.nScheme != INTERNET_SCHEME_HTTP && uc.nScheme != INTERNET_SCHEME_HTTPS) || *uc.lpszExtraInfo) {
+ report (R_WARNING, "Can't submit report to scheme %s or extra info '%s'", uc.lpszScheme, uc.lpszExtraInfo);
+ goto done;
+ }
+
+ } else {
+ uc.nScheme = INTERNET_SCHEME_HTTP;
+ uc.lpszHostName = heap_strdup (SERVER_NAME);
+ uc.nPort = INTERNET_DEFAULT_HTTP_PORT;
+ uc.lpszUserName = heap_strdup ("");
+ uc.lpszPassword = heap_strdup ("");
+ uc.lpszUrlPath = heap_strdup (URL_PATH);
+ }
ret = 1;
@@ -310,20 +348,22 @@ send_file_wininet (const char *name)
filesize = 1.5*1024*1024;
}
- report (R_STATUS, "Opening HTTP connection to " SERVER_NAME);
+ report (R_STATUS, "Opening %s connection to %s:%d",
+ (uc.nScheme == INTERNET_SCHEME_HTTP ? "http" : "https"),
+ uc.lpszHostName, uc.nPort);
session = pInternetOpen (USER_AGENT, INTERNET_OPEN_TYPE_PRECONFIG, NULL, NULL, 0);
if (session == NULL) {
report (R_WARNING, "Unable to open connection, error %u", GetLastError());
goto done;
}
- connection = pInternetConnect (session, SERVER_NAME, INTERNET_DEFAULT_HTTP_PORT, "", "", INTERNET_SERVICE_HTTP, 0, 0);
+ connection = pInternetConnect (session, uc.lpszHostName, uc.nPort, uc.lpszUserName, uc.lpszPassword, INTERNET_SERVICE_HTTP, 0, 0);
if (connection == NULL) {
report (R_WARNING, "Unable to connect, error %u", GetLastError());
goto done;
}
- request = pHttpOpenRequest (connection, "POST", URL_PATH, NULL, NULL, NULL,
+ request = pHttpOpenRequest (connection, "POST", uc.lpszUrlPath, NULL, NULL, NULL,
INTERNET_FLAG_NO_CACHE_WRITE | INTERNET_FLAG_NO_COOKIES | INTERNET_FLAG_NO_UI |
- INTERNET_FLAG_PRAGMA_NOCACHE | INTERNET_FLAG_RELOAD, 0);
+ INTERNET_FLAG_PRAGMA_NOCACHE | INTERNET_FLAG_RELOAD | (uc.nScheme == INTERNET_SCHEME_HTTPS ? INTERNET_FLAG_SECURE : 0), 0);
if (request == NULL) {
report (R_WARNING, "Unable to open request, error %u", GetLastError());
goto done;
@@ -396,6 +436,12 @@ send_file_wininet (const char *name)
}
done:
+ heap_free (uc.lpszScheme);
+ heap_free (uc.lpszHostName);
+ heap_free (uc.lpszUserName);
+ heap_free (uc.lpszPassword);
+ heap_free (uc.lpszUrlPath);
+ heap_free (uc.lpszExtraInfo);
heap_free((void *)buffers_in.lpcszHeader);
heap_free(str);
if (pInternetCloseHandle != NULL && request != NULL)
@@ -413,7 +459,7 @@ send_file_wininet (const char *name)
}
int
-send_file (const char *name)
+send_file (const char *url, const char *name)
{
- return send_file_wininet( name ) || send_file_direct( name );
+ return send_file_wininet( url, name ) || send_file_direct( url, name );
}
diff --git a/programs/winetest/winetest.h b/programs/winetest/winetest.h
index 2b9046caebc..e74f126077f 100644
--- a/programs/winetest/winetest.h
+++ b/programs/winetest/winetest.h
@@ -34,7 +34,7 @@ char *strmake (size_t *lenp, ...);
int goodtagchar (char c);
const char *findbadtagchar (const char *tag);
-int send_file (const char *name);
+int send_file (const char *url, const char *name);
extern HANDLE logfile;
--
2.11.0
More information about the wine-patches
mailing list