73 lines
		
	
	
		
			2.1 KiB
		
	
	
	
		
			Go
		
	
	
			
		
		
	
	
			73 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()
 | 
						|
}
 |