2015-07-13 20:08:13 +00:00
|
|
|
package storage
|
|
|
|
|
|
|
|
import (
|
2016-07-13 23:41:51 +00:00
|
|
|
"fmt"
|
2015-07-17 18:42:47 +00:00
|
|
|
"io"
|
2015-07-13 20:08:13 +00:00
|
|
|
"testing"
|
|
|
|
|
|
|
|
"github.com/docker/distribution"
|
|
|
|
"github.com/docker/distribution/context"
|
|
|
|
"github.com/docker/distribution/registry/storage/cache/memory"
|
|
|
|
"github.com/docker/distribution/registry/storage/driver"
|
|
|
|
"github.com/docker/distribution/registry/storage/driver/inmemory"
|
|
|
|
)
|
|
|
|
|
|
|
|
type setupEnv struct {
|
|
|
|
ctx context.Context
|
|
|
|
driver driver.StorageDriver
|
|
|
|
expected []string
|
|
|
|
registry distribution.Namespace
|
|
|
|
}
|
|
|
|
|
|
|
|
func setupFS(t *testing.T) *setupEnv {
|
|
|
|
d := inmemory.New()
|
|
|
|
c := []byte("")
|
|
|
|
ctx := context.Background()
|
2015-08-18 17:56:27 +00:00
|
|
|
registry, err := NewRegistry(ctx, d, BlobDescriptorCacheProvider(memory.NewInMemoryBlobDescriptorCacheProvider()), EnableRedirect)
|
|
|
|
if err != nil {
|
|
|
|
t.Fatalf("error creating registry: %v", err)
|
|
|
|
}
|
2015-08-18 01:51:05 +00:00
|
|
|
rootpath, _ := pathFor(repositoriesRootPathSpec{})
|
2015-07-13 20:08:13 +00:00
|
|
|
|
|
|
|
repos := []string{
|
|
|
|
"/foo/a/_layers/1",
|
|
|
|
"/foo/b/_layers/2",
|
|
|
|
"/bar/c/_layers/3",
|
|
|
|
"/bar/d/_layers/4",
|
|
|
|
"/foo/d/in/_layers/5",
|
|
|
|
"/an/invalid/repo",
|
|
|
|
"/bar/d/_layers/ignored/dir/6",
|
|
|
|
}
|
|
|
|
|
|
|
|
for _, repo := range repos {
|
|
|
|
if err := d.PutContent(ctx, rootpath+repo, c); err != nil {
|
|
|
|
t.Fatalf("Unable to put to inmemory fs")
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
expected := []string{
|
|
|
|
"bar/c",
|
|
|
|
"bar/d",
|
|
|
|
"foo/a",
|
|
|
|
"foo/b",
|
|
|
|
"foo/d/in",
|
|
|
|
}
|
|
|
|
|
|
|
|
return &setupEnv{
|
|
|
|
ctx: ctx,
|
|
|
|
driver: d,
|
|
|
|
expected: expected,
|
|
|
|
registry: registry,
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
func TestCatalog(t *testing.T) {
|
|
|
|
env := setupFS(t)
|
|
|
|
|
2015-07-17 18:42:47 +00:00
|
|
|
p := make([]string, 50)
|
|
|
|
|
|
|
|
numFilled, err := env.registry.Repositories(env.ctx, p, "")
|
2015-07-13 20:08:13 +00:00
|
|
|
|
2015-07-17 18:42:47 +00:00
|
|
|
if !testEq(p, env.expected, numFilled) {
|
2015-07-13 20:08:13 +00:00
|
|
|
t.Errorf("Expected catalog repos err")
|
|
|
|
}
|
|
|
|
|
2015-07-17 18:42:47 +00:00
|
|
|
if err != io.EOF {
|
2015-07-13 20:08:13 +00:00
|
|
|
t.Errorf("Catalog has more values which we aren't expecting")
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
func TestCatalogInParts(t *testing.T) {
|
|
|
|
env := setupFS(t)
|
|
|
|
|
|
|
|
chunkLen := 2
|
2015-07-17 18:42:47 +00:00
|
|
|
p := make([]string, chunkLen)
|
2015-07-13 20:08:13 +00:00
|
|
|
|
2015-07-17 18:42:47 +00:00
|
|
|
numFilled, err := env.registry.Repositories(env.ctx, p, "")
|
|
|
|
if err == io.EOF || numFilled != len(p) {
|
|
|
|
t.Errorf("Expected more values in catalog")
|
2015-07-13 20:08:13 +00:00
|
|
|
}
|
|
|
|
|
2015-07-17 18:42:47 +00:00
|
|
|
if !testEq(p, env.expected[0:chunkLen], numFilled) {
|
|
|
|
t.Errorf("Expected catalog first chunk err")
|
2015-07-13 20:08:13 +00:00
|
|
|
}
|
|
|
|
|
2015-07-17 18:42:47 +00:00
|
|
|
lastRepo := p[len(p)-1]
|
|
|
|
numFilled, err = env.registry.Repositories(env.ctx, p, lastRepo)
|
2015-07-13 20:08:13 +00:00
|
|
|
|
2015-07-17 18:42:47 +00:00
|
|
|
if err == io.EOF || numFilled != len(p) {
|
|
|
|
t.Errorf("Expected more values in catalog")
|
2015-07-13 20:08:13 +00:00
|
|
|
}
|
|
|
|
|
2015-07-17 18:42:47 +00:00
|
|
|
if !testEq(p, env.expected[chunkLen:chunkLen*2], numFilled) {
|
|
|
|
t.Errorf("Expected catalog second chunk err")
|
2015-07-13 20:08:13 +00:00
|
|
|
}
|
|
|
|
|
2015-07-17 18:42:47 +00:00
|
|
|
lastRepo = p[len(p)-1]
|
|
|
|
numFilled, err = env.registry.Repositories(env.ctx, p, lastRepo)
|
2015-07-13 20:08:13 +00:00
|
|
|
|
2015-07-17 18:42:47 +00:00
|
|
|
if err != io.EOF {
|
|
|
|
t.Errorf("Catalog has more values which we aren't expecting")
|
2015-07-13 20:08:13 +00:00
|
|
|
}
|
|
|
|
|
2015-07-17 18:42:47 +00:00
|
|
|
if !testEq(p, env.expected[chunkLen*2:chunkLen*3-1], numFilled) {
|
|
|
|
t.Errorf("Expected catalog third chunk err")
|
2015-07-13 20:08:13 +00:00
|
|
|
}
|
2016-08-10 00:42:26 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
func TestCatalogEnumerate(t *testing.T) {
|
|
|
|
env := setupFS(t)
|
2015-07-13 20:08:13 +00:00
|
|
|
|
2016-08-10 00:42:26 +00:00
|
|
|
var repos []string
|
|
|
|
repositoryEnumerator := env.registry.(distribution.RepositoryEnumerator)
|
|
|
|
err := repositoryEnumerator.Enumerate(env.ctx, func(repoName string) error {
|
|
|
|
repos = append(repos, repoName)
|
|
|
|
return nil
|
|
|
|
})
|
|
|
|
if err != nil {
|
|
|
|
t.Errorf("Expected catalog enumerate err")
|
|
|
|
}
|
|
|
|
|
|
|
|
if len(repos) != len(env.expected) {
|
|
|
|
t.Errorf("Expected catalog enumerate doesn't have correct number of values")
|
|
|
|
}
|
|
|
|
|
|
|
|
if !testEq(repos, env.expected, len(env.expected)) {
|
|
|
|
t.Errorf("Expected catalog enumerate not over all values")
|
|
|
|
}
|
2015-07-13 20:08:13 +00:00
|
|
|
}
|
|
|
|
|
2015-07-17 18:42:47 +00:00
|
|
|
func testEq(a, b []string, size int) bool {
|
|
|
|
for cnt := 0; cnt < size-1; cnt++ {
|
|
|
|
if a[cnt] != b[cnt] {
|
2015-07-13 20:08:13 +00:00
|
|
|
return false
|
|
|
|
}
|
|
|
|
}
|
|
|
|
return true
|
|
|
|
}
|
2016-07-13 23:41:51 +00:00
|
|
|
|
|
|
|
func setupBadWalkEnv(t *testing.T) *setupEnv {
|
|
|
|
d := newBadListDriver()
|
|
|
|
ctx := context.Background()
|
|
|
|
registry, err := NewRegistry(ctx, d, BlobDescriptorCacheProvider(memory.NewInMemoryBlobDescriptorCacheProvider()), EnableRedirect)
|
|
|
|
if err != nil {
|
|
|
|
t.Fatalf("error creating registry: %v", err)
|
|
|
|
}
|
|
|
|
|
|
|
|
return &setupEnv{
|
|
|
|
ctx: ctx,
|
|
|
|
driver: d,
|
|
|
|
registry: registry,
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
type badListDriver struct {
|
|
|
|
driver.StorageDriver
|
|
|
|
}
|
|
|
|
|
|
|
|
var _ driver.StorageDriver = &badListDriver{}
|
|
|
|
|
|
|
|
func newBadListDriver() *badListDriver {
|
|
|
|
return &badListDriver{StorageDriver: inmemory.New()}
|
|
|
|
}
|
|
|
|
|
|
|
|
func (d *badListDriver) List(ctx context.Context, path string) ([]string, error) {
|
|
|
|
return nil, fmt.Errorf("List error")
|
|
|
|
}
|
|
|
|
|
|
|
|
func TestCatalogWalkError(t *testing.T) {
|
|
|
|
env := setupBadWalkEnv(t)
|
|
|
|
p := make([]string, 1)
|
|
|
|
|
|
|
|
_, err := env.registry.Repositories(env.ctx, p, "")
|
|
|
|
if err == io.EOF {
|
|
|
|
t.Errorf("Expected catalog driver list error")
|
|
|
|
}
|
|
|
|
}
|