filestorage_test.go 2.15 KB
Newer Older
Kirill Smelkov's avatar
.  
Kirill Smelkov committed
1 2 3 4
// XXX license/copyright

package fs1

Kirill Smelkov's avatar
.  
Kirill Smelkov committed
5 6 7 8 9 10 11
import (
	"bytes"
	"testing"

	"../../zodb"
)

Kirill Smelkov's avatar
.  
Kirill Smelkov committed
12 13 14 15 16 17
// one database transaction record
type dbEntry struct {
	Header	TxnHeader
	Entryv	[]txnEntry
}

Kirill Smelkov's avatar
.  
Kirill Smelkov committed
18 19
// one entry inside transaction
type txnEntry struct {
Kirill Smelkov's avatar
.  
Kirill Smelkov committed
20 21 22
	Header	 DataHeader
	rawData	 []byte		// what is on disk, e.g. it can be backpointer
	userData []byte		// data client should see on load; nil means same as RawData
Kirill Smelkov's avatar
.  
Kirill Smelkov committed
23 24
}

Kirill Smelkov's avatar
.  
Kirill Smelkov committed
25
// Data returns data a client should see
Kirill Smelkov's avatar
.  
Kirill Smelkov committed
26
func (txe *txnEntry) Data() []byte {
Kirill Smelkov's avatar
.  
Kirill Smelkov committed
27
	data := txe.userData
Kirill Smelkov's avatar
.  
Kirill Smelkov committed
28 29 30 31
	if data == nil {
		data = txe.rawData
	}
	return data
Kirill Smelkov's avatar
.  
Kirill Smelkov committed
32 33
}

Kirill Smelkov's avatar
.  
Kirill Smelkov committed
34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54
// successfull result of load for an oid
type oidLoadedOk struct {
	tid	zodb.Tid
	data	[]byte
}

// current knowledge of what was "before" for an oid as we scan over
// data base entries
type beforeMap map[zodb.Oid]oidLoadedOk

func checkLoad(t *testing.T, fs *FileStorage, xid zodb.Xid, expect oidLoadedOk) {
	data, tid, err := fs.Load(xid)
	if err != nil {
		t.Errorf("load %v: %v", xid, err)
	}
	if tid != expect.tid {
		t.Errorf("load %v: returned tid unexpected: %v  ; want: %v", xid, tid, expect.tid)
	}
	if !bytes.Equal(data, expect.data) {
		t.Errorf("load %v: different data:\nhave: %q\nwant: %q", xid, data, expect.data)
	}
Kirill Smelkov's avatar
.  
Kirill Smelkov committed
55 56 57 58 59 60 61 62
}

func TestLoad(t *testing.T) {
	fs, err := NewFileStorage("testdata/1.fs")
	if err != nil {
		t.Fatal(err)
	}

Kirill Smelkov's avatar
.  
Kirill Smelkov committed
63 64
	before := beforeMap{}

Kirill Smelkov's avatar
.  
Kirill Smelkov committed
65
	for _, dbe := range _1fs_dbEntryv {
Kirill Smelkov's avatar
.  
Kirill Smelkov committed
66 67
		for _, txe := range dbe.Entryv {
			txh := txe.Header
Kirill Smelkov's avatar
.  
Kirill Smelkov committed
68

Kirill Smelkov's avatar
.  
Kirill Smelkov committed
69 70
			// loadSerial
			xid := zodb.Xid{zodb.XTid{txh.Tid, false}, txh.Oid}
Kirill Smelkov's avatar
.  
Kirill Smelkov committed
71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89
			checkLoad(t, fs, xid, oidLoadedOk{txh.Tid, txe.Data()})
			//data, tid, err := fs.Load(xid)
			//if err != nil {
			//	t.Errorf("load %v: %v", xid, err)
			//}
			//if tid != txh.Tid {
			//	t.Errorf("load %v: returned tid unexpected: %v", xid, tid)
			//}
			//if !bytes.Equal(data, txe.Data()) {
			//	t.Errorf("load %v: different data:\nhave: %q\nwant: %q", xid, data, txe.Data())
			//}

			// loadBefore
			// TODO also test loadBefore (TixMax)
			xid = zodb.Xid{zodb.XTid{txh.Tid, true}, txh.Oid}
			expect, ok := before[txh.Oid]
			// TODO also test for getting error when !ok
			if ok {
				checkLoad(t, fs, xid, expect)
Kirill Smelkov's avatar
.  
Kirill Smelkov committed
90
			}
Kirill Smelkov's avatar
.  
Kirill Smelkov committed
91 92 93 94 95



			before[txh.Oid] = oidLoadedOk{txh.Tid, txe.Data()}

Kirill Smelkov's avatar
.  
Kirill Smelkov committed
96 97
		}
	}
Kirill Smelkov's avatar
.  
Kirill Smelkov committed
98
}