// Package process is an integration test of system calls mapped to the
// JavaScript object "process". e.g. `go.syscall/js.valueCall(process.chdir...`
package process

import (
	"fmt"
	"log"
	"os"
	"syscall"
)

func Main() {
	fmt.Printf("syscall.Getpid()=%d\n", syscall.Getpid())
	fmt.Printf("syscall.Getppid()=%d\n", syscall.Getppid())
	fmt.Printf("syscall.Getuid()=%d\n", syscall.Getuid())
	fmt.Printf("syscall.Getgid()=%d\n", syscall.Getgid())
	fmt.Printf("syscall.Geteuid()=%d\n", syscall.Geteuid())
	fmt.Printf("syscall.Umask(0077)=%O\n", syscall.Umask(0o077))
	if g, err := syscall.Getgroups(); err != nil {
		log.Panicln(err)
	} else {
		fmt.Printf("syscall.Getgroups()=%v\n", g)
	}

	pid := syscall.Getpid()
	if p, err := os.FindProcess(pid); err != nil {
		log.Panicln(err)
	} else {
		fmt.Printf("os.FindProcess(%d).Pid=%d\n", pid, p.Pid)
	}

	if wd, err := syscall.Getwd(); err != nil {
		log.Panicln(err)
	} else if wd != "/" {
		log.Panicln("not root")
	}
	fmt.Println("wd ok")

	dirs := []struct {
		path, wd string
	}{
		{"dir", "/dir"},
		{".", "/dir"},
		{"..", "/"},
		{".", "/"},
		{"..", "/"},
	}

	for _, dir := range dirs {
		if err := syscall.Chdir(dir.path); err != nil {
			log.Panicln(dir.path, err)
		} else if wd, err := syscall.Getwd(); err != nil {
			log.Panicln(dir.path, err)
		} else if wd != dir.wd {
			log.Panicf("cd %s: expected wd=%s, but have %s", dir.path, dir.wd, wd)
		}
	}

	if err := syscall.Chdir("/animals.txt"); err == nil {
		log.Panicln("shouldn't be able to chdir to file")
	} else {
		fmt.Println(err) // should be the textual message of the errno.
	}
}