view mrjunejune/test/create_snapshots.c @ 125:f236c895604e

[MrJuneJune] Added web socket for chat to this.
author June Park <parkjune1995@gmail.com>
date Thu, 08 Jan 2026 08:46:49 -0800
parents 092afa595764
children
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},
    {"/resume", 200, snapshot_path, TEST_HOST, TEST_PORT},
    {"/tools", 200, snapshot_path, TEST_HOST, TEST_PORT},
    {"/tools/markdown_to_html", 200, snapshot_path, TEST_HOST, TEST_PORT},
    {"/tools/file_converter", 200, snapshot_path, TEST_HOST, TEST_PORT},
  };
  int num_success = sizeof(success_snapshots) / sizeof(success_snapshots[0]);

  // Define snapshots for redirect endpoints (301)
  SnapshotConfig redirect_snapshots[] = {
    {"/index.html", 301, snapshot_path, TEST_HOST, TEST_PORT},
    {"/resume/index.html", 301, snapshot_path, TEST_HOST, TEST_PORT},
    {"/tools/index.html", 301, snapshot_path, TEST_HOST, TEST_PORT},
    {"/tools/markdown_to_html/index.html", 301, snapshot_path, TEST_HOST, TEST_PORT},
    {"/tools/file_converter/index.html", 301, snapshot_path, TEST_HOST, TEST_PORT},
  };
  int num_redirects = sizeof(redirect_snapshots) / sizeof(redirect_snapshots[0]);

  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 redirect snapshots
  printf("\nCreating snapshots for redirect paths:\n\n");
  for (int i = 0; i < num_redirects; i++)
  {
    if (Seobeo_Snapshot_Create(&redirect_snapshots[i]) == 0)
    {
      total_passed++;
    }
    else
    {
      total_failed++;
    }
  }

  // Create error snapshots
  printf("\nCreating 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;
  }
}