1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95
|
// Copyright (c) 2019, Sylabs Inc. All rights reserved.
// This software is licensed under a 3-clause BSD license. Please consult the
// LICENSE.md file distributed with the sources of this project regarding your
// rights to use or distribute this software.
package unix
import (
"math/rand"
"os"
"path/filepath"
"testing"
"time"
"github.com/sylabs/singularity/v4/internal/pkg/test"
)
func init() {
// TODO - go 1.20 initializes seed randomly by default, so can drop this
// deprecated call in future.
rand.Seed(time.Now().UnixNano()) //nolint:staticcheck
}
var letters = []rune("abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ")
func randSeq(n int) string {
b := make([]rune, n)
for i := range b {
//#nosec G404
b[i] = letters[rand.Intn(len(letters))]
}
return string(b)
}
func TestCreateSocket(t *testing.T) {
test.DropPrivilege(t)
defer test.ResetPrivilege(t)
paths := []string{
filepath.Join(os.TempDir(), randSeq(10), "socket"), // short path
filepath.Join(os.TempDir(), randSeq(100), "socket"), // long path
}
for _, path := range paths {
syncCh := make(chan bool, 1)
dir := filepath.Dir(path)
os.Mkdir(dir, 0o700)
defer os.RemoveAll(dir)
// create socket and returns listener
ln, err := CreateSocket(path)
if err != nil {
t.Fatal(err)
}
// accept connection and test if received data are correct
go func() {
buf := make([]byte, 4)
conn, err := ln.Accept()
if err != nil {
t.Error(err)
}
n, err := conn.Read(buf)
if err != nil {
t.Error(err)
}
if n != 4 {
t.Error()
}
if string(buf) != "send" {
t.Errorf("unexpected data returned: %s", string(buf))
}
syncCh <- true
}()
// open / write / close to socket path
if err := WriteSocket(path, []byte("send")); err != nil {
t.Error(err)
}
<-syncCh
// close socket implies to delete file automatically
os.Chdir(dir)
ln.Close()
// socket file is deleted by net package at close
if err := os.Remove(path); err == nil {
t.Errorf("unexpected success during socket removal")
}
}
}
|