Przeglądaj źródła

Fix tests

tags/v2.1.11^2^2
9seconds 2 miesięcy temu
rodzic
commit
5b91edf5c4

+ 1
- 1
internal/cli/simple_run.go Wyświetl plik

18
 	TCPBuffer           string        `kong:"name='tcp-buffer',short='b',default='4KB',help='Deprecated and ignored'"`                                                 //nolint: lll
18
 	TCPBuffer           string        `kong:"name='tcp-buffer',short='b',default='4KB',help='Deprecated and ignored'"`                                                 //nolint: lll
19
 	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
19
 	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
20
 	DomainFrontingPort  uint64        `kong:"name='domain-fronting-port',short='p',default='443',help='A port to access for domain fronting.'"`                        //nolint: lll
20
 	DomainFrontingPort  uint64        `kong:"name='domain-fronting-port',short='p',default='443',help='A port to access for domain fronting.'"`                        //nolint: lll
21
-	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
21
+	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
22
 	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
22
 	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
23
 	Timeout             time.Duration `kong:"name='timeout',short='t',default='10s',help='Network timeout to use'"`                                                    //nolint: lll
23
 	Timeout             time.Duration `kong:"name='timeout',short='t',default='10s',help='Network timeout to use'"`                                                    //nolint: lll
24
 	Socks5Proxies       []string      `kong:"name='socks5-proxy',short='s',help='Socks5 proxies to use for network access.'"`                                          //nolint: lll
24
 	Socks5Proxies       []string      `kong:"name='socks5-proxy',short='s',help='Socks5 proxies to use for network access.'"`                                          //nolint: lll

+ 36
- 38
mtglib/internal/dc/init.go Wyświetl plik

38
 	Run(ctx context.Context)
38
 	Run(ctx context.Context)
39
 }
39
 }
40
 
40
 
41
-var (
42
-	// https://github.com/telegramdesktop/tdesktop/blob/master/Telegram/SourceFiles/mtproto/mtproto_dc_options.cpp#L30
43
-	defaultDCAddrSet = dcAddrSet{
44
-		v4: map[int][]Addr{
45
-			1: {
46
-				{Network: "tcp4", Address: "149.154.175.50:443"},
47
-			},
48
-			2: {
49
-				{Network: "tcp4", Address: "149.154.167.51:443"},
50
-				{Network: "tcp4", Address: "95.161.76.100:443"},
51
-			},
52
-			3: {
53
-				{Network: "tcp4", Address: "149.154.175.100:443"},
54
-			},
55
-			4: {
56
-				{Network: "tcp4", Address: "149.154.167.91:443"},
57
-			},
58
-			5: {
59
-				{Network: "tcp4", Address: "149.154.171.5:443"},
60
-			},
41
+// https://github.com/telegramdesktop/tdesktop/blob/master/Telegram/SourceFiles/mtproto/mtproto_dc_options.cpp#L30
42
+var defaultDCAddrSet = dcAddrSet{
43
+	v4: map[int][]Addr{
44
+		1: {
45
+			{Network: "tcp4", Address: "149.154.175.50:443"},
61
 		},
46
 		},
62
-		v6: map[int][]Addr{
63
-			1: {
64
-				{Network: "tcp6", Address: "[2001:b28:f23d:f001::a]:443"},
65
-			},
66
-			2: {
67
-				{Network: "tcp6", Address: "[2001:67c:04e8:f002::a]:443"},
68
-			},
69
-			3: {
70
-				{Network: "tcp6", Address: "[2001:b28:f23d:f003::a]:443"},
71
-			},
72
-			4: {
73
-				{Network: "tcp6", Address: "[2001:67c:04e8:f004::a]:443"},
74
-			},
75
-			5: {
76
-				{Network: "tcp6", Address: "[2001:b28:f23f:f005::a]:443"},
77
-			},
47
+		2: {
48
+			{Network: "tcp4", Address: "149.154.167.51:443"},
49
+			{Network: "tcp4", Address: "95.161.76.100:443"},
78
 		},
50
 		},
79
-	}
80
-)
51
+		3: {
52
+			{Network: "tcp4", Address: "149.154.175.100:443"},
53
+		},
54
+		4: {
55
+			{Network: "tcp4", Address: "149.154.167.91:443"},
56
+		},
57
+		5: {
58
+			{Network: "tcp4", Address: "149.154.171.5:443"},
59
+		},
60
+	},
61
+	v6: map[int][]Addr{
62
+		1: {
63
+			{Network: "tcp6", Address: "[2001:b28:f23d:f001::a]:443"},
64
+		},
65
+		2: {
66
+			{Network: "tcp6", Address: "[2001:67c:04e8:f002::a]:443"},
67
+		},
68
+		3: {
69
+			{Network: "tcp6", Address: "[2001:b28:f23d:f003::a]:443"},
70
+		},
71
+		4: {
72
+			{Network: "tcp6", Address: "[2001:67c:04e8:f004::a]:443"},
73
+		},
74
+		5: {
75
+			{Network: "tcp6", Address: "[2001:b28:f23f:f005::a]:443"},
76
+		},
77
+	},
78
+}

+ 3
- 3
mtglib/internal/dc/public_config_updater.go Wyświetl plik

19
 	tg   *Telegram
19
 	tg   *Telegram
20
 }
20
 }
21
 
21
 
22
-func (p PublicConfigUpdater) Run(ctx context.Context, url, network string) {
22
+func (p *PublicConfigUpdater) Run(ctx context.Context, url, network string) {
23
 	p.run(ctx, func() error {
23
 	p.run(ctx, func() error {
24
 		req, err := http.NewRequestWithContext(ctx, http.MethodGet, url, nil)
24
 		req, err := http.NewRequestWithContext(ctx, http.MethodGet, url, nil)
25
 		if err != nil {
25
 		if err != nil {
81
 	})
81
 	})
82
 }
82
 }
83
 
83
 
84
-func NewPublicConfigUpdater(tg *Telegram, logger Logger, client *http.Client) PublicConfigUpdater {
85
-	return PublicConfigUpdater{
84
+func NewPublicConfigUpdater(tg *Telegram, logger Logger, client *http.Client) *PublicConfigUpdater {
85
+	return &PublicConfigUpdater{
86
 		updater: updater{
86
 		updater: updater{
87
 			logger: logger,
87
 			logger: logger,
88
 			period: PublicConfigUpdateEach,
88
 			period: PublicConfigUpdateEach,

+ 17
- 39
mtglib/internal/dc/public_config_updater_test.go Wyświetl plik

14
 type PublicConfigUpdaterTestSuite struct {
14
 type PublicConfigUpdaterTestSuite struct {
15
 	UpdaterTestSuiteBase
15
 	UpdaterTestSuiteBase
16
 
16
 
17
-	u               PublicConfigUpdater
17
+	u               *PublicConfigUpdater
18
 	lock            sync.Mutex
18
 	lock            sync.Mutex
19
 	srv             *httptest.Server
19
 	srv             *httptest.Server
20
 	responseHandler func(w http.ResponseWriter)
20
 	responseHandler func(w http.ResponseWriter)
42
 }
42
 }
43
 
43
 
44
 func (s *PublicConfigUpdaterTestSuite) Test502StatusCode() {
44
 func (s *PublicConfigUpdaterTestSuite) Test502StatusCode() {
45
-	done := false
46
-
47
 	s.responseHandler = func(w http.ResponseWriter) {
45
 	s.responseHandler = func(w http.ResponseWriter) {
48
 		w.WriteHeader(http.StatusBadGateway)
46
 		w.WriteHeader(http.StatusBadGateway)
49
-		done = true
50
 	}
47
 	}
51
-	go s.u.Run(s.ctx, s.srv.URL, "tcp4")
52
-
53
-	s.Eventually(func() bool {
54
-		s.lock.Lock()
55
-		defer s.lock.Unlock()
48
+	s.u.Run(s.ctx, s.srv.URL, "tcp4")
56
 
49
 
57
-		return done
58
-	}, time.Second, 10*time.Millisecond)
50
+	time.Sleep(100 * time.Millisecond)
51
+	s.ctxCancel()
52
+	s.u.Wait()
59
 
53
 
60
 	s.Len(s.u.tg.view.publicConfigs.v4, 0)
54
 	s.Len(s.u.tg.view.publicConfigs.v4, 0)
61
 }
55
 }
62
 
56
 
63
 func (s *PublicConfigUpdaterTestSuite) TestEmptyFile() {
57
 func (s *PublicConfigUpdaterTestSuite) TestEmptyFile() {
64
-	done := false
65
-
66
 	s.responseHandler = func(w http.ResponseWriter) {
58
 	s.responseHandler = func(w http.ResponseWriter) {
67
-		done = true
68
 		w.WriteHeader(http.StatusOK)
59
 		w.WriteHeader(http.StatusOK)
69
 	}
60
 	}
70
-	go s.u.Run(s.ctx, s.srv.URL, "tcp4")
71
-
72
-	s.Eventually(func() bool {
73
-		s.lock.Lock()
74
-		defer s.lock.Unlock()
61
+	s.u.Run(s.ctx, s.srv.URL, "tcp4")
75
 
62
 
76
-		return done
77
-	}, time.Second, 10*time.Millisecond)
63
+	time.Sleep(100 * time.Millisecond)
64
+	s.ctxCancel()
65
+	s.u.Wait()
78
 
66
 
79
 	s.Len(s.u.tg.view.publicConfigs.v4, 0)
67
 	s.Len(s.u.tg.view.publicConfigs.v4, 0)
80
 }
68
 }
85
 proxy_for 100 100.10.0.0:3333;
73
 proxy_for 100 100.10.0.0:3333;
86
 lala 0 0
74
 lala 0 0
87
 `
75
 `
88
-	done := false
89
 
76
 
90
 	s.responseHandler = func(w http.ResponseWriter) {
77
 	s.responseHandler = func(w http.ResponseWriter) {
91
-		done = true
92
 		w.WriteHeader(http.StatusOK)
78
 		w.WriteHeader(http.StatusOK)
93
 		w.Write([]byte(result)) //nolint: errcheck
79
 		w.Write([]byte(result)) //nolint: errcheck
94
 	}
80
 	}
95
-	go s.u.Run(s.ctx, s.srv.URL, "tcp4")
96
-
97
-	s.Eventually(func() bool {
98
-		s.lock.Lock()
99
-		defer s.lock.Unlock()
81
+	s.u.Run(s.ctx, s.srv.URL, "tcp4")
100
 
82
 
101
-		return done
102
-	}, time.Second, 10*time.Millisecond)
83
+	time.Sleep(100 * time.Millisecond)
84
+	s.ctxCancel()
85
+	s.u.Wait()
103
 
86
 
104
 	s.Len(s.u.tg.view.publicConfigs.v4, 0)
87
 	s.Len(s.u.tg.view.publicConfigs.v4, 0)
105
 }
88
 }
109
 proxy_for 203 100.10.0.0:3333;
92
 proxy_for 203 100.10.0.0:3333;
110
 proxy_for -100 101.10.0.0:3333;
93
 proxy_for -100 101.10.0.0:3333;
111
 `
94
 `
112
-	done := false
113
 
95
 
114
 	s.responseHandler = func(w http.ResponseWriter) {
96
 	s.responseHandler = func(w http.ResponseWriter) {
115
-		done = true
116
 		w.WriteHeader(http.StatusOK)
97
 		w.WriteHeader(http.StatusOK)
117
 		w.Write([]byte(result)) //nolint: errcheck
98
 		w.Write([]byte(result)) //nolint: errcheck
118
 	}
99
 	}
119
-	go s.u.Run(s.ctx, s.srv.URL, "tcp4")
120
-
121
-	s.Eventually(func() bool {
122
-		s.lock.Lock()
123
-		defer s.lock.Unlock()
100
+	s.u.Run(s.ctx, s.srv.URL, "tcp4")
124
 
101
 
125
-		return done
126
-	}, time.Second, 10*time.Millisecond)
102
+	time.Sleep(100 * time.Millisecond)
103
+	s.ctxCancel()
104
+	s.u.Wait()
127
 
105
 
128
 	s.Len(s.u.tg.view.publicConfigs.v4, 1)
106
 	s.Len(s.u.tg.view.publicConfigs.v4, 1)
129
 	s.Len(s.u.tg.view.publicConfigs.v4[203], 1)
107
 	s.Len(s.u.tg.view.publicConfigs.v4[203], 1)

+ 29
- 21
mtglib/internal/dc/updater.go Wyświetl plik

2
 
2
 
3
 import (
3
 import (
4
 	"context"
4
 	"context"
5
+	"sync"
5
 	"time"
6
 	"time"
6
 )
7
 )
7
 
8
 
8
 type updater struct {
9
 type updater struct {
10
+	wg     sync.WaitGroup
9
 	logger Logger
11
 	logger Logger
10
 	period time.Duration
12
 	period time.Duration
11
 }
13
 }
12
 
14
 
13
-func (u updater) run(ctx context.Context, callback func() error) {
14
-	ticker := time.NewTicker(u.period)
15
+func (u *updater) Wait() {
16
+	u.wg.Wait()
17
+}
15
 
18
 
16
-	defer func() {
17
-		ticker.Stop()
19
+func (u *updater) run(ctx context.Context, callback func() error) {
20
+	u.wg.Go(func() {
21
+		ticker := time.NewTicker(u.period)
18
 
22
 
19
-		select {
20
-		case <-ticker.C:
21
-		default:
22
-		}
23
-	}()
23
+		defer func() {
24
+			ticker.Stop()
24
 
25
 
25
-	for {
26
-		u.logger.Info("start update")
27
-		if err := callback(); err != nil {
28
-			u.logger.WarningError("cannot update: %w", err)
29
-		}
30
-		u.logger.Info("updated")
26
+			select {
27
+			case <-ticker.C:
28
+			default:
29
+			}
30
+		}()
31
+
32
+		for {
33
+			u.logger.Info("start update")
34
+			if err := callback(); err != nil {
35
+				u.logger.WarningError("cannot update: %w", err)
36
+			}
37
+			u.logger.Info("updated")
31
 
38
 
32
-		select {
33
-		case <-ctx.Done():
34
-			u.logger.Info("stop updating")
35
-			return
36
-		case <-ticker.C:
39
+			select {
40
+			case <-ctx.Done():
41
+				u.logger.Info("stop updating")
42
+				return
43
+			case <-ticker.C:
44
+			}
37
 		}
45
 		}
38
-	}
46
+	})
39
 }
47
 }

+ 9
- 7
mtglib/proxy.go Wyświetl plik

30
 	domainFrontingIP         string
30
 	domainFrontingIP         string
31
 	workerPool               *ants.PoolWithFunc
31
 	workerPool               *ants.PoolWithFunc
32
 	telegram                 *dc.Telegram
32
 	telegram                 *dc.Telegram
33
+	configUpdater            *dc.PublicConfigUpdater
33
 	clientObfuscatror        obfuscation.Obfuscator
34
 	clientObfuscatror        obfuscation.Obfuscator
34
 
35
 
35
 	secret          Secret
36
 	secret          Secret
152
 	p.ctxCancel()
153
 	p.ctxCancel()
153
 	p.streamWaitGroup.Wait()
154
 	p.streamWaitGroup.Wait()
154
 	p.workerPool.Release()
155
 	p.workerPool.Release()
156
+	p.configUpdater.Wait()
155
 
157
 
156
 	p.allowlist.Shutdown()
158
 	p.allowlist.Shutdown()
157
 	p.blocklist.Shutdown()
159
 	p.blocklist.Shutdown()
328
 		tolerateTimeSkewness:     opts.getTolerateTimeSkewness(),
330
 		tolerateTimeSkewness:     opts.getTolerateTimeSkewness(),
329
 		allowFallbackOnUnknownDC: opts.AllowFallbackOnUnknownDC,
331
 		allowFallbackOnUnknownDC: opts.AllowFallbackOnUnknownDC,
330
 		telegram:                 tg,
332
 		telegram:                 tg,
333
+		configUpdater: dc.NewPublicConfigUpdater(
334
+			tg,
335
+			updatersLogger.Named("public-config"),
336
+			opts.Network.MakeHTTPClient(nil),
337
+		),
331
 		clientObfuscatror: obfuscation.Obfuscator{
338
 		clientObfuscatror: obfuscation.Obfuscator{
332
 			Secret: opts.Secret.Key[:],
339
 			Secret: opts.Secret.Key[:],
333
 		},
340
 		},
334
 	}
341
 	}
335
 
342
 
336
-	publicConfigUpdater := dc.NewPublicConfigUpdater(
337
-		tg,
338
-		updatersLogger.Named("public-config"),
339
-		opts.Network.MakeHTTPClient(nil),
340
-	)
341
-	go publicConfigUpdater.Run(ctx, dc.PublicConfigUpdateURLv4, "tcp4")
342
-	go publicConfigUpdater.Run(ctx, dc.PublicConfigUpdateURLv6, "tcp6")
343
+	proxy.configUpdater.Run(ctx, dc.PublicConfigUpdateURLv4, "tcp4")
344
+	proxy.configUpdater.Run(ctx, dc.PublicConfigUpdateURLv6, "tcp6")
343
 
345
 
344
 	pool, err := ants.NewPoolWithFunc(opts.getConcurrency(),
346
 	pool, err := ants.NewPoolWithFunc(opts.getConcurrency(),
345
 		func(arg any) {
347
 		func(arg any) {

Ładowanie…
Anuluj
Zapisz