You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

90 lines
1.9 KiB

  1. package asmtree
  2. import (
  3. "bytes"
  4. "fmt"
  5. "testing"
  6. )
  7. func TestTree(t *testing.T) {
  8. censusSize := 1000
  9. storage := t.TempDir()
  10. tr1 := &Tree{}
  11. err := tr1.Init("test1", storage)
  12. if err != nil {
  13. t.Fatal(err)
  14. }
  15. for i := 0; i < censusSize; i++ {
  16. if err = tr1.Add([]byte(fmt.Sprintf("number %d", i)),
  17. []byte(fmt.Sprintf("number %d value", i))); err != nil {
  18. t.Fatal(err)
  19. }
  20. }
  21. root1 := tr1.Root()
  22. data, err := tr1.Dump(root1)
  23. if err != nil {
  24. t.Fatal(err)
  25. }
  26. t.Logf("dumped data size is: %d bytes", len(data))
  27. tr2 := &Tree{}
  28. err = tr2.Init("test2", storage)
  29. if err != nil {
  30. t.Fatal(err)
  31. }
  32. if err = tr2.ImportDump(data); err != nil {
  33. t.Fatal(err)
  34. }
  35. root2 := tr2.Root()
  36. if !bytes.Equal(root1, root2) {
  37. t.Errorf("roots are different but they should be equal (%x != %x)", root1, root2)
  38. }
  39. // Try closing the storage and creating the tree again
  40. tr2.Close()
  41. err = tr2.Init("test2", storage)
  42. if err != nil {
  43. t.Fatal(err)
  44. }
  45. // Get the size
  46. s, err := tr2.Size(nil)
  47. if err != nil {
  48. t.Errorf("cannot get te size of the tree after reopen: (%s)", err)
  49. }
  50. if s != int64(censusSize) {
  51. t.Errorf("Size is wrong (have %d, expexted %d)", s, censusSize)
  52. }
  53. // Check Root is still the same
  54. if !bytes.Equal(tr2.Root(), root2) {
  55. t.Fatalf("after closing and opening the tree, the root is different")
  56. }
  57. // Generate a proof on tr1 and check validity on snapshot and tr2
  58. proof1, err := tr1.GenProof([]byte("number 5"), []byte("number 5 value"))
  59. if err != nil {
  60. t.Error(err)
  61. }
  62. t.Logf("Proof Length: %d", len(proof1))
  63. tr1s, err := tr1.Snapshot(root1)
  64. if err != nil {
  65. t.Fatal(err)
  66. }
  67. valid, err := tr1s.CheckProof([]byte("number 5"), []byte("number 5 value"), root1, proof1)
  68. if err != nil {
  69. t.Error(err)
  70. }
  71. if !valid {
  72. t.Errorf("proof is invalid on snapshot")
  73. }
  74. valid, err = tr2.CheckProof([]byte("number 5"), []byte("number 5 value"), nil, proof1)
  75. if err != nil {
  76. t.Error(err)
  77. }
  78. if !valid {
  79. t.Errorf("proof is invalid on tree2")
  80. }
  81. }