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 }