go-hep.org/x/hep@v0.38.1/rio/file_test.go (about) 1 // Copyright ©2015 The go-hep 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 rio 6 7 import ( 8 "bytes" 9 "fmt" 10 "reflect" 11 "testing" 12 ) 13 14 func TestFile(t *testing.T) { 15 buf := new(bytes.Buffer) 16 w, err := NewWriter(buf) 17 if err != nil { 18 t.Fatalf("error creating new rio Writer: %v", err) 19 } 20 21 evt1 := event{ 22 runnbr: 10, 23 evtnbr: 11, 24 id: "id-11", 25 eles: []electron{newElectron(11, 12, 13, 14)}, 26 muons: []muon{newMuon(11, 12, 13, 14)}, 27 } 28 err = w.WriteValue("evt1", &evt1) 29 if err != nil { 30 t.Fatalf("error writing value [evt1]: %v", err) 31 } 32 33 evt2 := event{ 34 runnbr: 10, 35 evtnbr: 12, 36 id: "id-22", 37 eles: []electron{newElectron(21, 22, 23, 24)}, 38 muons: []muon{newMuon(21, 22, 23, 24)}, 39 } 40 err = w.WriteValue("evt2", &evt2) 41 if err != nil { 42 t.Fatalf("error writing value [evt2]: %v", err) 43 } 44 45 err = w.Close() 46 if err != nil { 47 t.Fatalf("error closing rio writer: %v", err) 48 } 49 50 r := bytes.NewReader(buf.Bytes()) 51 52 f, err := Open(r) 53 if err != nil { 54 t.Fatalf("error opening file: %v\n", err) 55 } 56 defer f.Close() 57 58 keys := []RecordDesc{ 59 { 60 Name: "evt1", 61 Blocks: []BlockDesc{ 62 { 63 Name: "evt1", 64 Type: "*go-hep.org/x/hep/rio.event", 65 }, 66 }, 67 }, 68 { 69 Name: "evt2", 70 Blocks: []BlockDesc{ 71 { 72 Name: "evt2", 73 Type: "*go-hep.org/x/hep/rio.event", 74 }, 75 }, 76 }, 77 } 78 if !reflect.DeepEqual(keys, f.Keys()) { 79 t.Fatalf("keys differ.\ngot= %v\nwant=%v\n", f.Keys(), keys) 80 } 81 82 if !f.Has("evt1") { 83 t.Fatalf("expected 'evt1' to be present in file") 84 } 85 if f.Has("not-there") { 86 t.Fatalf("did not expect a 'not-there' record in file") 87 } 88 89 var ( 90 revt1 event 91 revt2 event 92 ) 93 94 err = f.Get("evt2", &revt2) 95 if err != nil { 96 t.Fatalf("error: %v\n", err) 97 } 98 99 err = f.Get("evt1", &revt1) 100 if err != nil { 101 t.Fatalf("error: %v\n", err) 102 } 103 104 if !reflect.DeepEqual(evt1, revt1) { 105 t.Fatalf("evt1 differ.\ngot= %v\nwant=%v\n", revt1, evt1) 106 } 107 108 if !reflect.DeepEqual(evt2, revt2) { 109 t.Fatalf("evt2 differ.\ngot= %v\nwant=%v\n", revt2, evt2) 110 } 111 } 112 113 func TestInvalidFile(t *testing.T) { 114 for _, tc := range []struct { 115 r []byte 116 err error 117 }{ 118 { 119 r: nil, 120 err: fmt.Errorf("rio: error reading magic-header: EOF"), 121 }, 122 { 123 r: []byte{'s', 'i', 'o', '\x00'}, 124 err: fmt.Errorf("rio: not a rio-stream. magic-header=\"sio\\x00\". want=\"rio\\x00\""), 125 }, 126 { 127 r: []byte{'r', 'i', 'o', '\x00'}, 128 err: fmt.Errorf("rio: error seeking footer: bytes.Reader.Seek: negative position"), 129 }, 130 } { 131 t.Run("", func(t *testing.T) { 132 r := bytes.NewReader(tc.r) 133 f, err := Open(r) 134 if got, want := err.Error(), tc.err.Error(); got != want { 135 t.Fatalf("got=%s, want=%s", got, want) 136 } 137 defer f.Close() 138 }) 139 } 140 }