mirror of https://github.com/schollz/croc.git
403 lines
9.3 KiB
Go
403 lines
9.3 KiB
Go
package croc
|
|
|
|
import (
|
|
"os"
|
|
"path"
|
|
"path/filepath"
|
|
"runtime"
|
|
"strings"
|
|
"sync"
|
|
"testing"
|
|
"time"
|
|
|
|
"github.com/schollz/croc/v9/src/tcp"
|
|
log "github.com/schollz/logger"
|
|
"github.com/stretchr/testify/assert"
|
|
)
|
|
|
|
func init() {
|
|
log.SetLevel("trace")
|
|
|
|
go tcp.Run("debug", "127.0.0.1", "8281", "pass123", "8281,4")
|
|
go tcp.Run("debug", "127.0.0.1", "8282", "pass123")
|
|
go tcp.Run("debug", "127.0.0.1", "8283", "pass123")
|
|
go tcp.Run("debug", "127.0.0.1", "8284", "pass123")
|
|
go tcp.Run("debug", "127.0.0.1", "8285", "pass123")
|
|
time.Sleep(1 * time.Second)
|
|
}
|
|
|
|
func TestCrocReadme(t *testing.T) {
|
|
defer os.Remove("README.md")
|
|
|
|
log.Debug("setting up sender")
|
|
sender, err := New(Options{
|
|
IsSender: true,
|
|
SharedSecret: "8123-testingthecroc",
|
|
Debug: true,
|
|
RelayAddress: "127.0.0.1:8281",
|
|
BasePort: 8281,
|
|
RelayPassword: "pass123",
|
|
Stdout: false,
|
|
NoPrompt: true,
|
|
DisableLocal: true,
|
|
Curve: "siec",
|
|
Overwrite: true,
|
|
GitIgnore: false,
|
|
})
|
|
if err != nil {
|
|
panic(err)
|
|
}
|
|
|
|
log.Debug("setting up receiver")
|
|
receiver, err := New(Options{
|
|
IsSender: false,
|
|
SharedSecret: "8123-testingthecroc",
|
|
Debug: true,
|
|
RelayAddress: "127.0.0.1:8281",
|
|
RelayPassword: "pass123",
|
|
Stdout: false,
|
|
NoPrompt: true,
|
|
DisableLocal: true,
|
|
Curve: "siec",
|
|
Overwrite: true,
|
|
})
|
|
if err != nil {
|
|
panic(err)
|
|
}
|
|
|
|
var wg sync.WaitGroup
|
|
wg.Add(2)
|
|
go func() {
|
|
filesInfo, emptyFolders, totalNumberFolders, errGet := GetFilesInfo([]string{"../../README.md"}, false, false)
|
|
if errGet != nil {
|
|
t.Errorf("failed to get minimal info: %v", errGet)
|
|
}
|
|
err := sender.Send(filesInfo, emptyFolders, totalNumberFolders)
|
|
if err != nil {
|
|
t.Errorf("send failed: %v", err)
|
|
}
|
|
wg.Done()
|
|
}()
|
|
time.Sleep(100 * time.Millisecond)
|
|
go func() {
|
|
err := receiver.Receive()
|
|
if err != nil {
|
|
t.Errorf("receive failed: %v", err)
|
|
}
|
|
wg.Done()
|
|
}()
|
|
|
|
wg.Wait()
|
|
}
|
|
|
|
func TestCrocEmptyFolder(t *testing.T) {
|
|
pathName := "../../testEmpty"
|
|
defer os.RemoveAll(pathName)
|
|
defer os.RemoveAll("./testEmpty")
|
|
os.MkdirAll(pathName, 0o755)
|
|
|
|
log.Debug("setting up sender")
|
|
sender, err := New(Options{
|
|
IsSender: true,
|
|
SharedSecret: "8123-testingthecroc",
|
|
Debug: true,
|
|
RelayAddress: "127.0.0.1:8281",
|
|
BasePort: 8281,
|
|
RelayPassword: "pass123",
|
|
Stdout: false,
|
|
NoPrompt: true,
|
|
DisableLocal: true,
|
|
Curve: "siec",
|
|
Overwrite: true,
|
|
})
|
|
if err != nil {
|
|
panic(err)
|
|
}
|
|
|
|
log.Debug("setting up receiver")
|
|
receiver, err := New(Options{
|
|
IsSender: false,
|
|
SharedSecret: "8123-testingthecroc",
|
|
Debug: true,
|
|
RelayAddress: "127.0.0.1:8281",
|
|
RelayPassword: "pass123",
|
|
Stdout: false,
|
|
NoPrompt: true,
|
|
DisableLocal: true,
|
|
Curve: "siec",
|
|
Overwrite: true,
|
|
})
|
|
if err != nil {
|
|
panic(err)
|
|
}
|
|
|
|
var wg sync.WaitGroup
|
|
wg.Add(2)
|
|
go func() {
|
|
filesInfo, emptyFolders, totalNumberFolders, errGet := GetFilesInfo([]string{pathName}, false, false)
|
|
if errGet != nil {
|
|
t.Errorf("failed to get minimal info: %v", errGet)
|
|
}
|
|
err := sender.Send(filesInfo, emptyFolders, totalNumberFolders)
|
|
if err != nil {
|
|
t.Errorf("send failed: %v", err)
|
|
}
|
|
wg.Done()
|
|
}()
|
|
time.Sleep(100 * time.Millisecond)
|
|
go func() {
|
|
err := receiver.Receive()
|
|
if err != nil {
|
|
t.Errorf("receive failed: %v", err)
|
|
}
|
|
wg.Done()
|
|
}()
|
|
|
|
wg.Wait()
|
|
}
|
|
|
|
func TestCrocSymlink(t *testing.T) {
|
|
pathName := "../link-in-folder"
|
|
defer os.RemoveAll(pathName)
|
|
defer os.RemoveAll("./link-in-folder")
|
|
os.MkdirAll(pathName, 0o755)
|
|
os.Symlink("../../README.md", filepath.Join(pathName, "README.link"))
|
|
|
|
log.Debug("setting up sender")
|
|
sender, err := New(Options{
|
|
IsSender: true,
|
|
SharedSecret: "8124-testingthecroc",
|
|
Debug: true,
|
|
RelayAddress: "127.0.0.1:8281",
|
|
BasePort: 8281,
|
|
RelayPassword: "pass123",
|
|
Stdout: false,
|
|
NoPrompt: true,
|
|
DisableLocal: true,
|
|
Curve: "siec",
|
|
Overwrite: true,
|
|
GitIgnore: false,
|
|
})
|
|
if err != nil {
|
|
panic(err)
|
|
}
|
|
|
|
log.Debug("setting up receiver")
|
|
receiver, err := New(Options{
|
|
IsSender: false,
|
|
SharedSecret: "8124-testingthecroc",
|
|
Debug: true,
|
|
RelayAddress: "127.0.0.1:8281",
|
|
RelayPassword: "pass123",
|
|
Stdout: false,
|
|
NoPrompt: true,
|
|
DisableLocal: true,
|
|
Curve: "siec",
|
|
Overwrite: true,
|
|
})
|
|
if err != nil {
|
|
panic(err)
|
|
}
|
|
|
|
var wg sync.WaitGroup
|
|
wg.Add(2)
|
|
go func() {
|
|
filesInfo, emptyFolders, totalNumberFolders, errGet := GetFilesInfo([]string{pathName}, false, false)
|
|
if errGet != nil {
|
|
t.Errorf("failed to get minimal info: %v", errGet)
|
|
}
|
|
err = sender.Send(filesInfo, emptyFolders, totalNumberFolders)
|
|
if err != nil {
|
|
t.Errorf("send failed: %v", err)
|
|
}
|
|
wg.Done()
|
|
}()
|
|
time.Sleep(100 * time.Millisecond)
|
|
go func() {
|
|
err = receiver.Receive()
|
|
if err != nil {
|
|
t.Errorf("receive failed: %v", err)
|
|
}
|
|
wg.Done()
|
|
}()
|
|
|
|
wg.Wait()
|
|
|
|
s, err := filepath.EvalSymlinks(path.Join(pathName, "README.link"))
|
|
if s != "../../README.md" && s != "..\\..\\README.md" {
|
|
log.Debug(s)
|
|
t.Errorf("symlink failed to transfer in folder")
|
|
}
|
|
if err != nil {
|
|
t.Errorf("symlink transfer failed: %s", err.Error())
|
|
}
|
|
}
|
|
func testCrocIgnoreGit(t *testing.T) {
|
|
log.SetLevel("trace")
|
|
defer os.Remove(".gitignore")
|
|
time.Sleep(300 * time.Millisecond)
|
|
|
|
time.Sleep(1 * time.Second)
|
|
file, err := os.Create(".gitignore")
|
|
if err != nil {
|
|
log.Errorf("error creating file")
|
|
}
|
|
_, err = file.WriteString("LICENSE")
|
|
if err != nil {
|
|
log.Errorf("error writing to file")
|
|
}
|
|
time.Sleep(1 * time.Second)
|
|
// due to how files are ignored in this function, all we have to do to test is make sure LICENSE doesn't get included in FilesInfo.
|
|
filesInfo, _, _, errGet := GetFilesInfo([]string{"../../LICENSE", ".gitignore", "croc.go"}, false, true)
|
|
if errGet != nil {
|
|
t.Errorf("failed to get minimal info: %v", errGet)
|
|
}
|
|
for _, file := range filesInfo {
|
|
if strings.Contains(file.Name, "LICENSE") {
|
|
t.Errorf("test failed, should ignore LICENSE")
|
|
}
|
|
}
|
|
}
|
|
|
|
func TestCrocLocal(t *testing.T) {
|
|
log.SetLevel("trace")
|
|
defer os.Remove("LICENSE")
|
|
defer os.Remove("touched")
|
|
time.Sleep(300 * time.Millisecond)
|
|
|
|
log.Debug("setting up sender")
|
|
sender, err := New(Options{
|
|
IsSender: true,
|
|
SharedSecret: "8123-testingthecroc",
|
|
Debug: true,
|
|
RelayAddress: "127.0.0.1:8181",
|
|
BasePort: 8181,
|
|
TransferPorts: 1,
|
|
RelayPassword: "pass123",
|
|
Stdout: true,
|
|
NoPrompt: true,
|
|
DisableLocal: false,
|
|
Curve: "siec",
|
|
Overwrite: true,
|
|
GitIgnore: false,
|
|
})
|
|
if err != nil {
|
|
panic(err)
|
|
}
|
|
time.Sleep(1 * time.Second)
|
|
|
|
log.Debug("setting up receiver")
|
|
receiver, err := New(Options{
|
|
IsSender: false,
|
|
SharedSecret: "8123-testingthecroc",
|
|
Debug: true,
|
|
RelayAddress: "127.0.0.1:8181",
|
|
RelayPassword: "pass123",
|
|
Stdout: true,
|
|
NoPrompt: true,
|
|
DisableLocal: false,
|
|
Curve: "siec",
|
|
Overwrite: true,
|
|
})
|
|
if err != nil {
|
|
panic(err)
|
|
}
|
|
|
|
var wg sync.WaitGroup
|
|
os.Create("touched")
|
|
wg.Add(2)
|
|
go func() {
|
|
filesInfo, emptyFolders, totalNumberFolders, errGet := GetFilesInfo([]string{"../../LICENSE", "touched"}, false, false)
|
|
if errGet != nil {
|
|
t.Errorf("failed to get minimal info: %v", errGet)
|
|
}
|
|
err := sender.Send(filesInfo, emptyFolders, totalNumberFolders)
|
|
if err != nil {
|
|
t.Errorf("send failed: %v", err)
|
|
}
|
|
wg.Done()
|
|
}()
|
|
time.Sleep(100 * time.Millisecond)
|
|
go func() {
|
|
err := receiver.Receive()
|
|
if err != nil {
|
|
t.Errorf("send failed: %v", err)
|
|
}
|
|
wg.Done()
|
|
}()
|
|
|
|
wg.Wait()
|
|
}
|
|
|
|
func TestCrocError(t *testing.T) {
|
|
content := []byte("temporary file's content")
|
|
tmpfile, err := os.CreateTemp("", "example")
|
|
if err != nil {
|
|
panic(err)
|
|
}
|
|
|
|
defer os.Remove(tmpfile.Name()) // clean up
|
|
|
|
if _, err = tmpfile.Write(content); err != nil {
|
|
panic(err)
|
|
}
|
|
if err = tmpfile.Close(); err != nil {
|
|
panic(err)
|
|
}
|
|
|
|
Debug(false)
|
|
log.SetLevel("warn")
|
|
sender, _ := New(Options{
|
|
IsSender: true,
|
|
SharedSecret: "8123-testingthecroc2",
|
|
Debug: true,
|
|
RelayAddress: "doesntexistok.com:8381",
|
|
BasePort: 8381,
|
|
TransferPorts: 1,
|
|
RelayPassword: "pass123",
|
|
Stdout: true,
|
|
NoPrompt: true,
|
|
DisableLocal: true,
|
|
Curve: "siec",
|
|
Overwrite: true,
|
|
})
|
|
filesInfo, emptyFolders, totalNumberFolders, errGet := GetFilesInfo([]string{tmpfile.Name()}, false, false)
|
|
if errGet != nil {
|
|
t.Errorf("failed to get minimal info: %v", errGet)
|
|
}
|
|
err = sender.Send(filesInfo, emptyFolders, totalNumberFolders)
|
|
log.Debug(err)
|
|
assert.NotNil(t, err)
|
|
}
|
|
|
|
func TestCleanUp(t *testing.T) {
|
|
// windows allows files to be deleted only if they
|
|
// are not open by another program so the remove actions
|
|
// from the above tests will not always do a good clean up
|
|
// This "test" will make sure
|
|
operatingSystem := runtime.GOOS
|
|
log.Debugf("The operating system is %s", operatingSystem)
|
|
if operatingSystem == "windows" {
|
|
time.Sleep(1 * time.Second)
|
|
log.Debug("Full cleanup")
|
|
var err error
|
|
|
|
for _, file := range []string{"README.md", "./README.md"} {
|
|
err = os.Remove(file)
|
|
if err == nil {
|
|
log.Debugf("Successfully purged %s", file)
|
|
} else {
|
|
log.Debugf("%s was already purged.", file)
|
|
}
|
|
}
|
|
for _, folder := range []string{"./testEmpty", "./link-in-folder"} {
|
|
err = os.RemoveAll(folder)
|
|
if err == nil {
|
|
log.Debugf("Successfully purged %s", folder)
|
|
} else {
|
|
log.Debugf("%s was already purged.", folder)
|
|
}
|
|
}
|
|
}
|
|
}
|