github.com/nnlgsakib/mind-dpos@v0.0.0-20230606105614-f3c8ca06f808/swarm/api/api_test.go (about)

     1  // Copyright 2016 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 api
    18  
    19  import (
    20  	"errors"
    21  	"fmt"
    22  	"github.com/TTCECO/gttc/common/hexutil"
    23  	"io"
    24  	"io/ioutil"
    25  	"os"
    26  	"testing"
    27  
    28  	"github.com/TTCECO/gttc/common"
    29  	"github.com/TTCECO/gttc/log"
    30  	"github.com/TTCECO/gttc/swarm/storage"
    31  )
    32  
    33  func testApi(t *testing.T, f func(*Api)) {
    34  	datadir, err := ioutil.TempDir("", "bzz-test")
    35  	if err != nil {
    36  		t.Fatalf("unable to create temp dir: %v", err)
    37  	}
    38  	os.RemoveAll(datadir)
    39  	defer os.RemoveAll(datadir)
    40  	dpa, err := storage.NewLocalDPA(datadir)
    41  	if err != nil {
    42  		return
    43  	}
    44  	api := NewApi(dpa, nil)
    45  	dpa.Start()
    46  	f(api)
    47  	dpa.Stop()
    48  }
    49  
    50  type testResponse struct {
    51  	reader storage.LazySectionReader
    52  	*Response
    53  }
    54  
    55  func checkResponse(t *testing.T, resp *testResponse, exp *Response) {
    56  
    57  	if resp.MimeType != exp.MimeType {
    58  		t.Errorf("incorrect mimeType. expected '%s', got '%s'", exp.MimeType, resp.MimeType)
    59  	}
    60  	if resp.Status != exp.Status {
    61  		t.Errorf("incorrect status. expected '%d', got '%d'", exp.Status, resp.Status)
    62  	}
    63  	if resp.Size != exp.Size {
    64  		t.Errorf("incorrect size. expected '%d', got '%d'", exp.Size, resp.Size)
    65  	}
    66  	if resp.reader != nil {
    67  		content := make([]byte, resp.Size)
    68  		read, _ := resp.reader.Read(content)
    69  		if int64(read) != exp.Size {
    70  			t.Errorf("incorrect content length. expected '%d...', got '%d...'", read, exp.Size)
    71  		}
    72  		resp.Content = string(content)
    73  	}
    74  	if resp.Content != exp.Content {
    75  		// if !bytes.Equal(resp.Content, exp.Content)
    76  		t.Errorf("incorrect content. expected '%s...', got '%s...'", string(exp.Content), string(resp.Content))
    77  	}
    78  }
    79  
    80  // func expResponse(content []byte, mimeType string, status int) *Response {
    81  func expResponse(content string, mimeType string, status int) *Response {
    82  	log.Trace(fmt.Sprintf("expected content (%v): %v ", len(content), content))
    83  	return &Response{mimeType, status, int64(len(content)), content}
    84  }
    85  
    86  // func testGet(t *testing.T, api *Api, bzzhash string) *testResponse {
    87  func testGet(t *testing.T, api *Api, bzzhash, path string) *testResponse {
    88  	key := storage.Key(common.Hex2Bytes(bzzhash))
    89  	reader, mimeType, status, err := api.Get(key, path)
    90  	if err != nil {
    91  		t.Fatalf("unexpected error: %v", err)
    92  	}
    93  	quitC := make(chan bool)
    94  	size, err := reader.Size(quitC)
    95  	if err != nil {
    96  		t.Fatalf("unexpected error: %v", err)
    97  	}
    98  	log.Trace(fmt.Sprintf("reader size: %v ", size))
    99  	s := make([]byte, size)
   100  	_, err = reader.Read(s)
   101  	if err != io.EOF {
   102  		t.Fatalf("unexpected error: %v", err)
   103  	}
   104  	reader.Seek(0, 0)
   105  	return &testResponse{reader, &Response{mimeType, status, size, string(s)}}
   106  	// return &testResponse{reader, &Response{mimeType, status, reader.Size(), nil}}
   107  }
   108  
   109  func TestApiPut(t *testing.T) {
   110  	testApi(t, func(api *Api) {
   111  		content := "hello"
   112  		exp := expResponse(content, "text/plain", 0)
   113  		// exp := expResponse([]byte(content), "text/plain", 0)
   114  		key, err := api.Put(content, exp.MimeType)
   115  		if err != nil {
   116  			t.Fatalf("unexpected error: %v", err)
   117  		}
   118  		resp := testGet(t, api, key.String(), "")
   119  		checkResponse(t, resp, exp)
   120  	})
   121  }
   122  
   123  // testResolver implements the Resolver interface and either returns the given
   124  // hash if it is set, or returns a "name not found" error
   125  type testResolver struct {
   126  	hash *common.Hash
   127  }
   128  
   129  func newTestResolver(addr string) *testResolver {
   130  	r := &testResolver{}
   131  	if addr != "" {
   132  		hash := common.HexToHash(addr)
   133  		r.hash = &hash
   134  	}
   135  	return r
   136  }
   137  
   138  func (t *testResolver) Resolve(addr string) (common.Hash, error) {
   139  	if t.hash == nil {
   140  		return common.Hash{}, fmt.Errorf("DNS name not found: %q", addr)
   141  	}
   142  	return *t.hash, nil
   143  }
   144  
   145  // TestAPIResolve tests resolving URIs which can either contain content hashes
   146  // or ENS names
   147  func TestAPIResolve(t *testing.T) {
   148  	ensAddr := "swarm.eth"
   149  	hashAddr := "1111111111111111111111111111111111111111111111111111111111111111"
   150  	resolvedAddr := "2222222222222222222222222222222222222222222222222222222222222222"
   151  	doesResolve := newTestResolver(resolvedAddr)
   152  	doesntResolve := newTestResolver("")
   153  
   154  	type test struct {
   155  		desc      string
   156  		dns       Resolver
   157  		addr      string
   158  		immutable bool
   159  		result    string
   160  		expectErr error
   161  	}
   162  
   163  	tests := []*test{
   164  		{
   165  			desc:   "DNS not configured, hash address, returns hash address",
   166  			dns:    nil,
   167  			addr:   hashAddr,
   168  			result: hashAddr,
   169  		},
   170  		{
   171  			desc:      "DNS not configured, ENS address, returns error",
   172  			dns:       nil,
   173  			addr:      ensAddr,
   174  			expectErr: errors.New(`no DNS to resolve name: "swarm.eth"`),
   175  		},
   176  		{
   177  			desc:   "DNS configured, hash address, hash resolves, returns resolved address",
   178  			dns:    doesResolve,
   179  			addr:   hashAddr,
   180  			result: resolvedAddr,
   181  		},
   182  		{
   183  			desc:      "DNS configured, immutable hash address, hash resolves, returns hash address",
   184  			dns:       doesResolve,
   185  			addr:      hashAddr,
   186  			immutable: true,
   187  			result:    hashAddr,
   188  		},
   189  		{
   190  			desc:   "DNS configured, hash address, hash doesn't resolve, returns hash address",
   191  			dns:    doesntResolve,
   192  			addr:   hashAddr,
   193  			result: hashAddr,
   194  		},
   195  		{
   196  			desc:   "DNS configured, ENS address, name resolves, returns resolved address",
   197  			dns:    doesResolve,
   198  			addr:   ensAddr,
   199  			result: resolvedAddr,
   200  		},
   201  		{
   202  			desc:      "DNS configured, immutable ENS address, name resolves, returns error",
   203  			dns:       doesResolve,
   204  			addr:      ensAddr,
   205  			immutable: true,
   206  			expectErr: errors.New(`immutable address not a content hash: "swarm.eth"`),
   207  		},
   208  		{
   209  			desc:      "DNS configured, ENS address, name doesn't resolve, returns error",
   210  			dns:       doesntResolve,
   211  			addr:      ensAddr,
   212  			expectErr: errors.New(`DNS name not found: "swarm.eth"`),
   213  		},
   214  	}
   215  	for _, x := range tests {
   216  		t.Run(x.desc, func(t *testing.T) {
   217  			api := &Api{dns: x.dns}
   218  			uri := &URI{Addr: x.addr, Scheme: "bzz"}
   219  			if x.immutable {
   220  				uri.Scheme = "bzz-immutable"
   221  			}
   222  			res, err := api.Resolve(uri)
   223  			if err == nil {
   224  				if x.expectErr != nil {
   225  					t.Fatalf("expected error %q, got result %q", x.expectErr, res)
   226  				}
   227  				if res.String() != x.result {
   228  					t.Fatalf("expected result %q, got %q", x.result, res)
   229  				}
   230  			} else {
   231  				if x.expectErr == nil {
   232  					t.Fatalf("expected no error, got %q", err)
   233  				}
   234  				if err.Error() != x.expectErr.Error() {
   235  					t.Fatalf("expected error %q, got %q", x.expectErr, err)
   236  				}
   237  			}
   238  		})
   239  	}
   240  }
   241  
   242  func TestMultiResolver(t *testing.T) {
   243  	doesntResolve := newTestResolver("")
   244  
   245  	ethAddr := "swarm.eth"
   246  	ethHash := hexutil.CustomHexPrefix + "2222222222222222222222222222222222222222222222222222222222222222"
   247  	ethResolve := newTestResolver(ethHash)
   248  
   249  	testAddr := "swarm.test"
   250  	testHash := hexutil.CustomHexPrefix +"1111111111111111111111111111111111111111111111111111111111111111"
   251  	testResolve := newTestResolver(testHash)
   252  
   253  	tests := []struct {
   254  		desc   string
   255  		r      Resolver
   256  		addr   string
   257  		result string
   258  		err    error
   259  	}{
   260  		{
   261  			desc: "No resolvers, returns error",
   262  			r:    NewMultiResolver(),
   263  			err:  NewNoResolverError(""),
   264  		},
   265  		{
   266  			desc:   "One default resolver, returns resolved address",
   267  			r:      NewMultiResolver(MultiResolverOptionWithResolver(ethResolve, "")),
   268  			addr:   ethAddr,
   269  			result: ethHash,
   270  		},
   271  		{
   272  			desc: "Two default resolvers, returns resolved address",
   273  			r: NewMultiResolver(
   274  				MultiResolverOptionWithResolver(ethResolve, ""),
   275  				MultiResolverOptionWithResolver(ethResolve, ""),
   276  			),
   277  			addr:   ethAddr,
   278  			result: ethHash,
   279  		},
   280  		{
   281  			desc: "Two default resolvers, first doesn't resolve, returns resolved address",
   282  			r: NewMultiResolver(
   283  				MultiResolverOptionWithResolver(doesntResolve, ""),
   284  				MultiResolverOptionWithResolver(ethResolve, ""),
   285  			),
   286  			addr:   ethAddr,
   287  			result: ethHash,
   288  		},
   289  		{
   290  			desc: "Default resolver doesn't resolve, tld resolver resolve, returns resolved address",
   291  			r: NewMultiResolver(
   292  				MultiResolverOptionWithResolver(doesntResolve, ""),
   293  				MultiResolverOptionWithResolver(ethResolve, "eth"),
   294  			),
   295  			addr:   ethAddr,
   296  			result: ethHash,
   297  		},
   298  		{
   299  			desc: "Three TLD resolvers, third resolves, returns resolved address",
   300  			r: NewMultiResolver(
   301  				MultiResolverOptionWithResolver(doesntResolve, "eth"),
   302  				MultiResolverOptionWithResolver(doesntResolve, "eth"),
   303  				MultiResolverOptionWithResolver(ethResolve, "eth"),
   304  			),
   305  			addr:   ethAddr,
   306  			result: ethHash,
   307  		},
   308  		{
   309  			desc: "One TLD resolver doesn't resolve, returns error",
   310  			r: NewMultiResolver(
   311  				MultiResolverOptionWithResolver(doesntResolve, ""),
   312  				MultiResolverOptionWithResolver(ethResolve, "eth"),
   313  			),
   314  			addr:   ethAddr,
   315  			result: ethHash,
   316  		},
   317  		{
   318  			desc: "One defautl and one TLD resolver, all doesn't resolve, returns error",
   319  			r: NewMultiResolver(
   320  				MultiResolverOptionWithResolver(doesntResolve, ""),
   321  				MultiResolverOptionWithResolver(doesntResolve, "eth"),
   322  			),
   323  			addr:   ethAddr,
   324  			result: ethHash,
   325  			err:    errors.New(`DNS name not found: "swarm.eth"`),
   326  		},
   327  		{
   328  			desc: "Two TLD resolvers, both resolve, returns resolved address",
   329  			r: NewMultiResolver(
   330  				MultiResolverOptionWithResolver(ethResolve, "eth"),
   331  				MultiResolverOptionWithResolver(testResolve, "test"),
   332  			),
   333  			addr:   testAddr,
   334  			result: testHash,
   335  		},
   336  		{
   337  			desc: "One TLD resolver, no default resolver, returns error for different TLD",
   338  			r: NewMultiResolver(
   339  				MultiResolverOptionWithResolver(ethResolve, "eth"),
   340  			),
   341  			addr: testAddr,
   342  			err:  NewNoResolverError("test"),
   343  		},
   344  	}
   345  	for _, x := range tests {
   346  		t.Run(x.desc, func(t *testing.T) {
   347  			res, err := x.r.Resolve(x.addr)
   348  			if err == nil {
   349  				if x.err != nil {
   350  					t.Fatalf("expected error %q, got result %q", x.err, res.Hex())
   351  				}
   352  				if res.Hex() != x.result {
   353  					t.Fatalf("expected result %q, got %q", x.result, res.Hex())
   354  				}
   355  			} else {
   356  				if x.err == nil {
   357  					t.Fatalf("expected no error, got %q", err)
   358  				}
   359  				if err.Error() != x.err.Error() {
   360  					t.Fatalf("expected error %q, got %q", x.err, err)
   361  				}
   362  			}
   363  		})
   364  	}
   365  }