internal/format/exiftool_test.go

main
gallery/internal/format/exiftool_test.go history · blame · raw

58 lines · 1178 bytes

 1package format
 2
 3import (
 4	"errors"
 5	"os"
 6	"syscall"
 7	"testing"
 8	"time"
 9)
10
11func TestMain(m *testing.M) {
12	code := m.Run()
13	CloseExiftool()
14	os.Exit(code)
15}
16
17func TestExiftoolCloseEndsProcess(t *testing.T) {
18	requireTools(t)
19	var e exiftool
20	if _, err := e.run("-ver"); err != nil {
21		t.Fatal(err)
22	}
23	pid := e.cmd.Process.Pid
24	e.close()
25	if e.cmd != nil {
26		t.Fatal("cmd not cleared")
27	}
28	if err := syscall.Kill(pid, 0); !errors.Is(err, syscall.ESRCH) {
29		t.Fatalf("exiftool pid %d still running after close (kill 0: %v)", pid, err)
30	}
31}
32
33func TestExiftoolRunAfterCloseFails(t *testing.T) {
34	requireTools(t)
35	var e exiftool
36	e.close()
37	before := exiftoolStarts.Load()
38	if _, err := e.run("-ver"); err == nil {
39		t.Fatal("run after close: want error")
40	}
41	if exiftoolStarts.Load() != before {
42		t.Fatal("run after close started a process")
43	}
44}
45
46func TestExiftoolTimeoutKillsAndRecovers(t *testing.T) {
47	requireTools(t)
48	e := exiftool{timeout: time.Nanosecond}
49	if _, err := e.run("-ver"); err == nil {
50		t.Fatal("want timeout error")
51	}
52	e.timeout = 0
53	out, err := e.run("-ver")
54	if err != nil || len(out) == 0 {
55		t.Fatalf("run after timeout: %q, %v", out, err)
56	}
57	e.close()
58}