importer_test.go 1.9 KB
Newer Older
1 2 3 4 5
package importer

import (
	"bytes"
	"crypto/rand"
6
	"fmt"
7 8
	"io"
	"io/ioutil"
9
	"os"
10 11 12 13 14
	"testing"

	dag "github.com/jbenet/go-ipfs/merkledag"
)

15 16 17
func TestBuildDag(t *testing.T) {
	td := os.TempDir()
	fi, err := os.Create(td + "/tmpfi")
18 19 20
	if err != nil {
		t.Fatal(err)
	}
21 22

	_, err = io.CopyN(fi, rand.Reader, 1024*1024)
23 24 25 26
	if err != nil {
		t.Fatal(err)
	}

27 28 29
	fi.Close()

	_, err = NewDagFromFile(td + "/tmpfi")
30 31 32
	if err != nil {
		t.Fatal(err)
	}
33
}
34

35 36
//Test where calls to read are smaller than the chunk size
func TestSizeBasedSplit(t *testing.T) {
37
	bs := &SizeSplitter{512}
38
	testFileConsistency(t, bs, 32*512)
39
	bs = &SizeSplitter{4096}
40 41 42 43 44 45
	testFileConsistency(t, bs, 32*4096)

	// Uneven offset
	testFileConsistency(t, bs, 31*4095)
}

Jeromy's avatar
Jeromy committed
46 47 48 49 50 51
func dup(b []byte) []byte {
	o := make([]byte, len(b))
	copy(o, b)
	return o
}

52
func testFileConsistency(t *testing.T, bs BlockSplitter, nbytes int) {
53
	buf := new(bytes.Buffer)
54
	io.CopyN(buf, rand.Reader, int64(nbytes))
Jeromy's avatar
Jeromy committed
55
	should := dup(buf.Bytes())
56
	nd, err := NewDagFromReaderWithSplitter(buf, bs)
57 58 59
	if err != nil {
		t.Fatal(err)
	}
60
	r, err := dag.NewDagReader(nd, nil)
61 62 63 64 65 66 67 68 69
	if err != nil {
		t.Fatal(err)
	}

	out, err := ioutil.ReadAll(r)
	if err != nil {
		t.Fatal(err)
	}

70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88
	err = arrComp(out, should)
	if err != nil {
		t.Fatal(err)
	}
}

func arrComp(a, b []byte) error {
	if len(a) != len(b) {
		return fmt.Errorf("Arrays differ in length. %d != %d", len(a), len(b))
	}
	for i, v := range a {
		if v != b[i] {
			return fmt.Errorf("Arrays differ at index: %d", i)
		}
	}
	return nil
}

func TestMaybeRabinConsistency(t *testing.T) {
89
	testFileConsistency(t, NewMaybeRabin(4096), 256*4096)
90
}
91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106

func TestRabinBlockSize(t *testing.T) {
	buf := new(bytes.Buffer)
	nbytes := 1024 * 1024
	io.CopyN(buf, rand.Reader, int64(nbytes))
	rab := NewMaybeRabin(4096)
	blkch := rab.Split(buf)

	var blocks [][]byte
	for b := range blkch {
		blocks = append(blocks, b)
	}

	fmt.Printf("Avg block size: %d\n", nbytes/len(blocks))

}