view s3/tests/s3_uploader_test.c @ 197:0106cb67d958

env var ignore.
author MrJuneJune <me@mrjunejune.com>
date Sat, 14 Feb 2026 16:08:47 -0800
parents 83f16548ba41
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;
}