test(context): cover SaveUploadedFile chmod branches

Add a regression test for #4622 that asserts SaveUploadedFile leaves
permissions on a pre-existing target directory untouched.

Make TestSaveUploadedFileWithPermission hermetic by saving into a
not-yet-existing subdirectory under t.TempDir(), so the assertion on
the requested mode is meaningful regardless of the test runner's
working-directory permissions (the previous form relied on the
soon-to-be-removed chmod-on-existing-dir behaviour to pass).
This commit is contained in:
Nghĩa Nguyễn Ngọc 2026-05-09 10:12:56 +07:00
parent c92f4bf410
commit ec746b4060

View File

@ -246,14 +246,19 @@ func TestSaveUploadedFileWithPermission(t *testing.T) {
f, err := c.FormFile("file")
require.NoError(t, err)
assert.Equal(t, "permission_test", f.Filename)
// Save into a not-yet-existing subdirectory so the requested mode is
// applied by MkdirAll/Chmod and the assertion is independent of the
// test runner's working-directory permissions.
parent := t.TempDir()
newDir := filepath.Join(parent, "perm_subdir")
dst := filepath.Join(newDir, "permission_test")
var mode fs.FileMode = 0o755
require.NoError(t, c.SaveUploadedFile(f, "permission_test", mode))
t.Cleanup(func() {
assert.NoError(t, os.Remove("permission_test"))
})
info, err := os.Stat(filepath.Dir("permission_test"))
require.NoError(t, c.SaveUploadedFile(f, dst, mode))
info, err := os.Stat(newDir)
require.NoError(t, err)
assert.Equal(t, info.Mode().Perm(), mode)
assert.Equal(t, mode, info.Mode().Perm())
}
func TestSaveUploadedFileWithPermissionFailed(t *testing.T) {
@ -274,6 +279,39 @@ func TestSaveUploadedFileWithPermissionFailed(t *testing.T) {
require.Error(t, c.SaveUploadedFile(f, "test/permission_test", mode))
}
// TestSaveUploadedFileExistingDir verifies that SaveUploadedFile does not
// alter permissions on a pre-existing target directory (regression test for
// #4622, where chmod on a system dir like /tmp would fail).
func TestSaveUploadedFileExistingDir(t *testing.T) {
buf := new(bytes.Buffer)
mw := multipart.NewWriter(buf)
w, err := mw.CreateFormFile("file", "existing_dir_test")
require.NoError(t, err)
_, err = w.Write([]byte("existing_dir_test"))
require.NoError(t, err)
mw.Close()
c, _ := CreateTestContext(httptest.NewRecorder())
c.Request, _ = http.NewRequest(http.MethodPost, "/", buf)
c.Request.Header.Set("Content-Type", mw.FormDataContentType())
f, err := c.FormFile("file")
require.NoError(t, err)
// Create a target directory with a non-default permission and
// confirm SaveUploadedFile leaves the existing perm untouched.
dir := t.TempDir()
var existingPerm fs.FileMode = 0o700
require.NoError(t, os.Chmod(dir, existingPerm))
dst := filepath.Join(dir, "existing_dir_test")
var mode fs.FileMode = 0o755
require.NoError(t, c.SaveUploadedFile(f, dst, mode))
info, err := os.Stat(dir)
require.NoError(t, err)
assert.Equal(t, existingPerm, info.Mode().Perm(),
"existing directory permissions must not be modified")
}
func TestContextReset(t *testing.T) {
router := New()
c := router.allocateContext(0)