diff options
| -rw-r--r-- | tests/defaults/diriv_test.go | 73 | 
1 files changed, 73 insertions, 0 deletions
| diff --git a/tests/defaults/diriv_test.go b/tests/defaults/diriv_test.go new file mode 100644 index 0000000..75f1511 --- /dev/null +++ b/tests/defaults/diriv_test.go @@ -0,0 +1,73 @@ +package defaults + +import ( +	"io/ioutil" +	"os" +	"sync" +	"syscall" +	"testing" +	"time" + +	"github.com/rfjakob/gocryptfs/tests/test_helpers" +) + +func TestDirIVRace(t *testing.T) { +	// Create "dir1" with one file in it +	dir1 := test_helpers.DefaultPlainDir + "/TestDirIVRace_Dir1" +	err := os.Mkdir(dir1, 0700) +	if err != nil { +		t.Fatal(err) +	} +	err = ioutil.WriteFile(dir1+"/file", nil, 0600) +	if err != nil { +		t.Fatal(err) +	} + +	// Create directory "dir2" +	dir2 := test_helpers.DefaultPlainDir + "/TestDirIVRace_Dir2" +	err = os.Mkdir(dir2, 0700) +	if err != nil { +		t.Fatal(err) +	} +	file2 := dir2 + "/file" +	err = ioutil.WriteFile(file2, nil, 0600) +	if err != nil { +		t.Fatal(err) +	} + +	stop := false +	defer func() { stop = true }() + +	var wg sync.WaitGroup +	wg.Add(1) +	go func() { +		wg.Done() +		for { +			// Keep dir2 in the diriv cache +			fd, err2 := os.Open(file2) +			if err2 != nil { +				fd.Close() +			} +			if stop { +				return +			} +		} +	}() +	wg.Wait() +	time.Sleep(time.Millisecond) + +	// Overwrite dir2 with dir1 +	err = syscall.Unlink(file2) +	if err != nil { +		t.Fatal(err) +	} +	err = syscall.Rename(dir1, dir2) +	if err != nil { +		t.Fatal(err) +	} +	// We should be able to stat file2 +	_, err = os.Stat(file2) +	if err != nil { +		t.Error(err) +	} +} | 
