github.com/ph/moby@v1.13.1/pkg/ioutils/fswriters_test.go (about)

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