github.com/docker/docker@v299999999.0.0-20200612211812-aaf470eca7b5+incompatible/container/view_test.go (about)

     1  package container // import "github.com/docker/docker/container"
     2  
     3  import (
     4  	"io/ioutil"
     5  	"os"
     6  	"path/filepath"
     7  	"testing"
     8  
     9  	"github.com/docker/docker/api/types"
    10  	containertypes "github.com/docker/docker/api/types/container"
    11  	"github.com/google/uuid"
    12  	"gotest.tools/v3/assert"
    13  	is "gotest.tools/v3/assert/cmp"
    14  )
    15  
    16  var root string
    17  
    18  func TestMain(m *testing.M) {
    19  	var err error
    20  	root, err = ioutil.TempDir("", "docker-container-test-")
    21  	if err != nil {
    22  		panic(err)
    23  	}
    24  	defer os.RemoveAll(root)
    25  
    26  	os.Exit(m.Run())
    27  }
    28  
    29  func newContainer(t *testing.T) *Container {
    30  	var (
    31  		id    = uuid.New().String()
    32  		cRoot = filepath.Join(root, id)
    33  	)
    34  	if err := os.MkdirAll(cRoot, 0755); err != nil {
    35  		t.Fatal(err)
    36  	}
    37  	c := NewBaseContainer(id, cRoot)
    38  	c.HostConfig = &containertypes.HostConfig{}
    39  	return c
    40  }
    41  
    42  func TestViewSaveDelete(t *testing.T) {
    43  	db, err := NewViewDB()
    44  	if err != nil {
    45  		t.Fatal(err)
    46  	}
    47  	c := newContainer(t)
    48  	if err := c.CheckpointTo(db); err != nil {
    49  		t.Fatal(err)
    50  	}
    51  	if err := db.Delete(c); err != nil {
    52  		t.Fatal(err)
    53  	}
    54  }
    55  
    56  func TestViewAll(t *testing.T) {
    57  	var (
    58  		db, _ = NewViewDB()
    59  		one   = newContainer(t)
    60  		two   = newContainer(t)
    61  	)
    62  	one.Pid = 10
    63  	if err := one.CheckpointTo(db); err != nil {
    64  		t.Fatal(err)
    65  	}
    66  	two.Pid = 20
    67  	if err := two.CheckpointTo(db); err != nil {
    68  		t.Fatal(err)
    69  	}
    70  
    71  	all, err := db.Snapshot().All()
    72  	if err != nil {
    73  		t.Fatal(err)
    74  	}
    75  	if l := len(all); l != 2 {
    76  		t.Fatalf("expected 2 items, got %d", l)
    77  	}
    78  	byID := make(map[string]Snapshot)
    79  	for i := range all {
    80  		byID[all[i].ID] = all[i]
    81  	}
    82  	if s, ok := byID[one.ID]; !ok || s.Pid != 10 {
    83  		t.Fatalf("expected something different with for id=%s: %v", one.ID, s)
    84  	}
    85  	if s, ok := byID[two.ID]; !ok || s.Pid != 20 {
    86  		t.Fatalf("expected something different with for id=%s: %v", two.ID, s)
    87  	}
    88  }
    89  
    90  func TestViewGet(t *testing.T) {
    91  	var (
    92  		db, _ = NewViewDB()
    93  		one   = newContainer(t)
    94  	)
    95  	one.ImageID = "some-image-123"
    96  	if err := one.CheckpointTo(db); err != nil {
    97  		t.Fatal(err)
    98  	}
    99  	s, err := db.Snapshot().Get(one.ID)
   100  	if err != nil {
   101  		t.Fatal(err)
   102  	}
   103  	if s == nil || s.ImageID != "some-image-123" {
   104  		t.Fatalf("expected ImageID=some-image-123. Got: %v", s)
   105  	}
   106  }
   107  
   108  func TestNames(t *testing.T) {
   109  	db, err := NewViewDB()
   110  	if err != nil {
   111  		t.Fatal(err)
   112  	}
   113  	assert.Check(t, db.ReserveName("name1", "containerid1"))
   114  	assert.Check(t, db.ReserveName("name1", "containerid1")) // idempotent
   115  	assert.Check(t, db.ReserveName("name2", "containerid2"))
   116  	assert.Check(t, is.Error(db.ReserveName("name2", "containerid3"), ErrNameReserved.Error()))
   117  
   118  	// Releasing a name allows the name to point to something else later.
   119  	assert.Check(t, db.ReleaseName("name2"))
   120  	assert.Check(t, db.ReserveName("name2", "containerid3"))
   121  
   122  	view := db.Snapshot()
   123  
   124  	id, err := view.GetID("name1")
   125  	assert.Check(t, err)
   126  	assert.Check(t, is.Equal("containerid1", id))
   127  
   128  	id, err = view.GetID("name2")
   129  	assert.Check(t, err)
   130  	assert.Check(t, is.Equal("containerid3", id))
   131  
   132  	_, err = view.GetID("notreserved")
   133  	assert.Check(t, is.Error(err, ErrNameNotReserved.Error()))
   134  
   135  	// Releasing and re-reserving a name doesn't affect the snapshot.
   136  	assert.Check(t, db.ReleaseName("name2"))
   137  	assert.Check(t, db.ReserveName("name2", "containerid4"))
   138  
   139  	id, err = view.GetID("name1")
   140  	assert.Check(t, err)
   141  	assert.Check(t, is.Equal("containerid1", id))
   142  
   143  	id, err = view.GetID("name2")
   144  	assert.Check(t, err)
   145  	assert.Check(t, is.Equal("containerid3", id))
   146  
   147  	// GetAllNames
   148  	assert.Check(t, is.DeepEqual(map[string][]string{"containerid1": {"name1"}, "containerid3": {"name2"}}, view.GetAllNames()))
   149  
   150  	assert.Check(t, db.ReserveName("name3", "containerid1"))
   151  	assert.Check(t, db.ReserveName("name4", "containerid1"))
   152  
   153  	view = db.Snapshot()
   154  	assert.Check(t, is.DeepEqual(map[string][]string{"containerid1": {"name1", "name3", "name4"}, "containerid4": {"name2"}}, view.GetAllNames()))
   155  
   156  	// Release containerid1's names with Delete even though no container exists
   157  	assert.Check(t, db.Delete(&Container{ID: "containerid1"}))
   158  
   159  	// Reusing one of those names should work
   160  	assert.Check(t, db.ReserveName("name1", "containerid4"))
   161  	view = db.Snapshot()
   162  	assert.Check(t, is.DeepEqual(map[string][]string{"containerid4": {"name1", "name2"}}, view.GetAllNames()))
   163  }
   164  
   165  // Test case for GitHub issue 35920
   166  func TestViewWithHealthCheck(t *testing.T) {
   167  	var (
   168  		db, _ = NewViewDB()
   169  		one   = newContainer(t)
   170  	)
   171  	one.Health = &Health{
   172  		Health: types.Health{
   173  			Status: "starting",
   174  		},
   175  	}
   176  	if err := one.CheckpointTo(db); err != nil {
   177  		t.Fatal(err)
   178  	}
   179  	s, err := db.Snapshot().Get(one.ID)
   180  	if err != nil {
   181  		t.Fatal(err)
   182  	}
   183  	if s == nil || s.Health != "starting" {
   184  		t.Fatalf("expected Health=starting. Got: %+v", s)
   185  	}
   186  }