Przeglądaj źródła

Add test for error handler

bel 8 lat temu
rodzic
commit
39c9b4631f
2 zmienionych plików z 268 dodań i 0 usunięć
  1. 1 0
      test/CMakeLists.txt
  2. 267 0
      test/public_server.c

+ 1 - 0
test/CMakeLists.txt

@@ -169,6 +169,7 @@ civetweb_add_test(PublicServer "Server Requests")
 civetweb_add_test(PublicServer "Handle Form")
 civetweb_add_test(PublicServer "HTTP Authentication")
 civetweb_add_test(PublicServer "HTTP Keep Alive")
+civetweb_add_test(PublicServer "Error handling")
 
 # Timer tests
 civetweb_add_test(Timer "Timer1")

+ 267 - 0
test/public_server.c

@@ -2997,6 +2997,267 @@ START_TEST(test_keep_alive)
 END_TEST
 
 
+START_TEST(test_error_handling)
+{
+	struct mg_context *ctx;
+	FILE *f;
+
+	char bad_thread_num[32] = "badnumber";
+
+	const char *OPTIONS[] = {
+#if !defined(NO_FILES)
+		"document_root",
+		".",
+#endif
+		"error_pages",
+		"./",
+		"listening_ports",
+		"8080",
+		"num_threads",
+		bad_thread_num,
+		"unknown_option",
+		"unknown_option_value",
+		NULL
+	};
+	struct mg_callbacks callbacks;
+	char errmsg[256];
+
+	struct mg_connection *client_conn;
+	char client_err[256];
+	const struct mg_request_info *client_ri;
+	int client_res, i;
+
+	memset(&callbacks, 0, sizeof(callbacks));
+
+	callbacks.log_message = log_msg_func;
+
+	/* test with unknown option */
+	memset(errmsg, 0, sizeof(errmsg));
+	ctx = test_mg_start(&callbacks, (void *)errmsg, OPTIONS);
+
+	/* Details of errmsg may vary, but it may not be empty */
+	ck_assert_str_ne(errmsg, "");
+	ck_assert(ctx == NULL);
+	ck_assert_str_eq(errmsg, "Invalid option: unknown_option");
+
+	/* Remove invalid option */
+	for (i = 0; OPTIONS[i]; i++) {
+		if (strstr(OPTIONS[i], "unknown_option")) {
+			OPTIONS[i] = 0;
+		}
+	}
+
+	/* Test with bad num_thread option */
+	memset(errmsg, 0, sizeof(errmsg));
+	ctx = test_mg_start(&callbacks, (void *)errmsg, OPTIONS);
+
+	/* Details of errmsg may vary, but it may not be empty */
+	ck_assert_str_ne(errmsg, "");
+	ck_assert(ctx == NULL);
+	ck_assert_str_eq(errmsg, "Invalid number of worker threads");
+
+/* Set to a number - but use a number above the limit */
+#ifdef MAX_WORKER_THREADS
+	sprintf(bad_thread_num, "%u", MAX_WORKER_THREADS + 1);
+#else
+	sprintf(bad_thread_num, "%lu", 1000000000lu);
+#endif
+
+	/* Test with bad num_thread option */
+	memset(errmsg, 0, sizeof(errmsg));
+	ctx = test_mg_start(&callbacks, (void *)errmsg, OPTIONS);
+
+	/* Details of errmsg may vary, but it may not be empty */
+	ck_assert_str_ne(errmsg, "");
+	ck_assert(ctx == NULL);
+	ck_assert_str_eq(errmsg, "Too many worker threads");
+
+
+	/* HTTP 1.0 GET request - server is not running */
+	memset(client_err, 0, sizeof(client_err));
+	client_conn =
+	    mg_connect_client("127.0.0.1", 8080, 0, client_err, sizeof(client_err));
+	ck_assert(client_conn == NULL);
+
+	/* Error message detail may vary - it may not be empty ans should contain
+	 * some information "connect" failed */
+	ck_assert_str_ne(client_err, "");
+	ck_assert(strstr(client_err, "connect"));
+
+
+	/* This time start the server with a valid configuration */
+	sprintf(bad_thread_num, "%i", 1);
+	memset(errmsg, 0, sizeof(errmsg));
+	ctx = test_mg_start(&callbacks, (void *)errmsg, OPTIONS);
+
+	ck_assert_str_eq(errmsg, "");
+	ck_assert(ctx != NULL);
+
+
+	/* Server is running now */
+	test_sleep(1);
+
+	/* Remove error files (in case they exist) */
+	(void)remove("error.htm");
+	(void)remove("error4xx.htm");
+	(void)remove("error404.htm");
+
+
+	/* Ask for something not existing - should get default 404 */
+	memset(client_err, 0, sizeof(client_err));
+	client_conn =
+	    mg_connect_client("127.0.0.1", 8080, 0, client_err, sizeof(client_err));
+	ck_assert(client_conn != NULL);
+
+	mg_printf(client_conn, "GET /something/not/existing HTTP/1.0\r\n\r\n");
+	client_res =
+	    mg_get_response(client_conn, client_err, sizeof(client_err), 10000);
+	ck_assert_int_ge(client_res, 0);
+	ck_assert_str_eq(client_err, "");
+	client_ri = mg_get_request_info(client_conn);
+	ck_assert(client_ri != NULL);
+
+	ck_assert_str_eq(client_ri->uri, "404");
+	mg_close_connection(client_conn);
+	test_sleep(1);
+
+	/* Create an error.htm file */
+	f = fopen("error.htm", "wt");
+	ck_assert(f != NULL);
+	(void)fprintf(f, "err-all");
+	(void)fclose(f);
+
+
+	/* Ask for something not existing - should get error.htm */
+	memset(client_err, 0, sizeof(client_err));
+	client_conn =
+	    mg_connect_client("127.0.0.1", 8080, 0, client_err, sizeof(client_err));
+	ck_assert(client_conn != NULL);
+
+	mg_printf(client_conn, "GET /something/not/existing HTTP/1.0\r\n\r\n");
+	client_res =
+	    mg_get_response(client_conn, client_err, sizeof(client_err), 10000);
+	ck_assert_int_ge(client_res, 0);
+	ck_assert_str_eq(client_err, "");
+	client_ri = mg_get_request_info(client_conn);
+	ck_assert(client_ri != NULL);
+
+	ck_assert_str_eq(client_ri->uri, "200");
+
+	client_res = (int)mg_read(client_conn, client_err, sizeof(client_err));
+	mg_close_connection(client_conn);
+	ck_assert_int_eq(client_res, 7);
+	client_err[8] = 0;
+	ck_assert_str_eq(client_err, "err-all");
+	test_sleep(1);
+
+	/* Create an error4xx.htm file */
+	f = fopen("error4xx.htm", "wt");
+	ck_assert(f != NULL);
+	(void)fprintf(f, "err-4xx");
+	(void)fclose(f);
+
+
+	/* Ask for something not existing - should get error4xx.htm */
+	memset(client_err, 0, sizeof(client_err));
+	client_conn =
+	    mg_connect_client("127.0.0.1", 8080, 0, client_err, sizeof(client_err));
+	ck_assert(client_conn != NULL);
+
+	mg_printf(client_conn, "GET /something/not/existing HTTP/1.0\r\n\r\n");
+	client_res =
+	    mg_get_response(client_conn, client_err, sizeof(client_err), 10000);
+	ck_assert_int_ge(client_res, 0);
+	ck_assert_str_eq(client_err, "");
+	client_ri = mg_get_request_info(client_conn);
+	ck_assert(client_ri != NULL);
+
+	ck_assert_str_eq(client_ri->uri, "200");
+
+	client_res = (int)mg_read(client_conn, client_err, sizeof(client_err));
+	mg_close_connection(client_conn);
+	ck_assert_int_eq(client_res, 7);
+	client_err[8] = 0;
+	ck_assert_str_eq(client_err, "err-4xx");
+	test_sleep(1);
+
+	/* Create an error404.htm file */
+	f = fopen("error404.htm", "wt");
+	ck_assert(f != NULL);
+	(void)fprintf(f, "err-404");
+	(void)fclose(f);
+
+
+	/* Ask for something not existing - should get error404.htm */
+	memset(client_err, 0, sizeof(client_err));
+	client_conn =
+	    mg_connect_client("127.0.0.1", 8080, 0, client_err, sizeof(client_err));
+	ck_assert(client_conn != NULL);
+
+	mg_printf(client_conn, "GET /something/not/existing HTTP/1.0\r\n\r\n");
+	client_res =
+	    mg_get_response(client_conn, client_err, sizeof(client_err), 10000);
+	ck_assert_int_ge(client_res, 0);
+	ck_assert_str_eq(client_err, "");
+	client_ri = mg_get_request_info(client_conn);
+	ck_assert(client_ri != NULL);
+
+	ck_assert_str_eq(client_ri->uri, "200");
+
+	client_res = (int)mg_read(client_conn, client_err, sizeof(client_err));
+	mg_close_connection(client_conn);
+	ck_assert_int_eq(client_res, 7);
+	client_err[8] = 0;
+	ck_assert_str_eq(client_err, "err-404");
+	test_sleep(1);
+
+
+	/* Ask in a malformed way - should get error4xx.htm */
+	memset(client_err, 0, sizeof(client_err));
+	client_conn =
+	    mg_connect_client("127.0.0.1", 8080, 0, client_err, sizeof(client_err));
+	ck_assert(client_conn != NULL);
+
+	mg_printf(client_conn, "Gimme some file!\r\n\r\n");
+	client_res =
+	    mg_get_response(client_conn, client_err, sizeof(client_err), 10000);
+	ck_assert_int_ge(client_res, 0);
+	ck_assert_str_eq(client_err, "");
+	client_ri = mg_get_request_info(client_conn);
+	ck_assert(client_ri != NULL);
+
+	ck_assert_str_eq(client_ri->uri, "200");
+
+	client_res = (int)mg_read(client_conn, client_err, sizeof(client_err));
+	mg_close_connection(client_conn);
+	ck_assert_int_eq(client_res, 7);
+	client_err[8] = 0;
+	ck_assert_str_eq(client_err, "err-4xx");
+	test_sleep(1);
+
+
+	/* Remove all error files created by this test */
+	(void)remove("error.htm");
+	(void)remove("error4xx.htm");
+	(void)remove("error404.htm");
+
+
+	/* Stop the server */
+	test_mg_stop(ctx);
+
+
+	/* HTTP 1.1 GET request - must not work, since server is already stopped  */
+	memset(client_err, 0, sizeof(client_err));
+	client_conn =
+	    mg_connect_client("127.0.0.1", 8080, 0, client_err, sizeof(client_err));
+	ck_assert(client_conn == NULL);
+	ck_assert_str_ne(client_err, "");
+
+	test_sleep(1);
+}
+END_TEST
+
+
 Suite *
 make_public_server_suite(void)
 {
@@ -3011,6 +3272,7 @@ make_public_server_suite(void)
 	TCase *const tcase_handle_form = tcase_create("Handle Form");
 	TCase *const tcase_http_auth = tcase_create("HTTP Authentication");
 	TCase *const tcase_keep_alive = tcase_create("HTTP Keep Alive");
+	TCase *const tcase_error_handling = tcase_create("Error handling");
 
 	tcase_add_test(tcase_checktestenv, test_the_test_environment);
 	tcase_set_timeout(tcase_checktestenv, civetweb_min_test_timeout);
@@ -3048,6 +3310,10 @@ make_public_server_suite(void)
 	tcase_set_timeout(tcase_keep_alive, 300);
 	suite_add_tcase(suite, tcase_keep_alive);
 
+	tcase_add_test(tcase_error_handling, test_error_handling);
+	tcase_set_timeout(tcase_error_handling, 300);
+	suite_add_tcase(suite, tcase_error_handling);
+
 	return suite;
 }
 
@@ -3072,6 +3338,7 @@ MAIN_PUBLIC_SERVER(void)
 	test_handle_form(0);
 	test_http_auth(0);
 	test_keep_alive(0);
+	test_error_handling(0);
 
 	printf("\nok: %i\nfailed: %i\n\n", chk_ok, chk_failed);
 }