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