github.com/moby/docker@v26.1.3+incompatible/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 testMode os.FileMode = 0o640
    12  
    13  func init() {
    14  	// Windows does not support full Linux file mode
    15  	if runtime.GOOS == "windows" {
    16  		testMode = 0o666
    17  	}
    18  }
    19  
    20  func TestAtomicWriteToFile(t *testing.T) {
    21  	tmpDir := t.TempDir()
    22  
    23  	expected := []byte("barbaz")
    24  	if err := AtomicWriteFile(filepath.Join(tmpDir, "foo"), expected, testMode); err != nil {
    25  		t.Fatalf("Error writing to file: %v", err)
    26  	}
    27  
    28  	actual, err := os.ReadFile(filepath.Join(tmpDir, "foo"))
    29  	if err != nil {
    30  		t.Fatalf("Error reading from file: %v", err)
    31  	}
    32  
    33  	if !bytes.Equal(actual, expected) {
    34  		t.Fatalf("Data mismatch, expected %q, got %q", expected, actual)
    35  	}
    36  
    37  	st, err := os.Stat(filepath.Join(tmpDir, "foo"))
    38  	if err != nil {
    39  		t.Fatalf("Error statting file: %v", err)
    40  	}
    41  	if expected := testMode; st.Mode() != expected {
    42  		t.Fatalf("Mode mismatched, expected %o, got %o", expected, st.Mode())
    43  	}
    44  }
    45  
    46  func TestAtomicWriteSetCommit(t *testing.T) {
    47  	tmpDir := t.TempDir()
    48  
    49  	if err := os.Mkdir(filepath.Join(tmpDir, "tmp"), 0o700); err != nil {
    50  		t.Fatalf("Error creating tmp directory: %s", err)
    51  	}
    52  
    53  	targetDir := filepath.Join(tmpDir, "target")
    54  	ws, err := NewAtomicWriteSet(filepath.Join(tmpDir, "tmp"))
    55  	if err != nil {
    56  		t.Fatalf("Error creating atomic write set: %s", err)
    57  	}
    58  
    59  	expected := []byte("barbaz")
    60  	if err := ws.WriteFile("foo", expected, testMode); err != nil {
    61  		t.Fatalf("Error writing to file: %v", err)
    62  	}
    63  
    64  	if _, err := os.ReadFile(filepath.Join(targetDir, "foo")); err == nil {
    65  		t.Fatalf("Expected error reading file where should not exist")
    66  	}
    67  
    68  	if err := ws.Commit(targetDir); err != nil {
    69  		t.Fatalf("Error committing file: %s", err)
    70  	}
    71  
    72  	actual, err := os.ReadFile(filepath.Join(targetDir, "foo"))
    73  	if err != nil {
    74  		t.Fatalf("Error reading from file: %v", err)
    75  	}
    76  
    77  	if !bytes.Equal(actual, expected) {
    78  		t.Fatalf("Data mismatch, expected %q, got %q", expected, actual)
    79  	}
    80  
    81  	st, err := os.Stat(filepath.Join(targetDir, "foo"))
    82  	if err != nil {
    83  		t.Fatalf("Error statting file: %v", err)
    84  	}
    85  	if expected := testMode; st.Mode() != expected {
    86  		t.Fatalf("Mode mismatched, expected %o, got %o", expected, st.Mode())
    87  	}
    88  }
    89  
    90  func TestAtomicWriteSetCancel(t *testing.T) {
    91  	tmpDir := t.TempDir()
    92  
    93  	if err := os.Mkdir(filepath.Join(tmpDir, "tmp"), 0o700); err != nil {
    94  		t.Fatalf("Error creating tmp directory: %s", err)
    95  	}
    96  
    97  	ws, err := NewAtomicWriteSet(filepath.Join(tmpDir, "tmp"))
    98  	if err != nil {
    99  		t.Fatalf("Error creating atomic write set: %s", err)
   100  	}
   101  
   102  	expected := []byte("barbaz")
   103  	if err := ws.WriteFile("foo", expected, testMode); err != nil {
   104  		t.Fatalf("Error writing to file: %v", err)
   105  	}
   106  
   107  	if err := ws.Cancel(); err != nil {
   108  		t.Fatalf("Error committing file: %s", err)
   109  	}
   110  
   111  	if _, err := os.ReadFile(filepath.Join(tmpDir, "target", "foo")); err == nil {
   112  		t.Fatalf("Expected error reading file where should not exist")
   113  	} else if !os.IsNotExist(err) {
   114  		t.Fatalf("Unexpected error reading file: %s", err)
   115  	}
   116  }