summaryrefslogtreecommitdiff
path: root/xdelta3/go/src/regtest.go
blob: 6497166f9a2e715a630c844fb68c4a5b597b9b7c (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
package main

import (
	"errors"
	"fmt"
	"io"

	"xdelta"
)

const (
	blocksize = 1<<16
	winsize = 1<<26
	xdelta3 = "/volume/home/jmacd/src/xdelta-64bithash/xdelta3/build/x86_64-pc-linux-gnu-m64/usize64/xoff64/xdelta3"
	seed = 1422253499919909358
)

func smokeTest(r *xdelta.Runner, t *xdelta.TestGroup, p *xdelta.Program) {
	t.Add(1)
	target := "Hello world!"
	source := "Hello world, nice to meet you!"
	
	run, err := r.Exec(p, true, []string{"-evv"})
	if err != nil {
		t.Panic(err)
	}
	encodeout := t.Drain(run.Stdout, "encode.stdout")
	t.Empty(run.Stderr, "encode")

	t.Write("encode.stdin", run.Stdin, []byte(target))
	t.Write("encode.srcin", run.Srcin, []byte(source))

	if err := run.Cmd.Wait(); err != nil {
		t.Panic(err)
	}

	run, err = r.Exec(p, true, []string{"-dvv"})
	if err != nil {
		t.Panic(err)
	}

	decodeout := t.Drain(run.Stdout, "decode.stdout")
	t.Empty(run.Stderr, "decode")

	t.Write("decode.stdin", run.Stdin, <-encodeout)
	t.Write("decode.srcin", run.Srcin, []byte(source))
	decoded := string(<-decodeout)
	if err := run.Cmd.Wait(); err != nil {
		t.Panic(err)
	}
	if decoded != target {
		t.Panic(errors.New("It's not working!!!"))
	}
	t.Done()
	fmt.Println("Smoketest pass")
}

func offsetTest(r *xdelta.Runner, t *xdelta.TestGroup, p *xdelta.Program, offset, bufsize, length int64) {
	t.Add(1)
	eargs := []string{"-e", "-1", "-N", fmt.Sprint("-B", bufsize), "-vv", fmt.Sprint("-W", winsize)}
	enc, err := r.Exec(p, true, eargs)
	if err != nil {
		t.Panic(err)
	}
	dargs := []string{"-d", fmt.Sprint("-B", bufsize), "-vv", fmt.Sprint("-W", winsize)}
	dec, err := r.Exec(p, true, dargs)
	if err != nil {
		t.Panic(err)
	}

	read, write := io.Pipe()

	t.Empty(enc.Stderr, "encode")
	t.Empty(dec.Stderr, "decode")

	t.CopyStreams(enc.Stdout, dec.Stdin)
	t.CompareStreams(dec.Stdout, read, length)

	// TODO: seems possible to use one WriteRstreams call to generate
	// the source and target for both encoder and decoder.  Why not?
	xdelta.WriteRstreams(t, seed, offset, length, enc.Srcin, enc. Stdin)
	xdelta.WriteRstreams(t, seed, offset, length, dec.Srcin, write)

	if err := enc.Cmd.Wait(); err != nil {
		t.Panic(err)
	}
	if err := dec.Cmd.Wait(); err != nil {
		t.Panic(err)
	}
	t.Done()
}

func main() {
	r, err := xdelta.NewRunner()
	if err != nil {
		panic(err)
	}
	defer r.Cleanup()

	prog := &xdelta.Program{xdelta3}

	smokeTest(r, xdelta.NewTestGroup(), prog)

	offsetTest(r, xdelta.NewTestGroup(), prog, 1 << 31, 1 << 32, 1 << 33)
}