Mercurial
view mrjunejune/test/latex_renderer_test.c @ 256:30c2196d03d4
[site] Integrate Zenbu themes and components
Co-authored-by: Copilot <[email protected]>
| author | MrJuneJune <me@mrjunejune.com> |
|---|---|
| date | Tue, 04 Aug 2026 16:49:01 -0700 |
| parents | b8b6e726964a |
| children |
line wrap: on
line source
#include "mrjunejune/latex_renderer.h" #include <assert.h> #include <dirent.h> #include <stdio.h> #include <string.h> #include <unistd.h> static size_t latex_workspace_count(void) { DIR *directory = opendir("/tmp"); assert(directory); size_t count = 0; struct dirent *entry; while ((entry = readdir(directory)) != NULL) { if (strncmp(entry->d_name, "mrjunejune-latex-", 19) == 0) count++; } closedir(directory); return count; } int main(void) { assert(chdir("/") == 0); size_t initial_workspaces = latex_workspace_count(); const char *valid = "\\documentclass{article}\n" "\\begin{document}\n" "Hello from the sandbox. $x^2 + y^2 = z^2$\n" "\\end{document}\n"; Latex_Render_Result result = Latex_Render( (const uint8 *)valid, strlen(valid)); if (result.status != LATEX_RENDER_OK) fprintf(stderr, "%s\n", result.diagnostics ? result.diagnostics : "unknown error"); assert(result.status == LATEX_RENDER_OK); assert(result.pdf_size > 1000); assert(memcmp(result.pdf_data, "%PDF-", 5) == 0); Latex_Render_Result_Destroy(&result); const char *invalid = "\\documentclass{article}\n" "\\begin{document}\n" "\\notarealcommand\n" "\\end{document}\n"; result = Latex_Render((const uint8 *)invalid, strlen(invalid)); assert(result.status == LATEX_RENDER_COMPILE_ERROR); assert(result.diagnostics); assert(strstr(result.diagnostics, "Undefined control sequence")); Latex_Render_Result_Destroy(&result); const char *host_read = "\\documentclass{article}\n" "\\begin{document}\n" "\\input{/etc/passwd}\n" "\\end{document}\n"; result = Latex_Render((const uint8 *)host_read, strlen(host_read)); assert(result.status == LATEX_RENDER_COMPILE_ERROR); assert(result.diagnostics); assert(!strstr(result.diagnostics, "root:x:")); Latex_Render_Result_Destroy(&result); char shell_path[128]; snprintf( shell_path, sizeof(shell_path), "/tmp/mrjunejune-latex-shell-%ld", (long)getpid()); char shell_escape[512]; snprintf( shell_escape, sizeof(shell_escape), "\\documentclass{article}\n" "\\begin{document}\n" "\\immediate\\write18{touch %s}\n" "Shell escape must stay disabled.\n" "\\end{document}\n", shell_path); result = Latex_Render( (const uint8 *)shell_escape, strlen(shell_escape)); assert(result.status == LATEX_RENDER_OK); assert(access(shell_path, F_OK) != 0); Latex_Render_Result_Destroy(&result); uint8 oversized[LATEX_SOURCE_MAX_BYTES + 1] = {0}; memset(oversized, 'x', sizeof(oversized)); result = Latex_Render(oversized, sizeof(oversized)); assert(result.status == LATEX_RENDER_INVALID_INPUT); Latex_Render_Result_Destroy(&result); const char *infinite = "\\documentclass{article}\n" "\\begin{document}\n" "\\loop\\iftrue\\repeat\n" "\\end{document}\n"; result = Latex_Render((const uint8 *)infinite, strlen(infinite)); assert(result.status == LATEX_RENDER_TIMEOUT); Latex_Render_Result_Destroy(&result); assert(latex_workspace_count() == initial_workspaces); return 0; }