package format import ( "errors" "os" "syscall" "testing" "time" ) func TestMain(m *testing.M) { code := m.Run() CloseExiftool() os.Exit(code) } func TestExiftoolCloseEndsProcess(t *testing.T) { requireTools(t) var e exiftool if _, err := e.run("-ver"); err != nil { t.Fatal(err) } pid := e.cmd.Process.Pid e.close() if e.cmd != nil { t.Fatal("cmd not cleared") } if err := syscall.Kill(pid, 0); !errors.Is(err, syscall.ESRCH) { t.Fatalf("exiftool pid %d still running after close (kill 0: %v)", pid, err) } } func TestExiftoolRunAfterCloseFails(t *testing.T) { requireTools(t) var e exiftool e.close() before := exiftoolStarts.Load() if _, err := e.run("-ver"); err == nil { t.Fatal("run after close: want error") } if exiftoolStarts.Load() != before { t.Fatal("run after close started a process") } } func TestExiftoolTimeoutKillsAndRecovers(t *testing.T) { requireTools(t) e := exiftool{timeout: time.Nanosecond} if _, err := e.run("-ver"); err == nil { t.Fatal("want timeout error") } e.timeout = 0 out, err := e.run("-ver") if err != nil || len(out) == 0 { t.Fatalf("run after timeout: %q, %v", out, err) } e.close() }