all: mv v1 to next; imp tests, docs

This commit is contained in:
Ainar Garipov 2022-09-09 14:25:48 +03:00
parent d74ba3cb9d
commit dbfc8ae362
26 changed files with 122 additions and 87 deletions

View file

@ -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)'\

View file

@ -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 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
}

View file

@ -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"
) )

View file

@ -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"
) )

View file

@ -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

View file

@ -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"

View file

@ -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"
) )

View file

@ -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() {}

View file

@ -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,
}, },
}) })
} }

View 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)
}

View file

@ -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"
) )

View file

@ -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"

View file

@ -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"

View file

@ -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)
}

View file

@ -1,5 +1,5 @@
//go:build !v1 //go:build !next
// +build !v1 // +build !next
package main package main

View file

@ -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

View file

@ -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 ./...