Mercurial
diff mrjunejune/test/integration_test.c @ 126:e7899c93da77
Remove playground.
| author | June Park <parkjune1995@gmail.com> |
|---|---|
| date | Thu, 08 Jan 2026 18:03:34 -0800 |
| parents | 96628cf126a0 |
| children | 7eb79fd91c7e |
line wrap: on
line diff
--- a/mrjunejune/test/integration_test.c Thu Jan 08 08:46:49 2026 -0800 +++ b/mrjunejune/test/integration_test.c Thu Jan 08 18:03:34 2026 -0800 @@ -1,19 +1,4 @@ -#include "seobeo/seobeo.h" -#include <stdio.h> -#include <stdlib.h> -#include <string.h> -#include <unistd.h> -#include <sys/wait.h> -#include <signal.h> -#include <assert.h> - -#define TEST_PORT "6969" -#define TEST_HOST "127.0.0.1" -#define MAX_RESPONSE_SIZE (1024 * 1024) -#ifndef SNAPSHOT_DIR - // TODO: Make it as current directory /snapshots... - #define SNAPSHOT_DIR "mrjunejune/test/snapshots" -#endif +#include "seobeo/test/test.h" // Test case structure typedef struct { @@ -117,274 +102,67 @@ return 0; } -// Helper: Create test client -Seobeo_Handle* create_test_client() -{ - Seobeo_Handle *client = Seobeo_Stream_Handle_Client_Create(TEST_HOST, TEST_PORT, FALSE); - if (!client || client->socket < 0) - { - if (client) - { - Seobeo_Handle_Destroy(client); - } - return NULL; - } - return client; -} - -// Helper: Generate default HTTP GET request -int generate_http_get_request(char *buffer, size_t buffer_size, const char *path) +int execute_test_case(TestCase *test, pid_t server_pid) { - return snprintf( - buffer, buffer_size, - "GET %s HTTP/1.1\r\n" - "Host: %s\r\n" - "Connection: close\r\n" - "Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8\r\n" - "User-Agent: SeobeoTestClient/1.0\r\n" - "\r\n", - path, TEST_HOST - ); -} - -// Helper: Send HTTP request -int send_http_request(Seobeo_Handle *client, const char *path, const char *custom_request) -{ - char request_buffer[4096]; - int request_len; - - if (custom_request) + printf(" Testing: GET %s (expecting %d)\n", test->path, test->expected_status); + + int32 max_url_length = 1024*3; + char *url = malloc(sizeof(char)*max_url_length); + snprintf(url, max_url_length, "%s%s", TEST_URL, test->path); + Seobeo_Client_Request *p_req = Seobeo_Client_Request_Create(url); + if (!p_req) { - request_len = snprintf(request_buffer, sizeof(request_buffer), "%s", custom_request); - } - else - { - request_len = generate_http_get_request(request_buffer, sizeof(request_buffer), path); - } - - if (request_len < 0 || request_len >= sizeof(request_buffer)) - { - fprintf(stderr, "Request buffer too small\n"); - return -1; - } - - Seobeo_Handle_Queue(client, (uint8*)request_buffer, (uint32)request_len); - return Seobeo_Handle_Flush(client); -} - -// Helper: Read HTTP response -int read_http_response(Seobeo_Handle *client, char **response_out, size_t *response_len_out) -{ - char *response = malloc(MAX_RESPONSE_SIZE); - if (!response) - { + printf("Can't create requests"); return -1; } - size_t total_bytes = 0; - int attempts = 0; - const int max_attempts = 100; - - while (attempts++ < max_attempts && total_bytes < MAX_RESPONSE_SIZE - 1) + Seobeo_Client_Response *p_resp = Seobeo_Client_Request_Execute(p_req); + if (!p_resp) { - int bytes_read = Seobeo_Handle_Read(client); - - if (bytes_read > 0) - { - size_t to_copy = client->read_buffer_len; - if (total_bytes + to_copy > MAX_RESPONSE_SIZE - 1) - { - to_copy = MAX_RESPONSE_SIZE - 1 - total_bytes; - } - - memcpy(response + total_bytes, client->read_buffer, to_copy); - total_bytes += to_copy; - Seobeo_Handle_Consume(client, (uint32)to_copy); - } - else if (bytes_read == -2) - { - // Connection closed - break; - } - else if (bytes_read == 0) - { - // Would block - usleep(10000); - continue; - } - else - { - free(response); - return -1; - } - } - - response[total_bytes] = '\0'; - *response_out = response; - *response_len_out = total_bytes; - - return (total_bytes > 0) ? 0 : -1; -} - -// Helper: Parse HTTP status code -int parse_http_status(const char *response) -{ - if (!response || strlen(response) < 12) - { - return -1; - } - - const char *status_start = strstr(response, "HTTP/1.1 "); - if (!status_start) - { - status_start = strstr(response, "HTTP/1.0 "); - } - - if (!status_start) - { + printf("No response"); return -1; } - int status_code; - if (sscanf(status_start + 9, "%d", &status_code) == 1) + if (p_resp->status_code != test->expected_status) { - return status_code; - } - - return -1; -} - -// Helper: Check if status is a redirect -int is_redirect_status(int status) -{ - return (status >= 300 && status < 400); -} - -// Helper: Execute a test case -int execute_test_case(TestCase *test, pid_t server_pid) -{ - printf(" Testing: GET %s (expecting %d)\n", test->path, test->expected_status); - - Seobeo_Handle *client = create_test_client(); - if (!client) - { - printf(" ✗ Failed to create client connection\n"); - return -1; - } - - if (send_http_request(client, test->path, NULL) < 0) - { - printf(" ✗ Failed to send request\n"); - Seobeo_Handle_Destroy(client); + printf(" ✗ Status mismatch: expected %d, got %d\n", + test->expected_status, p_resp->status_code); + Seobeo_Client_Response_Destroy(p_resp); + Seobeo_Client_Request_Destroy(p_req); return -1; } - char *response = NULL; - size_t response_len = 0; - if (read_http_response(client, &response, &response_len) < 0) - { - printf(" ✗ Failed to read response\n"); - Seobeo_Handle_Destroy(client); - return -1; - } - - test->actual_response = response; - test->response_len = response_len; + printf(" ✓ Status code: %d\n", p_resp->status_code); - int actual_status = parse_http_status(response); - if (actual_status != test->expected_status) - { - printf(" ✗ Status mismatch: expected %d, got %d\n", - test->expected_status, actual_status); - Seobeo_Handle_Destroy(client); - return -1; - } - - printf(" ✓ Status code: %d\n", actual_status); - - // For redirects, skip content comparison - if (is_redirect_status(actual_status)) - { - printf(" ⚠ Redirect status - skipping content comparison\n"); - Seobeo_Handle_Destroy(client); - return 0; - } - - // Only verify 200 OK responses against snapshots - if (actual_status == 200) + if (p_resp->status_code == 200) { if (!test->expected_content) { printf(" ✗ No expected snapshot found: %s\n", test->expected_file_path); printf(" → Run: bazel run //mrjunejune:create_snapshots\n"); - Seobeo_Handle_Destroy(client); + Seobeo_Client_Response_Destroy(p_resp); + Seobeo_Client_Request_Destroy(p_req); return -1; } - if (strcmp(response, test->expected_content) != 0) + if (strcmp(p_resp->body, test->expected_content) != 0) { printf(" ✗ Response does not match expected snapshot\n"); printf(" Expected file: %s\n", test->expected_file_path); - Seobeo_Handle_Destroy(client); + Seobeo_Client_Response_Destroy(p_resp); + Seobeo_Client_Request_Destroy(p_req); return -1; } - printf(" ✓ Response matches snapshot (%zu bytes)\n", response_len); + printf(" ✓ Response matches snapshot (%zu bytes)\n", p_resp->body_length); } - Seobeo_Handle_Destroy(client); + Seobeo_Client_Response_Destroy(p_resp); + Seobeo_Client_Request_Destroy(p_req); return 0; } -// Helper: Execute custom request test -int execute_custom_request_test(const char *name, const char *custom_request, - int expected_status, pid_t server_pid) -{ - printf(" Testing: %s (expecting %d)\n", name, expected_status); - - Seobeo_Handle *client = create_test_client(); - if (!client) - { - printf(" ✗ Failed to create client connection\n"); - return -1; - } - - if (send_http_request(client, NULL, custom_request) < 0) - { - printf(" ✗ Failed to send request\n"); - Seobeo_Handle_Destroy(client); - return -1; - } - - char *response = NULL; - size_t response_len = 0; - if (read_http_response(client, &response, &response_len) < 0) - { - printf(" ✗ Failed to read response\n"); - Seobeo_Handle_Destroy(client); - return -1; - } - - int actual_status = parse_http_status(response); - if (actual_status != expected_status) - { - printf(" ✗ Status mismatch: expected %d, got %d\n", - expected_status, actual_status); - free(response); - Seobeo_Handle_Destroy(client); - return -1; - } - - printf(" ✓ Status code: %d\n", actual_status); - printf(" ✓ Response received (%zu bytes)\n", response_len); - - free(response); - Seobeo_Handle_Destroy(client); - return 0; -} - -// Helper: Send POST request with file data -int send_post_file(Seobeo_Handle *client, const char *path, const char *file_data, size_t file_size) +int send_post_file(Seobeo_Handle *p_req, const char *path, const char *file_data, size_t file_size) { char request_buffer[8192]; int header_len = snprintf( @@ -405,7 +183,7 @@ } // Send headers - Seobeo_Handle_Queue(client, (uint8*)request_buffer, (uint32)header_len); + Seobeo_Handle_Queue(p_req, (uint8*)request_buffer, (uint32)header_len); // Send file data in chunks if needed size_t remaining = file_size; @@ -413,15 +191,14 @@ while (remaining > 0) { size_t chunk_size = remaining > 4096 ? 4096 : remaining; - Seobeo_Handle_Queue(client, (uint8*)ptr, (uint32)chunk_size); + Seobeo_Handle_Queue(p_req, (uint8*)ptr, (uint32)chunk_size); ptr += chunk_size; remaining -= chunk_size; } - return Seobeo_Handle_Flush(client); + return Seobeo_Handle_Flush(p_req); } -// Helper: Extract JSON field value from response body char* extract_json_field(const char *json, const char *field, char *buffer, size_t buffer_size) { char search_pattern[256]; @@ -452,7 +229,6 @@ return buffer; } -// Helper: Test POST file conversion int test_file_conversion(const char *endpoint, const char *test_file_path, const char *expected_format, pid_t server_pid) { @@ -461,152 +237,66 @@ // Read test file size_t file_size; char *file_data = read_file(test_file_path, &file_size); - if (!file_data) - { + if (!file_data) { printf(" ✗ Failed to read test file: %s\n", test_file_path); return -1; } - printf(" → Loaded test file (%zu bytes)\n", file_size); + char url[1024]; + snprintf(url, sizeof(url), "%s%s", TEST_URL, endpoint); - // Create client and send request - Seobeo_Handle *client = create_test_client(); - if (!client) - { - printf(" ✗ Failed to create client connection\n"); - free(file_data); - return -1; - } + Seobeo_Client_Request *p_req = Seobeo_Client_Request_Create(url); + Seobeo_Client_Request_Set_Method(p_req, "POST"); + Seobeo_Client_Request_Set_Body(p_req, (uint8*)file_data, (uint32)file_size); + Seobeo_Client_Request_Add_Header_Array(p_req, "Content-Type: application/octet-stream"); - if (send_post_file(client, endpoint, file_data, file_size) < 0) - { - printf(" ✗ Failed to send POST request\n"); - free(file_data); - Seobeo_Handle_Destroy(client); - return -1; - } - + Seobeo_Client_Response *p_resp = Seobeo_Client_Request_Execute(p_req); free(file_data); - // Read response - char *response = NULL; - size_t response_len = 0; - if (read_http_response(client, &response, &response_len) < 0) - { - printf(" ✗ Failed to read response\n"); - Seobeo_Handle_Destroy(client); - return -1; - } - - Seobeo_Handle_Destroy(client); + if (!p_resp || p_resp->status_code != 200) { + printf(" ✗ Conversion failed with status: %d\n", p_resp ? p_resp->status_code : 0); + if (p_resp) Seobeo_Client_Response_Destroy(p_resp); - // Parse status - int status = parse_http_status(response); - if (status != 200) - { - printf(" ✗ Conversion failed with status: %d\n", status); - printf(" Response: %s\n", response); - free(response); - return -1; - } - - printf(" ✓ Status code: 200\n"); - - // Extract download URL from JSON response - const char *body = strstr(response, "\r\n\r\n"); - if (!body) - { - printf(" ✗ No response body found\n"); - free(response); - return -1; - } - body += 4; - - char download_url[512]; - if (!extract_json_field(body, "download_url", download_url, sizeof(download_url))) - { - printf(" ✗ Failed to extract download_url from response\n"); - printf(" Response body: %s\n", body); - free(response); + Seobeo_Client_Response_Destroy(p_resp); + Seobeo_Client_Request_Destroy(p_req); return -1; } - printf(" ✓ Conversion succeeded\n"); - printf(" ✓ Download URL: %s\n", download_url); - free(response); - - // Test downloading the converted file - printf(" → Testing download: GET %s\n", download_url); - - client = create_test_client(); - if (!client) - { - printf(" ✗ Failed to create client for download\n"); - return -1; - } - - if (send_http_request(client, download_url, NULL) < 0) - { - printf(" ✗ Failed to send download request\n"); - Seobeo_Handle_Destroy(client); - return -1; - } - - response = NULL; - response_len = 0; - if (read_http_response(client, &response, &response_len) < 0) - { - printf(" ✗ Failed to read download response\n"); - Seobeo_Handle_Destroy(client); + // Extract download URL from JSON body + char download_url_path[512]; + if (!extract_json_field((char*)p_resp->body, "download_url", download_url_path, sizeof(download_url_path))) { + printf(" ✗ Failed to extract download_url\n"); + Seobeo_Client_Response_Destroy(p_resp); + Seobeo_Client_Request_Destroy(p_req); return -1; } - Seobeo_Handle_Destroy(client); + printf(" ✓ Conversion succeeded. Download URL: %s\n", download_url_path); + Seobeo_Client_Response_Destroy(p_resp); + Seobeo_Client_Request_Destroy(p_req); - status = parse_http_status(response); - if (status != 200) + printf(" → Testing download: GET %s\n", download_url_path); + char full_download_url[1024]; + snprintf(full_download_url, sizeof(full_download_url), "%s%s", TEST_URL, download_url_path); + + p_req = Seobeo_Client_Request_Create(full_download_url); + p_resp = Seobeo_Client_Request_Execute(p_req); + + if (!p_resp || p_resp->status_code != 200) { - printf(" ✗ Download failed with status: %d\n", status); - free(response); + printf(" ✗ Download failed\n"); + if (p_resp) Seobeo_Client_Response_Destroy(p_resp); + Seobeo_Client_Request_Destroy(p_req); return -1; } - // Find body in download response - body = strstr(response, "\r\n\r\n"); - if (!body) - { - printf(" ✗ No file data in download response\n"); - free(response); - return -1; - } - body += 4; - - size_t downloaded_size = response_len - (body - response); + printf(" ✓ Downloaded converted file (%u bytes)\n", p_resp->body_length); - // Verify content type in response headers - const char *content_type = strstr(response, "Content-Type: "); - if (!content_type) - { - printf(" ✗ No Content-Type header in download\n"); - free(response); - return -1; - } - - if (strstr(content_type, expected_format) == NULL) - { - printf(" ✗ Wrong content type (expected %s)\n", expected_format); - free(response); - return -1; - } - - printf(" ✓ Downloaded converted file (%zu bytes)\n", downloaded_size); - printf(" ✓ Content-Type: %s\n", expected_format); - - free(response); + Seobeo_Client_Response_Destroy(p_resp); + Seobeo_Client_Request_Destroy(p_req); return 0; } -// Helper: Start test server pid_t start_test_server(const char *server_binary) { pid_t server_pid = fork(); @@ -694,14 +384,12 @@ // Main integration test int test_server_client_integration(const char *server_binary) { - printf("=== Server-Client Integration Test ===\n"); + printf("=== Server-p_req Integration Test ===\n"); printf("MODE: Verifying Against Snapshots\n\n"); char cwd[1024]; if (getcwd(cwd, sizeof(cwd)) != NULL) - { printf("Working directory: %s\n", cwd); - } if (access(server_binary, X_OK) != 0) { @@ -714,14 +402,11 @@ pid_t server_pid = start_test_server(server_binary); if (server_pid < 0) - { return -1; - } int failed_tests = 0; int passed_tests = 0; - // Define test cases - paths that should succeed (200 OK) TestCase success_tests[] = { {"/", 200, NULL, NULL, NULL, 0}, {"/resume", 200, NULL, NULL, NULL, 0}, @@ -731,7 +416,6 @@ }; int num_success_tests = sizeof(success_tests) / sizeof(success_tests[0]); - // Define test cases - paths that should redirect (301) TestCase redirect_tests[] = { {"/index.html", 301, NULL, NULL, NULL, 0}, {"/resume/index.html", 301, NULL, NULL, NULL, 0}, @@ -741,7 +425,6 @@ }; int num_redirect_tests = sizeof(redirect_tests) / sizeof(redirect_tests[0]); - // Define test cases - paths that should fail (404) TestCase failure_tests[] = { {"/nonexistent", 404, NULL, NULL, NULL, 0}, {"/does/not/exist", 404, NULL, NULL, NULL, 0}, @@ -749,134 +432,73 @@ }; int num_failure_tests = sizeof(failure_tests) / sizeof(failure_tests[0]); - // Initialize all test cases for (int i = 0; i < num_success_tests; i++) - { init_test_case(&success_tests[i]); - } + for (int i = 0; i < num_redirect_tests; i++) - { init_test_case(&redirect_tests[i]); - } + for (int i = 0; i < num_failure_tests; i++) - { init_test_case(&failure_tests[i]); - } - // Run success tests printf("Running tests for paths that should succeed:\n"); for (int i = 0; i < num_success_tests; i++) { if (execute_test_case(&success_tests[i], server_pid) == 0) - { passed_tests++; - } else - { failed_tests++; - } } printf("\n"); - // Run redirect tests printf("Running tests for paths that should redirect:\n"); for (int i = 0; i < num_redirect_tests; i++) { if (execute_test_case(&redirect_tests[i], server_pid) == 0) - { passed_tests++; - } else - { failed_tests++; - } - } - - printf("\n"); - - // Run failure tests - printf("Running tests for paths that should fail:\n"); - for (int i = 0; i < num_failure_tests; i++) - { - if (execute_test_case(&failure_tests[i], server_pid) == 0) - { - passed_tests++; - } - else - { - failed_tests++; - } } printf("\n"); - // Test with custom request - printf("Running tests with custom requests:\n"); - char custom_request[4096]; - snprintf(custom_request, sizeof(custom_request), - "GET / HTTP/1.1\r\n" - "Host: %s\r\n" - "Connection: close\r\n" - "X-Custom-Header: TestValue\r\n" - "\r\n", - TEST_HOST); - - if (execute_custom_request_test("Custom headers GET /", custom_request, 200, server_pid) == 0) + printf("Running tests for paths that should fail:\n"); + for (int i = 0; i < num_failure_tests; i++) { - passed_tests++; - } - else - { - failed_tests++; + if (execute_test_case(&failure_tests[i], server_pid) == 0) + passed_tests++; + else + failed_tests++; } printf("\n"); - // Test POST endpoints printf("Running tests for POST conversion endpoints:\n"); - - // Test image-to-webp conversion if (test_file_conversion("/api/convert/image-to-webp", "mrjunejune/test/shiba.webp", "image/webp", server_pid) == 0) - { passed_tests++; - } else - { failed_tests++; - } printf("\n"); - // Test video-to-mp4 conversion if (test_file_conversion("/api/convert/video-to-mp4", "mrjunejune/test/test_avi.avi", "video/mp4", server_pid) == 0) - { passed_tests++; - } else - { failed_tests++; - } - // Cleanup test cases for (int i = 0; i < num_success_tests; i++) - { cleanup_test_case(&success_tests[i]); - } for (int i = 0; i < num_redirect_tests; i++) - { cleanup_test_case(&redirect_tests[i]); - } for (int i = 0; i < num_failure_tests; i++) - { cleanup_test_case(&failure_tests[i]); - } stop_test_server(server_pid); @@ -893,20 +515,14 @@ const char *server_binary = "./mrjunejune_server"; if (argc > 1) - { server_binary = argv[1]; - } int result = test_server_client_integration(server_binary); if (result == 0) - { printf("\n✓ All tests passed!\n"); - } else - { printf("\n✗ Some tests failed\n"); - } return result; }