All checks were successful
		
		
	
	Test / Create distribution (push) Successful in 27s
				
			Test / Sandbox (race detector) (push) Successful in 41s
				
			Test / Sandbox (push) Successful in 41s
				
			Test / Hakurei (push) Successful in 44s
				
			Test / Hakurei (race detector) (push) Successful in 44s
				
			Test / Hpkg (push) Successful in 42s
				
			Test / Flake checks (push) Successful in 1m30s
				
			Hopefully eliminates spurious failures. Signed-off-by: Ophestra <cat@gensokyo.uk>
		
			
				
	
	
		
			103 lines
		
	
	
		
			2.3 KiB
		
	
	
	
		
			Go
		
	
	
	
	
	
			
		
		
	
	
			103 lines
		
	
	
		
			2.3 KiB
		
	
	
	
		
			Go
		
	
	
	
	
	
| package helper
 | |
| 
 | |
| import (
 | |
| 	"flag"
 | |
| 	"fmt"
 | |
| 	"io"
 | |
| 	"os"
 | |
| 	"strconv"
 | |
| 	"syscall"
 | |
| )
 | |
| 
 | |
| // InternalHelperStub is an internal function but exported because it is cross-package;
 | |
| // it is part of the implementation of the helper stub.
 | |
| func InternalHelperStub() {
 | |
| 	// this test mocks the helper process
 | |
| 	var ap, sp string
 | |
| 	if v, ok := os.LookupEnv(HakureiHelper); !ok {
 | |
| 		return
 | |
| 	} else {
 | |
| 		ap = v
 | |
| 	}
 | |
| 	if v, ok := os.LookupEnv(HakureiStatus); !ok {
 | |
| 		panic(HakureiStatus)
 | |
| 	} else {
 | |
| 		sp = v
 | |
| 	}
 | |
| 
 | |
| 	genericStub(flagRestoreFiles(1, ap, sp))
 | |
| 
 | |
| 	os.Exit(0)
 | |
| }
 | |
| 
 | |
| func newFile(fd int, name, p string) *os.File {
 | |
| 	present := false
 | |
| 	switch p {
 | |
| 	case "0":
 | |
| 	case "1":
 | |
| 		present = true
 | |
| 	default:
 | |
| 		panic(fmt.Sprintf("%s fd has unexpected presence value %q", name, p))
 | |
| 	}
 | |
| 
 | |
| 	f := os.NewFile(uintptr(fd), name)
 | |
| 	if !present && f != nil {
 | |
| 		panic(fmt.Sprintf("%s fd set but not present", name))
 | |
| 	}
 | |
| 	if present && f == nil {
 | |
| 		panic(fmt.Sprintf("%s fd preset but unset", name))
 | |
| 	}
 | |
| 
 | |
| 	return f
 | |
| }
 | |
| 
 | |
| func flagRestoreFiles(offset int, ap, sp string) (argsFile, statFile *os.File) {
 | |
| 	argsFd := flag.Int("args", -1, "")
 | |
| 	statFd := flag.Int("fd", -1, "")
 | |
| 	_ = flag.CommandLine.Parse(os.Args[offset:])
 | |
| 	argsFile = newFile(*argsFd, "args", ap)
 | |
| 	statFile = newFile(*statFd, "stat", sp)
 | |
| 	return
 | |
| }
 | |
| 
 | |
| func genericStub(argsFile, statFile *os.File) {
 | |
| 	if argsFile != nil {
 | |
| 		// this output is checked by parent
 | |
| 		if _, err := io.Copy(os.Stdout, argsFile); err != nil {
 | |
| 			panic("cannot read args: " + err.Error())
 | |
| 		}
 | |
| 	}
 | |
| 
 | |
| 	if statFile != nil {
 | |
| 		// simulate status pipe behaviour
 | |
| 		var epoll int
 | |
| 		if fd, err := syscall.EpollCreate1(0); err != nil {
 | |
| 			panic("cannot open epoll fd: " + err.Error())
 | |
| 		} else {
 | |
| 			defer func() {
 | |
| 				if err = syscall.Close(fd); err != nil {
 | |
| 					panic("cannot close epoll fd: " + err.Error())
 | |
| 				}
 | |
| 			}()
 | |
| 			epoll = fd
 | |
| 		}
 | |
| 		if err := syscall.EpollCtl(epoll, syscall.EPOLL_CTL_ADD, int(statFile.Fd()), &syscall.EpollEvent{}); err != nil {
 | |
| 			panic("cannot add status pipe to epoll: " + err.Error())
 | |
| 		}
 | |
| 
 | |
| 		if _, err := statFile.Write([]byte{'x'}); err != nil {
 | |
| 			panic("cannot write to status pipe: " + err.Error())
 | |
| 		}
 | |
| 
 | |
| 		// wait for status pipe close
 | |
| 		events := make([]syscall.EpollEvent, 1)
 | |
| 		if _, err := syscall.EpollWait(epoll, events, -1); err != nil {
 | |
| 			panic("cannot poll status pipe: " + err.Error())
 | |
| 		}
 | |
| 		if events[0].Events != syscall.EPOLLERR {
 | |
| 			panic(strconv.Itoa(int(events[0].Events)))
 | |
| 
 | |
| 		}
 | |
| 	}
 | |
| }
 |