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;
+}