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