github.com/slava-ustovytski/docker@v1.8.2-rc1/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  }