CI / Web-Barrierefreiheitspruefung (axe, Tastatur, Reflow, Textabstaende) (push) Canceled after 0s
CI / Core-Modul (Build/Vet/Test) (push) Canceled after 0s
CI / DMS Security-Test-Gate (AC5, Merge-Gate) (push) Canceled after 0s
CI / DMS-Modul (Lint/Build/Test/Coverage/Artefakt) (push) Canceled after 0s
CI / DMS-Modul Supply-Chain-Scan (govulncheck) (push) Canceled after 0s
CI / Web (dms-browser) (push) Canceled after 0s
CI / Web (pdf-viewer) (push) Canceled after 0s
CI / Web (shl) (push) Canceled after 0s
Supply-Chain-Scan (Go) / govulncheck (push) Canceled after 0s
66 lines
2.1 KiB
Go
66 lines
2.1 KiB
Go
package thumbnail
|
|
|
|
import (
|
|
"context"
|
|
"os"
|
|
"path/filepath"
|
|
"strings"
|
|
"testing"
|
|
"time"
|
|
)
|
|
|
|
func fakePdftoppm(t *testing.T, script string) string {
|
|
t.Helper()
|
|
path := filepath.Join(t.TempDir(), "pdftoppm")
|
|
if err := os.WriteFile(path, []byte("#!/bin/sh\n"+script+"\n"), 0o700); err != nil {
|
|
t.Fatal(err)
|
|
}
|
|
return path
|
|
}
|
|
|
|
// QA-15 F-13: ein haengender pdftoppm-Lauf wird nach dem Zeitlimit beendet.
|
|
func TestRenderPDFFirstPage_KillsHangingProcessAfterTimeout(t *testing.T) {
|
|
g := &Generator{PdftoppmPath: fakePdftoppm(t, "sleep 60"), RenderTimeout: 300 * time.Millisecond}
|
|
start := time.Now()
|
|
_, err := g.renderPDFFirstPage(context.Background(), []byte("%PDF-1.4"))
|
|
if err == nil || !strings.Contains(err.Error(), "zeitlimit") {
|
|
t.Fatalf("err = %v, erwartet zeitlimit-fehler", err)
|
|
}
|
|
if elapsed := time.Since(start); elapsed > 10*time.Second {
|
|
t.Fatalf("lauf dauerte %s, das zeitlimit greift nicht", elapsed)
|
|
}
|
|
}
|
|
|
|
func TestRenderPDFFirstPage_ParentCancellationStopsProcess(t *testing.T) {
|
|
g := &Generator{PdftoppmPath: fakePdftoppm(t, "sleep 60"), RenderTimeout: time.Minute}
|
|
ctx, cancel := context.WithTimeout(context.Background(), 300*time.Millisecond)
|
|
defer cancel()
|
|
start := time.Now()
|
|
if _, err := g.renderPDFFirstPage(ctx, []byte("%PDF-1.4")); err == nil {
|
|
t.Fatal("kein fehler bei abgebrochenem kontext")
|
|
}
|
|
if elapsed := time.Since(start); elapsed > 10*time.Second {
|
|
t.Fatalf("lauf dauerte %s nach abbruch", elapsed)
|
|
}
|
|
}
|
|
|
|
func TestRenderPDFFirstPage_LongToolOutputIsTruncatedInError(t *testing.T) {
|
|
g := &Generator{PdftoppmPath: fakePdftoppm(t, "yes x | head -c 100000; exit 1")}
|
|
_, err := g.renderPDFFirstPage(context.Background(), []byte("%PDF-1.4"))
|
|
if err == nil {
|
|
t.Fatal("kein fehler")
|
|
}
|
|
if len(err.Error()) > 1000 {
|
|
t.Fatalf("fehlermeldung nicht gekuerzt: %d bytes", len(err.Error()))
|
|
}
|
|
}
|
|
|
|
func TestRenderTimeoutDefault(t *testing.T) {
|
|
if got := (&Generator{}).renderTimeout(); got != defaultRenderTimeout {
|
|
t.Fatalf("standard = %s", got)
|
|
}
|
|
if got := (&Generator{RenderTimeout: 5 * time.Second}).renderTimeout(); got != 5*time.Second {
|
|
t.Fatalf("konfiguriert = %s", got)
|
|
}
|
|
}
|