|
|
|
package server
|
|
|
|
|
|
|
|
import (
|
|
|
|
"bytes"
|
|
|
|
"encoding/json"
|
|
|
|
"fmt"
|
|
|
|
"io/ioutil"
|
|
|
|
"net/http"
|
|
|
|
"os"
|
|
|
|
"time"
|
|
|
|
|
|
|
|
. "gopkg.in/check.v1"
|
|
|
|
)
|
|
|
|
|
|
|
|
const (
|
|
|
|
host = "localhost"
|
|
|
|
port = 4001
|
|
|
|
snapAfter = 1000
|
|
|
|
dbfile = "rqlite-test"
|
|
|
|
)
|
|
|
|
|
|
|
|
type SingleServerSuite struct{}
|
|
|
|
|
|
|
|
var _ = Suite(&SingleServerSuite{})
|
|
|
|
|
|
|
|
func getEndpoint(endpoint string) (*http.Response, error) {
|
|
|
|
url := fmt.Sprintf("http://%s:%d%s", host, port, endpoint)
|
|
|
|
return http.Get(url)
|
|
|
|
}
|
|
|
|
|
|
|
|
func getEndpointBody(endpoint string, body string) (*http.Response, error) {
|
|
|
|
var jsonStr = []byte(body)
|
|
|
|
url := fmt.Sprintf("http://%s:%d%s", host, port, endpoint)
|
|
|
|
req, err := http.NewRequest("GET", url, bytes.NewBuffer(jsonStr))
|
|
|
|
if err != nil {
|
|
|
|
panic(err)
|
|
|
|
}
|
|
|
|
req.Header.Set("Content-Type", "application/json")
|
|
|
|
|
|
|
|
client := &http.Client{}
|
|
|
|
return client.Do(req)
|
|
|
|
}
|
|
|
|
|
|
|
|
func postEndpoint(endpoint string, body string) (*http.Response, error) {
|
|
|
|
var jsonStr = []byte(body)
|
|
|
|
url := fmt.Sprintf("http://%s:%d%s", host, port, endpoint)
|
|
|
|
req, err := http.NewRequest("POST", url, bytes.NewBuffer(jsonStr))
|
|
|
|
if err != nil {
|
|
|
|
panic(err)
|
|
|
|
}
|
|
|
|
req.Header.Set("Content-Type", "application/json")
|
|
|
|
|
|
|
|
client := &http.Client{}
|
|
|
|
return client.Do(req)
|
|
|
|
}
|
|
|
|
|
|
|
|
func isJSONBody(res *http.Response) bool {
|
|
|
|
b, err := ioutil.ReadAll(res.Body)
|
|
|
|
if err != nil {
|
|
|
|
return false
|
|
|
|
}
|
|
|
|
|
|
|
|
var o interface{}
|
|
|
|
err = json.Unmarshal(b, &o)
|
|
|
|
if err != nil {
|
|
|
|
return false
|
|
|
|
}
|
|
|
|
|
|
|
|
return true
|
|
|
|
}
|
|
|
|
|
|
|
|
func (s *SingleServerSuite) Test_SingleServer(c *C) {
|
|
|
|
dir, err := ioutil.TempDir("", "rqlite-test-")
|
|
|
|
c.Assert(err, IsNil)
|
|
|
|
defer os.RemoveAll(dir)
|
|
|
|
|
|
|
|
server := NewServer(dir, dbfile, snapAfter, host, port)
|
|
|
|
c.Assert(server, NotNil)
|
|
|
|
go func() { server.ListenAndServe("") }()
|
|
|
|
|
|
|
|
// Wait to ensure server is up. This is not ideal, and the server should
|
|
|
|
// really use a channel to flag it is ready.
|
|
|
|
time.Sleep(1 * time.Second)
|
|
|
|
|
|
|
|
// Sanity-check admin API endpoints
|
|
|
|
var res *http.Response
|
|
|
|
res, err = getEndpoint("/statistics")
|
|
|
|
c.Assert(err, IsNil)
|
|
|
|
c.Assert(res.StatusCode, Equals, 200)
|
|
|
|
c.Assert(isJSONBody(res), Equals, true)
|
|
|
|
|
|
|
|
res, err = getEndpoint("/diagnostics")
|
|
|
|
c.Assert(err, IsNil)
|
|
|
|
c.Assert(res.StatusCode, Equals, 200)
|
|
|
|
c.Assert(isJSONBody(res), Equals, true)
|
|
|
|
|
|
|
|
res, err = getEndpoint("/raft")
|
|
|
|
c.Assert(err, IsNil)
|
|
|
|
c.Assert(res.StatusCode, Equals, 200)
|
|
|
|
c.Assert(isJSONBody(res), Equals, true)
|
|
|
|
|
|
|
|
// Create a database.
|
|
|
|
res, err = postEndpoint("/db", "CREATE TABLE foo (id integer not null primary key, name text)")
|
|
|
|
c.Assert(err, IsNil)
|
|
|
|
c.Assert(res.StatusCode, Equals, 200)
|
|
|
|
|
|
|
|
// Data write.
|
|
|
|
res, err = postEndpoint("/db", "INSERT INTO foo(name) VALUES(\"fiona\")")
|
|
|
|
c.Assert(err, IsNil)
|
|
|
|
c.Assert(res.StatusCode, Equals, 200)
|
|
|
|
|
|
|
|
// Data read
|
|
|
|
res, err = getEndpointBody("/db", "SELECT * from foo")
|
|
|
|
c.Assert(err, IsNil)
|
|
|
|
c.Assert(res.StatusCode, Equals, 200)
|
|
|
|
c.Assert(isJSONBody(res), Equals, true)
|
|
|
|
}
|