github.com/dlintw/docker@v1.5.0-rc4/graph/tags_unit_test.go (about) 1 package graph 2 3 import ( 4 "bytes" 5 "io" 6 "os" 7 "path" 8 "testing" 9 10 "github.com/docker/docker/daemon/graphdriver" 11 _ "github.com/docker/docker/daemon/graphdriver/vfs" // import the vfs driver so it is used in the tests 12 "github.com/docker/docker/image" 13 "github.com/docker/docker/utils" 14 "github.com/docker/docker/vendor/src/code.google.com/p/go/src/pkg/archive/tar" 15 ) 16 17 const ( 18 testOfficialImageName = "myapp" 19 testOfficialImageID = "1a2d3c4d4e5fa2d2a21acea242a5e2345d3aefc3e7dfa2a2a2a21a2a2ad2d234" 20 testOfficialImageIDShort = "1a2d3c4d4e5f" 21 testPrivateImageName = "127.0.0.1:8000/privateapp" 22 testPrivateImageID = "5bc255f8699e4ee89ac4469266c3d11515da88fdcbde45d7b069b636ff4efd81" 23 testPrivateImageIDShort = "5bc255f8699e" 24 ) 25 26 func fakeTar() (io.Reader, error) { 27 uid := os.Getuid() 28 gid := os.Getgid() 29 30 content := []byte("Hello world!\n") 31 buf := new(bytes.Buffer) 32 tw := tar.NewWriter(buf) 33 for _, name := range []string{"/etc/postgres/postgres.conf", "/etc/passwd", "/var/log/postgres/postgres.conf"} { 34 hdr := new(tar.Header) 35 36 // Leaving these fields blank requires root privileges 37 hdr.Uid = uid 38 hdr.Gid = gid 39 40 hdr.Size = int64(len(content)) 41 hdr.Name = name 42 if err := tw.WriteHeader(hdr); err != nil { 43 return nil, err 44 } 45 tw.Write([]byte(content)) 46 } 47 tw.Close() 48 return buf, nil 49 } 50 51 func mkTestTagStore(root string, t *testing.T) *TagStore { 52 driver, err := graphdriver.New(root, nil) 53 if err != nil { 54 t.Fatal(err) 55 } 56 graph, err := NewGraph(root, driver) 57 if err != nil { 58 t.Fatal(err) 59 } 60 store, err := NewTagStore(path.Join(root, "tags"), graph, nil) 61 if err != nil { 62 t.Fatal(err) 63 } 64 officialArchive, err := fakeTar() 65 if err != nil { 66 t.Fatal(err) 67 } 68 img := &image.Image{ID: testOfficialImageID} 69 if err := graph.Register(img, officialArchive); err != nil { 70 t.Fatal(err) 71 } 72 if err := store.Set(testOfficialImageName, "", testOfficialImageID, false); err != nil { 73 t.Fatal(err) 74 } 75 privateArchive, err := fakeTar() 76 if err != nil { 77 t.Fatal(err) 78 } 79 img = &image.Image{ID: testPrivateImageID} 80 if err := graph.Register(img, privateArchive); err != nil { 81 t.Fatal(err) 82 } 83 if err := store.Set(testPrivateImageName, "", testPrivateImageID, false); err != nil { 84 t.Fatal(err) 85 } 86 return store 87 } 88 89 func TestLookupImage(t *testing.T) { 90 tmp, err := utils.TestDirectory("") 91 if err != nil { 92 t.Fatal(err) 93 } 94 defer os.RemoveAll(tmp) 95 store := mkTestTagStore(tmp, t) 96 defer store.graph.driver.Cleanup() 97 98 officialLookups := []string{ 99 testOfficialImageID, 100 testOfficialImageIDShort, 101 testOfficialImageName + ":" + testOfficialImageID, 102 testOfficialImageName + ":" + testOfficialImageIDShort, 103 testOfficialImageName, 104 testOfficialImageName + ":" + DEFAULTTAG, 105 "docker.io/" + testOfficialImageName, 106 "docker.io/" + testOfficialImageName + ":" + DEFAULTTAG, 107 "index.docker.io/" + testOfficialImageName, 108 "index.docker.io/" + testOfficialImageName + ":" + DEFAULTTAG, 109 "library/" + testOfficialImageName, 110 "library/" + testOfficialImageName + ":" + DEFAULTTAG, 111 "docker.io/library/" + testOfficialImageName, 112 "docker.io/library/" + testOfficialImageName + ":" + DEFAULTTAG, 113 "index.docker.io/library/" + testOfficialImageName, 114 "index.docker.io/library/" + testOfficialImageName + ":" + DEFAULTTAG, 115 } 116 117 privateLookups := []string{ 118 testPrivateImageID, 119 testPrivateImageIDShort, 120 testPrivateImageName + ":" + testPrivateImageID, 121 testPrivateImageName + ":" + testPrivateImageIDShort, 122 testPrivateImageName, 123 testPrivateImageName + ":" + DEFAULTTAG, 124 } 125 126 invalidLookups := []string{ 127 testOfficialImageName + ":" + "fail", 128 "fail:fail", 129 } 130 131 for _, name := range officialLookups { 132 if img, err := store.LookupImage(name); err != nil { 133 t.Errorf("Error looking up %s: %s", name, err) 134 } else if img == nil { 135 t.Errorf("Expected 1 image, none found: %s", name) 136 } else if img.ID != testOfficialImageID { 137 t.Errorf("Expected ID '%s' found '%s'", testOfficialImageID, img.ID) 138 } 139 } 140 141 for _, name := range privateLookups { 142 if img, err := store.LookupImage(name); err != nil { 143 t.Errorf("Error looking up %s: %s", name, err) 144 } else if img == nil { 145 t.Errorf("Expected 1 image, none found: %s", name) 146 } else if img.ID != testPrivateImageID { 147 t.Errorf("Expected ID '%s' found '%s'", testPrivateImageID, img.ID) 148 } 149 } 150 151 for _, name := range invalidLookups { 152 if img, err := store.LookupImage(name); err == nil { 153 t.Errorf("Expected error, none found: %s", name) 154 } else if img != nil { 155 t.Errorf("Expected 0 image, 1 found: %s", name) 156 } 157 } 158 } 159 160 func TestValidTagName(t *testing.T) { 161 validTags := []string{"9", "foo", "foo-test", "bar.baz.boo"} 162 for _, tag := range validTags { 163 if err := ValidateTagName(tag); err != nil { 164 t.Errorf("'%s' should've been a valid tag", tag) 165 } 166 } 167 } 168 169 func TestInvalidTagName(t *testing.T) { 170 validTags := []string{"-9", ".foo", "-test", ".", "-"} 171 for _, tag := range validTags { 172 if err := ValidateTagName(tag); err == nil { 173 t.Errorf("'%s' shouldn't have been a valid tag", tag) 174 } 175 } 176 }