/*
|
Copyright 2017 The Kubernetes Authors.
|
|
Licensed under the Apache License, Version 2.0 (the "License");
|
you may not use this file except in compliance with the License.
|
You may obtain a copy of the License at
|
|
http://www.apache.org/licenses/LICENSE-2.0
|
|
Unless required by applicable law or agreed to in writing, software
|
distributed under the License is distributed on an "AS IS" BASIS,
|
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
See the License for the specific language governing permissions and
|
limitations under the License.
|
*/
|
|
package disk
|
|
import (
|
"bytes"
|
"io/ioutil"
|
"net/http"
|
"net/url"
|
"os"
|
"path/filepath"
|
"testing"
|
|
"github.com/stretchr/testify/assert"
|
)
|
|
// copied from k8s.io/client-go/transport/round_trippers_test.go
|
type testRoundTripper struct {
|
Request *http.Request
|
Response *http.Response
|
Err error
|
}
|
|
func (rt *testRoundTripper) RoundTrip(req *http.Request) (*http.Response, error) {
|
rt.Request = req
|
return rt.Response, rt.Err
|
}
|
|
func TestCacheRoundTripper(t *testing.T) {
|
rt := &testRoundTripper{}
|
cacheDir, err := ioutil.TempDir("", "cache-rt")
|
defer os.RemoveAll(cacheDir)
|
if err != nil {
|
t.Fatal(err)
|
}
|
cache := newCacheRoundTripper(cacheDir, rt)
|
|
// First call, caches the response
|
req := &http.Request{
|
Method: http.MethodGet,
|
URL: &url.URL{Host: "localhost"},
|
}
|
rt.Response = &http.Response{
|
Header: http.Header{"ETag": []string{`"123456"`}},
|
Body: ioutil.NopCloser(bytes.NewReader([]byte("Content"))),
|
StatusCode: http.StatusOK,
|
}
|
resp, err := cache.RoundTrip(req)
|
if err != nil {
|
t.Fatal(err)
|
}
|
content, err := ioutil.ReadAll(resp.Body)
|
if err != nil {
|
t.Fatal(err)
|
}
|
if string(content) != "Content" {
|
t.Errorf(`Expected Body to be "Content", got %q`, string(content))
|
}
|
|
// Second call, returns cached response
|
req = &http.Request{
|
Method: http.MethodGet,
|
URL: &url.URL{Host: "localhost"},
|
}
|
rt.Response = &http.Response{
|
StatusCode: http.StatusNotModified,
|
Body: ioutil.NopCloser(bytes.NewReader([]byte("Other Content"))),
|
}
|
|
resp, err = cache.RoundTrip(req)
|
if err != nil {
|
t.Fatal(err)
|
}
|
|
// Read body and make sure we have the initial content
|
content, err = ioutil.ReadAll(resp.Body)
|
resp.Body.Close()
|
if err != nil {
|
t.Fatal(err)
|
}
|
if string(content) != "Content" {
|
t.Errorf("Invalid content read from cache %q", string(content))
|
}
|
}
|
|
func TestCacheRoundTripperPathPerm(t *testing.T) {
|
assert := assert.New(t)
|
|
rt := &testRoundTripper{}
|
cacheDir, err := ioutil.TempDir("", "cache-rt")
|
os.RemoveAll(cacheDir)
|
defer os.RemoveAll(cacheDir)
|
|
if err != nil {
|
t.Fatal(err)
|
}
|
cache := newCacheRoundTripper(cacheDir, rt)
|
|
// First call, caches the response
|
req := &http.Request{
|
Method: http.MethodGet,
|
URL: &url.URL{Host: "localhost"},
|
}
|
rt.Response = &http.Response{
|
Header: http.Header{"ETag": []string{`"123456"`}},
|
Body: ioutil.NopCloser(bytes.NewReader([]byte("Content"))),
|
StatusCode: http.StatusOK,
|
}
|
resp, err := cache.RoundTrip(req)
|
if err != nil {
|
t.Fatal(err)
|
}
|
content, err := ioutil.ReadAll(resp.Body)
|
if err != nil {
|
t.Fatal(err)
|
}
|
if string(content) != "Content" {
|
t.Errorf(`Expected Body to be "Content", got %q`, string(content))
|
}
|
|
err = filepath.Walk(cacheDir, func(path string, info os.FileInfo, err error) error {
|
if err != nil {
|
return err
|
}
|
if info.IsDir() {
|
assert.Equal(os.FileMode(0750), info.Mode().Perm())
|
} else {
|
assert.Equal(os.FileMode(0660), info.Mode().Perm())
|
}
|
return nil
|
})
|
assert.NoError(err)
|
}
|