aboutsummaryrefslogtreecommitdiffstats
path: root/cmd/swarm/export_test.go
diff options
context:
space:
mode:
Diffstat (limited to 'cmd/swarm/export_test.go')
-rw-r--r--cmd/swarm/export_test.go287
1 files changed, 0 insertions, 287 deletions
diff --git a/cmd/swarm/export_test.go b/cmd/swarm/export_test.go
deleted file mode 100644
index ca82cfd4c..000000000
--- a/cmd/swarm/export_test.go
+++ /dev/null
@@ -1,287 +0,0 @@
-// Copyright 2018 The go-ethereum Authors
-// This file is part of go-ethereum.
-//
-// go-ethereum is free software: you can redistribute it and/or modify
-// it under the terms of the GNU General Public License as published by
-// the Free Software Foundation, either version 3 of the License, or
-// (at your option) any later version.
-//
-// go-ethereum is distributed in the hope that it will be useful,
-// but WITHOUT ANY WARRANTY; without even the implied warranty of
-// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
-// GNU General Public License for more details.
-//
-// You should have received a copy of the GNU General Public License
-// along with go-ethereum. If not, see <http://www.gnu.org/licenses/>.
-
-package main
-
-import (
- "archive/tar"
- "bytes"
- "compress/gzip"
- "crypto/md5"
- "encoding/base64"
- "encoding/hex"
- "io"
- "io/ioutil"
- "net/http"
- "os"
- "path"
- "runtime"
- "strings"
- "testing"
-
- "github.com/ethereum/go-ethereum/cmd/swarm/testdata"
- "github.com/ethereum/go-ethereum/log"
- "github.com/ethereum/go-ethereum/swarm"
- "github.com/ethereum/go-ethereum/swarm/testutil"
-)
-
-const (
- DATABASE_FIXTURE_BZZ_ACCOUNT = "0aa159029fa13ffa8fa1c6fff6ebceface99d6a4"
- DATABASE_FIXTURE_PASSWORD = "pass"
- FIXTURE_DATADIR_PREFIX = "swarm/bzz-0aa159029fa13ffa8fa1c6fff6ebceface99d6a4"
- FixtureBaseKey = "a9f22b3d77b4bdf5f3eefce995d6c8e7cecf2636f20956f08a0d1ed95adb52ad"
-)
-
-// TestCLISwarmExportImport perform the following test:
-// 1. runs swarm node
-// 2. uploads a random file
-// 3. runs an export of the local datastore
-// 4. runs a second swarm node
-// 5. imports the exported datastore
-// 6. fetches the uploaded random file from the second node
-func TestCLISwarmExportImport(t *testing.T) {
- if runtime.GOOS == "windows" {
- t.Skip()
- }
- cluster := newTestCluster(t, 1)
-
- // generate random 1mb file
- content := testutil.RandomBytes(1, 1000000)
- fileName := testutil.TempFileWithContent(t, string(content))
- defer os.Remove(fileName)
-
- // upload the file with 'swarm up' and expect a hash
- up := runSwarm(t, "--bzzapi", cluster.Nodes[0].URL, "up", fileName)
- _, matches := up.ExpectRegexp(`[a-f\d]{64}`)
- up.ExpectExit()
- hash := matches[0]
-
- var info swarm.Info
- if err := cluster.Nodes[0].Client.Call(&info, "bzz_info"); err != nil {
- t.Fatal(err)
- }
-
- cluster.Stop()
- defer cluster.Cleanup()
-
- // generate an export.tar
- exportCmd := runSwarm(t, "db", "export", info.Path+"/chunks", info.Path+"/export.tar", strings.TrimPrefix(info.BzzKey, "0x"))
- exportCmd.ExpectExit()
-
- // start second cluster
- cluster2 := newTestCluster(t, 1)
-
- var info2 swarm.Info
- if err := cluster2.Nodes[0].Client.Call(&info2, "bzz_info"); err != nil {
- t.Fatal(err)
- }
-
- // stop second cluster, so that we close LevelDB
- cluster2.Stop()
- defer cluster2.Cleanup()
-
- // import the export.tar
- importCmd := runSwarm(t, "db", "import", info2.Path+"/chunks", info.Path+"/export.tar", strings.TrimPrefix(info2.BzzKey, "0x"))
- importCmd.ExpectExit()
-
- // spin second cluster back up
- cluster2.StartExistingNodes(t, 1, strings.TrimPrefix(info2.BzzAccount, "0x"))
-
- // try to fetch imported file
- res, err := http.Get(cluster2.Nodes[0].URL + "/bzz:/" + hash)
- if err != nil {
- t.Fatal(err)
- }
-
- if res.StatusCode != 200 {
- t.Fatalf("expected HTTP status %d, got %s", 200, res.Status)
- }
-
- // compare downloaded file with the generated random file
- mustEqualFiles(t, bytes.NewReader(content), res.Body)
-}
-
-// TestExportLegacyToNew checks that an old database gets imported correctly into the new localstore structure
-// The test sequence is as follows:
-// 1. unpack database fixture to tmp dir
-// 2. try to open with new swarm binary that should complain about old database
-// 3. export from old database
-// 4. remove the chunks folder
-// 5. import the dump
-// 6. file should be accessible
-func TestExportLegacyToNew(t *testing.T) {
- if runtime.GOOS == "windows" {
- t.Skip() // this should be reenabled once the appveyor tests underlying issue is fixed
- }
- /*
- fixture bzz account 0aa159029fa13ffa8fa1c6fff6ebceface99d6a4
- */
- const UPLOADED_FILE_MD5_HASH = "a001fdae53ba50cae584b8b02b06f821"
- const UPLOADED_HASH = "67a86082ee0ea1bc7dd8d955bb1e14d04f61d55ae6a4b37b3d0296a3a95e454a"
- tmpdir, err := ioutil.TempDir("", "swarm-test")
- log.Trace("running legacy datastore migration test", "temp dir", tmpdir)
- defer os.RemoveAll(tmpdir)
- if err != nil {
- t.Fatal(err)
- }
- inflateBase64Gzip(t, testdata.DATADIR_MIGRATION_FIXTURE, tmpdir)
-
- tmpPassword := testutil.TempFileWithContent(t, DATABASE_FIXTURE_PASSWORD)
- defer os.Remove(tmpPassword)
-
- flags := []string{
- "--datadir", tmpdir,
- "--bzzaccount", DATABASE_FIXTURE_BZZ_ACCOUNT,
- "--password", tmpPassword,
- }
-
- newSwarmOldDb := runSwarm(t, flags...)
- _, matches := newSwarmOldDb.ExpectRegexp(".+")
- newSwarmOldDb.ExpectExit()
-
- if len(matches) == 0 {
- t.Fatalf("stdout not matched")
- }
-
- if newSwarmOldDb.ExitStatus() == 0 {
- t.Fatal("should error")
- }
- t.Log("exporting legacy database")
- actualDataDir := path.Join(tmpdir, FIXTURE_DATADIR_PREFIX)
- exportCmd := runSwarm(t, "--verbosity", "5", "db", "export", actualDataDir+"/chunks", tmpdir+"/export.tar", FixtureBaseKey)
- exportCmd.ExpectExit()
-
- stat, err := os.Stat(tmpdir + "/export.tar")
- if err != nil {
- t.Fatal(err)
- }
-
- // make some silly size assumption
- if stat.Size() < 90000 {
- t.Fatal("export size too small")
- }
- log.Info("removing chunk datadir")
- err = os.RemoveAll(path.Join(actualDataDir, "chunks"))
- if err != nil {
- t.Fatal(err)
- }
-
- // start second cluster
- cluster2 := newTestCluster(t, 1)
- var info2 swarm.Info
- if err := cluster2.Nodes[0].Client.Call(&info2, "bzz_info"); err != nil {
- t.Fatal(err)
- }
-
- // stop second cluster, so that we close LevelDB
- cluster2.Stop()
- defer cluster2.Cleanup()
-
- // import the export.tar
- importCmd := runSwarm(t, "db", "import", "--legacy", info2.Path+"/chunks", tmpdir+"/export.tar", strings.TrimPrefix(info2.BzzKey, "0x"))
- importCmd.ExpectExit()
-
- // spin second cluster back up
- cluster2.StartExistingNodes(t, 1, strings.TrimPrefix(info2.BzzAccount, "0x"))
- t.Log("trying to http get the file")
- // try to fetch imported file
- res, err := http.Get(cluster2.Nodes[0].URL + "/bzz:/" + UPLOADED_HASH)
- if err != nil {
- t.Fatal(err)
- }
-
- if res.StatusCode != 200 {
- t.Fatalf("expected HTTP status %d, got %s", 200, res.Status)
- }
- h := md5.New()
- if _, err := io.Copy(h, res.Body); err != nil {
- t.Fatal(err)
- }
-
- sum := h.Sum(nil)
-
- b, err := hex.DecodeString(UPLOADED_FILE_MD5_HASH)
- if err != nil {
- t.Fatal(err)
- }
-
- if !bytes.Equal(sum, b) {
- t.Fatal("should be equal")
- }
-}
-
-func mustEqualFiles(t *testing.T, up io.Reader, down io.Reader) {
- h := md5.New()
- upLen, err := io.Copy(h, up)
- if err != nil {
- t.Fatal(err)
- }
- upHash := h.Sum(nil)
- h.Reset()
- downLen, err := io.Copy(h, down)
- if err != nil {
- t.Fatal(err)
- }
- downHash := h.Sum(nil)
-
- if !bytes.Equal(upHash, downHash) || upLen != downLen {
- t.Fatalf("downloaded imported file md5=%x (length %v) is not the same as the generated one mp5=%x (length %v)", downHash, downLen, upHash, upLen)
- }
-}
-
-func inflateBase64Gzip(t *testing.T, base64File, directory string) {
- t.Helper()
-
- f := base64.NewDecoder(base64.StdEncoding, strings.NewReader(base64File))
- gzf, err := gzip.NewReader(f)
- if err != nil {
- t.Fatal(err)
- }
-
- tarReader := tar.NewReader(gzf)
-
- for {
- header, err := tarReader.Next()
- if err == io.EOF {
- break
- }
-
- if err != nil {
- t.Fatal(err)
- }
-
- name := header.Name
-
- switch header.Typeflag {
- case tar.TypeDir:
- err := os.Mkdir(path.Join(directory, name), os.ModePerm)
- if err != nil {
- t.Fatal(err)
- }
- case tar.TypeReg:
- file, err := os.Create(path.Join(directory, name))
- if err != nil {
- t.Fatal(err)
- }
- if _, err := io.Copy(file, tarReader); err != nil {
- t.Fatal(err)
- }
- file.Close()
- default:
- t.Fatal("shouldn't happen")
- }
- }
-}