Mercurial
view 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 source
#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; }