forked from TrueCloudLab/distribution
9c88801a12
Back in the before time, the best practices surrounding usage of Context weren't quite worked out. We defined our own type to make usage easier. As this packaged was used elsewhere, it make it more and more challenging to integrate with the forked `Context` type. Now that it is available in the standard library, we can just use that one directly. To make usage more consistent, we now use `dcontext` when referring to the distribution context package. Signed-off-by: Stephen J Day <stephen.day@docker.com>
72 lines
2.1 KiB
Go
72 lines
2.1 KiB
Go
package testdriver
|
|
|
|
import (
|
|
"context"
|
|
|
|
storagedriver "github.com/docker/distribution/registry/storage/driver"
|
|
"github.com/docker/distribution/registry/storage/driver/factory"
|
|
"github.com/docker/distribution/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()
|
|
}
|