@@ -101,7 +101,7 @@ func testRecovery(t *testing.T) {
101101 check (t , mem .UnsafeUnmap ())
102102}
103103
104- func TestOpenPopulatesID (t * testing.T ) {
104+ func TestWriteAfterOpen (t * testing.T ) {
105105 tt := & tester {t : t }
106106 for i := range tt .file {
107107 tt .file [i ].tester = tt
@@ -116,19 +116,49 @@ func TestOpenPopulatesID(t *testing.T) {
116116 if createdID == [16 ]byte {} {
117117 t .Fatal ("created ID is zero" )
118118 }
119- m .Release ()
120- m .UnsafeUnmap ()
119+ first := []byte ("written before reopen" )
120+ _ , err = m .Expand (len (first ))
121+ check (t , err )
122+ check (t , m .Mutate (m .Data (), first ))
123+ check (t , m .Sync ())
124+ check (t , m .Release ())
125+ check (t , m .UnsafeUnmap ())
126+
127+ m , err = Open ("magic" , & tt .file [0 ], & tt .file [1 ], nil )
128+ if err != nil {
129+ t .Fatal (err )
130+ }
131+ tt .setMem (m )
132+ if m .id != createdID {
133+ t .Errorf ("opened ID %x != created ID %x" , m .id , createdID )
134+ }
135+ if ! bytes .Equal (m .Data (), first ) {
136+ t .Errorf ("opened data %q, want %q" , m .Data (), first )
137+ }
138+
139+ // Frames written after Open carry m.id, so if Open did not restore it
140+ // from the files, the writes below would be stamped with a zero ID and
141+ // dropped (or rejected) by the next Open.
142+ second := []byte ("written after reopen, longer than the first write" )
143+ _ , err = m .Expand (len (second ))
144+ check (t , err )
145+ check (t , m .Mutate (m .Data (), second ))
146+ check (t , m .Sync ())
147+ check (t , m .Release ())
148+ check (t , m .UnsafeUnmap ())
121149
122150 m2 , err := Open ("magic" , tt .file [0 ].clone (), tt .file [1 ].clone (), nil )
123151 if err != nil {
124152 t .Fatal (err )
125153 }
126- defer m2 .Release ()
127- defer m2 .UnsafeUnmap ()
128-
129154 if m2 .id != createdID {
130- t .Errorf ("opened ID %x != created ID %x" , m2 .id , createdID )
155+ t .Errorf ("reopened ID %x != created ID %x" , m2 .id , createdID )
156+ }
157+ if ! bytes .Equal (m2 .Data (), second ) {
158+ t .Errorf ("reopened data %q, want %q" , m2 .Data (), second )
131159 }
160+ check (t , m2 .Release ())
161+ check (t , m2 .UnsafeUnmap ())
132162}
133163
134164func randFill (b []byte ) []byte {
0 commit comments