view mrjunejune/test/create_snapshots.c @ 71:75de5903355c

Giagantic changes that update Dowa library to be more align with stb style array and hashmap. Updated Seobeo to be caching on server side instead of file level caching. Deleted bunch of things I don't really use.
author June Park <parkjune1995@gmail.com>
date Sun, 28 Dec 2025 20:34:22 -0800
parents 6626ec933933
children 092afa595764
line wrap: on
line source

#include "seobeo/seobeo.h"
#include "seobeo/snapshot_creator.h"
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <sys/wait.h>
#include <signal.h>

#define TEST_PORT "6969"
#define TEST_HOST "127.0.0.1"
#define SNAPSHOT_DIR "mrjunejune/test/snapshots"

// Start the server process
static pid_t start_server(const char *server_binary)
{
  pid_t server_pid = fork();

  if (server_pid < 0)
  {
    perror("fork");
    return -1;
  }

  if (server_pid == 0)
  {
    // Child process - run server
    printf("Starting server on port %s...\n", TEST_PORT);
    execl(server_binary, server_binary, NULL);
    perror("execl failed");
    exit(1);
  }

  // Parent - verify server started
  printf("Server started (PID: %d)\n", server_pid);

  usleep(100000);
  int status;
  pid_t result = waitpid(server_pid, &status, WNOHANG);
  if (result != 0)
  {
    if (WIFEXITED(status))
    {
      fprintf(stderr, "Server exited with code: %d\n", WEXITSTATUS(status));
    }
    else if (WIFSIGNALED(status))
    {
      fprintf(stderr, "Server killed by signal: %d\n", WTERMSIG(status));
    }
    return -1;
  }

  sleep(2);
  printf("Server ready\n\n");

  return server_pid;
}

// Stop the server process
static void stop_server_test(pid_t server_pid)
{
  if (server_pid > 0)
  {
    printf("\nStopping server (PID: %d)...\n", server_pid);
    kill(server_pid, SIGTERM);
    waitpid(server_pid, NULL, 0);
    printf("Server stopped\n");
  }
}

int main(int argc, char *argv[])
{
  printf("=== Seobeo Snapshot Creator ===\n\n");

  // Get workspace directory (where the source files are)
  const char *workspace_dir = getenv("BUILD_WORKSPACE_DIRECTORY");
  if (!workspace_dir)
  {
    fprintf(stderr, "Error: BUILD_WORKSPACE_DIRECTORY not set\n");
    fprintf(stderr, "This binary must be run with 'bazel run'\n");
    return 1;
  }

  // Construct full path to snapshot directory
  char snapshot_path[1024];
  snprintf(snapshot_path, sizeof(snapshot_path), "%s/%s", workspace_dir, SNAPSHOT_DIR);

  // Get server binary path
  const char *server_binary = "./mrjunejune_server";
  if (argc > 1)
  {
    server_binary = argv[1];
  }

  printf("Workspace: %s\n", workspace_dir);
  printf("Server binary: %s\n", server_binary);
  printf("Snapshot directory: %s\n\n", snapshot_path);

  // Start server
  pid_t server_pid = start_server(server_binary);
  if (server_pid < 0)
  {
    fprintf(stderr, "Failed to start server\n");
    return 1;
  }

  // Define snapshots to create - paths that should succeed (200 OK)
  SnapshotConfig success_snapshots[] = {
    {"/", 200, snapshot_path, TEST_HOST, TEST_PORT},
    {"/index.html", 200, snapshot_path, TEST_HOST, TEST_PORT},
  };
  int num_success = sizeof(success_snapshots) / sizeof(success_snapshots[0]);

  // Define snapshots for error paths (404)
  SnapshotConfig error_snapshots[] = {
    {"/nonexistent", 404, snapshot_path, TEST_HOST, TEST_PORT},
    {"/does/not/exist", 404, snapshot_path, TEST_HOST, TEST_PORT},
    {"/missing.html", 404, snapshot_path, TEST_HOST, TEST_PORT},
  };
  int num_errors = sizeof(error_snapshots) / sizeof(error_snapshots[0]);

  int total_failed = 0;
  int total_passed = 0;

  // Create success snapshots
  printf("Creating snapshots for successful paths:\n\n");
  for (int i = 0; i < num_success; i++)
  {
    if (Seobeo_Snapshot_Create(&success_snapshots[i]) == 0)
    {
      total_passed++;
    }
    else
    {
      total_failed++;
    }
  }

  // Create error snapshots
  printf("Creating snapshots for error paths:\n\n");
  for (int i = 0; i < num_errors; i++)
  {
    if (Seobeo_Snapshot_Create(&error_snapshots[i]) == 0)
    {
      total_passed++;
    }
    else
    {
      total_failed++;
    }
  }

  // Stop server
  stop_server_test(server_pid);

  // Print summary
  printf("\n=== Summary ===\n");
  printf("Snapshots created: %d\n", total_passed);
  printf("Failed: %d\n", total_failed);

  if (total_failed == 0)
  {
    printf("\n✓ All snapshots created successfully!\n");
    printf("\nSnapshots saved to: %s/\n", snapshot_path);
    printf("\nRun tests to verify:\n");
    printf("  bazel test //mrjunejune:integration_test\n");
    return 0;
  }
  else
  {
    printf("\n✗ Some snapshots failed\n");
    return 1;
  }
}