github.com/fozzysec/SiaPrime@v0.0.0-20190612043147-66c8e8d11fe3/modules/renter/erasure_test.go (about) 1 package renter 2 3 import ( 4 "bytes" 5 "io/ioutil" 6 "testing" 7 8 "gitlab.com/NebulousLabs/fastrand" 9 ) 10 11 // TestRSEncode tests the rsCode type. 12 func TestRSEncode(t *testing.T) { 13 badParams := []struct { 14 data, parity int 15 }{ 16 {-1, -1}, 17 {-1, 0}, 18 {0, -1}, 19 {0, 0}, 20 {0, 1}, 21 {1, 0}, 22 } 23 for _, ps := range badParams { 24 if _, err := NewRSCode(ps.data, ps.parity); err == nil { 25 t.Error("expected bad parameter error, got nil") 26 } 27 } 28 29 rsc, err := NewRSCode(10, 3) 30 if err != nil { 31 t.Fatal(err) 32 } 33 34 data := fastrand.Bytes(777) 35 36 pieces, err := rsc.Encode(data) 37 if err != nil { 38 t.Fatal(err) 39 } 40 _, err = rsc.Encode(nil) 41 if err == nil { 42 t.Fatal("expected nil data error, got nil") 43 } 44 45 buf := new(bytes.Buffer) 46 err = rsc.Recover(pieces, 777, buf) 47 if err != nil { 48 t.Fatal(err) 49 } 50 err = rsc.Recover(nil, 777, buf) 51 if err == nil { 52 t.Fatal("expected nil pieces error, got nil") 53 } 54 55 if !bytes.Equal(data, buf.Bytes()) { 56 t.Fatal("recovered data does not match original") 57 } 58 } 59 60 func BenchmarkRSEncode(b *testing.B) { 61 rsc, err := NewRSCode(80, 20) 62 if err != nil { 63 b.Fatal(err) 64 } 65 data := fastrand.Bytes(1 << 20) 66 67 b.SetBytes(1 << 20) 68 b.ResetTimer() 69 for i := 0; i < b.N; i++ { 70 rsc.Encode(data) 71 } 72 } 73 74 func BenchmarkRSRecover(b *testing.B) { 75 rsc, err := NewRSCode(50, 200) 76 if err != nil { 77 b.Fatal(err) 78 } 79 data := fastrand.Bytes(1 << 20) 80 pieces, err := rsc.Encode(data) 81 if err != nil { 82 b.Fatal(err) 83 } 84 85 b.SetBytes(1 << 20) 86 b.ResetTimer() 87 for i := 0; i < b.N; i++ { 88 for j := 0; j < len(pieces)/2; j += 2 { 89 pieces[j] = nil 90 } 91 rsc.Recover(pieces, 1<<20, ioutil.Discard) 92 } 93 }