2016-12-09 19:54:46 +00:00
|
|
|
package ipfscluster
|
|
|
|
|
|
|
|
import (
|
|
|
|
"bytes"
|
|
|
|
"encoding/json"
|
2017-01-30 12:12:25 +00:00
|
|
|
"fmt"
|
2016-12-09 19:54:46 +00:00
|
|
|
"io/ioutil"
|
|
|
|
"net/http"
|
|
|
|
"testing"
|
2017-02-08 17:04:08 +00:00
|
|
|
|
|
|
|
"github.com/ipfs/ipfs-cluster/api"
|
2017-02-09 15:29:17 +00:00
|
|
|
"github.com/ipfs/ipfs-cluster/test"
|
2016-12-09 19:54:46 +00:00
|
|
|
)
|
|
|
|
|
|
|
|
var (
|
2016-12-14 14:31:50 +00:00
|
|
|
apiHost = "http://127.0.0.1:10002" // should match testingConfig()
|
2016-12-09 19:54:46 +00:00
|
|
|
)
|
|
|
|
|
2016-12-23 18:35:37 +00:00
|
|
|
func testRESTAPI(t *testing.T) *RESTAPI {
|
2016-12-09 19:54:46 +00:00
|
|
|
//logging.SetDebugLogging()
|
2016-12-14 14:31:50 +00:00
|
|
|
cfg := testingConfig()
|
2017-02-08 17:04:08 +00:00
|
|
|
rest, err := NewRESTAPI(cfg)
|
2016-12-09 19:54:46 +00:00
|
|
|
if err != nil {
|
|
|
|
t.Fatal("should be able to create a new Api: ", err)
|
|
|
|
}
|
|
|
|
|
2016-12-23 18:35:37 +00:00
|
|
|
// No keep alive! Otherwise tests hang with
|
|
|
|
// connections re-used from previous tests
|
2017-02-08 17:04:08 +00:00
|
|
|
rest.server.SetKeepAlivesEnabled(false)
|
2017-02-09 15:29:17 +00:00
|
|
|
rest.SetClient(test.NewMockRPCClient(t))
|
2017-02-08 17:04:08 +00:00
|
|
|
return rest
|
2016-12-09 19:54:46 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
func processResp(t *testing.T, httpResp *http.Response, err error, resp interface{}) {
|
|
|
|
if err != nil {
|
|
|
|
t.Fatal("error making get request: ", err)
|
|
|
|
}
|
|
|
|
body, err := ioutil.ReadAll(httpResp.Body)
|
|
|
|
defer httpResp.Body.Close()
|
|
|
|
if err != nil {
|
|
|
|
t.Fatal("error reading body: ", err)
|
|
|
|
}
|
|
|
|
|
|
|
|
if len(body) != 0 {
|
|
|
|
err = json.Unmarshal(body, resp)
|
|
|
|
if err != nil {
|
|
|
|
t.Error(string(body))
|
|
|
|
t.Fatal("error parsing json: ", err)
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
func makeGet(t *testing.T, path string, resp interface{}) {
|
|
|
|
httpResp, err := http.Get(apiHost + path)
|
|
|
|
processResp(t, httpResp, err, resp)
|
|
|
|
}
|
|
|
|
|
2017-01-30 12:12:25 +00:00
|
|
|
func makePost(t *testing.T, path string, body []byte, resp interface{}) {
|
|
|
|
httpResp, err := http.Post(apiHost+path, "application/json", bytes.NewReader(body))
|
2016-12-09 19:54:46 +00:00
|
|
|
processResp(t, httpResp, err, resp)
|
|
|
|
}
|
|
|
|
|
|
|
|
func makeDelete(t *testing.T, path string, resp interface{}) {
|
|
|
|
req, _ := http.NewRequest("DELETE", apiHost+path, bytes.NewReader([]byte{}))
|
|
|
|
c := &http.Client{}
|
|
|
|
httpResp, err := c.Do(req)
|
|
|
|
processResp(t, httpResp, err, resp)
|
|
|
|
}
|
|
|
|
|
2016-12-23 18:35:37 +00:00
|
|
|
func TestRESTAPIShutdown(t *testing.T) {
|
2017-02-08 17:04:08 +00:00
|
|
|
rest := testRESTAPI(t)
|
|
|
|
err := rest.Shutdown()
|
2016-12-09 19:54:46 +00:00
|
|
|
if err != nil {
|
|
|
|
t.Error("should shutdown cleanly: ", err)
|
|
|
|
}
|
2016-12-23 18:35:37 +00:00
|
|
|
// test shutting down twice
|
2017-02-08 17:04:08 +00:00
|
|
|
rest.Shutdown()
|
2016-12-09 19:54:46 +00:00
|
|
|
}
|
|
|
|
|
2017-01-24 15:19:23 +00:00
|
|
|
func TestRestAPIIDEndpoint(t *testing.T) {
|
2017-02-08 17:04:08 +00:00
|
|
|
rest := testRESTAPI(t)
|
|
|
|
defer rest.Shutdown()
|
|
|
|
id := api.IDSerial{}
|
2017-01-24 15:19:23 +00:00
|
|
|
makeGet(t, "/id", &id)
|
2017-02-09 15:29:17 +00:00
|
|
|
if id.ID != test.TestPeerID1.Pretty() {
|
2017-01-24 15:19:23 +00:00
|
|
|
t.Error("expected correct id")
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2016-12-23 18:35:37 +00:00
|
|
|
func TestRESTAPIVersionEndpoint(t *testing.T) {
|
2017-02-08 17:04:08 +00:00
|
|
|
rest := testRESTAPI(t)
|
|
|
|
defer rest.Shutdown()
|
|
|
|
ver := api.Version{}
|
2016-12-09 19:54:46 +00:00
|
|
|
makeGet(t, "/version", &ver)
|
2016-12-23 18:35:37 +00:00
|
|
|
if ver.Version != "0.0.mock" {
|
2016-12-09 19:54:46 +00:00
|
|
|
t.Error("expected correct version")
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2017-01-26 18:59:31 +00:00
|
|
|
func TestRESTAPIPeerstEndpoint(t *testing.T) {
|
2017-02-08 17:04:08 +00:00
|
|
|
rest := testRESTAPI(t)
|
|
|
|
defer rest.Shutdown()
|
2016-12-23 18:35:37 +00:00
|
|
|
|
2017-02-08 17:04:08 +00:00
|
|
|
var list []api.IDSerial
|
2017-01-26 18:59:31 +00:00
|
|
|
makeGet(t, "/peers", &list)
|
|
|
|
if len(list) != 1 {
|
|
|
|
t.Fatal("expected 1 element")
|
|
|
|
}
|
2017-02-09 15:29:17 +00:00
|
|
|
if list[0].ID != test.TestPeerID1.Pretty() {
|
2016-12-23 18:35:37 +00:00
|
|
|
t.Error("expected a different peer id list: ", list)
|
2016-12-09 19:54:46 +00:00
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2017-01-30 12:12:25 +00:00
|
|
|
func TestRESTAPIPeerAddEndpoint(t *testing.T) {
|
2017-02-08 17:04:08 +00:00
|
|
|
rest := testRESTAPI(t)
|
|
|
|
defer rest.Shutdown()
|
2017-01-30 12:12:25 +00:00
|
|
|
|
2017-02-08 17:04:08 +00:00
|
|
|
id := api.IDSerial{}
|
2017-01-30 12:12:25 +00:00
|
|
|
// post with valid body
|
2017-02-09 15:29:17 +00:00
|
|
|
body := fmt.Sprintf("{\"peer_multiaddress\":\"/ip4/1.2.3.4/tcp/1234/ipfs/%s\"}", test.TestPeerID1.Pretty())
|
2017-01-30 12:12:25 +00:00
|
|
|
t.Log(body)
|
|
|
|
makePost(t, "/peers", []byte(body), &id)
|
|
|
|
|
2017-02-09 15:29:17 +00:00
|
|
|
if id.ID != test.TestPeerID1.Pretty() {
|
2017-01-30 12:12:25 +00:00
|
|
|
t.Error("expected correct ID")
|
|
|
|
}
|
|
|
|
if id.Error != "" {
|
|
|
|
t.Error("did not expect an error")
|
|
|
|
}
|
|
|
|
|
|
|
|
// Send invalid body
|
|
|
|
errResp := errorResp{}
|
|
|
|
makePost(t, "/peers", []byte("oeoeoeoe"), &errResp)
|
|
|
|
if errResp.Code != 400 {
|
|
|
|
t.Error("expected error with bad body")
|
|
|
|
}
|
|
|
|
// Send invalid multiaddr
|
|
|
|
makePost(t, "/peers", []byte("{\"peer_multiaddress\": \"ab\"}"), &errResp)
|
|
|
|
if errResp.Code != 400 {
|
|
|
|
t.Error("expected error with bad multiaddress")
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
func TestRESTAPIPeerRemoveEndpoint(t *testing.T) {
|
2017-02-08 17:04:08 +00:00
|
|
|
rest := testRESTAPI(t)
|
|
|
|
defer rest.Shutdown()
|
2017-01-30 12:12:25 +00:00
|
|
|
|
2017-02-09 15:29:17 +00:00
|
|
|
makeDelete(t, "/peers/"+test.TestPeerID1.Pretty(), &struct{}{})
|
2017-01-30 12:12:25 +00:00
|
|
|
}
|
|
|
|
|
2016-12-23 18:35:37 +00:00
|
|
|
func TestRESTAPIPinEndpoint(t *testing.T) {
|
2017-02-08 17:04:08 +00:00
|
|
|
rest := testRESTAPI(t)
|
|
|
|
defer rest.Shutdown()
|
2016-12-09 19:54:46 +00:00
|
|
|
|
2016-12-23 18:35:37 +00:00
|
|
|
// test regular post
|
2017-02-09 15:29:17 +00:00
|
|
|
makePost(t, "/pins/"+test.TestCid1, []byte{}, &struct{}{})
|
2016-12-23 18:35:37 +00:00
|
|
|
|
2016-12-09 19:54:46 +00:00
|
|
|
errResp := errorResp{}
|
2017-02-09 15:29:17 +00:00
|
|
|
makePost(t, "/pins/"+test.ErrorCid, []byte{}, &errResp)
|
|
|
|
if errResp.Message != test.ErrBadCid.Error() {
|
2016-12-23 18:35:37 +00:00
|
|
|
t.Error("expected different error: ", errResp.Message)
|
2016-12-09 19:54:46 +00:00
|
|
|
}
|
|
|
|
|
2017-01-30 12:12:25 +00:00
|
|
|
makePost(t, "/pins/abcd", []byte{}, &errResp)
|
2016-12-09 19:54:46 +00:00
|
|
|
if errResp.Code != 400 {
|
2016-12-23 18:35:37 +00:00
|
|
|
t.Error("should fail with bad Cid")
|
2016-12-09 19:54:46 +00:00
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2016-12-23 18:35:37 +00:00
|
|
|
func TestRESTAPIUnpinEndpoint(t *testing.T) {
|
2017-02-08 17:04:08 +00:00
|
|
|
rest := testRESTAPI(t)
|
|
|
|
defer rest.Shutdown()
|
2016-12-09 19:54:46 +00:00
|
|
|
|
2016-12-23 18:35:37 +00:00
|
|
|
// test regular delete
|
2017-02-09 15:29:17 +00:00
|
|
|
makeDelete(t, "/pins/"+test.TestCid1, &struct{}{})
|
2016-12-23 18:35:37 +00:00
|
|
|
|
2016-12-09 19:54:46 +00:00
|
|
|
errResp := errorResp{}
|
2017-02-09 15:29:17 +00:00
|
|
|
makeDelete(t, "/pins/"+test.ErrorCid, &errResp)
|
|
|
|
if errResp.Message != test.ErrBadCid.Error() {
|
2016-12-23 18:35:37 +00:00
|
|
|
t.Error("expected different error: ", errResp.Message)
|
2016-12-09 19:54:46 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
makeDelete(t, "/pins/abcd", &errResp)
|
|
|
|
if errResp.Code != 400 {
|
2016-12-23 18:35:37 +00:00
|
|
|
t.Error("should fail with bad Cid")
|
2016-12-09 19:54:46 +00:00
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2016-12-23 18:35:37 +00:00
|
|
|
func TestRESTAPIPinListEndpoint(t *testing.T) {
|
2017-02-08 17:04:08 +00:00
|
|
|
rest := testRESTAPI(t)
|
|
|
|
defer rest.Shutdown()
|
2016-12-15 18:08:46 +00:00
|
|
|
|
2017-02-13 15:46:53 +00:00
|
|
|
var resp []api.CidArgSerial
|
2017-01-25 18:38:23 +00:00
|
|
|
makeGet(t, "/pinlist", &resp)
|
2016-12-23 18:35:37 +00:00
|
|
|
if len(resp) != 3 ||
|
2017-02-13 15:46:53 +00:00
|
|
|
resp[0].Cid != test.TestCid1 || resp[1].Cid != test.TestCid2 ||
|
|
|
|
resp[2].Cid != test.TestCid3 {
|
2016-12-15 18:08:46 +00:00
|
|
|
t.Error("unexpected pin list: ", resp)
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2017-01-25 18:38:23 +00:00
|
|
|
func TestRESTAPIStatusAllEndpoint(t *testing.T) {
|
2017-02-08 17:04:08 +00:00
|
|
|
rest := testRESTAPI(t)
|
|
|
|
defer rest.Shutdown()
|
2016-12-09 19:54:46 +00:00
|
|
|
|
2017-02-08 17:04:08 +00:00
|
|
|
var resp []api.GlobalPinInfoSerial
|
2017-01-25 18:38:23 +00:00
|
|
|
makeGet(t, "/pins", &resp)
|
2016-12-23 18:35:37 +00:00
|
|
|
if len(resp) != 3 ||
|
2017-02-09 15:29:17 +00:00
|
|
|
resp[0].Cid != test.TestCid1 ||
|
|
|
|
resp[1].PeerMap[test.TestPeerID1.Pretty()].Status != "pinning" {
|
2016-12-19 17:35:24 +00:00
|
|
|
t.Errorf("unexpected statusResp:\n %+v", resp)
|
2016-12-09 19:54:46 +00:00
|
|
|
}
|
|
|
|
}
|
2016-12-20 18:51:13 +00:00
|
|
|
|
2017-01-25 18:38:23 +00:00
|
|
|
func TestRESTAPIStatusEndpoint(t *testing.T) {
|
2017-02-08 17:04:08 +00:00
|
|
|
rest := testRESTAPI(t)
|
|
|
|
defer rest.Shutdown()
|
2016-12-23 18:35:37 +00:00
|
|
|
|
2017-02-08 17:04:08 +00:00
|
|
|
var resp api.GlobalPinInfoSerial
|
2017-02-09 15:29:17 +00:00
|
|
|
makeGet(t, "/pins/"+test.TestCid1, &resp)
|
2016-12-23 18:35:37 +00:00
|
|
|
|
2017-02-09 15:29:17 +00:00
|
|
|
if resp.Cid != test.TestCid1 {
|
2016-12-20 18:51:13 +00:00
|
|
|
t.Error("expected the same cid")
|
|
|
|
}
|
2017-02-09 15:29:17 +00:00
|
|
|
info, ok := resp.PeerMap[test.TestPeerID1.Pretty()]
|
2016-12-20 18:51:13 +00:00
|
|
|
if !ok {
|
2017-02-09 15:29:17 +00:00
|
|
|
t.Fatal("expected info for test.TestPeerID1")
|
2016-12-20 18:51:13 +00:00
|
|
|
}
|
2017-01-25 17:07:19 +00:00
|
|
|
if info.Status != "pinned" {
|
2016-12-20 18:51:13 +00:00
|
|
|
t.Error("expected different status")
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2017-01-25 18:38:23 +00:00
|
|
|
func TestRESTAPISyncAllEndpoint(t *testing.T) {
|
2017-02-08 17:04:08 +00:00
|
|
|
rest := testRESTAPI(t)
|
|
|
|
defer rest.Shutdown()
|
2016-12-20 18:51:13 +00:00
|
|
|
|
2017-02-08 17:04:08 +00:00
|
|
|
var resp []api.GlobalPinInfoSerial
|
2017-01-30 12:12:25 +00:00
|
|
|
makePost(t, "/pins/sync", []byte{}, &resp)
|
2016-12-23 18:35:37 +00:00
|
|
|
|
|
|
|
if len(resp) != 3 ||
|
2017-02-09 15:29:17 +00:00
|
|
|
resp[0].Cid != test.TestCid1 ||
|
|
|
|
resp[1].PeerMap[test.TestPeerID1.Pretty()].Status != "pinning" {
|
2016-12-20 18:51:13 +00:00
|
|
|
t.Errorf("unexpected statusResp:\n %+v", resp)
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2017-01-25 18:38:23 +00:00
|
|
|
func TestRESTAPISyncEndpoint(t *testing.T) {
|
2017-02-08 17:04:08 +00:00
|
|
|
rest := testRESTAPI(t)
|
|
|
|
defer rest.Shutdown()
|
2017-01-25 18:38:23 +00:00
|
|
|
|
2017-02-08 17:04:08 +00:00
|
|
|
var resp api.GlobalPinInfoSerial
|
2017-02-09 15:29:17 +00:00
|
|
|
makePost(t, "/pins/"+test.TestCid1+"/sync", []byte{}, &resp)
|
2017-01-25 18:38:23 +00:00
|
|
|
|
2017-02-09 15:29:17 +00:00
|
|
|
if resp.Cid != test.TestCid1 {
|
2017-01-25 18:38:23 +00:00
|
|
|
t.Error("expected the same cid")
|
|
|
|
}
|
2017-02-09 15:29:17 +00:00
|
|
|
info, ok := resp.PeerMap[test.TestPeerID1.Pretty()]
|
2017-01-25 18:38:23 +00:00
|
|
|
if !ok {
|
2017-02-09 15:29:17 +00:00
|
|
|
t.Fatal("expected info for test.TestPeerID1")
|
2017-01-25 18:38:23 +00:00
|
|
|
}
|
|
|
|
if info.Status != "pinned" {
|
|
|
|
t.Error("expected different status")
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
func TestRESTAPIRecoverEndpoint(t *testing.T) {
|
2017-02-08 17:04:08 +00:00
|
|
|
rest := testRESTAPI(t)
|
|
|
|
defer rest.Shutdown()
|
2016-12-23 18:35:37 +00:00
|
|
|
|
2017-02-08 17:04:08 +00:00
|
|
|
var resp api.GlobalPinInfoSerial
|
2017-02-09 15:29:17 +00:00
|
|
|
makePost(t, "/pins/"+test.TestCid1+"/recover", []byte{}, &resp)
|
2016-12-23 18:35:37 +00:00
|
|
|
|
2017-02-09 15:29:17 +00:00
|
|
|
if resp.Cid != test.TestCid1 {
|
2016-12-20 18:51:13 +00:00
|
|
|
t.Error("expected the same cid")
|
|
|
|
}
|
2017-02-09 15:29:17 +00:00
|
|
|
info, ok := resp.PeerMap[test.TestPeerID1.Pretty()]
|
2016-12-20 18:51:13 +00:00
|
|
|
if !ok {
|
2017-02-09 15:29:17 +00:00
|
|
|
t.Fatal("expected info for test.TestPeerID1")
|
2016-12-20 18:51:13 +00:00
|
|
|
}
|
2017-01-25 17:07:19 +00:00
|
|
|
if info.Status != "pinned" {
|
2016-12-20 18:51:13 +00:00
|
|
|
t.Error("expected different status")
|
|
|
|
}
|
|
|
|
}
|