mirror of
https://github.com/schollz/croc.git
synced 2025-10-10 21:01:02 +02:00
add tests
This commit is contained in:
parent
ec5abfb41b
commit
dcf879b836
2 changed files with 350 additions and 0 deletions
171
src/mnemonicode/mnemonicode_test.go
Normal file
171
src/mnemonicode/mnemonicode_test.go
Normal file
|
@ -0,0 +1,171 @@
|
||||||
|
package mnemonicode
|
||||||
|
|
||||||
|
import (
|
||||||
|
"testing"
|
||||||
|
)
|
||||||
|
|
||||||
|
func TestWordsRequired(t *testing.T) {
|
||||||
|
tests := []struct {
|
||||||
|
name string
|
||||||
|
length int
|
||||||
|
want int
|
||||||
|
}{
|
||||||
|
{"empty", 0, 0},
|
||||||
|
{"1 byte", 1, 1},
|
||||||
|
{"2 bytes", 2, 2},
|
||||||
|
{"3 bytes", 3, 3},
|
||||||
|
{"4 bytes", 4, 3},
|
||||||
|
{"5 bytes", 5, 4},
|
||||||
|
{"8 bytes", 8, 6},
|
||||||
|
{"12 bytes", 12, 9},
|
||||||
|
}
|
||||||
|
|
||||||
|
for _, tt := range tests {
|
||||||
|
t.Run(tt.name, func(t *testing.T) {
|
||||||
|
if got := WordsRequired(tt.length); got != tt.want {
|
||||||
|
t.Errorf("WordsRequired(%d) = %d, want %d", tt.length, got, tt.want)
|
||||||
|
}
|
||||||
|
})
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
func TestEncodeWordList(t *testing.T) {
|
||||||
|
tests := []struct {
|
||||||
|
name string
|
||||||
|
dst []string
|
||||||
|
src []byte
|
||||||
|
want int
|
||||||
|
}{
|
||||||
|
{
|
||||||
|
name: "empty input",
|
||||||
|
dst: []string{},
|
||||||
|
src: []byte{},
|
||||||
|
want: 0,
|
||||||
|
},
|
||||||
|
{
|
||||||
|
name: "single byte",
|
||||||
|
dst: []string{},
|
||||||
|
src: []byte{0x01},
|
||||||
|
want: 1,
|
||||||
|
},
|
||||||
|
{
|
||||||
|
name: "two bytes",
|
||||||
|
dst: []string{},
|
||||||
|
src: []byte{0x01, 0x02},
|
||||||
|
want: 2,
|
||||||
|
},
|
||||||
|
{
|
||||||
|
name: "three bytes",
|
||||||
|
dst: []string{},
|
||||||
|
src: []byte{0x01, 0x02, 0x03},
|
||||||
|
want: 3,
|
||||||
|
},
|
||||||
|
{
|
||||||
|
name: "four bytes",
|
||||||
|
dst: []string{},
|
||||||
|
src: []byte{0x01, 0x02, 0x03, 0x04},
|
||||||
|
want: 3,
|
||||||
|
},
|
||||||
|
{
|
||||||
|
name: "eight bytes",
|
||||||
|
dst: []string{},
|
||||||
|
src: []byte{0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08},
|
||||||
|
want: 6,
|
||||||
|
},
|
||||||
|
{
|
||||||
|
name: "with existing dst",
|
||||||
|
dst: []string{"existing"},
|
||||||
|
src: []byte{0x01},
|
||||||
|
want: 2,
|
||||||
|
},
|
||||||
|
}
|
||||||
|
|
||||||
|
for _, tt := range tests {
|
||||||
|
t.Run(tt.name, func(t *testing.T) {
|
||||||
|
result := EncodeWordList(tt.dst, tt.src)
|
||||||
|
if len(result) != tt.want {
|
||||||
|
t.Errorf("EncodeWordList() returned %d words, want %d", len(result), tt.want)
|
||||||
|
}
|
||||||
|
|
||||||
|
// Check that all words are valid
|
||||||
|
for i, word := range result {
|
||||||
|
if word == "" {
|
||||||
|
t.Errorf("EncodeWordList() returned empty word at index %d", i)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
})
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
func TestEncodeWordListConsistency(t *testing.T) {
|
||||||
|
input := []byte{0x12, 0x34, 0x56, 0x78}
|
||||||
|
|
||||||
|
// Encode twice with empty dst
|
||||||
|
result1 := EncodeWordList([]string{}, input)
|
||||||
|
result2 := EncodeWordList([]string{}, input)
|
||||||
|
|
||||||
|
if len(result1) != len(result2) {
|
||||||
|
t.Errorf("Inconsistent result lengths: %d vs %d", len(result1), len(result2))
|
||||||
|
}
|
||||||
|
|
||||||
|
for i := range result1 {
|
||||||
|
if result1[i] != result2[i] {
|
||||||
|
t.Errorf("Inconsistent result at index %d: %s vs %s", i, result1[i], result2[i])
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
func TestEncodeWordListCapacityHandling(t *testing.T) {
|
||||||
|
// Test with dst that has sufficient capacity
|
||||||
|
dst := make([]string, 1, 10)
|
||||||
|
dst[0] = "existing"
|
||||||
|
input := []byte{0x01, 0x02}
|
||||||
|
|
||||||
|
result := EncodeWordList(dst, input)
|
||||||
|
|
||||||
|
if len(result) != 3 { // 1 existing + 2 new
|
||||||
|
t.Errorf("Expected 3 words, got %d", len(result))
|
||||||
|
}
|
||||||
|
|
||||||
|
if result[0] != "existing" {
|
||||||
|
t.Errorf("Expected first word to be 'existing', got %s", result[0])
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
func TestEncodeWordListBoundaryValues(t *testing.T) {
|
||||||
|
tests := []struct {
|
||||||
|
name string
|
||||||
|
src []byte
|
||||||
|
}{
|
||||||
|
{"max single byte", []byte{0xFF}},
|
||||||
|
{"max two bytes", []byte{0xFF, 0xFF}},
|
||||||
|
{"max three bytes", []byte{0xFF, 0xFF, 0xFF}},
|
||||||
|
{"max four bytes", []byte{0xFF, 0xFF, 0xFF, 0xFF}},
|
||||||
|
{"all zeros", []byte{0x00, 0x00, 0x00, 0x00}},
|
||||||
|
}
|
||||||
|
|
||||||
|
for _, tt := range tests {
|
||||||
|
t.Run(tt.name, func(t *testing.T) {
|
||||||
|
result := EncodeWordList([]string{}, tt.src)
|
||||||
|
expectedLen := WordsRequired(len(tt.src))
|
||||||
|
|
||||||
|
if len(result) != expectedLen {
|
||||||
|
t.Errorf("Expected %d words, got %d", expectedLen, len(result))
|
||||||
|
}
|
||||||
|
|
||||||
|
// Ensure all words are from the WordList
|
||||||
|
for _, word := range result {
|
||||||
|
found := false
|
||||||
|
for _, validWord := range WordList {
|
||||||
|
if word == validWord {
|
||||||
|
found = true
|
||||||
|
break
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if !found {
|
||||||
|
t.Errorf("Invalid word generated: %s", word)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
})
|
||||||
|
}
|
||||||
|
}
|
179
src/models/models_test.go
Normal file
179
src/models/models_test.go
Normal file
|
@ -0,0 +1,179 @@
|
||||||
|
package models
|
||||||
|
|
||||||
|
import (
|
||||||
|
"net"
|
||||||
|
"strings"
|
||||||
|
"testing"
|
||||||
|
"time"
|
||||||
|
)
|
||||||
|
|
||||||
|
func TestConstants(t *testing.T) {
|
||||||
|
if TCP_BUFFER_SIZE != 1024*64 {
|
||||||
|
t.Errorf("TCP_BUFFER_SIZE = %d, want %d", TCP_BUFFER_SIZE, 1024*64)
|
||||||
|
}
|
||||||
|
|
||||||
|
if DEFAULT_PORT != "9009" {
|
||||||
|
t.Errorf("DEFAULT_PORT = %s, want %s", DEFAULT_PORT, "9009")
|
||||||
|
}
|
||||||
|
|
||||||
|
if DEFAULT_PASSPHRASE != "pass123" {
|
||||||
|
t.Errorf("DEFAULT_PASSPHRASE = %s, want %s", DEFAULT_PASSPHRASE, "pass123")
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
func TestPublicDNSServers(t *testing.T) {
|
||||||
|
if len(publicDNS) == 0 {
|
||||||
|
t.Error("publicDNS list should not be empty")
|
||||||
|
}
|
||||||
|
|
||||||
|
// Check that we have both IPv4 and IPv6 servers
|
||||||
|
hasIPv4 := false
|
||||||
|
hasIPv6 := false
|
||||||
|
|
||||||
|
for _, dns := range publicDNS {
|
||||||
|
if strings.Contains(dns, "[") {
|
||||||
|
hasIPv6 = true
|
||||||
|
} else {
|
||||||
|
hasIPv4 = true
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if !hasIPv4 {
|
||||||
|
t.Error("publicDNS should contain IPv4 servers")
|
||||||
|
}
|
||||||
|
|
||||||
|
if !hasIPv6 {
|
||||||
|
t.Error("publicDNS should contain IPv6 servers")
|
||||||
|
}
|
||||||
|
|
||||||
|
// Verify known DNS servers are present
|
||||||
|
expectedServers := []string{
|
||||||
|
"1.1.1.1", // Cloudflare
|
||||||
|
"8.8.8.8", // Google
|
||||||
|
"9.9.9.9", // Quad9
|
||||||
|
"208.67.220.220", // OpenDNS
|
||||||
|
}
|
||||||
|
|
||||||
|
for _, expected := range expectedServers {
|
||||||
|
found := false
|
||||||
|
for _, dns := range publicDNS {
|
||||||
|
if dns == expected {
|
||||||
|
found = true
|
||||||
|
break
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if !found {
|
||||||
|
t.Errorf("Expected DNS server %s not found in publicDNS", expected)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
func TestLocalLookupIP(t *testing.T) {
|
||||||
|
tests := []struct {
|
||||||
|
name string
|
||||||
|
address string
|
||||||
|
wantErr bool
|
||||||
|
}{
|
||||||
|
{
|
||||||
|
name: "localhost",
|
||||||
|
address: "localhost",
|
||||||
|
wantErr: false,
|
||||||
|
},
|
||||||
|
{
|
||||||
|
name: "invalid hostname",
|
||||||
|
address: "this-hostname-should-not-exist-12345",
|
||||||
|
wantErr: true,
|
||||||
|
},
|
||||||
|
}
|
||||||
|
|
||||||
|
for _, tt := range tests {
|
||||||
|
t.Run(tt.name, func(t *testing.T) {
|
||||||
|
ip, err := localLookupIP(tt.address)
|
||||||
|
|
||||||
|
if (err != nil) != tt.wantErr {
|
||||||
|
t.Errorf("localLookupIP() error = %v, wantErr %v", err, tt.wantErr)
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
if !tt.wantErr && ip == "" {
|
||||||
|
t.Error("localLookupIP() returned empty IP for valid hostname")
|
||||||
|
}
|
||||||
|
|
||||||
|
if !tt.wantErr {
|
||||||
|
// Verify it's a valid IP address
|
||||||
|
if net.ParseIP(ip) == nil {
|
||||||
|
t.Errorf("localLookupIP() returned invalid IP: %s", ip)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
})
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
func TestRemoteLookupIPTimeout(t *testing.T) {
|
||||||
|
// Test with an invalid DNS server that should timeout
|
||||||
|
start := time.Now()
|
||||||
|
_, err := remoteLookupIP("example.com", "192.0.2.1")
|
||||||
|
duration := time.Since(start)
|
||||||
|
|
||||||
|
// Should timeout within reasonable time (we set 500ms timeout)
|
||||||
|
if duration > time.Second {
|
||||||
|
t.Errorf("remoteLookupIP took too long: %v", duration)
|
||||||
|
}
|
||||||
|
|
||||||
|
if err == nil {
|
||||||
|
t.Error("remoteLookupIP should have failed with invalid DNS server")
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
func TestLookupFunction(t *testing.T) {
|
||||||
|
// Test the main lookup function
|
||||||
|
tests := []struct {
|
||||||
|
name string
|
||||||
|
address string
|
||||||
|
wantErr bool
|
||||||
|
}{
|
||||||
|
{
|
||||||
|
name: "localhost",
|
||||||
|
address: "localhost",
|
||||||
|
wantErr: false,
|
||||||
|
},
|
||||||
|
{
|
||||||
|
name: "invalid hostname",
|
||||||
|
address: "this-hostname-should-definitely-not-exist-98765",
|
||||||
|
wantErr: true,
|
||||||
|
},
|
||||||
|
}
|
||||||
|
|
||||||
|
for _, tt := range tests {
|
||||||
|
t.Run(tt.name, func(t *testing.T) {
|
||||||
|
ip, err := lookup(tt.address)
|
||||||
|
|
||||||
|
if (err != nil) != tt.wantErr {
|
||||||
|
t.Errorf("lookup() error = %v, wantErr %v", err, tt.wantErr)
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
if !tt.wantErr && ip == "" {
|
||||||
|
t.Error("lookup() returned empty IP for valid hostname")
|
||||||
|
}
|
||||||
|
|
||||||
|
if !tt.wantErr {
|
||||||
|
// Verify it's a valid IP address
|
||||||
|
if net.ParseIP(ip) == nil {
|
||||||
|
t.Errorf("lookup() returned invalid IP: %s", ip)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
})
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
func TestGetConfigFile(t *testing.T) {
|
||||||
|
fname, err := getConfigFile(false)
|
||||||
|
if err != nil {
|
||||||
|
t.Skip("Could not get config directory")
|
||||||
|
}
|
||||||
|
|
||||||
|
if !strings.HasSuffix(fname, "internal-dns") {
|
||||||
|
t.Errorf("Expected config file to end with 'internal-dns', got %s", fname)
|
||||||
|
}
|
||||||
|
}
|
Loading…
Add table
Add a link
Reference in a new issue