| // Copyright 2024 The Go Authors. All rights reserved. |
| // Use of this source code is governed by a BSD-style |
| // license that can be found in the LICENSE file. |
| |
| package windows_test |
| |
| import ( |
| "internal/syscall/windows" |
| "os" |
| "path/filepath" |
| "syscall" |
| "testing" |
| ) |
| |
| func TestOpen(t *testing.T) { |
| t.Parallel() |
| |
| dir := t.TempDir() |
| file := filepath.Join(dir, "a") |
| f, err := os.Create(file) |
| if err != nil { |
| t.Fatal(err) |
| } |
| f.Close() |
| |
| tests := []struct { |
| path string |
| flag int |
| err error |
| }{ |
| {dir, syscall.O_RDONLY, nil}, |
| {dir, syscall.O_CREAT, nil}, |
| {dir, syscall.O_RDONLY | syscall.O_CREAT, nil}, |
| {file, syscall.O_APPEND | syscall.O_WRONLY | os.O_CREATE, nil}, |
| {file, syscall.O_APPEND | syscall.O_WRONLY | os.O_CREATE | os.O_TRUNC, nil}, |
| {dir, syscall.O_RDONLY | syscall.O_TRUNC, syscall.ERROR_ACCESS_DENIED}, |
| {dir, syscall.O_WRONLY | syscall.O_RDWR, nil}, // TODO: syscall.Open returns EISDIR here, we should reconcile this |
| {dir, syscall.O_WRONLY, syscall.EISDIR}, |
| {dir, syscall.O_RDWR, syscall.EISDIR}, |
| } |
| for i, tt := range tests { |
| dir := filepath.Dir(tt.path) |
| dirfd, err := syscall.Open(dir, syscall.O_RDONLY, 0) |
| if err != nil { |
| t.Error(err) |
| continue |
| } |
| base := filepath.Base(tt.path) |
| h, err := windows.Openat(dirfd, base, uint64(tt.flag), 0o660) |
| syscall.CloseHandle(dirfd) |
| if err == nil { |
| syscall.CloseHandle(h) |
| } |
| if err != tt.err { |
| t.Errorf("%d: Open got %q, want %q", i, err, tt.err) |
| } |
| } |
| } |