mirror of
https://github.com/minio/minio.git
synced 2024-12-26 07:05:55 -05:00
d2557bb538
The object cache implementation is XL cache, which defaults to 8GB worth of read cache. Currently GetObject() transparently writes to this cache upon first client read and then subsequently serves reads from the same cache. Currently expiration is not implemented.
96 lines
2.7 KiB
Go
96 lines
2.7 KiB
Go
/*
|
|
* Minio Cloud Storage, (C) 2016 Minio, Inc.
|
|
*
|
|
* 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 objcache
|
|
|
|
import (
|
|
"io"
|
|
"io/ioutil"
|
|
"os"
|
|
"testing"
|
|
)
|
|
|
|
// Tests different types of seekable operations on an allocated buffer.
|
|
func TestBufferSeek(t *testing.T) {
|
|
r := NewBuffer([]byte("0123456789"))
|
|
tests := []struct {
|
|
off int64
|
|
seek int
|
|
n int
|
|
want string
|
|
wantpos int64
|
|
seekerr string
|
|
}{
|
|
{seek: os.SEEK_SET, off: 0, n: 20, want: "0123456789"},
|
|
{seek: os.SEEK_SET, off: 1, n: 1, want: "1"},
|
|
{seek: os.SEEK_CUR, off: 1, wantpos: 3, n: 2, want: "34"},
|
|
{seek: os.SEEK_SET, off: -1, seekerr: "cache.Buffer.Seek: negative position"},
|
|
{seek: os.SEEK_SET, off: 1 << 33, wantpos: 1 << 33},
|
|
{seek: os.SEEK_CUR, off: 1, wantpos: 1<<33 + 1},
|
|
{seek: os.SEEK_SET, n: 5, want: "01234"},
|
|
{seek: os.SEEK_CUR, n: 5, want: "56789"},
|
|
{seek: os.SEEK_END, off: -1, seekerr: "cache.Buffer.Seek: whence os.SEEK_END is not supported"},
|
|
}
|
|
|
|
for i, tt := range tests {
|
|
pos, err := r.Seek(tt.off, tt.seek)
|
|
if err == nil && tt.seekerr != "" {
|
|
t.Errorf("%d. want seek error %q", i, tt.seekerr)
|
|
continue
|
|
}
|
|
if err != nil && err.Error() != tt.seekerr {
|
|
t.Errorf("%d. seek error = %q; want %q", i, err.Error(), tt.seekerr)
|
|
continue
|
|
}
|
|
if tt.wantpos != 0 && tt.wantpos != pos {
|
|
t.Errorf("%d. pos = %d, want %d", i, pos, tt.wantpos)
|
|
}
|
|
buf := make([]byte, tt.n)
|
|
n, err := r.Read(buf)
|
|
if err != nil {
|
|
t.Errorf("%d. read = %v", i, err)
|
|
continue
|
|
}
|
|
got := string(buf[:n])
|
|
if got != tt.want {
|
|
t.Errorf("%d. got %q; want %q", i, got, tt.want)
|
|
}
|
|
}
|
|
}
|
|
|
|
// Tests read operation after big seek.
|
|
func TestReadAfterBigSeek(t *testing.T) {
|
|
r := NewBuffer([]byte("0123456789"))
|
|
if _, err := r.Seek(1<<31+5, os.SEEK_SET); err != nil {
|
|
t.Fatal(err)
|
|
}
|
|
if n, err := r.Read(make([]byte, 10)); n != 0 || err != io.EOF {
|
|
t.Errorf("Read = %d, %v; want 0, EOF", n, err)
|
|
}
|
|
}
|
|
|
|
// tests that Len is affected by reads, but Size is not.
|
|
func TestBufferLenSize(t *testing.T) {
|
|
r := NewBuffer([]byte("abc"))
|
|
io.CopyN(ioutil.Discard, r, 1)
|
|
if r.Len() != 2 {
|
|
t.Errorf("Len = %d; want 2", r.Len())
|
|
}
|
|
if r.Size() != 3 {
|
|
t.Errorf("Size = %d; want 3", r.Size())
|
|
}
|
|
}
|