Highly-opinionated (ex-bullshit-free) MTPROTO proxy for Telegram. If you use v1.0 or upgrade broke you proxy, please read the chapter Version 2
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

config_test.go 4.9KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164
  1. package config_test
  2. import (
  3. "os"
  4. "path/filepath"
  5. "testing"
  6. "github.com/9seconds/mtg/v2/internal/config"
  7. "github.com/stretchr/testify/suite"
  8. )
  9. type ConfigTestSuite struct {
  10. suite.Suite
  11. }
  12. func (suite *ConfigTestSuite) ReadConfig(filename string) []byte {
  13. data, err := os.ReadFile(filepath.Join("testdata", filename))
  14. suite.NoError(err)
  15. return data
  16. }
  17. func (suite *ConfigTestSuite) TestParseEmpty() {
  18. _, err := config.Parse([]byte{})
  19. suite.Error(err)
  20. }
  21. func (suite *ConfigTestSuite) TestParseBrokenToml() {
  22. _, err := config.Parse(suite.ReadConfig("broken.toml"))
  23. suite.Error(err)
  24. }
  25. func (suite *ConfigTestSuite) TestParseOnlySecret() {
  26. _, err := config.Parse(suite.ReadConfig("only_secret.toml"))
  27. suite.Error(err)
  28. }
  29. func (suite *ConfigTestSuite) TestParseMinimalConfig() {
  30. conf, err := config.Parse(suite.ReadConfig("minimal.toml"))
  31. suite.NoError(err)
  32. suite.Equal("7oe1GqLy6TBc38CV3jx7q09nb29nbGUuY29t", conf.Secret.Base64())
  33. suite.Equal("0.0.0.0:3128", conf.BindTo.String())
  34. }
  35. func (suite *ConfigTestSuite) TestParseLogTimeFormatDefault() {
  36. conf, err := config.Parse(suite.ReadConfig("minimal.toml"))
  37. suite.NoError(err)
  38. suite.Equal("unix-ms", conf.LogTimeFormat.Get("unix-ms"))
  39. }
  40. func (suite *ConfigTestSuite) TestParseLogTimeFormatPresets() {
  41. presets := []string{
  42. "unix", "unix-ms", "unix-micro", "unix-nano",
  43. "rfc3339", "rfc3339-nano",
  44. "2006-01-02 15:04:05",
  45. }
  46. for _, preset := range presets {
  47. preset := preset
  48. suite.Run(preset, func() {
  49. conf, err := config.Parse([]byte(`
  50. secret = "7oe1GqLy6TBc38CV3jx7q09nb29nbGUuY29t"
  51. bind-to = "0.0.0.0:3128"
  52. log-time-format = "` + preset + `"
  53. `))
  54. suite.NoError(err)
  55. suite.Equal(preset, conf.LogTimeFormat.Get("unix-ms"))
  56. })
  57. }
  58. }
  59. func (suite *ConfigTestSuite) TestParseLogTimeFormatEmptyIsUnset() {
  60. // An explicitly empty log-time-format is dropped by the TOML->JSON
  61. // omitempty step (the same as prefer-ip and every other optional
  62. // string field), so it is treated as unset and falls back to the
  63. // default. Rejection of a genuinely empty value is enforced by
  64. // TypeLogTimeFormat.Set, exercised in type_log_time_format_test.go.
  65. conf, err := config.Parse([]byte(`
  66. secret = "7oe1GqLy6TBc38CV3jx7q09nb29nbGUuY29t"
  67. bind-to = "0.0.0.0:3128"
  68. log-time-format = ""
  69. `))
  70. suite.NoError(err)
  71. suite.Equal("unix-ms", conf.LogTimeFormat.Get("unix-ms"))
  72. }
  73. func (suite *ConfigTestSuite) TestParsePublicIP() {
  74. conf, err := config.Parse(suite.ReadConfig("public_ip.toml"))
  75. suite.NoError(err)
  76. suite.Equal("203.0.113.1", conf.PublicIPv4.Get(nil).String())
  77. suite.Equal("2001:db8::1", conf.PublicIPv6.Get(nil).String())
  78. }
  79. func (suite *ConfigTestSuite) TestParsePublicIPv4Only() {
  80. conf, err := config.Parse(suite.ReadConfig("public_ip_v4_only.toml"))
  81. suite.NoError(err)
  82. suite.Equal("203.0.113.1", conf.PublicIPv4.Get(nil).String())
  83. suite.Nil(conf.PublicIPv6.Get(nil))
  84. }
  85. func (suite *ConfigTestSuite) TestParsePublicIPInvalid() {
  86. _, err := config.Parse(suite.ReadConfig("public_ip_invalid.toml"))
  87. suite.Error(err)
  88. }
  89. func (suite *ConfigTestSuite) TestParsePublicIPNotSet() {
  90. conf, err := config.Parse(suite.ReadConfig("minimal.toml"))
  91. suite.NoError(err)
  92. suite.Nil(conf.PublicIPv4.Get(nil))
  93. suite.Nil(conf.PublicIPv6.Get(nil))
  94. }
  95. func (suite *ConfigTestSuite) TestString() {
  96. conf, err := config.Parse(suite.ReadConfig("minimal.toml"))
  97. suite.NoError(err)
  98. suite.NotEmpty(conf.String())
  99. }
  100. func (suite *ConfigTestSuite) TestDomainFrontingIPIgnoredWhenHostSet() {
  101. conf, err := config.Parse(suite.ReadConfig("minimal.toml"))
  102. suite.NoError(err)
  103. suite.NoError(conf.DomainFronting.Host.Set("fronting-backend"))
  104. suite.NoError(conf.DomainFronting.IP.Set("10.0.0.10"))
  105. suite.NoError(conf.Validate())
  106. suite.Equal("fronting-backend", conf.GetDomainFrontingHost())
  107. }
  108. func (suite *ConfigTestSuite) TestDomainFrontingHostFromTOML() {
  109. conf, err := config.Parse(suite.ReadConfig("domain_fronting_host.toml"))
  110. suite.NoError(err)
  111. suite.NoError(conf.Validate())
  112. suite.Equal("fronting-backend", conf.GetDomainFrontingHost())
  113. }
  114. func (suite *ConfigTestSuite) TestDomainFrontingHostAcceptsLiteralIP() {
  115. conf, err := config.Parse(suite.ReadConfig("domain_fronting_host_ip.toml"))
  116. suite.NoError(err)
  117. suite.NoError(conf.Validate())
  118. suite.Equal("10.0.0.1", conf.GetDomainFrontingHost())
  119. }
  120. func (suite *ConfigTestSuite) TestDomainFrontingIPIgnoredFromTOML() {
  121. conf, err := config.Parse(suite.ReadConfig("domain_fronting_ip.toml"))
  122. suite.NoError(err)
  123. suite.NoError(conf.Validate())
  124. // Deprecated [domain-fronting].ip is parsed but never used to derive
  125. // the dial target — the user must migrate to [domain-fronting].host.
  126. suite.NotNil(conf.DomainFronting.IP.Get(nil))
  127. suite.Equal("", conf.GetDomainFrontingHost())
  128. }
  129. func (suite *ConfigTestSuite) TestDomainFrontingNotSet() {
  130. conf, err := config.Parse(suite.ReadConfig("minimal.toml"))
  131. suite.NoError(err)
  132. suite.NoError(conf.Validate())
  133. suite.Equal("", conf.GetDomainFrontingHost())
  134. }
  135. func TestConfig(t *testing.T) {
  136. t.Parallel()
  137. suite.Run(t, &ConfigTestSuite{})
  138. }