mirror of
https://github.com/fnproject/fn.git
synced 2022-10-28 21:29:17 +03:00
* fn: lb and pure-runner with non-blocking agent *) Removed pure-runner capacity tracking code. This did not play well with internal agent resource tracker. *) In LB and runner gRPC comm, removed ACK. Now, upon TryCall, pure-runner quickly proceeds to call Submit. This is good since at this stage pure-runner already has all relevant data to initiate the call. *) Unless pure-runner emits a NACK, LB immediately streams http body to runners. *) For retriable requests added a CachedReader for http.Request Body. *) Idempotenty/retry is similar to previous code. After initial success in Engament, after attempting a TryCall, unless we receive NACK, we cannot retry that call. *) ch and naive places now wraps each TryExec with a cancellable context to clean up gRPC contexts quicker. * fn: err for simpler one-time read GetBody approach This allows for a more flexible approach since we let users to define GetBody() to allow repetitive http body read. In default LB case, LB executes a one-time io.ReadAll and sets of GetBody, which is detected by RunnerCall.RequestBody(). * fn: additional check for non-nil req.body * fn: attempt to override IO errors with ctx for TryExec * fn: system-tests log dest * fn: LB: EOF send handling * fn: logging for partial IO * fn: use buffer pool for IO storage in lb agent * fn: pure runner should use chunks for data msgs * fn: required config validations and pass APIErrors * fn: additional tests and gRPC proto simplification *) remove ACK/NACK messages as Finish message type works OK for this purpose. *) return resp in api tests for check for status code *) empty body json test in api tests for lb & pure-runner * fn: buffer adjustments *) setRequestBody result handling correction *) switch to bytes.Reader for read-only safety *) io.EOF can be returned for non-nil Body in request. * fn: clarify detection of 503 / Server Too Busy
68 lines
1.6 KiB
Go
68 lines
1.6 KiB
Go
package tests
|
|
|
|
import (
|
|
"bytes"
|
|
"encoding/json"
|
|
"github.com/fnproject/fn_go/models"
|
|
"net/url"
|
|
"path"
|
|
"strconv"
|
|
"strings"
|
|
"testing"
|
|
)
|
|
|
|
type JSONResponse struct {
|
|
Message string `json:"message"`
|
|
}
|
|
|
|
func TestFnJSONFormats(t *testing.T) {
|
|
t.Parallel()
|
|
s := SetupHarness()
|
|
defer s.Cleanup()
|
|
|
|
// TODO(treeder): put image in fnproject @ dockerhub
|
|
|
|
s.GivenAppExists(t, &models.App{Name: s.AppName})
|
|
rt := s.BasicRoute()
|
|
rt.Image = "denismakogon/test-hot-json-go:0.0.1"
|
|
rt.Format = "json"
|
|
s.GivenRouteExists(t, s.AppName, rt)
|
|
|
|
u := url.URL{
|
|
Scheme: "http",
|
|
Host: Host(),
|
|
}
|
|
u.Path = path.Join(u.Path, "r", s.AppName, s.RoutePath)
|
|
|
|
b, _ := json.Marshal(&struct {
|
|
Name string `json:"name"`
|
|
}{
|
|
Name: "Jimmy",
|
|
})
|
|
content := bytes.NewBuffer(b)
|
|
output := &bytes.Buffer{}
|
|
resp, err := CallFN(u.String(), content, output, "POST", []string{})
|
|
if err != nil {
|
|
t.Errorf("Got unexpected error: %v", err)
|
|
}
|
|
|
|
msg := &JSONResponse{}
|
|
json.Unmarshal(output.Bytes(), msg)
|
|
expectedOutput := "Hello Jimmy"
|
|
if !strings.Contains(expectedOutput, msg.Message) {
|
|
t.Errorf("Assertion error.\n\tExpected: %v\n\tActual: %v", expectedOutput, output.String())
|
|
}
|
|
|
|
expectedHeaderNames := []string{"Content-Type", "Content-Length"}
|
|
expectedHeaderValues := []string{"application/json; charset=utf-8", strconv.Itoa(output.Len())}
|
|
for i, name := range expectedHeaderNames {
|
|
actual := resp.Header.Get(name)
|
|
expected := expectedHeaderValues[i]
|
|
if !strings.Contains(expected, actual) {
|
|
t.Errorf("HTTP header assertion error for %v."+
|
|
"\n\tExpected: %v\n\tActual: %v", name, expected, actual)
|
|
}
|
|
}
|
|
|
|
}
|