internal/format/exiftool_test.go
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}