|
|
@@ -10,6 +10,7 @@ import (
|
|
|
"net/http"
|
|
|
"os"
|
|
|
"reflect"
|
|
|
+ "regexp"
|
|
|
"sort"
|
|
|
"testing"
|
|
|
|
|
|
@@ -611,3 +612,106 @@ func (f noDeadPropsFile) Readdir(count int) ([]os.FileInfo, error) { return f.f
|
|
|
func (f noDeadPropsFile) Seek(off int64, whence int) (int64, error) { return f.f.Seek(off, whence) }
|
|
|
func (f noDeadPropsFile) Stat() (os.FileInfo, error) { return f.f.Stat() }
|
|
|
func (f noDeadPropsFile) Write(p []byte) (int, error) { return f.f.Write(p) }
|
|
|
+
|
|
|
+type overrideContentType struct {
|
|
|
+ os.FileInfo
|
|
|
+ contentType string
|
|
|
+ err error
|
|
|
+}
|
|
|
+
|
|
|
+func (o *overrideContentType) ContentType(ctx context.Context) (string, error) {
|
|
|
+ return o.contentType, o.err
|
|
|
+}
|
|
|
+
|
|
|
+func TestFindContentTypeOverride(t *testing.T) {
|
|
|
+ fs, err := buildTestFS([]string{"touch /file"})
|
|
|
+ if err != nil {
|
|
|
+ t.Fatalf("cannot create test filesystem: %v", err)
|
|
|
+ }
|
|
|
+ ctx := context.Background()
|
|
|
+ fi, err := fs.Stat(ctx, "/file")
|
|
|
+ if err != nil {
|
|
|
+ t.Fatalf("cannot Stat /file: %v", err)
|
|
|
+ }
|
|
|
+
|
|
|
+ // Check non overridden case
|
|
|
+ originalContentType, err := findContentType(ctx, fs, nil, "/file", fi)
|
|
|
+ if err != nil {
|
|
|
+ t.Fatalf("findContentType /file failed: %v", err)
|
|
|
+ }
|
|
|
+ if originalContentType != "text/plain; charset=utf-8" {
|
|
|
+ t.Fatalf("ContentType wrong want %q got %q", "text/plain; charset=utf-8", originalContentType)
|
|
|
+ }
|
|
|
+
|
|
|
+ // Now try overriding the ContentType
|
|
|
+ o := &overrideContentType{fi, "OverriddenContentType", nil}
|
|
|
+ ContentType, err := findContentType(ctx, fs, nil, "/file", o)
|
|
|
+ if err != nil {
|
|
|
+ t.Fatalf("findContentType /file failed: %v", err)
|
|
|
+ }
|
|
|
+ if ContentType != o.contentType {
|
|
|
+ t.Fatalf("ContentType wrong want %q got %q", o.contentType, ContentType)
|
|
|
+ }
|
|
|
+
|
|
|
+ // Now return ErrNotImplemented and check we get the original content type
|
|
|
+ o = &overrideContentType{fi, "OverriddenContentType", ErrNotImplemented}
|
|
|
+ ContentType, err = findContentType(ctx, fs, nil, "/file", o)
|
|
|
+ if err != nil {
|
|
|
+ t.Fatalf("findContentType /file failed: %v", err)
|
|
|
+ }
|
|
|
+ if ContentType != originalContentType {
|
|
|
+ t.Fatalf("ContentType wrong want %q got %q", originalContentType, ContentType)
|
|
|
+ }
|
|
|
+}
|
|
|
+
|
|
|
+type overrideETag struct {
|
|
|
+ os.FileInfo
|
|
|
+ eTag string
|
|
|
+ err error
|
|
|
+}
|
|
|
+
|
|
|
+func (o *overrideETag) ETag(ctx context.Context) (string, error) {
|
|
|
+ return o.eTag, o.err
|
|
|
+}
|
|
|
+
|
|
|
+func TestFindETagOverride(t *testing.T) {
|
|
|
+ fs, err := buildTestFS([]string{"touch /file"})
|
|
|
+ if err != nil {
|
|
|
+ t.Fatalf("cannot create test filesystem: %v", err)
|
|
|
+ }
|
|
|
+ ctx := context.Background()
|
|
|
+ fi, err := fs.Stat(ctx, "/file")
|
|
|
+ if err != nil {
|
|
|
+ t.Fatalf("cannot Stat /file: %v", err)
|
|
|
+ }
|
|
|
+
|
|
|
+ // Check non overridden case
|
|
|
+ originalETag, err := findETag(ctx, fs, nil, "/file", fi)
|
|
|
+ if err != nil {
|
|
|
+ t.Fatalf("findETag /file failed: %v", err)
|
|
|
+ }
|
|
|
+ matchETag := regexp.MustCompile(`^"-?[0-9a-f]{6,}"$`)
|
|
|
+ if !matchETag.MatchString(originalETag) {
|
|
|
+ t.Fatalf("ETag wrong, wanted something matching %v got %q", matchETag, originalETag)
|
|
|
+ }
|
|
|
+
|
|
|
+ // Now try overriding the ETag
|
|
|
+ o := &overrideETag{fi, `"OverriddenETag"`, nil}
|
|
|
+ ETag, err := findETag(ctx, fs, nil, "/file", o)
|
|
|
+ if err != nil {
|
|
|
+ t.Fatalf("findETag /file failed: %v", err)
|
|
|
+ }
|
|
|
+ if ETag != o.eTag {
|
|
|
+ t.Fatalf("ETag wrong want %q got %q", o.eTag, ETag)
|
|
|
+ }
|
|
|
+
|
|
|
+ // Now return ErrNotImplemented and check we get the original Etag
|
|
|
+ o = &overrideETag{fi, `"OverriddenETag"`, ErrNotImplemented}
|
|
|
+ ETag, err = findETag(ctx, fs, nil, "/file", o)
|
|
|
+ if err != nil {
|
|
|
+ t.Fatalf("findETag /file failed: %v", err)
|
|
|
+ }
|
|
|
+ if ETag != originalETag {
|
|
|
+ t.Fatalf("ETag wrong want %q got %q", originalETag, ETag)
|
|
|
+ }
|
|
|
+}
|