forked from TrueCloudLab/distribution
1d33874951
Go 1.13 and up enforce import paths to be versioned if a project contains a go.mod and has released v2 or up. The current v2.x branches (and releases) do not yet have a go.mod, and therefore are still allowed to be imported with a non-versioned import path (go modules add a `+incompatible` annotation in that case). However, now that this project has a `go.mod` file, incompatible import paths will not be accepted by go modules, and attempting to use code from this repository will fail. This patch uses `v3` for the import-paths (not `v2`), because changing import paths itself is a breaking change, which means that the next release should increment the "major" version to comply with SemVer (as go modules dictate). Signed-off-by: Sebastiaan van Stijn <github@gone.nl>
72 lines
2.2 KiB
Go
72 lines
2.2 KiB
Go
package testdriver
|
|
|
|
import (
|
|
"context"
|
|
|
|
storagedriver "github.com/distribution/distribution/v3/registry/storage/driver"
|
|
"github.com/distribution/distribution/v3/registry/storage/driver/factory"
|
|
"github.com/distribution/distribution/v3/registry/storage/driver/inmemory"
|
|
)
|
|
|
|
const driverName = "testdriver"
|
|
|
|
func init() {
|
|
factory.Register(driverName, &testDriverFactory{})
|
|
}
|
|
|
|
// testDriverFactory implements the factory.StorageDriverFactory interface.
|
|
type testDriverFactory struct{}
|
|
|
|
func (factory *testDriverFactory) Create(parameters map[string]interface{}) (storagedriver.StorageDriver, error) {
|
|
return New(), nil
|
|
}
|
|
|
|
// TestDriver is a StorageDriver for testing purposes. The Writer returned by this driver
|
|
// simulates the case where Write operations are buffered. This causes the value returned by Size to lag
|
|
// behind until Close (or Commit, or Cancel) is called.
|
|
type TestDriver struct {
|
|
storagedriver.StorageDriver
|
|
}
|
|
|
|
type testFileWriter struct {
|
|
storagedriver.FileWriter
|
|
prevchunk []byte
|
|
}
|
|
|
|
var _ storagedriver.StorageDriver = &TestDriver{}
|
|
|
|
// New constructs a new StorageDriver for testing purposes. The Writer returned by this driver
|
|
// simulates the case where Write operations are buffered. This causes the value returned by Size to lag
|
|
// behind until Close (or Commit, or Cancel) is called.
|
|
func New() *TestDriver {
|
|
return &TestDriver{StorageDriver: inmemory.New()}
|
|
}
|
|
|
|
// Writer returns a FileWriter which will store the content written to it
|
|
// at the location designated by "path" after the call to Commit.
|
|
func (td *TestDriver) Writer(ctx context.Context, path string, append bool) (storagedriver.FileWriter, error) {
|
|
fw, err := td.StorageDriver.Writer(ctx, path, append)
|
|
return &testFileWriter{FileWriter: fw}, err
|
|
}
|
|
|
|
func (tfw *testFileWriter) Write(p []byte) (int, error) {
|
|
_, err := tfw.FileWriter.Write(tfw.prevchunk)
|
|
tfw.prevchunk = make([]byte, len(p))
|
|
copy(tfw.prevchunk, p)
|
|
return len(p), err
|
|
}
|
|
|
|
func (tfw *testFileWriter) Close() error {
|
|
tfw.Write(nil)
|
|
return tfw.FileWriter.Close()
|
|
}
|
|
|
|
func (tfw *testFileWriter) Cancel() error {
|
|
tfw.Write(nil)
|
|
return tfw.FileWriter.Cancel()
|
|
}
|
|
|
|
func (tfw *testFileWriter) Commit() error {
|
|
tfw.Write(nil)
|
|
return tfw.FileWriter.Commit()
|
|
}
|