github.com/lmars/docker@v1.6.0-rc2/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 testPrivateImageDigest = "sha256:bc8813ea7b3603864987522f02a76101c17ad122e1c46d790efc0fca78ca7bfb" 25 testPrivateImageTag = "sometag" 26 ) 27 28 func fakeTar() (io.Reader, error) { 29 uid := os.Getuid() 30 gid := os.Getgid() 31 32 content := []byte("Hello world!\n") 33 buf := new(bytes.Buffer) 34 tw := tar.NewWriter(buf) 35 for _, name := range []string{"/etc/postgres/postgres.conf", "/etc/passwd", "/var/log/postgres/postgres.conf"} { 36 hdr := new(tar.Header) 37 38 // Leaving these fields blank requires root privileges 39 hdr.Uid = uid 40 hdr.Gid = gid 41 42 hdr.Size = int64(len(content)) 43 hdr.Name = name 44 if err := tw.WriteHeader(hdr); err != nil { 45 return nil, err 46 } 47 tw.Write([]byte(content)) 48 } 49 tw.Close() 50 return buf, nil 51 } 52 53 func mkTestTagStore(root string, t *testing.T) *TagStore { 54 driver, err := graphdriver.New(root, nil) 55 if err != nil { 56 t.Fatal(err) 57 } 58 graph, err := NewGraph(root, driver) 59 if err != nil { 60 t.Fatal(err) 61 } 62 store, err := NewTagStore(path.Join(root, "tags"), graph, nil) 63 if err != nil { 64 t.Fatal(err) 65 } 66 officialArchive, err := fakeTar() 67 if err != nil { 68 t.Fatal(err) 69 } 70 img := &image.Image{ID: testOfficialImageID} 71 if err := graph.Register(img, officialArchive); err != nil { 72 t.Fatal(err) 73 } 74 if err := store.Set(testOfficialImageName, "", testOfficialImageID, false); err != nil { 75 t.Fatal(err) 76 } 77 privateArchive, err := fakeTar() 78 if err != nil { 79 t.Fatal(err) 80 } 81 img = &image.Image{ID: testPrivateImageID} 82 if err := graph.Register(img, privateArchive); err != nil { 83 t.Fatal(err) 84 } 85 if err := store.Set(testPrivateImageName, "", testPrivateImageID, false); err != nil { 86 t.Fatal(err) 87 } 88 if err := store.SetDigest(testPrivateImageName, testPrivateImageDigest, testPrivateImageID); err != nil { 89 t.Fatal(err) 90 } 91 return store 92 } 93 94 func TestLookupImage(t *testing.T) { 95 tmp, err := utils.TestDirectory("") 96 if err != nil { 97 t.Fatal(err) 98 } 99 defer os.RemoveAll(tmp) 100 store := mkTestTagStore(tmp, t) 101 defer store.graph.driver.Cleanup() 102 103 officialLookups := []string{ 104 testOfficialImageID, 105 testOfficialImageIDShort, 106 testOfficialImageName + ":" + testOfficialImageID, 107 testOfficialImageName + ":" + testOfficialImageIDShort, 108 testOfficialImageName, 109 testOfficialImageName + ":" + DEFAULTTAG, 110 "docker.io/" + testOfficialImageName, 111 "docker.io/" + testOfficialImageName + ":" + DEFAULTTAG, 112 "index.docker.io/" + testOfficialImageName, 113 "index.docker.io/" + testOfficialImageName + ":" + DEFAULTTAG, 114 "library/" + testOfficialImageName, 115 "library/" + testOfficialImageName + ":" + DEFAULTTAG, 116 "docker.io/library/" + testOfficialImageName, 117 "docker.io/library/" + testOfficialImageName + ":" + DEFAULTTAG, 118 "index.docker.io/library/" + testOfficialImageName, 119 "index.docker.io/library/" + testOfficialImageName + ":" + DEFAULTTAG, 120 } 121 122 privateLookups := []string{ 123 testPrivateImageID, 124 testPrivateImageIDShort, 125 testPrivateImageName + ":" + testPrivateImageID, 126 testPrivateImageName + ":" + testPrivateImageIDShort, 127 testPrivateImageName, 128 testPrivateImageName + ":" + DEFAULTTAG, 129 } 130 131 invalidLookups := []string{ 132 testOfficialImageName + ":" + "fail", 133 "fail:fail", 134 } 135 136 digestLookups := []string{ 137 testPrivateImageName + "@" + testPrivateImageDigest, 138 } 139 140 for _, name := range officialLookups { 141 if img, err := store.LookupImage(name); err != nil { 142 t.Errorf("Error looking up %s: %s", name, err) 143 } else if img == nil { 144 t.Errorf("Expected 1 image, none found: %s", name) 145 } else if img.ID != testOfficialImageID { 146 t.Errorf("Expected ID '%s' found '%s'", testOfficialImageID, img.ID) 147 } 148 } 149 150 for _, name := range privateLookups { 151 if img, err := store.LookupImage(name); err != nil { 152 t.Errorf("Error looking up %s: %s", name, err) 153 } else if img == nil { 154 t.Errorf("Expected 1 image, none found: %s", name) 155 } else if img.ID != testPrivateImageID { 156 t.Errorf("Expected ID '%s' found '%s'", testPrivateImageID, img.ID) 157 } 158 } 159 160 for _, name := range invalidLookups { 161 if img, err := store.LookupImage(name); err == nil { 162 t.Errorf("Expected error, none found: %s", name) 163 } else if img != nil { 164 t.Errorf("Expected 0 image, 1 found: %s", name) 165 } 166 } 167 168 for _, name := range digestLookups { 169 if img, err := store.LookupImage(name); err != nil { 170 t.Errorf("Error looking up %s: %s", name, err) 171 } else if img == nil { 172 t.Errorf("Expected 1 image, none found: %s", name) 173 } else if img.ID != testPrivateImageID { 174 t.Errorf("Expected ID '%s' found '%s'", testPrivateImageID, img.ID) 175 } 176 } 177 } 178 179 func TestValidTagName(t *testing.T) { 180 validTags := []string{"9", "foo", "foo-test", "bar.baz.boo"} 181 for _, tag := range validTags { 182 if err := ValidateTagName(tag); err != nil { 183 t.Errorf("'%s' should've been a valid tag", tag) 184 } 185 } 186 } 187 188 func TestInvalidTagName(t *testing.T) { 189 validTags := []string{"-9", ".foo", "-test", ".", "-"} 190 for _, tag := range validTags { 191 if err := ValidateTagName(tag); err == nil { 192 t.Errorf("'%s' shouldn't have been a valid tag", tag) 193 } 194 } 195 } 196 197 func TestValidateDigest(t *testing.T) { 198 tests := []struct { 199 input string 200 expectError bool 201 }{ 202 {"", true}, 203 {"latest", true}, 204 {"a:b", false}, 205 {"aZ0124-.+:bY852-_.+=", false}, 206 {"#$%#$^:$%^#$%", true}, 207 } 208 209 for i, test := range tests { 210 err := validateDigest(test.input) 211 gotError := err != nil 212 if e, a := test.expectError, gotError; e != a { 213 t.Errorf("%d: with input %s, expected error=%t, got %t: %s", i, test.input, test.expectError, gotError, err) 214 } 215 } 216 }