github.com/cryptotooltop/go-ethereum@v0.0.0-20231103184714-151d1922f3e5/p2p/dnsdisc/tree_test.go (about) 1 // Copyright 2018 The go-ethereum Authors 2 // This file is part of the go-ethereum library. 3 // 4 // The go-ethereum library is free software: you can redistribute it and/or modify 5 // it under the terms of the GNU Lesser General Public License as published by 6 // the Free Software Foundation, either version 3 of the License, or 7 // (at your option) any later version. 8 // 9 // The go-ethereum library is distributed in the hope that it will be useful, 10 // but WITHOUT ANY WARRANTY; without even the implied warranty of 11 // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 12 // GNU Lesser General Public License for more details. 13 // 14 // You should have received a copy of the GNU Lesser General Public License 15 // along with the go-ethereum library. If not, see <http://www.gnu.org/licenses/>. 16 17 package dnsdisc 18 19 import ( 20 "reflect" 21 "testing" 22 23 "github.com/davecgh/go-spew/spew" 24 25 "github.com/scroll-tech/go-ethereum/common/hexutil" 26 "github.com/scroll-tech/go-ethereum/p2p/enode" 27 ) 28 29 func TestParseRoot(t *testing.T) { 30 tests := []struct { 31 input string 32 e rootEntry 33 err error 34 }{ 35 { 36 input: "enrtree-root:v1 e=TO4Q75OQ2N7DX4EOOR7X66A6OM seq=3 sig=N-YY6UB9xD0hFx1Gmnt7v0RfSxch5tKyry2SRDoLx7B4GfPXagwLxQqyf7gAMvApFn_ORwZQekMWa_pXrcGCtw", 37 err: entryError{"root", errSyntax}, 38 }, 39 { 40 input: "enrtree-root:v1 e=TO4Q75OQ2N7DX4EOOR7X66A6OM l=TO4Q75OQ2N7DX4EOOR7X66A6OM seq=3 sig=N-YY6UB9xD0hFx1Gmnt7v0RfSxch5tKyry2SRDoLx7B4GfPXagwLxQqyf7gAMvApFn_ORwZQekMWa_pXrcGCtw", 41 err: entryError{"root", errInvalidSig}, 42 }, 43 { 44 input: "enrtree-root:v1 e=QFT4PBCRX4XQCV3VUYJ6BTCEPU l=JGUFMSAGI7KZYB3P7IZW4S5Y3A seq=3 sig=3FmXuVwpa8Y7OstZTx9PIb1mt8FrW7VpDOFv4AaGCsZ2EIHmhraWhe4NxYhQDlw5MjeFXYMbJjsPeKlHzmJREQE", 45 e: rootEntry{ 46 eroot: "QFT4PBCRX4XQCV3VUYJ6BTCEPU", 47 lroot: "JGUFMSAGI7KZYB3P7IZW4S5Y3A", 48 seq: 3, 49 sig: hexutil.MustDecode("0xdc5997b95c296bc63b3acb594f1f4f21bd66b7c16b5bb5690ce16fe006860ac6761081e686b69685ee0dc588500e5c393237855d831b263b0f78a947ce62511101"), 50 }, 51 }, 52 } 53 for i, test := range tests { 54 e, err := parseRoot(test.input) 55 if !reflect.DeepEqual(e, test.e) { 56 t.Errorf("test %d: wrong entry %s, want %s", i, spew.Sdump(e), spew.Sdump(test.e)) 57 } 58 if err != test.err { 59 t.Errorf("test %d: wrong error %q, want %q", i, err, test.err) 60 } 61 } 62 } 63 64 func TestParseEntry(t *testing.T) { 65 testkey := testKey(signingKeySeed) 66 tests := []struct { 67 input string 68 e entry 69 err error 70 }{ 71 // Subtrees: 72 { 73 input: "enrtree-branch:1,2", 74 err: entryError{"branch", errInvalidChild}, 75 }, 76 { 77 input: "enrtree-branch:AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA", 78 err: entryError{"branch", errInvalidChild}, 79 }, 80 { 81 input: "enrtree-branch:", 82 e: &branchEntry{}, 83 }, 84 { 85 input: "enrtree-branch:AAAAAAAAAAAAAAAAAAAA", 86 e: &branchEntry{[]string{"AAAAAAAAAAAAAAAAAAAA"}}, 87 }, 88 { 89 input: "enrtree-branch:AAAAAAAAAAAAAAAAAAAA,BBBBBBBBBBBBBBBBBBBB", 90 e: &branchEntry{[]string{"AAAAAAAAAAAAAAAAAAAA", "BBBBBBBBBBBBBBBBBBBB"}}, 91 }, 92 // Links 93 { 94 input: "enrtree://AKPYQIUQIL7PSIACI32J7FGZW56E5FKHEFCCOFHILBIMW3M6LWXS2@nodes.example.org", 95 e: &linkEntry{"AKPYQIUQIL7PSIACI32J7FGZW56E5FKHEFCCOFHILBIMW3M6LWXS2@nodes.example.org", "nodes.example.org", &testkey.PublicKey}, 96 }, 97 { 98 input: "enrtree://nodes.example.org", 99 err: entryError{"link", errNoPubkey}, 100 }, 101 { 102 input: "enrtree://AP62DT7WOTEQZGQZOU474PP3KMEGVTTE7A7NPRXKX3DUD57@nodes.example.org", 103 err: entryError{"link", errBadPubkey}, 104 }, 105 { 106 input: "enrtree://AP62DT7WONEQZGQZOU474PP3KMEGVTTE7A7NPRXKX3DUD57TQHGIA@nodes.example.org", 107 err: entryError{"link", errBadPubkey}, 108 }, 109 // ENRs 110 { 111 input: "enr:-HW4QES8QIeXTYlDzbfr1WEzE-XKY4f8gJFJzjJL-9D7TC9lJb4Z3JPRRz1lP4pL_N_QpT6rGQjAU9Apnc-C1iMP36OAgmlkgnY0iXNlY3AyNTZrMaED5IdwfMxdmR8W37HqSFdQLjDkIwBd4Q_MjxgZifgKSdM", 112 e: &enrEntry{node: testNode(nodesSeed1)}, 113 }, 114 { 115 input: "enr:-HW4QLZHjM4vZXkbp-5xJoHsKSbE7W39FPC8283X-y8oHcHPTnDDlIlzL5ArvDUlHZVDPgmFASrh7cWgLOLxj4wprRkHgmlkgnY0iXNlY3AyNTZrMaEC3t2jLMhDpCDX5mbSEwDn4L3iUfyXzoO8G28XvjGRkrAg=", 116 err: entryError{"enr", errInvalidENR}, 117 }, 118 // Invalid: 119 {input: "", err: errUnknownEntry}, 120 {input: "foo", err: errUnknownEntry}, 121 {input: "enrtree", err: errUnknownEntry}, 122 {input: "enrtree-x=", err: errUnknownEntry}, 123 } 124 for i, test := range tests { 125 e, err := parseEntry(test.input, enode.ValidSchemes) 126 if !reflect.DeepEqual(e, test.e) { 127 t.Errorf("test %d: wrong entry %s, want %s", i, spew.Sdump(e), spew.Sdump(test.e)) 128 } 129 if err != test.err { 130 t.Errorf("test %d: wrong error %q, want %q", i, err, test.err) 131 } 132 } 133 } 134 135 func TestMakeTree(t *testing.T) { 136 nodes := testNodes(nodesSeed2, 50) 137 tree, err := MakeTree(2, nodes, nil) 138 if err != nil { 139 t.Fatal(err) 140 } 141 txt := tree.ToTXT("") 142 if len(txt) < len(nodes)+1 { 143 t.Fatal("too few TXT records in output") 144 } 145 }