/* SPDX-License-Identifier: MIT
*
* Phobos
*/
package syntax
import (
"strings"
"testing"
)
const phobosConfig = `[Interface]
PrivateKey = yAnz5TF+lXXJte14tji3zlMNq+hd2rYUIgJBgB3fBmk=
Address = 10.8.0.2/32
MTU = 1420
DNS = 1.1.1.1
[Peer]
PublicKey = xTIBA5rboUvnH4htodjb6e697QjLERt1NAB4mZqp8Dg=
AllowedIPs = 0.0.0.0/0, ::/0
PersistentKeepalive = 25
Endpoint = 127.0.0.1:51822
[instance]
source-if = 127.0.0.1
source-lport = 51822
target = vpn.example.com:51823
key = Ic0OGtSf1BdMmMDzs7GmYRuPS/HGmNXsSU9EOWEeuQI=
masking = MEDIA
obfuscate-bytes = 16
max-dummy = 4
media-pt = 102
media-ssrc = 0xDEADBEEF
media-clock = 30
verbose = 2
`
const phobosSocks5Config = `[instance]
mode = socks5
role = client
source-lport = 1080
target = vpn.example.com:51824
key = Ic0OGtSf1BdMmMDzs7GmYRuPS/HGmNXsSU9EOWEeuQI=
masking = STUN
[socks5]
login = phobos-user
password = s3cr3t
`
func errorSpans(t *testing.T, config string) []string {
t.Helper()
var offenders []string
for _, span := range highlightConfig(config) {
if span.t == highlightError {
offenders = append(offenders, config[span.s:span.s+span.len])
}
}
return offenders
}
func TestPhobosSectionsHighlightWithoutErrors(t *testing.T) {
for name, config := range map[string]string{"wireguard": phobosConfig, "socks5": phobosSocks5Config} {
t.Run(name, func(t *testing.T) {
if offenders := errorSpans(t, config); offenders != nil {
t.Fatalf("unexpected error spans: %q", offenders)
}
})
}
}
func TestPhobosFieldsAreFlaggedOutsideTheirSection(t *testing.T) {
misplaced := strings.Replace(phobosConfig, "MTU = 1420", "masking = STUN", 1)
if offenders := errorSpans(t, misplaced); len(offenders) == 0 {
t.Fatal("masking in [Interface] should be an error")
}
}
func TestPhobosInvalidValuesAreFlagged(t *testing.T) {
cases := map[string]string{
"masking": strings.Replace(phobosConfig, "masking = MEDIA", "masking = quic", 1),
"mode": strings.Replace(phobosSocks5Config, "mode = socks5", "mode = tcp", 1),
"role": strings.Replace(phobosSocks5Config, "role = client", "role = server", 1),
"target": strings.Replace(phobosConfig, "target = vpn.example.com:51823", "target = vpn.example.com", 1),
"source-lport": strings.Replace(phobosConfig, "source-lport = 51822", "source-lport = 70000", 1),
"media-pt": strings.Replace(phobosConfig, "media-pt = 102", "media-pt = 300", 1),
"media-clock": strings.Replace(phobosConfig, "media-clock = 30", "media-clock = 4000", 1),
"empty key": strings.Replace(phobosConfig, "key = Ic0OGtSf1BdMmMDzs7GmYRuPS/HGmNXsSU9EOWEeuQI=", "key =", 1),
"unknown key": strings.Replace(phobosConfig, "max-dummy = 4", "threads = 2", 1),
}
for name, config := range cases {
if offenders := errorSpans(t, config); len(offenders) == 0 {
t.Errorf("%s: expected an error span", name)
}
}
}
func TestWireGuardSectionsStillHighlight(t *testing.T) {
plain := `[Interface]
PrivateKey = yAnz5TF+lXXJte14tji3zlMNq+hd2rYUIgJBgB3fBmk=
Address = 10.8.0.2/32
Table = off
[Peer]
PublicKey = xTIBA5rboUvnH4htodjb6e697QjLERt1NAB4mZqp8Dg=
AllowedIPs = 0.0.0.0/0
Endpoint = demo.wireguard.com:12912
PersistentKeepalive = 25
`
if offenders := errorSpans(t, plain); offenders != nil {
t.Fatalf("unexpected error spans in a plain config: %q", offenders)
}
}