Skip to content

Commit

Permalink
swarm/api/http: added a regression test for resolver bug from ethereu…
Browse files Browse the repository at this point in the history
  • Loading branch information
acud authored and gbalint committed Sep 6, 2018
1 parent 5918b88 commit 4c15fff
Show file tree
Hide file tree
Showing 4 changed files with 148 additions and 23 deletions.
14 changes: 7 additions & 7 deletions swarm/api/client/client_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -47,7 +47,7 @@ func TestClientUploadDownloadRawEncrypted(t *testing.T) {
}

func testClientUploadDownloadRaw(toEncrypt bool, t *testing.T) {
srv := testutil.NewTestSwarmServer(t, serverFunc)
srv := testutil.NewTestSwarmServer(t, serverFunc, nil)
defer srv.Close()

client := NewClient(srv.URL)
Expand Down Expand Up @@ -88,7 +88,7 @@ func TestClientUploadDownloadFilesEncrypted(t *testing.T) {
}

func testClientUploadDownloadFiles(toEncrypt bool, t *testing.T) {
srv := testutil.NewTestSwarmServer(t, serverFunc)
srv := testutil.NewTestSwarmServer(t, serverFunc, nil)
defer srv.Close()

client := NewClient(srv.URL)
Expand Down Expand Up @@ -186,7 +186,7 @@ func newTestDirectory(t *testing.T) string {
// TestClientUploadDownloadDirectory tests uploading and downloading a
// directory of files to a swarm manifest
func TestClientUploadDownloadDirectory(t *testing.T) {
srv := testutil.NewTestSwarmServer(t, serverFunc)
srv := testutil.NewTestSwarmServer(t, serverFunc, nil)
defer srv.Close()

dir := newTestDirectory(t)
Expand Down Expand Up @@ -252,7 +252,7 @@ func TestClientFileListEncrypted(t *testing.T) {
}

func testClientFileList(toEncrypt bool, t *testing.T) {
srv := testutil.NewTestSwarmServer(t, serverFunc)
srv := testutil.NewTestSwarmServer(t, serverFunc, nil)
defer srv.Close()

dir := newTestDirectory(t)
Expand Down Expand Up @@ -310,7 +310,7 @@ func testClientFileList(toEncrypt bool, t *testing.T) {
// TestClientMultipartUpload tests uploading files to swarm using a multipart
// upload
func TestClientMultipartUpload(t *testing.T) {
srv := testutil.NewTestSwarmServer(t, serverFunc)
srv := testutil.NewTestSwarmServer(t, serverFunc, nil)
defer srv.Close()

// define an uploader which uploads testDirFiles with some data
Expand Down Expand Up @@ -376,7 +376,7 @@ func TestClientCreateResourceMultihash(t *testing.T) {

signer, _ := newTestSigner()

srv := testutil.NewTestSwarmServer(t, serverFunc)
srv := testutil.NewTestSwarmServer(t, serverFunc, nil)
client := NewClient(srv.URL)
defer srv.Close()

Expand Down Expand Up @@ -439,7 +439,7 @@ func TestClientCreateUpdateResource(t *testing.T) {

signer, _ := newTestSigner()

srv := testutil.NewTestSwarmServer(t, serverFunc)
srv := testutil.NewTestSwarmServer(t, serverFunc, nil)
client := NewClient(srv.URL)
defer srv.Close()

Expand Down
10 changes: 5 additions & 5 deletions swarm/api/http/response_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -29,7 +29,7 @@ import (
)

func TestError(t *testing.T) {
srv := testutil.NewTestSwarmServer(t, serverFunc)
srv := testutil.NewTestSwarmServer(t, serverFunc, nil)
defer srv.Close()

var resp *http.Response
Expand All @@ -55,7 +55,7 @@ func TestError(t *testing.T) {
}

func Test404Page(t *testing.T) {
srv := testutil.NewTestSwarmServer(t, serverFunc)
srv := testutil.NewTestSwarmServer(t, serverFunc, nil)
defer srv.Close()

var resp *http.Response
Expand All @@ -81,7 +81,7 @@ func Test404Page(t *testing.T) {
}

func Test500Page(t *testing.T) {
srv := testutil.NewTestSwarmServer(t, serverFunc)
srv := testutil.NewTestSwarmServer(t, serverFunc, nil)
defer srv.Close()

var resp *http.Response
Expand All @@ -106,7 +106,7 @@ func Test500Page(t *testing.T) {
}
}
func Test500PageWith0xHashPrefix(t *testing.T) {
srv := testutil.NewTestSwarmServer(t, serverFunc)
srv := testutil.NewTestSwarmServer(t, serverFunc, nil)
defer srv.Close()

var resp *http.Response
Expand Down Expand Up @@ -136,7 +136,7 @@ func Test500PageWith0xHashPrefix(t *testing.T) {
}

func TestJsonResponse(t *testing.T) {
srv := testutil.NewTestSwarmServer(t, serverFunc)
srv := testutil.NewTestSwarmServer(t, serverFunc, nil)
defer srv.Close()

var resp *http.Response
Expand Down
143 changes: 134 additions & 9 deletions swarm/api/http/server_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -27,6 +27,7 @@ import (
"fmt"
"io"
"io/ioutil"
"math/big"
"mime/multipart"
"net/http"
"os"
Expand All @@ -36,6 +37,7 @@ import (
"time"

"github.com/ethereum/go-ethereum/common"
"github.com/ethereum/go-ethereum/core/types"
"github.com/ethereum/go-ethereum/crypto"
"github.com/ethereum/go-ethereum/log"
"github.com/ethereum/go-ethereum/swarm/api"
Expand Down Expand Up @@ -114,7 +116,7 @@ func TestBzzResourceMultihash(t *testing.T) {

signer, _ := newTestSigner()

srv := testutil.NewTestSwarmServer(t, serverFunc)
srv := testutil.NewTestSwarmServer(t, serverFunc, nil)
defer srv.Close()

// add the data our multihash aliased manifest will point to
Expand Down Expand Up @@ -208,7 +210,7 @@ func TestBzzResourceMultihash(t *testing.T) {

// Test resource updates using the raw update methods
func TestBzzResource(t *testing.T) {
srv := testutil.NewTestSwarmServer(t, serverFunc)
srv := testutil.NewTestSwarmServer(t, serverFunc, nil)
signer, _ := newTestSigner()

defer srv.Close()
Expand Down Expand Up @@ -467,7 +469,7 @@ func testBzzGetPath(encrypted bool, t *testing.T) {

addr := [3]storage.Address{}

srv := testutil.NewTestSwarmServer(t, serverFunc)
srv := testutil.NewTestSwarmServer(t, serverFunc, nil)
defer srv.Close()

for i, mf := range testmanifest {
Expand Down Expand Up @@ -702,7 +704,7 @@ func TestBzzTar(t *testing.T) {
}

func testBzzTar(encrypted bool, t *testing.T) {
srv := testutil.NewTestSwarmServer(t, serverFunc)
srv := testutil.NewTestSwarmServer(t, serverFunc, nil)
defer srv.Close()
fileNames := []string{"tmp1.txt", "tmp2.lock", "tmp3.rtf"}
fileContents := []string{"tmp1textfilevalue", "tmp2lockfilelocked", "tmp3isjustaplaintextfile"}
Expand Down Expand Up @@ -827,7 +829,7 @@ func TestBzzRootRedirectEncrypted(t *testing.T) {
}

func testBzzRootRedirect(toEncrypt bool, t *testing.T) {
srv := testutil.NewTestSwarmServer(t, serverFunc)
srv := testutil.NewTestSwarmServer(t, serverFunc, nil)
defer srv.Close()

// create a manifest with some data at the root path
Expand Down Expand Up @@ -882,7 +884,7 @@ func testBzzRootRedirect(toEncrypt bool, t *testing.T) {
}

func TestMethodsNotAllowed(t *testing.T) {
srv := testutil.NewTestSwarmServer(t, serverFunc)
srv := testutil.NewTestSwarmServer(t, serverFunc, nil)
defer srv.Close()
databytes := "bar"
for _, c := range []struct {
Expand Down Expand Up @@ -941,7 +943,7 @@ func httpDo(httpMethod string, url string, reqBody io.Reader, headers map[string
}

func TestGet(t *testing.T) {
srv := testutil.NewTestSwarmServer(t, serverFunc)
srv := testutil.NewTestSwarmServer(t, serverFunc, nil)
defer srv.Close()

for _, testCase := range []struct {
Expand Down Expand Up @@ -1025,7 +1027,7 @@ func TestGet(t *testing.T) {
}

func TestModify(t *testing.T) {
srv := testutil.NewTestSwarmServer(t, serverFunc)
srv := testutil.NewTestSwarmServer(t, serverFunc, nil)
defer srv.Close()

swarmClient := swarm.NewClient(srv.URL)
Expand Down Expand Up @@ -1126,7 +1128,7 @@ func TestMultiPartUpload(t *testing.T) {
// POST /bzz:/ Content-Type: multipart/form-data
verbose := false
// Setup Swarm
srv := testutil.NewTestSwarmServer(t, serverFunc)
srv := testutil.NewTestSwarmServer(t, serverFunc, nil)
defer srv.Close()

url := fmt.Sprintf("%s/bzz:/", srv.URL)
Expand All @@ -1153,3 +1155,126 @@ func TestMultiPartUpload(t *testing.T) {
t.Fatalf("expected POST multipart/form-data to return a 64 char manifest but the answer was %d chars long", len(body))
}
}

// TestBzzGetFileWithResolver tests fetching a file using a mocked ENS resolver
func TestBzzGetFileWithResolver(t *testing.T) {
resolver := newTestResolveValidator("")
srv := testutil.NewTestSwarmServer(t, serverFunc, resolver)
defer srv.Close()
fileNames := []string{"dir1/tmp1.txt", "dir2/tmp2.lock", "dir3/tmp3.rtf"}
fileContents := []string{"tmp1textfilevalue", "tmp2lockfilelocked", "tmp3isjustaplaintextfile"}

buf := &bytes.Buffer{}
tw := tar.NewWriter(buf)

for i, v := range fileNames {
size := len(fileContents[i])
hdr := &tar.Header{
Name: v,
Mode: 0644,
Size: int64(size),
ModTime: time.Now(),
Xattrs: map[string]string{
"user.swarm.content-type": "text/plain",
},
}
if err := tw.WriteHeader(hdr); err != nil {
t.Fatal(err)
}

// copy the file into the tar stream
n, err := io.WriteString(tw, fileContents[i])
if err != nil {
t.Fatal(err)
} else if n != size {
t.Fatal("size mismatch")
}
}

if err := tw.Close(); err != nil {
t.Fatal(err)
}

//post tar stream
url := srv.URL + "/bzz:/"

req, err := http.NewRequest("POST", url, buf)
if err != nil {
t.Fatal(err)
}
req.Header.Add("Content-Type", "application/x-tar")
client := &http.Client{}
serverResponse, err := client.Do(req)
if err != nil {
t.Fatal(err)
}
if serverResponse.StatusCode != http.StatusOK {
t.Fatalf("err %s", serverResponse.Status)
}
swarmHash, err := ioutil.ReadAll(serverResponse.Body)
serverResponse.Body.Close()
if err != nil {
t.Fatal(err)
}
// set the resolved hash to be the swarm hash of what we've just uploaded
hash := common.HexToHash(string(swarmHash))
resolver.hash = &hash
for _, v := range []struct {
addr string
path string
expectedStatusCode int
}{
{
addr: string(swarmHash),
path: fileNames[0],
expectedStatusCode: http.StatusOK,
},
{
addr: "somebogusensname",
path: fileNames[0],
expectedStatusCode: http.StatusOK,
},
} {
req, err := http.NewRequest("GET", fmt.Sprintf(srv.URL+"/bzz:/%s/%s", v.addr, v.path), nil)
if err != nil {
t.Fatal(err)
}
serverResponse, err := client.Do(req)
if err != nil {
t.Fatal(err)
}
defer serverResponse.Body.Close()
if serverResponse.StatusCode != v.expectedStatusCode {
t.Fatalf("expected %d, got %d", v.expectedStatusCode, serverResponse.StatusCode)
}
}
}

// testResolver implements the Resolver interface and either returns the given
// hash if it is set, or returns a "name not found" error
type testResolveValidator struct {
hash *common.Hash
}

func newTestResolveValidator(addr string) *testResolveValidator {
r := &testResolveValidator{}
if addr != "" {
hash := common.HexToHash(addr)
r.hash = &hash
}
return r
}

func (t *testResolveValidator) Resolve(addr string) (common.Hash, error) {
if t.hash == nil {
return common.Hash{}, fmt.Errorf("DNS name not found: %q", addr)
}
return *t.hash, nil
}

func (t *testResolveValidator) Owner(node [32]byte) (addr common.Address, err error) {
return
}
func (t *testResolveValidator) HeaderByNumber(context.Context, *big.Int) (header *types.Header, err error) {
return
}
4 changes: 2 additions & 2 deletions swarm/testutil/http.go
Original file line number Diff line number Diff line change
Expand Up @@ -45,7 +45,7 @@ func (f *fakeTimeProvider) Now() mru.Timestamp {
return mru.Timestamp{Time: f.currentTime}
}

func NewTestSwarmServer(t *testing.T, serverFunc func(*api.API) TestServer) *TestSwarmServer {
func NewTestSwarmServer(t *testing.T, serverFunc func(*api.API) TestServer, resolver api.Resolver) *TestSwarmServer {
dir, err := ioutil.TempDir("", "swarm-storage-test")
if err != nil {
t.Fatal(err)
Expand Down Expand Up @@ -77,7 +77,7 @@ func NewTestSwarmServer(t *testing.T, serverFunc func(*api.API) TestServer) *Tes
t.Fatal(err)
}

a := api.NewAPI(fileStore, nil, rh.Handler, nil)
a := api.NewAPI(fileStore, resolver, rh.Handler, nil)
srv := httptest.NewServer(serverFunc(a))
return &TestSwarmServer{
Server: srv,
Expand Down

0 comments on commit 4c15fff

Please sign in to comment.