mirror of
https://github.com/AdguardTeam/AdGuardHome.git
synced 2024-11-25 06:25:44 +03:00
all: mv v1 to next; imp tests, docs
This commit is contained in:
parent
d74ba3cb9d
commit
dbfc8ae362
26 changed files with 122 additions and 87 deletions
4
Makefile
4
Makefile
|
@ -34,7 +34,7 @@ YARN_INSTALL_FLAGS = $(YARN_FLAGS) --network-timeout 120000 --silent\
|
||||||
--ignore-engines --ignore-optional --ignore-platform\
|
--ignore-engines --ignore-optional --ignore-platform\
|
||||||
--ignore-scripts
|
--ignore-scripts
|
||||||
|
|
||||||
V1API = 0
|
NEXTAPI = 0
|
||||||
|
|
||||||
# Macros for the build-release target. If FRONTEND_PREBUILT is 0, the
|
# Macros for the build-release target. If FRONTEND_PREBUILT is 0, the
|
||||||
# default, the macro $(BUILD_RELEASE_DEPS_$(FRONTEND_PREBUILT)) expands
|
# default, the macro $(BUILD_RELEASE_DEPS_$(FRONTEND_PREBUILT)) expands
|
||||||
|
@ -63,7 +63,7 @@ ENV = env\
|
||||||
PATH="$${PWD}/bin:$$( "$(GO.MACRO)" env GOPATH )/bin:$${PATH}"\
|
PATH="$${PWD}/bin:$$( "$(GO.MACRO)" env GOPATH )/bin:$${PATH}"\
|
||||||
RACE='$(RACE)'\
|
RACE='$(RACE)'\
|
||||||
SIGN='$(SIGN)'\
|
SIGN='$(SIGN)'\
|
||||||
V1API='$(V1API)'\
|
NEXTAPI='$(NEXTAPI)'\
|
||||||
VERBOSE='$(VERBOSE)'\
|
VERBOSE='$(VERBOSE)'\
|
||||||
VERSION='$(VERSION)'\
|
VERSION='$(VERSION)'\
|
||||||
|
|
||||||
|
|
|
@ -6,14 +6,28 @@ import (
|
||||||
"time"
|
"time"
|
||||||
)
|
)
|
||||||
|
|
||||||
// MustReceive panics if it cannot receive a value form c before timeout runs
|
// Receive returns an error if it cannot receive a value form c before timeout
|
||||||
// out.
|
// runs out.
|
||||||
func MustReceive[T any](c <-chan T, timeout time.Duration) (v T, ok bool) {
|
func Receive[T any](c <-chan T, timeout time.Duration) (v T, ok bool, err error) {
|
||||||
|
var zero T
|
||||||
timeoutCh := time.After(timeout)
|
timeoutCh := time.After(timeout)
|
||||||
select {
|
select {
|
||||||
case <-timeoutCh:
|
case <-timeoutCh:
|
||||||
panic(fmt.Errorf("did not receive after %s", timeout))
|
// TODO(a.garipov): Consider implementing [errors.Aser] for
|
||||||
|
// os.ErrTimeout.
|
||||||
|
return zero, false, fmt.Errorf("did not receive after %s", timeout)
|
||||||
case v, ok = <-c:
|
case v, ok = <-c:
|
||||||
|
return v, ok, nil
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// MustReceive panics if it cannot receive a value form c before timeout runs
|
||||||
|
// out.
|
||||||
|
func MustReceive[T any](c <-chan T, timeout time.Duration) (v T, ok bool) {
|
||||||
|
v, ok, err := Receive(c, timeout)
|
||||||
|
if err != nil {
|
||||||
|
panic(err)
|
||||||
|
}
|
||||||
|
|
||||||
return v, ok
|
return v, ok
|
||||||
}
|
}
|
||||||
}
|
|
||||||
|
|
|
@ -11,7 +11,7 @@ import (
|
||||||
"net/netip"
|
"net/netip"
|
||||||
"time"
|
"time"
|
||||||
|
|
||||||
"github.com/AdguardTeam/AdGuardHome/internal/v1/websvc"
|
"github.com/AdguardTeam/AdGuardHome/internal/next/websvc"
|
||||||
"github.com/AdguardTeam/golibs/log"
|
"github.com/AdguardTeam/golibs/log"
|
||||||
)
|
)
|
||||||
|
|
|
@ -4,7 +4,7 @@ import (
|
||||||
"os"
|
"os"
|
||||||
|
|
||||||
"github.com/AdguardTeam/AdGuardHome/internal/aghos"
|
"github.com/AdguardTeam/AdGuardHome/internal/aghos"
|
||||||
"github.com/AdguardTeam/AdGuardHome/internal/v1/agh"
|
"github.com/AdguardTeam/AdGuardHome/internal/next/agh"
|
||||||
"github.com/AdguardTeam/golibs/log"
|
"github.com/AdguardTeam/golibs/log"
|
||||||
)
|
)
|
||||||
|
|
|
@ -12,7 +12,7 @@ import (
|
||||||
"sync/atomic"
|
"sync/atomic"
|
||||||
"time"
|
"time"
|
||||||
|
|
||||||
"github.com/AdguardTeam/AdGuardHome/internal/v1/agh"
|
"github.com/AdguardTeam/AdGuardHome/internal/next/agh"
|
||||||
// TODO(a.garipov): Add a “dnsproxy proxy” package to shield us from changes
|
// TODO(a.garipov): Add a “dnsproxy proxy” package to shield us from changes
|
||||||
// and replacement of module dnsproxy.
|
// and replacement of module dnsproxy.
|
||||||
"github.com/AdguardTeam/dnsproxy/proxy"
|
"github.com/AdguardTeam/dnsproxy/proxy"
|
||||||
|
@ -51,6 +51,9 @@ type Service struct {
|
||||||
// running is an atomic boolean value. Keep it the first value in the
|
// running is an atomic boolean value. Keep it the first value in the
|
||||||
// struct to ensure atomic alignment. 0 means that the service is not
|
// struct to ensure atomic alignment. 0 means that the service is not
|
||||||
// running, 1 means that it is running.
|
// running, 1 means that it is running.
|
||||||
|
//
|
||||||
|
// TODO(a.garipov): Use [atomic.Bool] in Go 1.19 or get rid of it
|
||||||
|
// completely.
|
||||||
running uint64
|
running uint64
|
||||||
|
|
||||||
proxy *proxy.Proxy
|
proxy *proxy.Proxy
|
|
@ -7,7 +7,7 @@ import (
|
||||||
"time"
|
"time"
|
||||||
|
|
||||||
"github.com/AdguardTeam/AdGuardHome/internal/aghtest"
|
"github.com/AdguardTeam/AdGuardHome/internal/aghtest"
|
||||||
"github.com/AdguardTeam/AdGuardHome/internal/v1/dnssvc"
|
"github.com/AdguardTeam/AdGuardHome/internal/next/dnssvc"
|
||||||
"github.com/AdguardTeam/dnsproxy/upstream"
|
"github.com/AdguardTeam/dnsproxy/upstream"
|
||||||
"github.com/miekg/dns"
|
"github.com/miekg/dns"
|
||||||
"github.com/stretchr/testify/assert"
|
"github.com/stretchr/testify/assert"
|
|
@ -6,7 +6,7 @@ import (
|
||||||
"net/http"
|
"net/http"
|
||||||
"net/netip"
|
"net/netip"
|
||||||
|
|
||||||
"github.com/AdguardTeam/AdGuardHome/internal/v1/dnssvc"
|
"github.com/AdguardTeam/AdGuardHome/internal/next/dnssvc"
|
||||||
"github.com/AdguardTeam/golibs/timeutil"
|
"github.com/AdguardTeam/golibs/timeutil"
|
||||||
)
|
)
|
||||||
|
|
|
@ -36,6 +36,7 @@ type HTTPAPIHTTPSettings struct {
|
||||||
Addresses []netip.AddrPort `json:"addresses"`
|
Addresses []netip.AddrPort `json:"addresses"`
|
||||||
SecureAddresses []netip.AddrPort `json:"secure_addresses"`
|
SecureAddresses []netip.AddrPort `json:"secure_addresses"`
|
||||||
Timeout timeutil.Duration `json:"timeout"`
|
Timeout timeutil.Duration `json:"timeout"`
|
||||||
|
ForceHTTPS bool `json:"force_https"`
|
||||||
}
|
}
|
||||||
|
|
||||||
// handlePatchSettingsHTTP is the handler for the PATCH /api/v1/settings/http
|
// handlePatchSettingsHTTP is the handler for the PATCH /api/v1/settings/http
|
||||||
|
@ -65,6 +66,7 @@ func (svc *Service) handlePatchSettingsHTTP(w http.ResponseWriter, r *http.Reque
|
||||||
Addresses: newConf.Addresses,
|
Addresses: newConf.Addresses,
|
||||||
SecureAddresses: newConf.SecureAddresses,
|
SecureAddresses: newConf.SecureAddresses,
|
||||||
Timeout: timeutil.Duration{Duration: newConf.Timeout},
|
Timeout: timeutil.Duration{Duration: newConf.Timeout},
|
||||||
|
ForceHTTPS: newConf.ForceHTTPS,
|
||||||
})
|
})
|
||||||
|
|
||||||
cancelUpd := func() {}
|
cancelUpd := func() {}
|
|
@ -8,8 +8,6 @@ import (
|
||||||
|
|
||||||
// All Settings Handlers
|
// All Settings Handlers
|
||||||
|
|
||||||
// TODO(a.garipov): !! Write tests!
|
|
||||||
|
|
||||||
// RespGetV1SettingsAll describes the response of the GET /api/v1/settings/all
|
// RespGetV1SettingsAll describes the response of the GET /api/v1/settings/all
|
||||||
// HTTP API.
|
// HTTP API.
|
||||||
type RespGetV1SettingsAll struct {
|
type RespGetV1SettingsAll struct {
|
||||||
|
@ -40,6 +38,7 @@ func (svc *Service) handleGetSettingsAll(w http.ResponseWriter, r *http.Request)
|
||||||
Addresses: httpConf.Addresses,
|
Addresses: httpConf.Addresses,
|
||||||
SecureAddresses: httpConf.SecureAddresses,
|
SecureAddresses: httpConf.SecureAddresses,
|
||||||
Timeout: timeutil.Duration{Duration: httpConf.Timeout},
|
Timeout: timeutil.Duration{Duration: httpConf.Timeout},
|
||||||
|
ForceHTTPS: httpConf.ForceHTTPS,
|
||||||
},
|
},
|
||||||
})
|
})
|
||||||
}
|
}
|
75
internal/next/websvc/settings_test.go
Normal file
75
internal/next/websvc/settings_test.go
Normal file
|
@ -0,0 +1,75 @@
|
||||||
|
package websvc_test
|
||||||
|
|
||||||
|
import (
|
||||||
|
"crypto/tls"
|
||||||
|
"encoding/json"
|
||||||
|
"net/http"
|
||||||
|
"net/netip"
|
||||||
|
"net/url"
|
||||||
|
"testing"
|
||||||
|
"time"
|
||||||
|
|
||||||
|
"github.com/AdguardTeam/AdGuardHome/internal/next/dnssvc"
|
||||||
|
"github.com/AdguardTeam/AdGuardHome/internal/next/websvc"
|
||||||
|
"github.com/AdguardTeam/golibs/timeutil"
|
||||||
|
"github.com/stretchr/testify/assert"
|
||||||
|
"github.com/stretchr/testify/require"
|
||||||
|
)
|
||||||
|
|
||||||
|
func TestService_HandleGetSettingsAll(t *testing.T) {
|
||||||
|
// TODO(a.garipov): Add all currently supported parameters.
|
||||||
|
|
||||||
|
wantDNS := &websvc.HTTPAPIDNSSettings{
|
||||||
|
Addresses: []netip.AddrPort{netip.MustParseAddrPort("127.0.0.1:53")},
|
||||||
|
BootstrapServers: []string{"94.140.14.140", "94.140.14.141"},
|
||||||
|
UpstreamServers: []string{"94.140.14.14", "1.1.1.1"},
|
||||||
|
UpstreamTimeout: timeutil.Duration{Duration: 1 * time.Second},
|
||||||
|
}
|
||||||
|
|
||||||
|
wantWeb := &websvc.HTTPAPIHTTPSettings{
|
||||||
|
Addresses: []netip.AddrPort{netip.MustParseAddrPort("127.0.0.1:80")},
|
||||||
|
SecureAddresses: []netip.AddrPort{netip.MustParseAddrPort("127.0.0.1:443")},
|
||||||
|
Timeout: timeutil.Duration{Duration: 5 * time.Second},
|
||||||
|
ForceHTTPS: true,
|
||||||
|
}
|
||||||
|
|
||||||
|
confMgr := newConfigManager()
|
||||||
|
confMgr.onDNS = func() (c *dnssvc.Service) {
|
||||||
|
c, err := dnssvc.New(&dnssvc.Config{
|
||||||
|
Addresses: wantDNS.Addresses,
|
||||||
|
UpstreamServers: wantDNS.UpstreamServers,
|
||||||
|
BootstrapServers: wantDNS.BootstrapServers,
|
||||||
|
UpstreamTimeout: wantDNS.UpstreamTimeout.Duration,
|
||||||
|
})
|
||||||
|
require.NoError(t, err)
|
||||||
|
|
||||||
|
return c
|
||||||
|
}
|
||||||
|
|
||||||
|
confMgr.onWeb = func() (c *websvc.Service) {
|
||||||
|
return websvc.New(&websvc.Config{
|
||||||
|
TLS: &tls.Config{
|
||||||
|
Certificates: []tls.Certificate{{}},
|
||||||
|
},
|
||||||
|
Addresses: wantWeb.Addresses,
|
||||||
|
SecureAddresses: wantWeb.SecureAddresses,
|
||||||
|
Timeout: wantWeb.Timeout.Duration,
|
||||||
|
ForceHTTPS: true,
|
||||||
|
})
|
||||||
|
}
|
||||||
|
|
||||||
|
_, addr := newTestServer(t, confMgr)
|
||||||
|
u := &url.URL{
|
||||||
|
Scheme: "http",
|
||||||
|
Host: addr.String(),
|
||||||
|
Path: websvc.PathV1SettingsAll,
|
||||||
|
}
|
||||||
|
|
||||||
|
body := httpGet(t, u, http.StatusOK)
|
||||||
|
resp := &websvc.RespGetV1SettingsAll{}
|
||||||
|
err := json.Unmarshal(body, resp)
|
||||||
|
require.NoError(t, err)
|
||||||
|
|
||||||
|
assert.Equal(t, wantDNS, resp.DNS)
|
||||||
|
assert.Equal(t, wantWeb, resp.HTTP)
|
||||||
|
}
|
|
@ -8,7 +8,7 @@ import (
|
||||||
"testing"
|
"testing"
|
||||||
"time"
|
"time"
|
||||||
|
|
||||||
"github.com/AdguardTeam/AdGuardHome/internal/v1/websvc"
|
"github.com/AdguardTeam/AdGuardHome/internal/next/websvc"
|
||||||
"github.com/stretchr/testify/assert"
|
"github.com/stretchr/testify/assert"
|
||||||
"github.com/stretchr/testify/require"
|
"github.com/stretchr/testify/require"
|
||||||
)
|
)
|
|
@ -1,5 +1,8 @@
|
||||||
// Package websvc contains the AdGuard Home HTTP API service.
|
// Package websvc contains the AdGuard Home HTTP API service.
|
||||||
//
|
//
|
||||||
|
// NOTE: Packages other than cmd must not import this package, as it imports
|
||||||
|
// most other packages.
|
||||||
|
//
|
||||||
// TODO(a.garipov): Add tests.
|
// TODO(a.garipov): Add tests.
|
||||||
package websvc
|
package websvc
|
||||||
|
|
||||||
|
@ -14,8 +17,8 @@ import (
|
||||||
"sync"
|
"sync"
|
||||||
"time"
|
"time"
|
||||||
|
|
||||||
"github.com/AdguardTeam/AdGuardHome/internal/v1/agh"
|
"github.com/AdguardTeam/AdGuardHome/internal/next/agh"
|
||||||
"github.com/AdguardTeam/AdGuardHome/internal/v1/dnssvc"
|
"github.com/AdguardTeam/AdGuardHome/internal/next/dnssvc"
|
||||||
"github.com/AdguardTeam/golibs/errors"
|
"github.com/AdguardTeam/golibs/errors"
|
||||||
"github.com/AdguardTeam/golibs/log"
|
"github.com/AdguardTeam/golibs/log"
|
||||||
httptreemux "github.com/dimfeld/httptreemux/v5"
|
httptreemux "github.com/dimfeld/httptreemux/v5"
|
|
@ -10,8 +10,8 @@ import (
|
||||||
"time"
|
"time"
|
||||||
|
|
||||||
"github.com/AdguardTeam/AdGuardHome/internal/aghtest"
|
"github.com/AdguardTeam/AdGuardHome/internal/aghtest"
|
||||||
"github.com/AdguardTeam/AdGuardHome/internal/v1/dnssvc"
|
"github.com/AdguardTeam/AdGuardHome/internal/next/dnssvc"
|
||||||
"github.com/AdguardTeam/AdGuardHome/internal/v1/websvc"
|
"github.com/AdguardTeam/AdGuardHome/internal/next/websvc"
|
||||||
"github.com/AdguardTeam/golibs/testutil"
|
"github.com/AdguardTeam/golibs/testutil"
|
||||||
"github.com/stretchr/testify/assert"
|
"github.com/stretchr/testify/assert"
|
||||||
"github.com/stretchr/testify/require"
|
"github.com/stretchr/testify/require"
|
|
@ -1,61 +0,0 @@
|
||||||
package websvc_test
|
|
||||||
|
|
||||||
import (
|
|
||||||
"encoding/json"
|
|
||||||
"net/http"
|
|
||||||
"net/netip"
|
|
||||||
"net/url"
|
|
||||||
"testing"
|
|
||||||
"time"
|
|
||||||
|
|
||||||
"github.com/AdguardTeam/AdGuardHome/internal/v1/dnssvc"
|
|
||||||
"github.com/AdguardTeam/AdGuardHome/internal/v1/websvc"
|
|
||||||
"github.com/stretchr/testify/assert"
|
|
||||||
"github.com/stretchr/testify/require"
|
|
||||||
)
|
|
||||||
|
|
||||||
func TestService_HandleGetSettingsAll(t *testing.T) {
|
|
||||||
// TODO(a.garipov): Add all currently supported parameters.
|
|
||||||
|
|
||||||
dnsAddrs := []netip.AddrPort{netip.MustParseAddrPort("127.0.0.1:53")}
|
|
||||||
upsSrvs := []string{"94.140.14.14", "1.1.1.1"}
|
|
||||||
|
|
||||||
webAddrs := []netip.AddrPort{netip.MustParseAddrPort("127.0.0.1:80")}
|
|
||||||
const webTimeout = 5 * time.Second
|
|
||||||
|
|
||||||
confMgr := newConfigManager()
|
|
||||||
confMgr.onDNS = func() (c *dnssvc.Service) {
|
|
||||||
c, err := dnssvc.New(&dnssvc.Config{
|
|
||||||
Addresses: dnsAddrs,
|
|
||||||
UpstreamServers: upsSrvs,
|
|
||||||
})
|
|
||||||
require.NoError(t, err)
|
|
||||||
|
|
||||||
return c
|
|
||||||
}
|
|
||||||
|
|
||||||
confMgr.onWeb = func() (c *websvc.Service) {
|
|
||||||
return websvc.New(&websvc.Config{
|
|
||||||
Addresses: webAddrs,
|
|
||||||
Timeout: webTimeout,
|
|
||||||
})
|
|
||||||
}
|
|
||||||
|
|
||||||
_, addr := newTestServer(t, confMgr)
|
|
||||||
u := &url.URL{
|
|
||||||
Scheme: "http",
|
|
||||||
Host: addr.String(),
|
|
||||||
Path: websvc.PathV1SettingsAll,
|
|
||||||
}
|
|
||||||
|
|
||||||
body := httpGet(t, u, http.StatusOK)
|
|
||||||
resp := &websvc.RespGetV1SettingsAll{}
|
|
||||||
err := json.Unmarshal(body, resp)
|
|
||||||
require.NoError(t, err)
|
|
||||||
|
|
||||||
assert.Equal(t, dnsAddrs, resp.DNS.Addresses)
|
|
||||||
assert.Equal(t, upsSrvs, resp.DNS.UpstreamServers)
|
|
||||||
|
|
||||||
assert.Equal(t, webAddrs, resp.HTTP.Addresses)
|
|
||||||
assert.Equal(t, webTimeout, resp.HTTP.Timeout.Duration)
|
|
||||||
}
|
|
4
main.go
4
main.go
|
@ -1,5 +1,5 @@
|
||||||
//go:build !v1
|
//go:build !next
|
||||||
// +build !v1
|
// +build !next
|
||||||
|
|
||||||
package main
|
package main
|
||||||
|
|
||||||
|
|
|
@ -1,12 +1,12 @@
|
||||||
//go:build v1
|
//go:build next
|
||||||
// +build v1
|
// +build next
|
||||||
|
|
||||||
package main
|
package main
|
||||||
|
|
||||||
import (
|
import (
|
||||||
"embed"
|
"embed"
|
||||||
|
|
||||||
"github.com/AdguardTeam/AdGuardHome/internal/v1/cmd"
|
"github.com/AdguardTeam/AdGuardHome/internal/next/cmd"
|
||||||
)
|
)
|
||||||
|
|
||||||
// Embed the prebuilt client here since we strive to keep .go files inside the
|
// Embed the prebuilt client here since we strive to keep .go files inside the
|
|
@ -136,11 +136,11 @@ underscores() {
|
||||||
-e '_freebsd.go'\
|
-e '_freebsd.go'\
|
||||||
-e '_linux.go'\
|
-e '_linux.go'\
|
||||||
-e '_little.go'\
|
-e '_little.go'\
|
||||||
|
-e '_next.go'\
|
||||||
-e '_openbsd.go'\
|
-e '_openbsd.go'\
|
||||||
-e '_others.go'\
|
-e '_others.go'\
|
||||||
-e '_test.go'\
|
-e '_test.go'\
|
||||||
-e '_unix.go'\
|
-e '_unix.go'\
|
||||||
-e '_v1.go'\
|
|
||||||
-e '_windows.go' \
|
-e '_windows.go' \
|
||||||
-v\
|
-v\
|
||||||
| sed -e 's/./\t\0/'
|
| sed -e 's/./\t\0/'
|
||||||
|
@ -229,7 +229,7 @@ gocyclo --over 13 ./internal/filtering/
|
||||||
# Apply stricter standards to new or somewhat refactored code.
|
# Apply stricter standards to new or somewhat refactored code.
|
||||||
gocyclo --over 10 ./internal/aghio/ ./internal/aghnet/ ./internal/aghos/\
|
gocyclo --over 10 ./internal/aghio/ ./internal/aghnet/ ./internal/aghos/\
|
||||||
./internal/aghtest/ ./internal/dnsforward/ ./internal/stats/\
|
./internal/aghtest/ ./internal/dnsforward/ ./internal/stats/\
|
||||||
./internal/tools/ ./internal/updater/ ./internal/v1/ ./internal/version/\
|
./internal/tools/ ./internal/updater/ ./internal/next/ ./internal/version/\
|
||||||
./main.go
|
./main.go
|
||||||
|
|
||||||
ineffassign ./...
|
ineffassign ./...
|
||||||
|
|
Loading…
Reference in a new issue