Skip to content
This repository was archived by the owner on Dec 24, 2024. It is now read-only.

Commit 52ee6f5

Browse files
committed
cmd/dif-dump: improve help and add tests
1 parent 4a5464e commit 52ee6f5

File tree

2 files changed

+189
-12
lines changed

2 files changed

+189
-12
lines changed

cmd/dif-dump/main.go

Lines changed: 68 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,24 @@
22
// Use of this source code is governed by a BSD-style
33
// license that can be found in the LICENSE file.
44

5-
// Command dif-dump decodes and displays DIF data.
5+
// dif-dump decodes and displays DIF data files.
6+
//
7+
// Usage: dif-dump [OPTIONS] FILE1 [FILE2 [FILE3 ...]]
8+
//
9+
// Example:
10+
//
11+
// $> dif-dump ./testdata/Event_425050855_109_109_183
12+
// === DIF-ID 0xb7 ===
13+
// DIF trigger: 109
14+
// ACQ trigger: 0
15+
// Gbl trigger: 109
16+
// Abs BCID: 425050855
17+
// Time DIF: 1864732
18+
// Frames: 183
19+
// hroc=0x01 BCID= 1448778 000000000000000000000000000005f0
20+
// hroc=0x01 BCID= 1533835 0400000055b955540000040000000000
21+
// hroc=0x01 BCID= 1520655 00000010000000000000000000000000
22+
// [...]
623
package main
724

825
import (
@@ -20,12 +37,49 @@ func main() {
2037
log.SetPrefix("dif-dump: ")
2138
log.SetFlags(0)
2239

40+
flag.Usage = func() {
41+
fmt.Printf(`dif-dump decodes and displays DIF data files.
42+
43+
Usage: dif-dump [OPTIONS] FILE1 [FILE2 [FILE3 ...]]
44+
45+
Example:
46+
47+
$> dif-dump ./testdata/Event_425050855_109_109_183
48+
=== DIF-ID 0xb7 ===
49+
DIF trigger: 109
50+
ACQ trigger: 0
51+
Gbl trigger: 109
52+
Abs BCID: 425050855
53+
Time DIF: 1864732
54+
Frames: 183
55+
hroc=0x01 BCID= 1448778 000000000000000000000000000005f0
56+
hroc=0x01 BCID= 1533835 0400000055b955540000040000000000
57+
hroc=0x01 BCID= 1520655 00000010000000000000000000000000
58+
[...]
59+
60+
`)
61+
flag.PrintDefaults()
62+
}
63+
2364
flag.Parse()
24-
fname := flag.Arg(0)
2565

66+
if flag.NArg() == 0 {
67+
flag.Usage()
68+
log.Fatalf("missing path to input DIF file")
69+
}
70+
71+
for _, fname := range flag.Args() {
72+
err := process(os.Stdout, fname)
73+
if err != nil {
74+
log.Fatalf("could not dump file %q: %+v", fname, err)
75+
}
76+
}
77+
}
78+
79+
func process(w io.Writer, fname string) error {
2680
f, err := os.Open(fname)
2781
if err != nil {
28-
log.Fatalf("could not open %q: %+v", fname, err)
82+
return xerrors.Errorf("could not open %q: %w", fname, err)
2983
}
3084
defer f.Close()
3185

@@ -38,22 +92,24 @@ loop:
3892
if xerrors.Is(err, io.EOF) {
3993
break loop
4094
}
41-
log.Fatalf("could not decode DIF: %+v", err)
95+
return xerrors.Errorf("could not decode DIF: %w", err)
4296
}
43-
fmt.Printf("=== DIF-ID 0x%x ===\n", d.Header.ID)
44-
fmt.Printf("DIF trigger: % 10d\n", d.Header.DTC)
45-
fmt.Printf("ACQ trigger: % 10d\n", d.Header.ATC)
46-
fmt.Printf("Gbl trigger: % 10d\n", d.Header.GTC)
47-
fmt.Printf("Abs BCID: % 10d\n", d.Header.AbsBCID)
48-
fmt.Printf("Time DIF: % 10d\n", d.Header.TimeDIFTC)
49-
fmt.Printf("Frames: % 10d\n", len(d.Frames))
97+
fmt.Fprintf(w, "=== DIF-ID 0x%x ===\n", d.Header.ID)
98+
fmt.Fprintf(w, "DIF trigger: % 10d\n", d.Header.DTC)
99+
fmt.Fprintf(w, "ACQ trigger: % 10d\n", d.Header.ATC)
100+
fmt.Fprintf(w, "Gbl trigger: % 10d\n", d.Header.GTC)
101+
fmt.Fprintf(w, "Abs BCID: % 10d\n", d.Header.AbsBCID)
102+
fmt.Fprintf(w, "Time DIF: % 10d\n", d.Header.TimeDIFTC)
103+
fmt.Fprintf(w, "Frames: % 10d\n", len(d.Frames))
50104

51105
for _, frame := range d.Frames {
52-
fmt.Printf(" hroc=0x%02x BCID=% 8d %x\n",
106+
fmt.Fprintf(w, " hroc=0x%02x BCID=% 8d %x\n",
53107
frame.Header, frame.BCID, frame.Data,
54108
)
55109
}
56110
}
111+
112+
return nil
57113
}
58114

59115
func difIDFrom(f io.ReaderAt) uint8 {

cmd/dif-dump/main_test.go

Lines changed: 121 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,121 @@
1+
// Copyright 2020 The go-lpc Authors. All rights reserved.
2+
// Use of this source code is governed by a BSD-style
3+
// license that can be found in the LICENSE file.
4+
5+
package main
6+
7+
import (
8+
"io"
9+
"io/ioutil"
10+
"os"
11+
"path/filepath"
12+
"strings"
13+
"testing"
14+
15+
"github.com/go-lpc/mim/dif"
16+
"golang.org/x/xerrors"
17+
)
18+
19+
func TestDump(t *testing.T) {
20+
tmp, err := ioutil.TempDir("", "mim-dif-dump-")
21+
if err != nil {
22+
t.Fatalf("could not create tmp dir: %+v", err)
23+
}
24+
defer os.RemoveAll(tmp)
25+
26+
for _, tc := range []struct {
27+
name string
28+
data dif.DIF
29+
want string
30+
err error
31+
}{
32+
{
33+
name: "simple-dif",
34+
data: dif.DIF{
35+
Header: dif.GlobalHeader{
36+
ID: 0x42,
37+
DTC: 10,
38+
ATC: 11,
39+
GTC: 12,
40+
AbsBCID: 0x0000112233445566,
41+
TimeDIFTC: 0x00112233,
42+
},
43+
Frames: []dif.Frame{
44+
{
45+
Header: 1,
46+
BCID: 0x001a1b1c,
47+
Data: [16]uint8{0xa, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15},
48+
},
49+
{
50+
Header: 2,
51+
BCID: 0x002a2b2c,
52+
Data: [16]uint8{
53+
0xb, 21, 22, 23, 24, 25, 26, 27, 28, 29,
54+
210, 211, 212, 213, 214, 215,
55+
},
56+
},
57+
},
58+
},
59+
want: `=== DIF-ID 0x42 ===
60+
DIF trigger: 10
61+
ACQ trigger: 11
62+
Gbl trigger: 12
63+
Abs BCID: 18838586676582
64+
Time DIF: 1122867
65+
Frames: 2
66+
hroc=0x01 BCID= 1710876 0a0102030405060708090a0b0c0d0e0f
67+
hroc=0x02 BCID= 2763564 0b15161718191a1b1c1dd2d3d4d5d6d7
68+
`,
69+
},
70+
{
71+
name: "invalid-dif",
72+
data: dif.DIF{},
73+
want: string([]byte{0xb0, 0x42}),
74+
err: xerrors.Errorf("could not decode DIF: dif: could not read DIF header: %w", io.ErrUnexpectedEOF),
75+
},
76+
} {
77+
t.Run(tc.name, func(t *testing.T) {
78+
fname := filepath.Join(tmp, tc.name+".raw")
79+
f, err := os.Create(fname)
80+
if err != nil {
81+
t.Fatalf("could not create raw dif file: %+v", err)
82+
}
83+
defer f.Close()
84+
85+
switch {
86+
case tc.err == nil:
87+
err = dif.NewEncoder(f).Encode(&tc.data)
88+
if err != nil {
89+
t.Fatalf("could not encode dif: %+v", err)
90+
}
91+
default:
92+
_, err = f.Write([]byte(tc.want))
93+
if err != nil {
94+
t.Fatalf("could not encode dif: %+v", err)
95+
}
96+
}
97+
98+
err = f.Close()
99+
if err != nil {
100+
t.Fatalf("could not close raw dif file: %+v", err)
101+
}
102+
103+
out := new(strings.Builder)
104+
err = process(out, fname)
105+
switch {
106+
case err != nil && tc.err != nil:
107+
if got, want := err.Error(), tc.err.Error(); got != want {
108+
t.Fatalf("invalid error:\ngot= %v\nwant=%v\n", got, want)
109+
}
110+
case err != nil && tc.err == nil:
111+
t.Fatalf("could not dif-dump: %+v", err)
112+
case err == nil && tc.err == nil:
113+
if got, want := out.String(), tc.want; got != want {
114+
t.Fatalf("invalid dif-dump output:\ngot:\n%s\nwant:\n%s\n", got, want)
115+
}
116+
case err == nil && tc.err != nil:
117+
t.Fatalf("invalid error:\ngot= %v\nwant=%v\n", err, tc.err)
118+
}
119+
})
120+
}
121+
}

0 commit comments

Comments
 (0)