Mercurial
diff s3/tests/s3_uploader_test.c @ 196:83f16548ba41
[AI] Adding s3 bucket uploader code using Seobeo.
| author | MrJuneJune <me@mrjunejune.com> |
|---|---|
| date | Sat, 14 Feb 2026 16:08:15 -0800 |
| parents | |
| children | 008ca7780c8a |
line wrap: on
line diff
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/s3/tests/s3_uploader_test.c Sat Feb 14 16:08:15 2026 -0800 @@ -0,0 +1,139 @@ +#include "s3/s3_uploader.h" + +#include <stdio.h> +#include <string.h> + +// Simple test for S3 uploader +// Run with: bazel run //s3/tests:s3_uploader_test +// +// Set environment variables before running: +// export AWS_ACCESS_KEY_ID="your-access-key" +// export AWS_SECRET_ACCESS_KEY="your-secret-key" +// export AWS_REGION="us-east-1" +// export AWS_BUCKET="your-bucket" + +int main(int argc, char **argv) +{ + const char *access_key = getenv("AWS_ACCESS_KEY_ID"); + const char *secret_key = getenv("AWS_SECRET_ACCESS_KEY"); + const char *region = getenv("AWS_REGION"); + const char *bucket = getenv("AWS_BUCKET"); + + if (!access_key || !secret_key || !region || !bucket) + { + printf("Missing environment variables. Set:\n"); + printf(" AWS_ACCESS_KEY_ID\n"); + printf(" AWS_SECRET_ACCESS_KEY\n"); + printf(" AWS_REGION\n"); + printf(" AWS_BUCKET\n"); + return 1; + } + + S3_Config config = { + .access_key_id = access_key, + .secret_access_key = secret_key, + .region = region, + .bucket = bucket, + .endpoint = NULL, + .use_path_style = FALSE + }; + + printf("S3 Uploader Test\n"); + printf("================\n"); + printf("Region: %s\n", region); + printf("Bucket: %s\n", bucket); + printf("\n"); + + // Test 1: Upload string data + printf("Test 1: Uploading string data...\n"); + const char *test_data = "Hello from S3 uploader test!"; + S3_Result result = S3_Upload_Data(&config, + (const uint8 *)test_data, + strlen(test_data), + "test/hello.txt", + "text/plain"); + if (result.success) + { + printf(" SUCCESS! ETag: %s\n", result.etag ? result.etag : "(none)"); + } + else + { + printf(" FAILED! Status: %d, Error: %s\n", + result.status_code, + result.error_message ? result.error_message : "(unknown)"); + } + S3_Result_Destroy(&result); + + // Test 2: Content type detection + printf("\nTest 2: Content type detection...\n"); + printf(" .html -> %s\n", S3_Guess_Content_Type("page.html")); + printf(" .png -> %s\n", S3_Guess_Content_Type("image.png")); + printf(" .json -> %s\n", S3_Guess_Content_Type("data.json")); + printf(" .xyz -> %s\n", S3_Guess_Content_Type("unknown.xyz")); + + // Test 3: Generate presigned PUT URL + printf("\nTest 3: Generating presigned PUT URL...\n"); + S3_Presigned_URL put_url = S3_Presign_Put(&config, + "uploads/client-upload.png", + "image/png", + 3600); // 1 hour + if (put_url.success) + { + printf(" SUCCESS!\n"); + printf(" URL: %s\n", put_url.url); + printf("\n Client can upload with:\n"); + printf(" curl -X PUT -H \"Content-Type: image/png\" --data-binary @file.png \"$URL\"\n"); + } + else + { + printf(" FAILED! Error: %s\n", put_url.error_message ? put_url.error_message : "(unknown)"); + } + S3_Presigned_URL_Destroy(&put_url); + + // Test 4: Generate presigned GET URL + printf("\nTest 4: Generating presigned GET URL...\n"); + S3_Presigned_URL get_url = S3_Presign_Get(&config, + "uploads/client-upload.png", + 3600); // 1 hour + if (get_url.success) + { + printf(" SUCCESS!\n"); + printf(" URL: %s\n", get_url.url); + printf("\n Client can download with:\n"); + printf(" curl \"$URL\" -o file.png\n"); + } + else + { + printf(" FAILED! Error: %s\n", get_url.error_message ? get_url.error_message : "(unknown)"); + } + S3_Presigned_URL_Destroy(&get_url); + + // Test 5: Upload file (if provided as argument) + if (argc >= 3) + { + printf("\nTest 5: Uploading file...\n"); + printf(" Local: %s\n", argv[1]); + printf(" S3 Key: %s\n", argv[2]); + + result = S3_Upload_File(&config, argv[1], argv[2]); + if (result.success) + { + printf(" SUCCESS! ETag: %s\n", result.etag ? result.etag : "(none)"); + } + else + { + printf(" FAILED! Status: %d, Error: %s\n", + result.status_code, + result.error_message ? result.error_message : "(unknown)"); + } + S3_Result_Destroy(&result); + } + else + { + printf("\nTest 5: Skipped (no file path provided)\n"); + printf(" Usage: %s <local_file> <s3_key>\n", argv[0]); + } + + printf("\nDone!\n"); + return 0; +}