blob: 2fc77c1c32b66a2fa106309f09aae5fd5eda413b [file] [log] [blame]
package devserver
import (
"fmt"
"io/ioutil"
"net/http"
"net/http/httptest"
"os"
"path/filepath"
"strings"
"testing"
)
func tmpfile(t *testing.T, name, contents string) (string, func()) {
fullPath := filepath.Join(os.Getenv("TEST_TMPDIR"), name)
dir := filepath.Dir(fullPath)
if _, err := os.Stat(dir); err != nil {
if os.IsNotExist(err) {
if err := os.MkdirAll(dir, 0777); err != nil {
t.Fatalf("failed to create dir: %v", err)
}
} else {
t.Fatalf("failed to stat dir: %v", err)
}
}
err := ioutil.WriteFile(fullPath, []byte(contents), 0666)
if err != nil {
t.Fatalf("failed to write temp file: %v", err)
}
return fullPath, func() {
if err := os.Remove(fullPath); err != nil && !os.IsNotExist(err) {
t.Errorf("failed to delete file %q: %v", fullPath, err)
}
}
}
func req(handler http.HandlerFunc, url string) (int, string) {
req := httptest.NewRequest("GET", url, nil)
w := httptest.NewRecorder()
handler(w, req)
resp := w.Result()
body, _ := ioutil.ReadAll(resp.Body)
return resp.StatusCode, string(body)
}
func TestDevserverFileHandling(t *testing.T) {
_, del := tmpfile(t, "TestIndexServing/manifest.MF", "file1.js\nfile2.js")
defer del()
_, delIdx := tmpfile(t, "TestIndexServing/pkg1/index.html", "contents of index.html")
defer delIdx()
_, del = tmpfile(t, "TestIndexServing/pkg1/foo.html", "contents of foo.html")
defer del()
_, del = tmpfile(t, "TestIndexServing/pkg2/bar.html", "contents of bar.html")
defer del()
_, del = tmpfile(t, "TestIndexServing/pkg2/foo.html", "contents of foo.html in pkg2")
defer del()
_, del = tmpfile(t, "TestIndexServing/pkg2/rpc/items/index.html", "contents of rpc/items/index.html")
defer del()
_, del = tmpfile(t, "TestIndexServing/pkg3/baz.html", "contents of baz.html in pkg3")
defer del()
handler := CreateFileHandler("/app.js", "manifest.MF", []string{"pkg1", "pkg2"},
filepath.Join(os.Getenv("TEST_TMPDIR"), "TestIndexServing"))
defaultPageContent := `<script src="/app.js">`
tests := []struct {
code int
url string
content string
delIdx bool
}{
// index file from pkg1.
{http.StatusOK, "/", "contents of index.html", false},
// index file as a response to not found handler.
{http.StatusNotFound, "/no/such/dir", "contents of index.html", false},
// index file as a response to not found handler.
{http.StatusNotFound, "/no/such/dir/", "contents of index.html", false},
// index file as a response to a directory that is found.
{http.StatusNotFound, "/pkg2/", "contents of index.html", false},
// file from the base package.
{http.StatusOK, "/foo.html", "contents of foo.html", false},
// file from the base package with full path.
{http.StatusOK, "/pkg1/foo.html", "contents of foo.html", false},
// file from pkg2.
{http.StatusOK, "/bar.html", "contents of bar.html", false},
// file from pkg2 with full path.
{http.StatusOK, "/pkg2/bar.html", "contents of bar.html", false},
// index file from disk
{http.StatusOK, "/rpc/items", "contents of rpc/items/index.html", false},
// file from an unrelated package.
{http.StatusOK, "/pkg3/baz.html", "contents of baz.html in pkg3", false},
// generated index for root.
{http.StatusOK, "/", `<script src="/app.js">`, true},
// generated index as a response to not found handler.
{http.StatusNotFound, "/no/such/dir", defaultPageContent, true},
// generated index file as a response to a directory that is found.
{http.StatusNotFound, "/pkg2/", defaultPageContent, true},
}
for _, tst := range tests {
if tst.delIdx {
delIdx() // from here on, use the generated index.
}
code, body := req(handler, fmt.Sprintf("http://test%s", tst.url))
if code != tst.code {
t.Errorf("got %d, expected %d", code, tst.code)
}
if !strings.Contains(body, tst.content) {
t.Errorf("expected %q to contain %q, got %q", tst.url, tst.content, body)
}
if !tst.delIdx && strings.Contains(body, defaultPageContent) {
t.Errorf("got %q, default page shouldn't be part of response", body)
}
}
}