gopkg.in/docker/docker.v20@v20.10.27/pkg/system/rm_test.go (about)

     1  //go:build !darwin && !windows
     2  // +build !darwin,!windows
     3  
     4  package system // import "github.com/docker/docker/pkg/system"
     5  
     6  import (
     7  	"os"
     8  	"path/filepath"
     9  	"testing"
    10  	"time"
    11  
    12  	"github.com/moby/sys/mount"
    13  	"gotest.tools/v3/skip"
    14  )
    15  
    16  func TestEnsureRemoveAllWithMount(t *testing.T) {
    17  	skip.If(t, os.Getuid() != 0, "skipping test that requires root")
    18  
    19  	dir1, err := os.MkdirTemp("", "test-ensure-removeall-with-dir1")
    20  	if err != nil {
    21  		t.Fatal(err)
    22  	}
    23  	dir2, err := os.MkdirTemp("", "test-ensure-removeall-with-dir2")
    24  	if err != nil {
    25  		t.Fatal(err)
    26  	}
    27  	defer os.RemoveAll(dir2)
    28  
    29  	bindDir := filepath.Join(dir1, "bind")
    30  	if err := os.MkdirAll(bindDir, 0755); err != nil {
    31  		t.Fatal(err)
    32  	}
    33  
    34  	if err := mount.Mount(dir2, bindDir, "none", "bind"); err != nil {
    35  		t.Fatal(err)
    36  	}
    37  
    38  	done := make(chan struct{}, 1)
    39  	go func() {
    40  		err = EnsureRemoveAll(dir1)
    41  		close(done)
    42  	}()
    43  
    44  	select {
    45  	case <-done:
    46  		if err != nil {
    47  			t.Fatal(err)
    48  		}
    49  	case <-time.After(5 * time.Second):
    50  		t.Fatal("timeout waiting for EnsureRemoveAll to finish")
    51  	}
    52  
    53  	if _, err := os.Stat(dir1); !os.IsNotExist(err) {
    54  		t.Fatalf("expected %q to not exist", dir1)
    55  	}
    56  }