| // Copyright 2023 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. | |
| //go:build wasip1 | |
| package syscall_test | |
| import ( | |
| "syscall" | |
| "testing" | |
| "unsafe" | |
| ) | |
| var joinPathTests = [...]struct { | |
| dir, file, path string | |
| }{ | |
| 0: {".", ".", "."}, | |
| 1: {"./", "./", "./"}, | |
| 2: {"././././", ".", "."}, | |
| 3: {".", "./././", "./"}, | |
| 4: {".", "a", "a"}, | |
| 5: {".", "a/b", "a/b"}, | |
| 6: {".", "..", ".."}, | |
| 7: {".", "../", "../"}, | |
| 8: {".", "../../", "../../"}, | |
| 9: {".", "../..", "../.."}, | |
| 10: {".", "../..//..///", "../../../"}, | |
| 11: {"/", "/", "/"}, | |
| 12: {"/", "a", "/a"}, | |
| 13: {"/", "a/b", "/a/b"}, | |
| 14: {"/a", "b", "/a/b"}, | |
| 15: {"/", ".", "/"}, | |
| 16: {"/", "..", "/"}, | |
| 17: {"/", "../../", "/"}, | |
| 18: {"/", "/../a/b/c", "/a/b/c"}, | |
| 19: {"/", "/../a/b/c", "/a/b/c"}, | |
| 20: {"/", "./hello/world", "/hello/world"}, | |
| 21: {"/a", "../", "/"}, | |
| 22: {"/a/b/c", "..", "/a/b"}, | |
| 23: {"/a/b/c", "..///..///", "/a/"}, | |
| 24: {"/a/b/c", "..///..///..", "/"}, | |
| 25: {"/a/b/c", "..///..///..///..", "/"}, | |
| 26: {"/a/b/c", "..///..///..///..///..", "/"}, | |
| 27: {"/a/b/c/", "/d/e/f/", "/a/b/c/d/e/f/"}, | |
| 28: {"a/b/c/", ".", "a/b/c"}, | |
| 29: {"a/b/c/", "./d", "a/b/c/d"}, | |
| 30: {"a/b/c/", "./d/", "a/b/c/d/"}, | |
| 31: {"a/b/", "./c/d/", "a/b/c/d/"}, | |
| 32: {"../", "..", "../.."}, | |
| 33: {"a/b/c/d", "e/../..", "a/b/c"}, | |
| 34: {"a/b/c/d", "./e/../..", "a/b/c"}, | |
| 35: {"a/b/c/d", "./e/..//../../f/g//", "a/b/f/g/"}, | |
| 36: {"../../../", "a/../../b/c", "../../b/c"}, | |
| 37: {"/a/b/c", "/.././/hey!", "/a/b/hey!"}, | |
| } | |
| func TestJoinPath(t *testing.T) { | |
| for _, test := range joinPathTests { | |
| t.Run("", func(t *testing.T) { | |
| path := syscall.JoinPath(test.dir, test.file) | |
| if path != test.path { | |
| t.Errorf("join(%q,%q): want=%q got=%q", test.dir, test.file, test.path, path) | |
| } | |
| }) | |
| } | |
| } | |
| func BenchmarkJoinPath(b *testing.B) { | |
| for _, test := range joinPathTests { | |
| b.Run("", func(b *testing.B) { | |
| for i := 0; i < b.N; i++ { | |
| syscall.JoinPath(test.dir, test.file) | |
| } | |
| }) | |
| } | |
| } | |
| func TestRandomGetOverflow(t *testing.T) { | |
| // Use unsafe.Slice to avoid actually allocating ~4GB. | |
| var dummy byte | |
| b := unsafe.Slice(&dummy, int(1<<32)) | |
| if err := syscall.RandomGet(b); err != syscall.EINVAL { | |
| t.Errorf("syscall.RandomGet succeeds given a slice that is larger than what random_get supports, want %v", syscall.EINVAL) | |
| } | |
| } |