github.com/ethereum/go-ethereum@v1.16.1/core/rawdb/freezer_meta_test.go (about) 1 // Copyright 2022 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 rawdb 18 19 import ( 20 "os" 21 "testing" 22 23 "github.com/ethereum/go-ethereum/rlp" 24 ) 25 26 func TestReadWriteFreezerTableMeta(t *testing.T) { 27 f, err := os.CreateTemp(t.TempDir(), "*") 28 if err != nil { 29 t.Fatalf("Failed to create file %v", err) 30 } 31 defer f.Close() 32 33 meta, err := newMetadata(f) 34 if err != nil { 35 t.Fatalf("Failed to new metadata %v", err) 36 } 37 meta.setVirtualTail(100, false) 38 39 meta, err = newMetadata(f) 40 if err != nil { 41 t.Fatalf("Failed to reload metadata %v", err) 42 } 43 if meta.version != freezerTableV2 { 44 t.Fatalf("Unexpected version field") 45 } 46 if meta.virtualTail != uint64(100) { 47 t.Fatalf("Unexpected virtual tail field") 48 } 49 } 50 51 func TestUpgradeMetadata(t *testing.T) { 52 f, err := os.CreateTemp(t.TempDir(), "*") 53 if err != nil { 54 t.Fatalf("Failed to create file %v", err) 55 } 56 defer f.Close() 57 58 // Write legacy metadata into file 59 type obj struct { 60 Version uint16 61 Tail uint64 62 } 63 var o obj 64 o.Version = freezerTableV1 65 o.Tail = 100 66 67 if err := rlp.Encode(f, &o); err != nil { 68 t.Fatalf("Failed to encode %v", err) 69 } 70 71 // Reload the metadata, a silent upgrade is expected 72 meta, err := newMetadata(f) 73 if err != nil { 74 t.Fatalf("Failed to read metadata %v", err) 75 } 76 if meta.version != freezerTableV1 { 77 t.Fatal("Unexpected version field") 78 } 79 if meta.virtualTail != uint64(100) { 80 t.Fatal("Unexpected virtual tail field") 81 } 82 if meta.flushOffset != 0 { 83 t.Fatal("Unexpected flush offset field") 84 } 85 86 meta.setFlushOffset(100, true) 87 88 meta, err = newMetadata(f) 89 if err != nil { 90 t.Fatalf("Failed to read metadata %v", err) 91 } 92 if meta.version != freezerTableV2 { 93 t.Fatal("Unexpected version field") 94 } 95 if meta.virtualTail != uint64(100) { 96 t.Fatal("Unexpected virtual tail field") 97 } 98 if meta.flushOffset != 100 { 99 t.Fatal("Unexpected flush offset field") 100 } 101 } 102 103 func TestInvalidMetadata(t *testing.T) { 104 f, err := os.CreateTemp(t.TempDir(), "*") 105 if err != nil { 106 t.Fatalf("Failed to create file %v", err) 107 } 108 defer f.Close() 109 110 // Write invalid legacy metadata into file 111 type obj struct { 112 Version uint16 113 Tail uint64 114 } 115 var o obj 116 o.Version = freezerTableV2 // -> invalid version tag 117 o.Tail = 100 118 119 if err := rlp.Encode(f, &o); err != nil { 120 t.Fatalf("Failed to encode %v", err) 121 } 122 _, err = newMetadata(f) 123 if err == nil { 124 t.Fatal("Unexpected success") 125 } 126 }