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