github.com/dashpay/godash@v0.0.0-20160726055534-e038a21e0e3d/wire/shahash_test.go (about)

     1  // Copyright (c) 2013-2015 The btcsuite developers
     2  // Copyright (c) 2016 The Dash developers
     3  // Use of this source code is governed by an ISC
     4  // license that can be found in the LICENSE file.
     5  
     6  package wire_test
     7  
     8  import (
     9  	"bytes"
    10  	"encoding/hex"
    11  	"testing"
    12  
    13  	"github.com/dashpay/godash/wire"
    14  )
    15  
    16  // TestShaHash tests the ShaHash API.
    17  func TestShaHash(t *testing.T) {
    18  
    19  	// Hash of block 234439.
    20  	blockHashStr := "14a0810ac680a3eb3f82edc878cea25ec41d6b790744e5daeef"
    21  	blockHash, err := wire.NewShaHashFromStr(blockHashStr)
    22  	if err != nil {
    23  		t.Errorf("NewShaHashFromStr: %v", err)
    24  	}
    25  
    26  	// Hash of block 234440 as byte slice.
    27  	buf := []byte{
    28  		0x79, 0xa6, 0x1a, 0xdb, 0xc6, 0xe5, 0xa2, 0xe1,
    29  		0x39, 0xd2, 0x71, 0x3a, 0x54, 0x6e, 0xc7, 0xc8,
    30  		0x75, 0x63, 0x2e, 0x75, 0xf1, 0xdf, 0x9c, 0x3f,
    31  		0xa6, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
    32  	}
    33  
    34  	hash, err := wire.NewShaHash(buf)
    35  	if err != nil {
    36  		t.Errorf("NewShaHash: unexpected error %v", err)
    37  	}
    38  
    39  	// Ensure proper size.
    40  	if len(hash) != wire.HashSize {
    41  		t.Errorf("NewShaHash: hash length mismatch - got: %v, want: %v",
    42  			len(hash), wire.HashSize)
    43  	}
    44  
    45  	// Ensure contents match.
    46  	if !bytes.Equal(hash[:], buf) {
    47  		t.Errorf("NewShaHash: hash contents mismatch - got: %v, want: %v",
    48  			hash[:], buf)
    49  	}
    50  
    51  	// Ensure contents of hash of block 234440 don't match 234439.
    52  	if hash.IsEqual(blockHash) {
    53  		t.Errorf("IsEqual: hash contents should not match - got: %v, want: %v",
    54  			hash, blockHash)
    55  	}
    56  
    57  	// Set hash from byte slice and ensure contents match.
    58  	err = hash.SetBytes(blockHash.Bytes())
    59  	if err != nil {
    60  		t.Errorf("SetBytes: %v", err)
    61  	}
    62  	if !hash.IsEqual(blockHash) {
    63  		t.Errorf("IsEqual: hash contents mismatch - got: %v, want: %v",
    64  			hash, blockHash)
    65  	}
    66  
    67  	// Invalid size for SetBytes.
    68  	err = hash.SetBytes([]byte{0x00})
    69  	if err == nil {
    70  		t.Errorf("SetBytes: failed to received expected err - got: nil")
    71  	}
    72  
    73  	// Invalid size for NewShaHash.
    74  	invalidHash := make([]byte, wire.HashSize+1)
    75  	_, err = wire.NewShaHash(invalidHash)
    76  	if err == nil {
    77  		t.Errorf("NewShaHash: failed to received expected err - got: nil")
    78  	}
    79  }
    80  
    81  // TestShaHashString  tests the stringized output for sha hashes.
    82  func TestShaHashString(t *testing.T) {
    83  	// Block 100000 hash.
    84  	wantStr := "000000000003ba27aa200b1cecaad478d2b00432346c3f1f3986da1afd33e506"
    85  	hash := wire.ShaHash([wire.HashSize]byte{ // Make go vet happy.
    86  		0x06, 0xe5, 0x33, 0xfd, 0x1a, 0xda, 0x86, 0x39,
    87  		0x1f, 0x3f, 0x6c, 0x34, 0x32, 0x04, 0xb0, 0xd2,
    88  		0x78, 0xd4, 0xaa, 0xec, 0x1c, 0x0b, 0x20, 0xaa,
    89  		0x27, 0xba, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00,
    90  	})
    91  
    92  	hashStr := hash.String()
    93  	if hashStr != wantStr {
    94  		t.Errorf("String: wrong hash string - got %v, want %v",
    95  			hashStr, wantStr)
    96  	}
    97  }
    98  
    99  // TestNewShaHashFromStr executes tests against the NewShaHashFromStr function.
   100  func TestNewShaHashFromStr(t *testing.T) {
   101  	tests := []struct {
   102  		in   string
   103  		want wire.ShaHash
   104  		err  error
   105  	}{
   106  		// Genesis hash.
   107  		{
   108  			"000000000019d6689c085ae165831e934ff763ae46a2a6c172b3f1b60a8ce26f",
   109  			mainNetGenesisHash,
   110  			nil,
   111  		},
   112  
   113  		// Genesis hash with stripped leading zeros.
   114  		{
   115  			"19d6689c085ae165831e934ff763ae46a2a6c172b3f1b60a8ce26f",
   116  			mainNetGenesisHash,
   117  			nil,
   118  		},
   119  
   120  		// Empty string.
   121  		{
   122  			"",
   123  			wire.ShaHash{},
   124  			nil,
   125  		},
   126  
   127  		// Single digit hash.
   128  		{
   129  			"1",
   130  			wire.ShaHash([wire.HashSize]byte{ // Make go vet happy.
   131  				0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
   132  				0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
   133  				0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
   134  				0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
   135  			}),
   136  			nil,
   137  		},
   138  
   139  		// Block 203707 with stripped leading zeros.
   140  		{
   141  			"3264bc2ac36a60840790ba1d475d01367e7c723da941069e9dc",
   142  			wire.ShaHash([wire.HashSize]byte{ // Make go vet happy.
   143  				0xdc, 0xe9, 0x69, 0x10, 0x94, 0xda, 0x23, 0xc7,
   144  				0xe7, 0x67, 0x13, 0xd0, 0x75, 0xd4, 0xa1, 0x0b,
   145  				0x79, 0x40, 0x08, 0xa6, 0x36, 0xac, 0xc2, 0x4b,
   146  				0x26, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
   147  			}),
   148  			nil,
   149  		},
   150  
   151  		// Hash string that is too long.
   152  		{
   153  			"01234567890123456789012345678901234567890123456789012345678912345",
   154  			wire.ShaHash{},
   155  			wire.ErrHashStrSize,
   156  		},
   157  
   158  		// Hash string that is contains non-hex chars.
   159  		{
   160  			"abcdefg",
   161  			wire.ShaHash{},
   162  			hex.InvalidByteError('g'),
   163  		},
   164  	}
   165  
   166  	unexpectedErrStr := "NewShaHashFromStr #%d failed to detect expected error - got: %v want: %v"
   167  	unexpectedResultStr := "NewShaHashFromStr #%d got: %v want: %v"
   168  	t.Logf("Running %d tests", len(tests))
   169  	for i, test := range tests {
   170  		result, err := wire.NewShaHashFromStr(test.in)
   171  		if err != test.err {
   172  			t.Errorf(unexpectedErrStr, i, err, test.err)
   173  			continue
   174  		} else if err != nil {
   175  			// Got expected error. Move on to the next test.
   176  			continue
   177  		}
   178  		if !test.want.IsEqual(result) {
   179  			t.Errorf(unexpectedResultStr, i, result, &test.want)
   180  			continue
   181  		}
   182  	}
   183  }