github.com/decred/dcrlnd@v0.7.6/shachain/store_test.go (about)

     1  package shachain
     2  
     3  import (
     4  	"bytes"
     5  	"crypto/sha256"
     6  	"testing"
     7  )
     8  
     9  type testInsert struct {
    10  	index      index
    11  	secret     string
    12  	successful bool
    13  }
    14  
    15  // tests encodes the test vectors specified in BOLT-03, Appendix D,
    16  // Storage Tests.
    17  var tests = []struct {
    18  	name    string
    19  	inserts []testInsert
    20  }{
    21  	{
    22  		name: "insert_secret correct sequence",
    23  		inserts: []testInsert{
    24  			{
    25  				index: 281474976710655,
    26  				secret: "7cc854b54e3e0dcdb010d7a3fee464a9687b" +
    27  					"e6e8db3be6854c475621e007a5dc",
    28  				successful: true,
    29  			},
    30  			{
    31  				index: 281474976710654,
    32  				secret: "c7518c8ae4660ed02894df8976fa1a3659c1" +
    33  					"a8b4b5bec0c4b872abeba4cb8964",
    34  				successful: true,
    35  			},
    36  			{
    37  				index: 281474976710653,
    38  				secret: "2273e227a5b7449b6e70f1fb4652864038b1" +
    39  					"cbf9cd7c043a7d6456b7fc275ad8",
    40  				successful: true,
    41  			},
    42  			{
    43  				index: 281474976710652,
    44  				secret: "27cddaa5624534cb6cb9d7da077cf2b22ab2" +
    45  					"1e9b506fd4998a51d54502e99116",
    46  				successful: true,
    47  			},
    48  			{
    49  				index: 281474976710651,
    50  				secret: "c65716add7aa98ba7acb236352d665cab173" +
    51  					"45fe45b55fb879ff80e6bd0c41dd",
    52  				successful: true,
    53  			},
    54  			{
    55  				index: 281474976710650,
    56  				secret: "969660042a28f32d9be17344e09374b37996" +
    57  					"2d03db1574df5a8a5a47e19ce3f2",
    58  				successful: true,
    59  			},
    60  			{
    61  				index: 281474976710649,
    62  				secret: "a5a64476122ca0925fb344bdc1854c1c0a59" +
    63  					"fc614298e50a33e331980a220f32",
    64  				successful: true,
    65  			},
    66  			{
    67  				index: 281474976710648,
    68  				secret: "05cde6323d949933f7f7b78776bcc1ea6d9b" +
    69  					"31447732e3802e1f7ac44b650e17",
    70  				successful: true,
    71  			},
    72  		},
    73  	},
    74  	{
    75  		name: "insert_secret #1 incorrect",
    76  		inserts: []testInsert{
    77  			{
    78  				index: 281474976710655,
    79  				secret: "02a40c85b6f28da08dfdbe0926c53fab2d" +
    80  					"e6d28c10301f8f7c4073d5e42e3148",
    81  				successful: true,
    82  			},
    83  			{
    84  				index: 281474976710654,
    85  				secret: "c7518c8ae4660ed02894df8976fa1a3659" +
    86  					"c1a8b4b5bec0c4b872abeba4cb8964",
    87  				successful: false,
    88  			},
    89  		},
    90  	},
    91  	{
    92  		name: "insert_secret #2 incorrect (#1 derived from incorrect)",
    93  		inserts: []testInsert{
    94  			{
    95  				index: 281474976710655,
    96  				secret: "02a40c85b6f28da08dfdbe0926c53fab2de6" +
    97  					"d28c10301f8f7c4073d5e42e3148",
    98  				successful: true,
    99  			},
   100  			{
   101  				index: 281474976710654,
   102  				secret: "dddc3a8d14fddf2b68fa8c7fbad274827493" +
   103  					"7479dd0f8930d5ebb4ab6bd866a3",
   104  				successful: true,
   105  			},
   106  			{
   107  				index: 281474976710653,
   108  				secret: "2273e227a5b7449b6e70f1fb4652864038b1" +
   109  					"cbf9cd7c043a7d6456b7fc275ad8",
   110  				successful: true,
   111  			},
   112  			{
   113  				index: 281474976710652,
   114  				secret: "27cddaa5624534cb6cb9d7da077cf2b22a" +
   115  					"b21e9b506fd4998a51d54502e99116",
   116  				successful: false,
   117  			},
   118  		},
   119  	},
   120  	{
   121  		name: "insert_secret #3 incorrect",
   122  		inserts: []testInsert{
   123  			{
   124  				index: 281474976710655,
   125  				secret: "7cc854b54e3e0dcdb010d7a3fee464a9687b" +
   126  					"e6e8db3be6854c475621e007a5dc",
   127  				successful: true,
   128  			},
   129  			{
   130  				index: 281474976710654,
   131  				secret: "c7518c8ae4660ed02894df8976fa1a3659c1" +
   132  					"a8b4b5bec0c4b872abeba4cb8964",
   133  				successful: true,
   134  			},
   135  			{
   136  				index: 281474976710653,
   137  				secret: "c51a18b13e8527e579ec56365482c62f180b" +
   138  					"7d5760b46e9477dae59e87ed423a",
   139  				successful: true,
   140  			},
   141  			{
   142  				index: 281474976710652,
   143  				secret: "27cddaa5624534cb6cb9d7da077cf2b22ab2" +
   144  					"1e9b506fd4998a51d54502e99116",
   145  				successful: false,
   146  			},
   147  		},
   148  	},
   149  	{
   150  		name: "insert_secret #4 incorrect (1,2,3 derived from incorrect)",
   151  		inserts: []testInsert{
   152  			{
   153  				index: 281474976710655,
   154  				secret: "02a40c85b6f28da08dfdbe0926c53fab2de6" +
   155  					"d28c10301f8f7c4073d5e42e3148",
   156  				successful: true,
   157  			},
   158  			{
   159  				index: 281474976710654,
   160  				secret: "dddc3a8d14fddf2b68fa8c7fbad274827493" +
   161  					"7479dd0f8930d5ebb4ab6bd866a3",
   162  				successful: true,
   163  			},
   164  			{
   165  				index: 281474976710653,
   166  				secret: "c51a18b13e8527e579ec56365482c62f18" +
   167  					"0b7d5760b46e9477dae59e87ed423a",
   168  				successful: true,
   169  			},
   170  			{
   171  				index: 281474976710652,
   172  				secret: "ba65d7b0ef55a3ba300d4e87af29868f39" +
   173  					"4f8f138d78a7011669c79b37b936f4",
   174  				successful: true,
   175  			},
   176  			{
   177  				index: 281474976710651,
   178  				secret: "c65716add7aa98ba7acb236352d665cab1" +
   179  					"7345fe45b55fb879ff80e6bd0c41dd",
   180  				successful: true,
   181  			},
   182  			{
   183  				index: 281474976710650,
   184  				secret: "969660042a28f32d9be17344e09374b379" +
   185  					"962d03db1574df5a8a5a47e19ce3f2",
   186  				successful: true,
   187  			},
   188  			{
   189  				index: 281474976710649,
   190  				secret: "a5a64476122ca0925fb344bdc1854c1c0a" +
   191  					"59fc614298e50a33e331980a220f32",
   192  				successful: true,
   193  			},
   194  			{
   195  				index: 281474976710649,
   196  				secret: "05cde6323d949933f7f7b78776bcc1ea6d9b" +
   197  					"31447732e3802e1f7ac44b650e17",
   198  				successful: false,
   199  			},
   200  		},
   201  	},
   202  	{
   203  		name: "insert_secret #5 incorrect",
   204  		inserts: []testInsert{
   205  			{
   206  				index: 281474976710655,
   207  				secret: "7cc854b54e3e0dcdb010d7a3fee464a9687b" +
   208  					"e6e8db3be6854c475621e007a5dc",
   209  				successful: true,
   210  			},
   211  			{
   212  				index: 281474976710654,
   213  				secret: "c7518c8ae4660ed02894df8976fa1a3659c1a" +
   214  					"8b4b5bec0c4b872abeba4cb8964",
   215  				successful: true,
   216  			},
   217  			{
   218  				index: 281474976710653,
   219  				secret: "2273e227a5b7449b6e70f1fb4652864038b1" +
   220  					"cbf9cd7c043a7d6456b7fc275ad8",
   221  				successful: true,
   222  			},
   223  			{
   224  				index: 281474976710652,
   225  				secret: "27cddaa5624534cb6cb9d7da077cf2b22ab21" +
   226  					"e9b506fd4998a51d54502e99116",
   227  				successful: true,
   228  			},
   229  			{
   230  				index: 281474976710651,
   231  				secret: "631373ad5f9ef654bb3dade742d09504c567" +
   232  					"edd24320d2fcd68e3cc47e2ff6a6",
   233  				successful: true,
   234  			},
   235  			{
   236  				index: 281474976710650,
   237  				secret: "969660042a28f32d9be17344e09374b37996" +
   238  					"2d03db1574df5a8a5a47e19ce3f2",
   239  				successful: false,
   240  			},
   241  		},
   242  	},
   243  	{
   244  		name: "insert_secret #6 incorrect (5 derived from incorrect)",
   245  		inserts: []testInsert{
   246  			{
   247  				index: 281474976710655,
   248  				secret: "7cc854b54e3e0dcdb010d7a3fee464a9687b" +
   249  					"e6e8db3be6854c475621e007a5dc",
   250  				successful: true,
   251  			},
   252  			{
   253  				index: 281474976710654,
   254  				secret: "c7518c8ae4660ed02894df8976fa1a3659c1a" +
   255  					"8b4b5bec0c4b872abeba4cb8964",
   256  				successful: true,
   257  			},
   258  			{
   259  				index: 281474976710653,
   260  				secret: "2273e227a5b7449b6e70f1fb4652864038b1" +
   261  					"cbf9cd7c043a7d6456b7fc275ad8",
   262  				successful: true,
   263  			},
   264  			{
   265  				index: 281474976710652,
   266  				secret: "27cddaa5624534cb6cb9d7da077cf2b22ab21" +
   267  					"e9b506fd4998a51d54502e99116",
   268  				successful: true,
   269  			},
   270  			{
   271  				index: 281474976710651,
   272  				secret: "631373ad5f9ef654bb3dade742d09504c567" +
   273  					"edd24320d2fcd68e3cc47e2ff6a6",
   274  				successful: true,
   275  			},
   276  			{
   277  				index: 281474976710650,
   278  				secret: "b7e76a83668bde38b373970155c868a65330" +
   279  					"4308f9896692f904a23731224bb1",
   280  				successful: true,
   281  			},
   282  			{
   283  				index: 281474976710649,
   284  				secret: "a5a64476122ca0925fb344bdc1854c1c0a59f" +
   285  					"c614298e50a33e331980a220f32",
   286  				successful: true,
   287  			},
   288  			{
   289  				index: 281474976710648,
   290  				secret: "05cde6323d949933f7f7b78776bcc1ea6d9b" +
   291  					"31447732e3802e1f7ac44b650e17",
   292  				successful: false,
   293  			},
   294  		},
   295  	},
   296  	{
   297  		name: "insert_secret #7 incorrect",
   298  		inserts: []testInsert{
   299  			{
   300  				index: 281474976710655,
   301  				secret: "7cc854b54e3e0dcdb010d7a3fee464a9687b" +
   302  					"e6e8db3be6854c475621e007a5dc",
   303  				successful: true,
   304  			},
   305  			{
   306  				index: 281474976710654,
   307  				secret: "c7518c8ae4660ed02894df8976fa1a3659c1a" +
   308  					"8b4b5bec0c4b872abeba4cb8964",
   309  				successful: true,
   310  			},
   311  			{
   312  				index: 281474976710653,
   313  				secret: "2273e227a5b7449b6e70f1fb4652864038b1" +
   314  					"cbf9cd7c043a7d6456b7fc275ad8",
   315  				successful: true,
   316  			},
   317  			{
   318  				index: 281474976710652,
   319  				secret: "27cddaa5624534cb6cb9d7da077cf2b22ab21" +
   320  					"e9b506fd4998a51d54502e99116",
   321  				successful: true,
   322  			},
   323  			{
   324  				index: 281474976710651,
   325  				secret: "c65716add7aa98ba7acb236352d665cab173" +
   326  					"45fe45b55fb879ff80e6bd0c41dd",
   327  				successful: true,
   328  			},
   329  			{
   330  				index: 281474976710650,
   331  				secret: "969660042a28f32d9be17344e09374b37996" +
   332  					"2d03db1574df5a8a5a47e19ce3f2",
   333  				successful: true,
   334  			},
   335  			{
   336  				index: 281474976710649,
   337  				secret: "e7971de736e01da8ed58b94c2fc216cb1d" +
   338  					"ca9e326f3a96e7194fe8ea8af6c0a3",
   339  				successful: true,
   340  			},
   341  			{
   342  				index: 281474976710648,
   343  				secret: "05cde6323d949933f7f7b78776bcc1ea6d" +
   344  					"9b31447732e3802e1f7ac44b650e17",
   345  				successful: false,
   346  			},
   347  		},
   348  	},
   349  	{
   350  		name: "insert_secret #8 incorrect",
   351  		inserts: []testInsert{
   352  			{
   353  				index: 281474976710655,
   354  				secret: "7cc854b54e3e0dcdb010d7a3fee464a9687b" +
   355  					"e6e8db3be6854c475621e007a5dc",
   356  				successful: true,
   357  			},
   358  			{
   359  				index: 281474976710654,
   360  				secret: "c7518c8ae4660ed02894df8976fa1a3659c1a" +
   361  					"8b4b5bec0c4b872abeba4cb8964",
   362  				successful: true,
   363  			},
   364  			{
   365  				index: 281474976710653,
   366  				secret: "2273e227a5b7449b6e70f1fb4652864038b1" +
   367  					"cbf9cd7c043a7d6456b7fc275ad8",
   368  				successful: true,
   369  			},
   370  			{
   371  				index: 281474976710652,
   372  				secret: "27cddaa5624534cb6cb9d7da077cf2b22ab21" +
   373  					"e9b506fd4998a51d54502e99116",
   374  				successful: true,
   375  			},
   376  			{
   377  				index: 281474976710651,
   378  				secret: "c65716add7aa98ba7acb236352d665cab173" +
   379  					"45fe45b55fb879ff80e6bd0c41dd",
   380  				successful: true,
   381  			},
   382  			{
   383  				index: 281474976710650,
   384  				secret: "969660042a28f32d9be17344e09374b37996" +
   385  					"2d03db1574df5a8a5a47e19ce3f2",
   386  				successful: true,
   387  			},
   388  			{
   389  				index: 281474976710649,
   390  				secret: "a5a64476122ca0925fb344bdc1854c1c0a" +
   391  					"59fc614298e50a33e331980a220f32",
   392  				successful: true,
   393  			},
   394  			{
   395  				index: 281474976710648,
   396  				secret: "a7efbc61aac46d34f77778bac22c8a20c6" +
   397  					"a46ca460addc49009bda875ec88fa4",
   398  				successful: false,
   399  			},
   400  		},
   401  	},
   402  }
   403  
   404  // TestSpecificationShaChainInsert is used to check the consistency with
   405  // specification hash insert function.
   406  func TestSpecificationShaChainInsert(t *testing.T) {
   407  	t.Parallel()
   408  
   409  	for _, test := range tests {
   410  		receiver := NewRevocationStore()
   411  
   412  		for _, insert := range test.inserts {
   413  			secret, err := NewHashFromStr(insert.secret)
   414  			if err != nil {
   415  				t.Fatal(err)
   416  			}
   417  
   418  			if err := receiver.AddNextEntry(secret); err != nil {
   419  				if insert.successful {
   420  					t.Fatalf("Failed (%v): error was "+
   421  						"received but it shouldn't: "+
   422  						"%v", test.name, err)
   423  				}
   424  			} else {
   425  				if !insert.successful {
   426  					t.Fatalf("Failed (%v): error wasn't "+
   427  						"received", test.name)
   428  				}
   429  			}
   430  		}
   431  
   432  		t.Logf("Passed (%v)", test.name)
   433  	}
   434  }
   435  
   436  // TestShaChainStore checks the ability of shachain store to hold the produced
   437  // secrets after recovering from bytes data.
   438  func TestShaChainStore(t *testing.T) {
   439  	t.Parallel()
   440  
   441  	seed := ShaHash(sha256.Sum256([]byte("shachaintest")))
   442  
   443  	sender := NewRevocationProducer(seed)
   444  	receiver := NewRevocationStore()
   445  
   446  	for n := uint64(0); n < 10000; n++ {
   447  		sha, err := sender.AtIndex(n)
   448  		if err != nil {
   449  			t.Fatal(err)
   450  		}
   451  
   452  		if err = receiver.AddNextEntry(sha); err != nil {
   453  			t.Fatal(err)
   454  		}
   455  	}
   456  
   457  	var b bytes.Buffer
   458  	if err := receiver.Encode(&b); err != nil {
   459  		t.Fatal(err)
   460  	}
   461  
   462  	newReceiver, err := NewRevocationStoreFromBytes(&b)
   463  	if err != nil {
   464  		t.Fatal(err)
   465  	}
   466  
   467  	for n := uint64(0); n < 10000; n++ {
   468  		if _, err := newReceiver.LookUp(n); err != nil {
   469  			t.Fatal(err)
   470  		}
   471  	}
   472  }