73 lines
		
	
	
		
			2.2 KiB
		
	
	
	
		
			Go
		
	
	
			
		
		
	
	
			73 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(ctx context.Context) error {
 | |
| 	tfw.Write(nil)
 | |
| 	return tfw.FileWriter.Cancel(ctx)
 | |
| }
 | |
| 
 | |
| func (tfw *testFileWriter) Commit() error {
 | |
| 	tfw.Write(nil)
 | |
| 	return tfw.FileWriter.Commit()
 | |
| }
 |