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  }