github.com/endocode/docker@v1.4.2-0.20160113120958-46eb4700391e/layer/filestore_test.go (about) 1 package layer 2 3 import ( 4 "fmt" 5 "io/ioutil" 6 "math/rand" 7 "os" 8 "path/filepath" 9 "strings" 10 "syscall" 11 "testing" 12 13 "github.com/docker/distribution/digest" 14 ) 15 16 func randomLayerID(seed int64) ChainID { 17 r := rand.New(rand.NewSource(seed)) 18 19 return ChainID(digest.FromBytes([]byte(fmt.Sprintf("%d", r.Int63())))) 20 } 21 22 func newFileMetadataStore(t *testing.T) (*fileMetadataStore, string, func()) { 23 td, err := ioutil.TempDir("", "layers-") 24 if err != nil { 25 t.Fatal(err) 26 } 27 fms, err := NewFSMetadataStore(td) 28 if err != nil { 29 t.Fatal(err) 30 } 31 32 return fms.(*fileMetadataStore), td, func() { 33 if err := os.RemoveAll(td); err != nil { 34 t.Logf("Failed to cleanup %q: %s", td, err) 35 } 36 } 37 } 38 39 func assertNotDirectoryError(t *testing.T, err error) { 40 perr, ok := err.(*os.PathError) 41 if !ok { 42 t.Fatalf("Unexpected error %#v, expected path error", err) 43 } 44 45 if perr.Err != syscall.ENOTDIR { 46 t.Fatalf("Unexpected error %s, expected %s", perr.Err, syscall.ENOTDIR) 47 } 48 } 49 50 func assertPermissionError(t *testing.T, err error) { 51 perr, ok := err.(*os.PathError) 52 if !ok { 53 t.Fatalf("Unexpected error %#v, expected path error", err) 54 } 55 56 if perr.Err != syscall.EACCES { 57 t.Fatalf("Unexpected error %s, expected %s", perr.Err, syscall.EACCES) 58 } 59 } 60 61 func TestCommitFailure(t *testing.T) { 62 fms, td, cleanup := newFileMetadataStore(t) 63 defer cleanup() 64 65 if err := ioutil.WriteFile(filepath.Join(td, "sha256"), []byte("was here first!"), 0644); err != nil { 66 t.Fatal(err) 67 } 68 69 tx, err := fms.StartTransaction() 70 if err != nil { 71 t.Fatal(err) 72 } 73 74 if err := tx.SetSize(0); err != nil { 75 t.Fatal(err) 76 } 77 78 err = tx.Commit(randomLayerID(5)) 79 if err == nil { 80 t.Fatalf("Expected error committing with invalid layer parent directory") 81 } 82 assertNotDirectoryError(t, err) 83 } 84 85 func TestStartTransactionFailure(t *testing.T) { 86 fms, td, cleanup := newFileMetadataStore(t) 87 defer cleanup() 88 89 if err := ioutil.WriteFile(filepath.Join(td, "tmp"), []byte("was here first!"), 0644); err != nil { 90 t.Fatal(err) 91 } 92 93 _, err := fms.StartTransaction() 94 if err == nil { 95 t.Fatalf("Expected error starting transaction with invalid layer parent directory") 96 } 97 assertNotDirectoryError(t, err) 98 99 if err := os.Remove(filepath.Join(td, "tmp")); err != nil { 100 t.Fatal(err) 101 } 102 103 tx, err := fms.StartTransaction() 104 if err != nil { 105 t.Fatal(err) 106 } 107 108 if expected := filepath.Join(td, "tmp"); strings.HasPrefix(expected, tx.String()) { 109 t.Fatalf("Unexpected transaction string %q, expected prefix %q", tx.String(), expected) 110 } 111 112 if err := tx.Cancel(); err != nil { 113 t.Fatal(err) 114 } 115 }