Files
bzzz/test/integration/ucxl_parser_test.go
anthonyrawlins d96c931a29 Resolve import cycles and migrate to chorus.services module path
This comprehensive refactoring addresses critical architectural issues:

IMPORT CYCLE RESOLUTION:
• pkg/crypto ↔ pkg/slurp/roles: Created pkg/security/access_levels.go
• pkg/ucxl → pkg/dht: Created pkg/storage/interfaces.go
• pkg/slurp/leader → pkg/election → pkg/slurp/storage: Moved types to pkg/election/interfaces.go

MODULE PATH MIGRATION:
• Changed from github.com/anthonyrawlins/bzzz to chorus.services/bzzz
• Updated all import statements across 115+ files
• Maintains compatibility while removing personal GitHub account dependency

TYPE SYSTEM IMPROVEMENTS:
• Resolved duplicate type declarations in crypto package
• Added missing type definitions (RoleStatus, TimeRestrictions, KeyStatus, KeyRotationResult)
• Proper interface segregation to prevent future cycles

ARCHITECTURAL BENEFITS:
• Build now progresses past structural issues to normal dependency resolution
• Cleaner separation of concerns between packages
• Eliminates circular dependencies that prevented compilation
• Establishes foundation for scalable codebase growth

🤖 Generated with [Claude Code](https://claude.ai/code)

Co-Authored-By: Claude <noreply@anthropic.com>
2025-08-17 10:04:25 +10:00

416 lines
10 KiB
Go

package integration
import (
"testing"
"chorus.services/bzzz/pkg/ucxl"
"github.com/stretchr/testify/assert"
"github.com/stretchr/testify/require"
)
func TestUCXLAddressParsing(t *testing.T) {
testCases := []struct {
name string
address string
expectErr bool
expected *ucxl.UCXLAddress
}{
{
name: "Basic address",
address: "ucxl://agent-001:coordinator@bzzz:config/",
expected: &ucxl.UCXLAddress{
Raw: "ucxl://agent-001:coordinator@bzzz:config/",
Agent: "agent-001",
Role: "coordinator",
Project: "bzzz",
Task: "config",
Path: "",
Temporal: "",
},
},
{
name: "Address with path",
address: "ucxl://agent-001:coordinator@bzzz:config/network/settings",
expected: &ucxl.UCXLAddress{
Raw: "ucxl://agent-001:coordinator@bzzz:config/network/settings",
Agent: "agent-001",
Role: "coordinator",
Project: "bzzz",
Task: "config",
Path: "network/settings",
Temporal: "",
},
},
{
name: "Address with temporal navigation",
address: "ucxl://agent-001:coordinator@bzzz:config/*^/",
expected: &ucxl.UCXLAddress{
Raw: "ucxl://agent-001:coordinator@bzzz:config/*^/",
Agent: "agent-001",
Role: "coordinator",
Project: "bzzz",
Task: "config",
Path: "",
Temporal: "^/",
},
},
{
name: "Address with path and temporal",
address: "ucxl://agent-001:coordinator@bzzz:config/settings*~/",
expected: &ucxl.UCXLAddress{
Raw: "ucxl://agent-001:coordinator@bzzz:config/settings*~/",
Agent: "agent-001",
Role: "coordinator",
Project: "bzzz",
Task: "config",
Path: "settings",
Temporal: "~/",
},
},
{
name: "Wildcard address",
address: "ucxl://*:*@*:*/*^/",
expected: &ucxl.UCXLAddress{
Raw: "ucxl://*:*@*:*/*^/",
Agent: "*",
Role: "*",
Project: "*",
Task: "*",
Path: "",
Temporal: "^/",
},
},
{
name: "Invalid format - no scheme",
address: "agent-001:coordinator@bzzz:config/",
expectErr: true,
},
{
name: "Invalid format - wrong scheme",
address: "http://agent-001:coordinator@bzzz:config/",
expectErr: true,
},
{
name: "Invalid format - missing components",
address: "ucxl://agent-001@bzzz/",
expectErr: true,
},
{
name: "Empty address",
address: "",
expectErr: true,
},
}
for _, tc := range testCases {
t.Run(tc.name, func(t *testing.T) {
result, err := ucxl.ParseUCXLAddress(tc.address)
if tc.expectErr {
assert.Error(t, err)
assert.Nil(t, result)
} else {
require.NoError(t, err)
require.NotNil(t, result)
assert.Equal(t, tc.expected.Agent, result.Agent)
assert.Equal(t, tc.expected.Role, result.Role)
assert.Equal(t, tc.expected.Project, result.Project)
assert.Equal(t, tc.expected.Task, result.Task)
assert.Equal(t, tc.expected.Path, result.Path)
assert.Equal(t, tc.expected.Temporal, result.Temporal)
}
})
}
}
func TestUCXLAddressGeneration(t *testing.T) {
testCases := []struct {
name string
agent string
role string
project string
task string
path string
temporal string
expected string
expectErr bool
}{
{
name: "Basic generation",
agent: "agent-001",
role: "coordinator",
project: "bzzz",
task: "config",
expected: "ucxl://agent-001:coordinator@bzzz:config/",
},
{
name: "Generation with path",
agent: "agent-001",
role: "coordinator",
project: "bzzz",
task: "config",
path: "/network/settings",
expected: "ucxl://agent-001:coordinator@bzzz:config/%2Fnetwork%2Fsettings/",
},
{
name: "Generation with temporal",
agent: "agent-001",
role: "coordinator",
project: "bzzz",
task: "config",
temporal: "^/",
expected: "ucxl://agent-001:coordinator@bzzz:config/*^/",
},
{
name: "Generation with both",
agent: "agent-001",
role: "coordinator",
project: "bzzz",
task: "config",
path: "settings",
temporal: "~/",
expected: "ucxl://agent-001:coordinator@bzzz:config/settings*~/",
},
{
name: "Missing required field",
agent: "",
role: "coordinator",
project: "bzzz",
task: "config",
expectErr: true,
},
}
for _, tc := range testCases {
t.Run(tc.name, func(t *testing.T) {
result, err := ucxl.GenerateUCXLAddress(tc.agent, tc.role, tc.project, tc.task, tc.path, tc.temporal)
if tc.expectErr {
assert.Error(t, err)
assert.Empty(t, result)
} else {
assert.NoError(t, err)
assert.Equal(t, tc.expected, result)
// Verify generated address can be parsed back
parsed, err := ucxl.ParseUCXLAddress(result)
require.NoError(t, err)
assert.Equal(t, tc.agent, parsed.Agent)
assert.Equal(t, tc.role, parsed.Role)
assert.Equal(t, tc.project, parsed.Project)
assert.Equal(t, tc.task, parsed.Task)
}
})
}
}
func TestUCXLAddressValidation(t *testing.T) {
validAddresses := []string{
"ucxl://agent:role@project:task/",
"ucxl://*:*@*:*/*^/",
"ucxl://agent-001:coordinator@bzzz:config/settings*~/",
"ucxl://test:test@test:test/path/to/resource",
}
invalidAddresses := []string{
"",
"http://invalid",
"ucxl://incomplete",
"not-a-url",
"ucxl://:@:/",
}
for _, addr := range validAddresses {
t.Run("Valid_"+addr, func(t *testing.T) {
assert.True(t, ucxl.IsValidUCXLAddress(addr))
})
}
for _, addr := range invalidAddresses {
t.Run("Invalid_"+addr, func(t *testing.T) {
assert.False(t, ucxl.IsValidUCXLAddress(addr))
})
}
}
func TestUCXLAddressPatternMatching(t *testing.T) {
// Create test addresses
address1, err := ucxl.ParseUCXLAddress("ucxl://agent-001:coordinator@bzzz:config/network")
require.NoError(t, err)
address2, err := ucxl.ParseUCXLAddress("ucxl://agent-002:worker@bzzz:deployment/")
require.NoError(t, err)
// Create patterns
wildcardPattern, err := ucxl.ParseUCXLAddress("ucxl://*:*@bzzz:*/*^/")
require.NoError(t, err)
specificPattern, err := ucxl.ParseUCXLAddress("ucxl://agent-001:coordinator@bzzz:config/*^/")
require.NoError(t, err)
rolePattern, err := ucxl.ParseUCXLAddress("ucxl://*:coordinator@*:*/*^/")
require.NoError(t, err)
// Test pattern matching
testCases := []struct {
name string
address *ucxl.UCXLAddress
pattern *ucxl.UCXLAddress
expected bool
}{
{
name: "Wildcard pattern matches address1",
address: address1,
pattern: wildcardPattern,
expected: true,
},
{
name: "Wildcard pattern matches address2",
address: address2,
pattern: wildcardPattern,
expected: true,
},
{
name: "Specific pattern matches address1",
address: address1,
pattern: specificPattern,
expected: true,
},
{
name: "Specific pattern does not match address2",
address: address2,
pattern: specificPattern,
expected: false,
},
{
name: "Role pattern matches coordinator",
address: address1,
pattern: rolePattern,
expected: true,
},
{
name: "Role pattern does not match worker",
address: address2,
pattern: rolePattern,
expected: false,
},
}
for _, tc := range testCases {
t.Run(tc.name, func(t *testing.T) {
result := tc.address.MatchesPattern(tc.pattern)
assert.Equal(t, tc.expected, result)
})
}
}
func TestUCXLAddressNormalization(t *testing.T) {
testCases := []struct {
name string
input string
expected string
}{
{
name: "Already normalized",
input: "ucxl://agent:role@project:task/",
expected: "ucxl://agent:role@project:task/",
},
{
name: "Missing trailing slash",
input: "ucxl://agent:role@project:task",
expected: "ucxl://agent:role@project:task/",
},
{
name: "With path normalization",
input: "ucxl://agent:role@project:task/path/to/resource",
expected: "ucxl://agent:role@project:task/path/to/resource/",
},
}
for _, tc := range testCases {
t.Run(tc.name, func(t *testing.T) {
result, err := ucxl.NormalizeUCXLAddress(tc.input)
assert.NoError(t, err)
assert.Equal(t, tc.expected, result)
})
}
}
func TestUCXLAddressTemporalValidation(t *testing.T) {
validTemporalCases := []string{
"ucxl://agent:role@project:task/*^/", // Latest
"ucxl://agent:role@project:task/*~/", // Earliest
"ucxl://agent:role@project:task/*@1234/", // Specific timestamp
"ucxl://agent:role@project:task/*~5/", // 5 versions back
"ucxl://agent:role@project:task/*^3/", // 3 versions forward
}
invalidTemporalCases := []string{
"ucxl://agent:role@project:task/*invalid/",
"ucxl://agent:role@project:task/*@abc/",
"ucxl://agent:role@project:task/*~-1/",
}
for _, addr := range validTemporalCases {
t.Run("ValidTemporal_"+addr, func(t *testing.T) {
_, err := ucxl.ParseUCXLAddress(addr)
assert.NoError(t, err, "Should parse valid temporal syntax")
})
}
for _, addr := range invalidTemporalCases {
t.Run("InvalidTemporal_"+addr, func(t *testing.T) {
_, err := ucxl.ParseUCXLAddress(addr)
assert.Error(t, err, "Should reject invalid temporal syntax")
})
}
}
func TestUCXLAddressCrossLanguageConsistency(t *testing.T) {
// This test ensures UCXL address parsing is consistent across Go implementation
// When Rust implementation is available, similar tests should produce identical results
testAddresses := []string{
"ucxl://agent:role@project:task/*^/",
"ucxl://*:coordinator@bzzz:config/network/settings*~/",
"ucxl://test-agent-123:worker@production:deployment/services/api*@1640995200/",
}
for _, addr := range testAddresses {
t.Run("CrossLanguage_"+addr, func(t *testing.T) {
// Parse address
parsed, err := ucxl.ParseUCXLAddress(addr)
require.NoError(t, err)
// Convert to map (similar to JSON serialization)
addressMap := parsed.ToMap()
// Verify all components are present
assert.NotEmpty(t, addressMap["agent"])
assert.NotEmpty(t, addressMap["role"])
assert.NotEmpty(t, addressMap["project"])
assert.NotEmpty(t, addressMap["task"])
// Verify round-trip consistency
regenerated, err := ucxl.GenerateUCXLAddress(
parsed.Agent,
parsed.Role,
parsed.Project,
parsed.Task,
parsed.Path,
parsed.Temporal,
)
assert.NoError(t, err)
// Parse regenerated address
reparsed, err := ucxl.ParseUCXLAddress(regenerated)
require.NoError(t, err)
// Should be identical
assert.Equal(t, parsed.Agent, reparsed.Agent)
assert.Equal(t, parsed.Role, reparsed.Role)
assert.Equal(t, parsed.Project, reparsed.Project)
assert.Equal(t, parsed.Task, reparsed.Task)
})
}
}