@@ -6,6 +6,8 @@ package core
66import (
77 "fmt"
88 "math/big"
9+ "os"
10+ "path/filepath"
911 "slices"
1012 "testing"
1113
@@ -164,6 +166,30 @@ func copyMemDB(db ethdb.Database) (ethdb.Database, error) {
164166 return newDB , nil
165167}
166168
169+ // This copies all files from a flat directory [src] to a new temporary directory and returns
170+ // the path to the new directory.
171+ func copyFlatDir (t * testing.T , src string ) string {
172+ t .Helper ()
173+ if src == "" {
174+ return ""
175+ }
176+
177+ dst := t .TempDir ()
178+ ents , err := os .ReadDir (src )
179+ require .NoError (t , err )
180+
181+ for _ , e := range ents {
182+ require .False (t , e .IsDir (), "expected flat directory" )
183+ name := e .Name ()
184+ data , err := os .ReadFile (filepath .Join (src , name ))
185+ require .NoError (t , err )
186+ info , err := e .Info ()
187+ require .NoError (t , err )
188+ require .NoError (t , os .WriteFile (filepath .Join (dst , name ), data , info .Mode ().Perm ()))
189+ }
190+ return dst
191+ }
192+
167193// checkBlockChainState creates a new BlockChain instance and checks that exporting each block from
168194// genesis to last accepted from the original instance yields the same last accepted block and state
169195// root.
@@ -211,7 +237,8 @@ func checkBlockChainState(
211237 // Copy the database over to prevent any issues when re-using [originalDB] after this call.
212238 originalDB , err = copyMemDB (originalDB )
213239 require .NoError (err )
214- restartedChain , err := create (originalDB , gspec , lastAcceptedBlock .Hash (), oldChainDataDir )
240+ newChainDataDir := copyFlatDir (t , oldChainDataDir )
241+ restartedChain , err := create (originalDB , gspec , lastAcceptedBlock .Hash (), newChainDataDir )
215242 require .NoError (err )
216243 defer restartedChain .Stop ()
217244 currentBlock := restartedChain .CurrentBlock ()
0 commit comments