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
106
107
108
109
110
111
|
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) {
fmt.Println("Hi")
t.Add(1)
eargs := []string{"-e", "-1", "-n", fmt.Sprint("-B", bufsize), "-vv", fmt.Sprint("-W", winsize)}
enc, err := r.Exec(p, true, eargs)
fmt.Println("Hi2")
if err != nil {
t.Panic(err)
}
fmt.Println("Hi3")
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")
fmt.Println("Hi4")
t.CopyStreams(enc.Stdout, dec.Stdin)
fmt.Println("Hi5")
t.CompareStreams(dec.Stdout, read, length)
fmt.Println("Hi6")
// 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)
}
|