// Copyright 2016 The go-ethereum Authors // This file is part of the go-ethereum library. // // The go-ethereum library is free software: you can redistribute it and/or modify // it under the terms of the GNU Lesser General Public License as published by // the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. // // The go-ethereum library 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 Lesser General Public License for more details. // // You should have received a copy of the GNU Lesser General Public License // along with the go-ethereum library. If not, see . package api import ( "io" "io/ioutil" "os" "testing" "github.com/ethereum/go-ethereum/logger" "github.com/ethereum/go-ethereum/logger/glog" "github.com/ethereum/go-ethereum/swarm/storage" ) func testApi(t *testing.T, f func(*Api)) { datadir, err := ioutil.TempDir("", "bzz-test") if err != nil { t.Fatalf("unable to create temp dir: %v", err) } os.RemoveAll(datadir) defer os.RemoveAll(datadir) dpa, err := storage.NewLocalDPA(datadir) if err != nil { return } api := NewApi(dpa, nil) dpa.Start() f(api) dpa.Stop() } type testResponse struct { reader storage.LazySectionReader *Response } func checkResponse(t *testing.T, resp *testResponse, exp *Response) { if resp.MimeType != exp.MimeType { t.Errorf("incorrect mimeType. expected '%s', got '%s'", exp.MimeType, resp.MimeType) } if resp.Status != exp.Status { t.Errorf("incorrect status. expected '%d', got '%d'", exp.Status, resp.Status) } if resp.Size != exp.Size { t.Errorf("incorrect size. expected '%d', got '%d'", exp.Size, resp.Size) } if resp.reader != nil { content := make([]byte, resp.Size) read, _ := resp.reader.Read(content) if int64(read) != exp.Size { t.Errorf("incorrect content length. expected '%d...', got '%d...'", read, exp.Size) } resp.Content = string(content) } if resp.Content != exp.Content { // if !bytes.Equal(resp.Content, exp.Content) t.Errorf("incorrect content. expected '%s...', got '%s...'", string(exp.Content), string(resp.Content)) } } // func expResponse(content []byte, mimeType string, status int) *Response { func expResponse(content string, mimeType string, status int) *Response { glog.V(logger.Detail).Infof("expected content (%v): %v ", len(content), content) return &Response{mimeType, status, int64(len(content)), content} } // func testGet(t *testing.T, api *Api, bzzhash string) *testResponse { func testGet(t *testing.T, api *Api, bzzhash string) *testResponse { reader, mimeType, status, err := api.Get(bzzhash, true) if err != nil { t.Fatalf("unexpected error: %v", err) } quitC := make(chan bool) size, err := reader.Size(quitC) if err != nil { t.Fatalf("unexpected error: %v", err) } glog.V(logger.Detail).Infof("reader size: %v ", size) s := make([]byte, size) _, err = reader.Read(s) if err != io.EOF { t.Fatalf("unexpected error: %v", err) } reader.Seek(0, 0) return &testResponse{reader, &Response{mimeType, status, size, string(s)}} // return &testResponse{reader, &Response{mimeType, status, reader.Size(), nil}} } func TestApiPut(t *testing.T) { testApi(t, func(api *Api) { content := "hello" exp := expResponse(content, "text/plain", 0) // exp := expResponse([]byte(content), "text/plain", 0) bzzhash, err := api.Put(content, exp.MimeType) if err != nil { t.Fatalf("unexpected error: %v", err) } resp := testGet(t, api, bzzhash) checkResponse(t, resp, exp) }) }