github.com/eljojo/docker@v1.6.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  	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  }