github.com/kaisenlinux/docker.io@v0.0.0-20230510090727-ea55db55fac7/engine/pkg/ioutils/fswriters_test.go (about)

     1  package ioutils // import "github.com/docker/docker/pkg/ioutils"
     2  
     3  import (
     4  	"bytes"
     5  	"os"
     6  	"path/filepath"
     7  	"runtime"
     8  	"testing"
     9  )
    10  
    11  var (
    12  	testMode os.FileMode = 0640
    13  )
    14  
    15  func init() {
    16  	// Windows does not support full Linux file mode
    17  	if runtime.GOOS == "windows" {
    18  		testMode = 0666
    19  	}
    20  }
    21  
    22  func TestAtomicWriteToFile(t *testing.T) {
    23  	tmpDir, err := os.MkdirTemp("", "atomic-writers-test")
    24  	if err != nil {
    25  		t.Fatalf("Error when creating temporary directory: %s", err)
    26  	}
    27  	defer os.RemoveAll(tmpDir)
    28  
    29  	expected := []byte("barbaz")
    30  	if err := AtomicWriteFile(filepath.Join(tmpDir, "foo"), expected, testMode); err != nil {
    31  		t.Fatalf("Error writing to file: %v", err)
    32  	}
    33  
    34  	actual, err := os.ReadFile(filepath.Join(tmpDir, "foo"))
    35  	if err != nil {
    36  		t.Fatalf("Error reading from file: %v", err)
    37  	}
    38  
    39  	if !bytes.Equal(actual, expected) {
    40  		t.Fatalf("Data mismatch, expected %q, got %q", expected, actual)
    41  	}
    42  
    43  	st, err := os.Stat(filepath.Join(tmpDir, "foo"))
    44  	if err != nil {
    45  		t.Fatalf("Error statting file: %v", err)
    46  	}
    47  	if expected := testMode; st.Mode() != expected {
    48  		t.Fatalf("Mode mismatched, expected %o, got %o", expected, st.Mode())
    49  	}
    50  }
    51  
    52  func TestAtomicWriteSetCommit(t *testing.T) {
    53  	tmpDir, err := os.MkdirTemp("", "atomic-writerset-test")
    54  	if err != nil {
    55  		t.Fatalf("Error when creating temporary directory: %s", err)
    56  	}
    57  	defer os.RemoveAll(tmpDir)
    58  
    59  	if err := os.Mkdir(filepath.Join(tmpDir, "tmp"), 0700); err != nil {
    60  		t.Fatalf("Error creating tmp directory: %s", err)
    61  	}
    62  
    63  	targetDir := filepath.Join(tmpDir, "target")
    64  	ws, err := NewAtomicWriteSet(filepath.Join(tmpDir, "tmp"))
    65  	if err != nil {
    66  		t.Fatalf("Error creating atomic write set: %s", err)
    67  	}
    68  
    69  	expected := []byte("barbaz")
    70  	if err := ws.WriteFile("foo", expected, testMode); err != nil {
    71  		t.Fatalf("Error writing to file: %v", err)
    72  	}
    73  
    74  	if _, err := os.ReadFile(filepath.Join(targetDir, "foo")); err == nil {
    75  		t.Fatalf("Expected error reading file where should not exist")
    76  	}
    77  
    78  	if err := ws.Commit(targetDir); err != nil {
    79  		t.Fatalf("Error committing file: %s", err)
    80  	}
    81  
    82  	actual, err := os.ReadFile(filepath.Join(targetDir, "foo"))
    83  	if err != nil {
    84  		t.Fatalf("Error reading from file: %v", err)
    85  	}
    86  
    87  	if !bytes.Equal(actual, expected) {
    88  		t.Fatalf("Data mismatch, expected %q, got %q", expected, actual)
    89  	}
    90  
    91  	st, err := os.Stat(filepath.Join(targetDir, "foo"))
    92  	if err != nil {
    93  		t.Fatalf("Error statting file: %v", err)
    94  	}
    95  	if expected := testMode; st.Mode() != expected {
    96  		t.Fatalf("Mode mismatched, expected %o, got %o", expected, st.Mode())
    97  	}
    98  
    99  }
   100  
   101  func TestAtomicWriteSetCancel(t *testing.T) {
   102  	tmpDir, err := os.MkdirTemp("", "atomic-writerset-test")
   103  	if err != nil {
   104  		t.Fatalf("Error when creating temporary directory: %s", err)
   105  	}
   106  	defer os.RemoveAll(tmpDir)
   107  
   108  	if err := os.Mkdir(filepath.Join(tmpDir, "tmp"), 0700); err != nil {
   109  		t.Fatalf("Error creating tmp directory: %s", err)
   110  	}
   111  
   112  	ws, err := NewAtomicWriteSet(filepath.Join(tmpDir, "tmp"))
   113  	if err != nil {
   114  		t.Fatalf("Error creating atomic write set: %s", err)
   115  	}
   116  
   117  	expected := []byte("barbaz")
   118  	if err := ws.WriteFile("foo", expected, testMode); err != nil {
   119  		t.Fatalf("Error writing to file: %v", err)
   120  	}
   121  
   122  	if err := ws.Cancel(); err != nil {
   123  		t.Fatalf("Error committing file: %s", err)
   124  	}
   125  
   126  	if _, err := os.ReadFile(filepath.Join(tmpDir, "target", "foo")); err == nil {
   127  		t.Fatalf("Expected error reading file where should not exist")
   128  	} else if !os.IsNotExist(err) {
   129  		t.Fatalf("Unexpected error reading file: %s", err)
   130  	}
   131  }