Fix tests

This commit is contained in:
9seconds
2026-02-24 13:58:16 +01:00
parent 8b34c1b104
commit 5b91edf5c4
6 changed files with 95 additions and 109 deletions
+1 -1
View File
@@ -18,7 +18,7 @@ type SimpleRun struct {
TCPBuffer string `kong:"name='tcp-buffer',short='b',default='4KB',help='Deprecated and ignored'"` //nolint: lll TCPBuffer string `kong:"name='tcp-buffer',short='b',default='4KB',help='Deprecated and ignored'"` //nolint: lll
PreferIP string `kong:"name='prefer-ip',short='i',default='prefer-ipv6',help='IP preference. By default we prefer IPv6 with fallback to IPv4.'"` //nolint: lll PreferIP string `kong:"name='prefer-ip',short='i',default='prefer-ipv6',help='IP preference. By default we prefer IPv6 with fallback to IPv4.'"` //nolint: lll
DomainFrontingPort uint64 `kong:"name='domain-fronting-port',short='p',default='443',help='A port to access for domain fronting.'"` //nolint: lll DomainFrontingPort uint64 `kong:"name='domain-fronting-port',short='p',default='443',help='A port to access for domain fronting.'"` //nolint: lll
DomainFrontingIP string `kong:"name='domain-fronting-ip',help='An IP address to use for domain fronting instead of resolving the hostname via DNS.'"` //nolint: lll DomainFrontingIP string `kong:"name='domain-fronting-ip',help='An IP address to use for domain fronting instead of resolving the hostname via DNS.'"` //nolint: lll
DOHIP net.IP `kong:"name='doh-ip',short='n',default='1.1.1.1',help='IP address of DNS-over-HTTP to use.'"` //nolint: lll DOHIP net.IP `kong:"name='doh-ip',short='n',default='1.1.1.1',help='IP address of DNS-over-HTTP to use.'"` //nolint: lll
Timeout time.Duration `kong:"name='timeout',short='t',default='10s',help='Network timeout to use'"` //nolint: lll Timeout time.Duration `kong:"name='timeout',short='t',default='10s',help='Network timeout to use'"` //nolint: lll
Socks5Proxies []string `kong:"name='socks5-proxy',short='s',help='Socks5 proxies to use for network access.'"` //nolint: lll Socks5Proxies []string `kong:"name='socks5-proxy',short='s',help='Socks5 proxies to use for network access.'"` //nolint: lll
+36 -38
View File
@@ -38,43 +38,41 @@ type Updater interface {
Run(ctx context.Context) Run(ctx context.Context)
} }
var ( // https://github.com/telegramdesktop/tdesktop/blob/master/Telegram/SourceFiles/mtproto/mtproto_dc_options.cpp#L30
// https://github.com/telegramdesktop/tdesktop/blob/master/Telegram/SourceFiles/mtproto/mtproto_dc_options.cpp#L30 var defaultDCAddrSet = dcAddrSet{
defaultDCAddrSet = dcAddrSet{ v4: map[int][]Addr{
v4: map[int][]Addr{ 1: {
1: { {Network: "tcp4", Address: "149.154.175.50:443"},
{Network: "tcp4", Address: "149.154.175.50:443"},
},
2: {
{Network: "tcp4", Address: "149.154.167.51:443"},
{Network: "tcp4", Address: "95.161.76.100:443"},
},
3: {
{Network: "tcp4", Address: "149.154.175.100:443"},
},
4: {
{Network: "tcp4", Address: "149.154.167.91:443"},
},
5: {
{Network: "tcp4", Address: "149.154.171.5:443"},
},
}, },
v6: map[int][]Addr{ 2: {
1: { {Network: "tcp4", Address: "149.154.167.51:443"},
{Network: "tcp6", Address: "[2001:b28:f23d:f001::a]:443"}, {Network: "tcp4", Address: "95.161.76.100:443"},
},
2: {
{Network: "tcp6", Address: "[2001:67c:04e8:f002::a]:443"},
},
3: {
{Network: "tcp6", Address: "[2001:b28:f23d:f003::a]:443"},
},
4: {
{Network: "tcp6", Address: "[2001:67c:04e8:f004::a]:443"},
},
5: {
{Network: "tcp6", Address: "[2001:b28:f23f:f005::a]:443"},
},
}, },
} 3: {
) {Network: "tcp4", Address: "149.154.175.100:443"},
},
4: {
{Network: "tcp4", Address: "149.154.167.91:443"},
},
5: {
{Network: "tcp4", Address: "149.154.171.5:443"},
},
},
v6: map[int][]Addr{
1: {
{Network: "tcp6", Address: "[2001:b28:f23d:f001::a]:443"},
},
2: {
{Network: "tcp6", Address: "[2001:67c:04e8:f002::a]:443"},
},
3: {
{Network: "tcp6", Address: "[2001:b28:f23d:f003::a]:443"},
},
4: {
{Network: "tcp6", Address: "[2001:67c:04e8:f004::a]:443"},
},
5: {
{Network: "tcp6", Address: "[2001:b28:f23f:f005::a]:443"},
},
},
}
+3 -3
View File
@@ -19,7 +19,7 @@ type PublicConfigUpdater struct {
tg *Telegram tg *Telegram
} }
func (p PublicConfigUpdater) Run(ctx context.Context, url, network string) { func (p *PublicConfigUpdater) Run(ctx context.Context, url, network string) {
p.run(ctx, func() error { p.run(ctx, func() error {
req, err := http.NewRequestWithContext(ctx, http.MethodGet, url, nil) req, err := http.NewRequestWithContext(ctx, http.MethodGet, url, nil)
if err != nil { if err != nil {
@@ -81,8 +81,8 @@ func (p PublicConfigUpdater) Run(ctx context.Context, url, network string) {
}) })
} }
func NewPublicConfigUpdater(tg *Telegram, logger Logger, client *http.Client) PublicConfigUpdater { func NewPublicConfigUpdater(tg *Telegram, logger Logger, client *http.Client) *PublicConfigUpdater {
return PublicConfigUpdater{ return &PublicConfigUpdater{
updater: updater{ updater: updater{
logger: logger, logger: logger,
period: PublicConfigUpdateEach, period: PublicConfigUpdateEach,
@@ -14,7 +14,7 @@ import (
type PublicConfigUpdaterTestSuite struct { type PublicConfigUpdaterTestSuite struct {
UpdaterTestSuiteBase UpdaterTestSuiteBase
u PublicConfigUpdater u *PublicConfigUpdater
lock sync.Mutex lock sync.Mutex
srv *httptest.Server srv *httptest.Server
responseHandler func(w http.ResponseWriter) responseHandler func(w http.ResponseWriter)
@@ -42,39 +42,27 @@ func (s *PublicConfigUpdaterTestSuite) SetupTest() {
} }
func (s *PublicConfigUpdaterTestSuite) Test502StatusCode() { func (s *PublicConfigUpdaterTestSuite) Test502StatusCode() {
done := false
s.responseHandler = func(w http.ResponseWriter) { s.responseHandler = func(w http.ResponseWriter) {
w.WriteHeader(http.StatusBadGateway) w.WriteHeader(http.StatusBadGateway)
done = true
} }
go s.u.Run(s.ctx, s.srv.URL, "tcp4") s.u.Run(s.ctx, s.srv.URL, "tcp4")
s.Eventually(func() bool { time.Sleep(100 * time.Millisecond)
s.lock.Lock() s.ctxCancel()
defer s.lock.Unlock() s.u.Wait()
return done
}, time.Second, 10*time.Millisecond)
s.Len(s.u.tg.view.publicConfigs.v4, 0) s.Len(s.u.tg.view.publicConfigs.v4, 0)
} }
func (s *PublicConfigUpdaterTestSuite) TestEmptyFile() { func (s *PublicConfigUpdaterTestSuite) TestEmptyFile() {
done := false
s.responseHandler = func(w http.ResponseWriter) { s.responseHandler = func(w http.ResponseWriter) {
done = true
w.WriteHeader(http.StatusOK) w.WriteHeader(http.StatusOK)
} }
go s.u.Run(s.ctx, s.srv.URL, "tcp4") s.u.Run(s.ctx, s.srv.URL, "tcp4")
s.Eventually(func() bool { time.Sleep(100 * time.Millisecond)
s.lock.Lock() s.ctxCancel()
defer s.lock.Unlock() s.u.Wait()
return done
}, time.Second, 10*time.Millisecond)
s.Len(s.u.tg.view.publicConfigs.v4, 0) s.Len(s.u.tg.view.publicConfigs.v4, 0)
} }
@@ -85,21 +73,16 @@ proxy_for -1 -1;
proxy_for 100 100.10.0.0:3333; proxy_for 100 100.10.0.0:3333;
lala 0 0 lala 0 0
` `
done := false
s.responseHandler = func(w http.ResponseWriter) { s.responseHandler = func(w http.ResponseWriter) {
done = true
w.WriteHeader(http.StatusOK) w.WriteHeader(http.StatusOK)
w.Write([]byte(result)) //nolint: errcheck w.Write([]byte(result)) //nolint: errcheck
} }
go s.u.Run(s.ctx, s.srv.URL, "tcp4") s.u.Run(s.ctx, s.srv.URL, "tcp4")
s.Eventually(func() bool { time.Sleep(100 * time.Millisecond)
s.lock.Lock() s.ctxCancel()
defer s.lock.Unlock() s.u.Wait()
return done
}, time.Second, 10*time.Millisecond)
s.Len(s.u.tg.view.publicConfigs.v4, 0) s.Len(s.u.tg.view.publicConfigs.v4, 0)
} }
@@ -109,21 +92,16 @@ func (s *PublicConfigUpdaterTestSuite) TestOk() {
proxy_for 203 100.10.0.0:3333; proxy_for 203 100.10.0.0:3333;
proxy_for -100 101.10.0.0:3333; proxy_for -100 101.10.0.0:3333;
` `
done := false
s.responseHandler = func(w http.ResponseWriter) { s.responseHandler = func(w http.ResponseWriter) {
done = true
w.WriteHeader(http.StatusOK) w.WriteHeader(http.StatusOK)
w.Write([]byte(result)) //nolint: errcheck w.Write([]byte(result)) //nolint: errcheck
} }
go s.u.Run(s.ctx, s.srv.URL, "tcp4") s.u.Run(s.ctx, s.srv.URL, "tcp4")
s.Eventually(func() bool { time.Sleep(100 * time.Millisecond)
s.lock.Lock() s.ctxCancel()
defer s.lock.Unlock() s.u.Wait()
return done
}, time.Second, 10*time.Millisecond)
s.Len(s.u.tg.view.publicConfigs.v4, 1) s.Len(s.u.tg.view.publicConfigs.v4, 1)
s.Len(s.u.tg.view.publicConfigs.v4[203], 1) s.Len(s.u.tg.view.publicConfigs.v4[203], 1)
+29 -21
View File
@@ -2,38 +2,46 @@ package dc
import ( import (
"context" "context"
"sync"
"time" "time"
) )
type updater struct { type updater struct {
wg sync.WaitGroup
logger Logger logger Logger
period time.Duration period time.Duration
} }
func (u updater) run(ctx context.Context, callback func() error) { func (u *updater) Wait() {
ticker := time.NewTicker(u.period) u.wg.Wait()
}
defer func() { func (u *updater) run(ctx context.Context, callback func() error) {
ticker.Stop() u.wg.Go(func() {
ticker := time.NewTicker(u.period)
select { defer func() {
case <-ticker.C: ticker.Stop()
default:
} select {
}() case <-ticker.C:
default:
}
}()
for { for {
u.logger.Info("start update") u.logger.Info("start update")
if err := callback(); err != nil { if err := callback(); err != nil {
u.logger.WarningError("cannot update: %w", err) u.logger.WarningError("cannot update: %w", err)
} }
u.logger.Info("updated") u.logger.Info("updated")
select { select {
case <-ctx.Done(): case <-ctx.Done():
u.logger.Info("stop updating") u.logger.Info("stop updating")
return return
case <-ticker.C: case <-ticker.C:
}
} }
} })
} }
+9 -7
View File
@@ -30,6 +30,7 @@ type Proxy struct {
domainFrontingIP string domainFrontingIP string
workerPool *ants.PoolWithFunc workerPool *ants.PoolWithFunc
telegram *dc.Telegram telegram *dc.Telegram
configUpdater *dc.PublicConfigUpdater
clientObfuscatror obfuscation.Obfuscator clientObfuscatror obfuscation.Obfuscator
secret Secret secret Secret
@@ -152,6 +153,7 @@ func (p *Proxy) Shutdown() {
p.ctxCancel() p.ctxCancel()
p.streamWaitGroup.Wait() p.streamWaitGroup.Wait()
p.workerPool.Release() p.workerPool.Release()
p.configUpdater.Wait()
p.allowlist.Shutdown() p.allowlist.Shutdown()
p.blocklist.Shutdown() p.blocklist.Shutdown()
@@ -328,18 +330,18 @@ func NewProxy(opts ProxyOpts) (*Proxy, error) {
tolerateTimeSkewness: opts.getTolerateTimeSkewness(), tolerateTimeSkewness: opts.getTolerateTimeSkewness(),
allowFallbackOnUnknownDC: opts.AllowFallbackOnUnknownDC, allowFallbackOnUnknownDC: opts.AllowFallbackOnUnknownDC,
telegram: tg, telegram: tg,
configUpdater: dc.NewPublicConfigUpdater(
tg,
updatersLogger.Named("public-config"),
opts.Network.MakeHTTPClient(nil),
),
clientObfuscatror: obfuscation.Obfuscator{ clientObfuscatror: obfuscation.Obfuscator{
Secret: opts.Secret.Key[:], Secret: opts.Secret.Key[:],
}, },
} }
publicConfigUpdater := dc.NewPublicConfigUpdater( proxy.configUpdater.Run(ctx, dc.PublicConfigUpdateURLv4, "tcp4")
tg, proxy.configUpdater.Run(ctx, dc.PublicConfigUpdateURLv6, "tcp6")
updatersLogger.Named("public-config"),
opts.Network.MakeHTTPClient(nil),
)
go publicConfigUpdater.Run(ctx, dc.PublicConfigUpdateURLv4, "tcp4")
go publicConfigUpdater.Run(ctx, dc.PublicConfigUpdateURLv6, "tcp6")
pool, err := ants.NewPoolWithFunc(opts.getConcurrency(), pool, err := ants.NewPoolWithFunc(opts.getConcurrency(),
func(arg any) { func(arg any) {