feat(api): add debug route

This commit is contained in:
Julien Neuhart
2025-02-04 10:20:29 +01:00
parent 740e701ad3
commit a1596f7c62
22 changed files with 628 additions and 4 deletions

View File

@@ -5,7 +5,10 @@ import (
"errors"
"fmt"
"os"
"os/exec"
"path/filepath"
"strings"
"syscall"
"go.uber.org/zap"
@@ -52,6 +55,32 @@ func (engine *PdfCpu) Validate() error {
return nil
}
// Debug returns additional debug data.
func (engine *PdfCpu) Debug() map[string]interface{} {
debug := make(map[string]interface{})
cmd := exec.Command(engine.binPath, "version") //nolint:gosec
cmd.SysProcAttr = &syscall.SysProcAttr{Setpgid: true}
output, err := cmd.Output()
if err != nil {
debug["version"] = err.Error()
return debug
}
debug["version"] = "Unable to determine pdfcpu version"
lines := strings.Split(string(output), "\n")
for _, line := range lines {
if strings.HasPrefix(line, "pdfcpu:") {
debug["version"] = strings.TrimSpace(strings.TrimPrefix(line, "pdfcpu:"))
break
}
}
return debug
}
// Merge combines multiple PDFs into a single PDF.
func (engine *PdfCpu) Merge(ctx context.Context, logger *zap.Logger, inputPaths []string, outputPath string) error {
var args []string
@@ -132,5 +161,6 @@ var (
_ gotenberg.Module = (*PdfCpu)(nil)
_ gotenberg.Provisioner = (*PdfCpu)(nil)
_ gotenberg.Validator = (*PdfCpu)(nil)
_ gotenberg.Debuggable = (*PdfCpu)(nil)
_ gotenberg.PdfEngine = (*PdfCpu)(nil)
)

View File

@@ -71,6 +71,59 @@ func TestPdfCpu_Validate(t *testing.T) {
}
}
func TestPdfCpu_Debug(t *testing.T) {
for _, tc := range []struct {
scenario string
engine *PdfCpu
expect map[string]interface{}
doNotExpect map[string]interface{}
}{
{
scenario: "cannot determine version (command error)",
engine: &PdfCpu{
binPath: "foo",
},
expect: map[string]interface{}{
"version": `exec: "foo": executable file not found in $PATH`,
},
},
{
scenario: "cannot determine version (no pdfcpu)",
engine: &PdfCpu{
binPath: "echo",
},
expect: map[string]interface{}{
"version": "Unable to determine pdfcpu version",
},
},
{
scenario: "success",
engine: &PdfCpu{
binPath: "pdfcpu",
},
doNotExpect: map[string]interface{}{
"version": "Unable to determine pdfcpu version",
},
},
} {
t.Run(tc.scenario, func(t *testing.T) {
d := tc.engine.Debug()
if tc.expect != nil {
if !reflect.DeepEqual(d, tc.expect) {
t.Errorf("expected '%v' but got '%v'", tc.expect, d)
}
}
if tc.doNotExpect != nil {
if reflect.DeepEqual(d, tc.doNotExpect) {
t.Errorf("did not expect '%v'", d)
}
}
})
}
}
func TestPdfCpu_Merge(t *testing.T) {
for _, tc := range []struct {
scenario string