config_test.go 16 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476
  1. package server
  2. import (
  3. "io/ioutil"
  4. "os"
  5. "testing"
  6. "github.com/BurntSushi/toml"
  7. "github.com/stretchr/testify/assert"
  8. )
  9. // Ensures that a configuration can be deserialized from TOML.
  10. func TestConfigTOML(t *testing.T) {
  11. content := `
  12. addr = "127.0.0.1:4002"
  13. ca_file = "/tmp/file.ca"
  14. cert_file = "/tmp/file.cert"
  15. cors_origins = ["*"]
  16. cpu_profile_file = "XXX"
  17. data_dir = "/tmp/data"
  18. key_file = "/tmp/file.key"
  19. bind_addr = "127.0.0.1:4003"
  20. peers = ["coreos.com:4001", "coreos.com:4002"]
  21. peers_file = "/tmp/peers"
  22. max_cluster_size = 10
  23. max_result_buffer = 512
  24. max_retry_attempts = 5
  25. name = "test-name"
  26. snapshot = true
  27. verbose = true
  28. very_verbose = true
  29. web_url = "/web"
  30. [peer]
  31. addr = "127.0.0.1:7002"
  32. ca_file = "/tmp/peer/file.ca"
  33. cert_file = "/tmp/peer/file.cert"
  34. key_file = "/tmp/peer/file.key"
  35. bind_addr = "127.0.0.1:7003"
  36. `
  37. c := NewConfig()
  38. _, err := toml.Decode(content, &c)
  39. assert.Nil(t, err, "")
  40. assert.Equal(t, c.Addr, "127.0.0.1:4002", "")
  41. assert.Equal(t, c.CAFile, "/tmp/file.ca", "")
  42. assert.Equal(t, c.CertFile, "/tmp/file.cert", "")
  43. assert.Equal(t, c.CorsOrigins, []string{"*"}, "")
  44. assert.Equal(t, c.DataDir, "/tmp/data", "")
  45. assert.Equal(t, c.KeyFile, "/tmp/file.key", "")
  46. assert.Equal(t, c.BindAddr, "127.0.0.1:4003", "")
  47. assert.Equal(t, c.Peers, []string{"coreos.com:4001", "coreos.com:4002"}, "")
  48. assert.Equal(t, c.PeersFile, "/tmp/peers", "")
  49. assert.Equal(t, c.MaxClusterSize, 10, "")
  50. assert.Equal(t, c.MaxResultBuffer, 512, "")
  51. assert.Equal(t, c.MaxRetryAttempts, 5, "")
  52. assert.Equal(t, c.Name, "test-name", "")
  53. assert.Equal(t, c.Snapshot, true, "")
  54. assert.Equal(t, c.Verbose, true, "")
  55. assert.Equal(t, c.VeryVerbose, true, "")
  56. assert.Equal(t, c.WebURL, "/web", "")
  57. assert.Equal(t, c.Peer.Addr, "127.0.0.1:7002", "")
  58. assert.Equal(t, c.Peer.CAFile, "/tmp/peer/file.ca", "")
  59. assert.Equal(t, c.Peer.CertFile, "/tmp/peer/file.cert", "")
  60. assert.Equal(t, c.Peer.KeyFile, "/tmp/peer/file.key", "")
  61. assert.Equal(t, c.Peer.BindAddr, "127.0.0.1:7003", "")
  62. }
  63. // Ensures that a configuration can be retrieved from environment variables.
  64. func TestConfigEnv(t *testing.T) {
  65. os.Setenv("ETCD_CA_FILE", "/tmp/file.ca")
  66. os.Setenv("ETCD_CERT_FILE", "/tmp/file.cert")
  67. os.Setenv("ETCD_CPU_PROFILE_FILE", "XXX")
  68. os.Setenv("ETCD_CORS_ORIGINS", "localhost:4001,localhost:4002")
  69. os.Setenv("ETCD_DATA_DIR", "/tmp/data")
  70. os.Setenv("ETCD_KEY_FILE", "/tmp/file.key")
  71. os.Setenv("ETCD_BIND_ADDR", "127.0.0.1:4003")
  72. os.Setenv("ETCD_PEERS", "coreos.com:4001,coreos.com:4002")
  73. os.Setenv("ETCD_PEERS_FILE", "/tmp/peers")
  74. os.Setenv("ETCD_MAX_CLUSTER_SIZE", "10")
  75. os.Setenv("ETCD_MAX_RESULT_BUFFER", "512")
  76. os.Setenv("ETCD_MAX_RETRY_ATTEMPTS", "5")
  77. os.Setenv("ETCD_NAME", "test-name")
  78. os.Setenv("ETCD_SNAPSHOT", "true")
  79. os.Setenv("ETCD_VERBOSE", "1")
  80. os.Setenv("ETCD_VERY_VERBOSE", "yes")
  81. os.Setenv("ETCD_WEB_URL", "/web")
  82. os.Setenv("ETCD_PEER_ADDR", "127.0.0.1:7002")
  83. os.Setenv("ETCD_PEER_CA_FILE", "/tmp/peer/file.ca")
  84. os.Setenv("ETCD_PEER_CERT_FILE", "/tmp/peer/file.cert")
  85. os.Setenv("ETCD_PEER_KEY_FILE", "/tmp/peer/file.key")
  86. os.Setenv("ETCD_PEER_BIND_ADDR", "127.0.0.1:7003")
  87. c := NewConfig()
  88. c.LoadEnv()
  89. assert.Equal(t, c.CAFile, "/tmp/file.ca", "")
  90. assert.Equal(t, c.CertFile, "/tmp/file.cert", "")
  91. assert.Equal(t, c.CorsOrigins, []string{"localhost:4001", "localhost:4002"}, "")
  92. assert.Equal(t, c.DataDir, "/tmp/data", "")
  93. assert.Equal(t, c.KeyFile, "/tmp/file.key", "")
  94. assert.Equal(t, c.BindAddr, "127.0.0.1:4003", "")
  95. assert.Equal(t, c.Peers, []string{"coreos.com:4001", "coreos.com:4002"}, "")
  96. assert.Equal(t, c.PeersFile, "/tmp/peers", "")
  97. assert.Equal(t, c.MaxClusterSize, 10, "")
  98. assert.Equal(t, c.MaxResultBuffer, 512, "")
  99. assert.Equal(t, c.MaxRetryAttempts, 5, "")
  100. assert.Equal(t, c.Name, "test-name", "")
  101. assert.Equal(t, c.Snapshot, true, "")
  102. assert.Equal(t, c.Verbose, true, "")
  103. assert.Equal(t, c.VeryVerbose, true, "")
  104. assert.Equal(t, c.WebURL, "/web", "")
  105. assert.Equal(t, c.Peer.Addr, "127.0.0.1:7002", "")
  106. assert.Equal(t, c.Peer.CAFile, "/tmp/peer/file.ca", "")
  107. assert.Equal(t, c.Peer.CertFile, "/tmp/peer/file.cert", "")
  108. assert.Equal(t, c.Peer.KeyFile, "/tmp/peer/file.key", "")
  109. assert.Equal(t, c.Peer.BindAddr, "127.0.0.1:7003", "")
  110. }
  111. // Ensures that a the advertised url can be parsed from the environment.
  112. func TestConfigAddrEnv(t *testing.T) {
  113. withEnv("ETCD_ADDR", "127.0.0.1:4002", func(c *Config) {
  114. assert.Nil(t, c.LoadEnv(), "")
  115. assert.Equal(t, c.Addr, "127.0.0.1:4002", "")
  116. })
  117. }
  118. // Ensures that a the advertised flag can be parsed.
  119. func TestConfigAddrFlag(t *testing.T) {
  120. c := NewConfig()
  121. assert.Nil(t, c.LoadFlags([]string{"-addr", "127.0.0.1:4002"}), "")
  122. assert.Equal(t, c.Addr, "127.0.0.1:4002", "")
  123. }
  124. // Ensures that a the CA file can be parsed from the environment.
  125. func TestConfigCAFileEnv(t *testing.T) {
  126. withEnv("ETCD_CA_FILE", "/tmp/file.ca", func(c *Config) {
  127. assert.Nil(t, c.LoadEnv(), "")
  128. assert.Equal(t, c.CAFile, "/tmp/file.ca", "")
  129. })
  130. }
  131. // Ensures that a the CA file flag can be parsed.
  132. func TestConfigCAFileFlag(t *testing.T) {
  133. c := NewConfig()
  134. assert.Nil(t, c.LoadFlags([]string{"-ca-file", "/tmp/file.ca"}), "")
  135. assert.Equal(t, c.CAFile, "/tmp/file.ca", "")
  136. }
  137. // Ensures that a the CA file can be parsed from the environment.
  138. func TestConfigCertFileEnv(t *testing.T) {
  139. withEnv("ETCD_CERT_FILE", "/tmp/file.cert", func(c *Config) {
  140. assert.Nil(t, c.LoadEnv(), "")
  141. assert.Equal(t, c.CertFile, "/tmp/file.cert", "")
  142. })
  143. }
  144. // Ensures that a the Cert file flag can be parsed.
  145. func TestConfigCertFileFlag(t *testing.T) {
  146. c := NewConfig()
  147. assert.Nil(t, c.LoadFlags([]string{"-cert-file", "/tmp/file.cert"}), "")
  148. assert.Equal(t, c.CertFile, "/tmp/file.cert", "")
  149. }
  150. // Ensures that a the Key file can be parsed from the environment.
  151. func TestConfigKeyFileEnv(t *testing.T) {
  152. withEnv("ETCD_KEY_FILE", "/tmp/file.key", func(c *Config) {
  153. assert.Nil(t, c.LoadEnv(), "")
  154. assert.Equal(t, c.KeyFile, "/tmp/file.key", "")
  155. })
  156. }
  157. // Ensures that a the Key file flag can be parsed.
  158. func TestConfigKeyFileFlag(t *testing.T) {
  159. c := NewConfig()
  160. assert.Nil(t, c.LoadFlags([]string{"-key-file", "/tmp/file.key"}), "")
  161. assert.Equal(t, c.KeyFile, "/tmp/file.key", "")
  162. }
  163. // Ensures that a the Listen Host can be parsed from the environment.
  164. func TestConfigBindAddrEnv(t *testing.T) {
  165. withEnv("ETCD_BIND_ADDR", "127.0.0.1:4003", func(c *Config) {
  166. assert.Nil(t, c.LoadEnv(), "")
  167. assert.Equal(t, c.BindAddr, "127.0.0.1:4003", "")
  168. })
  169. }
  170. // Ensures that a the Listen Host file flag can be parsed.
  171. func TestConfigBindAddrFlag(t *testing.T) {
  172. c := NewConfig()
  173. assert.Nil(t, c.LoadFlags([]string{"-bind-addr", "127.0.0.1:4003"}), "")
  174. assert.Equal(t, c.BindAddr, "127.0.0.1:4003", "")
  175. }
  176. // Ensures that the peers can be parsed from the environment.
  177. func TestConfigPeersEnv(t *testing.T) {
  178. withEnv("ETCD_PEERS", "coreos.com:4001,coreos.com:4002", func(c *Config) {
  179. assert.Nil(t, c.LoadEnv(), "")
  180. assert.Equal(t, c.Peers, []string{"coreos.com:4001", "coreos.com:4002"}, "")
  181. })
  182. }
  183. // Ensures that a the Peers flag can be parsed.
  184. func TestConfigPeersFlag(t *testing.T) {
  185. c := NewConfig()
  186. assert.Nil(t, c.LoadFlags([]string{"-peers", "coreos.com:4001,coreos.com:4002"}), "")
  187. assert.Equal(t, c.Peers, []string{"coreos.com:4001", "coreos.com:4002"}, "")
  188. }
  189. // Ensures that the Peers File can be parsed from the environment.
  190. func TestConfigPeersFileEnv(t *testing.T) {
  191. withEnv("ETCD_PEERS_FILE", "/tmp/peers", func(c *Config) {
  192. assert.Nil(t, c.LoadEnv(), "")
  193. assert.Equal(t, c.PeersFile, "/tmp/peers", "")
  194. })
  195. }
  196. // Ensures that a the Peers File flag can be parsed.
  197. func TestConfigPeersFileFlag(t *testing.T) {
  198. c := NewConfig()
  199. assert.Nil(t, c.LoadFlags([]string{"-peers-file", "/tmp/peers"}), "")
  200. assert.Equal(t, c.PeersFile, "/tmp/peers", "")
  201. }
  202. // Ensures that the Max Cluster Size can be parsed from the environment.
  203. func TestConfigMaxClusterSizeEnv(t *testing.T) {
  204. withEnv("ETCD_MAX_CLUSTER_SIZE", "5", func(c *Config) {
  205. assert.Nil(t, c.LoadEnv(), "")
  206. assert.Equal(t, c.MaxClusterSize, 5, "")
  207. })
  208. }
  209. // Ensures that a the Max Cluster Size flag can be parsed.
  210. func TestConfigMaxClusterSizeFlag(t *testing.T) {
  211. c := NewConfig()
  212. assert.Nil(t, c.LoadFlags([]string{"-max-cluster-size", "5"}), "")
  213. assert.Equal(t, c.MaxClusterSize, 5, "")
  214. }
  215. // Ensures that the Max Result Buffer can be parsed from the environment.
  216. func TestConfigMaxResultBufferEnv(t *testing.T) {
  217. withEnv("ETCD_MAX_RESULT_BUFFER", "512", func(c *Config) {
  218. assert.Nil(t, c.LoadEnv(), "")
  219. assert.Equal(t, c.MaxResultBuffer, 512, "")
  220. })
  221. }
  222. // Ensures that a the Max Result Buffer flag can be parsed.
  223. func TestConfigMaxResultBufferFlag(t *testing.T) {
  224. c := NewConfig()
  225. assert.Nil(t, c.LoadFlags([]string{"-max-result-buffer", "512"}), "")
  226. assert.Equal(t, c.MaxResultBuffer, 512, "")
  227. }
  228. // Ensures that the Max Retry Attempts can be parsed from the environment.
  229. func TestConfigMaxRetryAttemptsEnv(t *testing.T) {
  230. withEnv("ETCD_MAX_RETRY_ATTEMPTS", "10", func(c *Config) {
  231. assert.Nil(t, c.LoadEnv(), "")
  232. assert.Equal(t, c.MaxRetryAttempts, 10, "")
  233. })
  234. }
  235. // Ensures that a the Max Retry Attempts flag can be parsed.
  236. func TestConfigMaxRetryAttemptsFlag(t *testing.T) {
  237. c := NewConfig()
  238. assert.Nil(t, c.LoadFlags([]string{"-max-retry-attempts", "10"}), "")
  239. assert.Equal(t, c.MaxRetryAttempts, 10, "")
  240. }
  241. // Ensures that the Name can be parsed from the environment.
  242. func TestConfigNameEnv(t *testing.T) {
  243. withEnv("ETCD_NAME", "test-name", func(c *Config) {
  244. assert.Nil(t, c.LoadEnv(), "")
  245. assert.Equal(t, c.Name, "test-name", "")
  246. })
  247. }
  248. // Ensures that a the Name flag can be parsed.
  249. func TestConfigNameFlag(t *testing.T) {
  250. c := NewConfig()
  251. assert.Nil(t, c.LoadFlags([]string{"-name", "test-name"}), "")
  252. assert.Equal(t, c.Name, "test-name", "")
  253. }
  254. // Ensures that Snapshot can be parsed from the environment.
  255. func TestConfigSnapshotEnv(t *testing.T) {
  256. withEnv("ETCD_SNAPSHOT", "1", func(c *Config) {
  257. assert.Nil(t, c.LoadEnv(), "")
  258. assert.Equal(t, c.Snapshot, true, "")
  259. })
  260. }
  261. // Ensures that a the Snapshot flag can be parsed.
  262. func TestConfigSnapshotFlag(t *testing.T) {
  263. c := NewConfig()
  264. assert.Nil(t, c.LoadFlags([]string{"-snapshot"}), "")
  265. assert.Equal(t, c.Snapshot, true, "")
  266. }
  267. // Ensures that Verbose can be parsed from the environment.
  268. func TestConfigVerboseEnv(t *testing.T) {
  269. withEnv("ETCD_VERBOSE", "true", func(c *Config) {
  270. assert.Nil(t, c.LoadEnv(), "")
  271. assert.Equal(t, c.Verbose, true, "")
  272. })
  273. }
  274. // Ensures that a the Verbose flag can be parsed.
  275. func TestConfigVerboseFlag(t *testing.T) {
  276. c := NewConfig()
  277. assert.Nil(t, c.LoadFlags([]string{"-v"}), "")
  278. assert.Equal(t, c.Verbose, true, "")
  279. }
  280. // Ensures that Very Verbose can be parsed from the environment.
  281. func TestConfigVeryVerboseEnv(t *testing.T) {
  282. withEnv("ETCD_VERY_VERBOSE", "true", func(c *Config) {
  283. assert.Nil(t, c.LoadEnv(), "")
  284. assert.Equal(t, c.VeryVerbose, true, "")
  285. })
  286. }
  287. // Ensures that a the Very Verbose flag can be parsed.
  288. func TestConfigVeryVerboseFlag(t *testing.T) {
  289. c := NewConfig()
  290. assert.Nil(t, c.LoadFlags([]string{"-vv"}), "")
  291. assert.Equal(t, c.VeryVerbose, true, "")
  292. }
  293. // Ensures that Web URL can be parsed from the environment.
  294. func TestConfigWebURLEnv(t *testing.T) {
  295. withEnv("ETCD_WEB_URL", "/web", func(c *Config) {
  296. assert.Nil(t, c.LoadEnv(), "")
  297. assert.Equal(t, c.WebURL, "/web", "")
  298. })
  299. }
  300. // Ensures that a the Web URL flag can be parsed.
  301. func TestConfigWebURLFlag(t *testing.T) {
  302. c := NewConfig()
  303. assert.Nil(t, c.LoadFlags([]string{"-web-url", "/web"}), "")
  304. assert.Equal(t, c.WebURL, "/web", "")
  305. }
  306. // Ensures that the Peer Advertised URL can be parsed from the environment.
  307. func TestConfigPeerAddrEnv(t *testing.T) {
  308. withEnv("ETCD_PEER_ADDR", "localhost:7002", func(c *Config) {
  309. assert.Nil(t, c.LoadEnv(), "")
  310. assert.Equal(t, c.Peer.Addr, "localhost:7002", "")
  311. })
  312. }
  313. // Ensures that a the Peer Advertised URL flag can be parsed.
  314. func TestConfigPeerAddrFlag(t *testing.T) {
  315. c := NewConfig()
  316. assert.Nil(t, c.LoadFlags([]string{"-peer-addr", "localhost:7002"}), "")
  317. assert.Equal(t, c.Peer.Addr, "localhost:7002", "")
  318. }
  319. // Ensures that the Peer CA File can be parsed from the environment.
  320. func TestConfigPeerCAFileEnv(t *testing.T) {
  321. withEnv("ETCD_PEER_CA_FILE", "/tmp/peer/file.ca", func(c *Config) {
  322. assert.Nil(t, c.LoadEnv(), "")
  323. assert.Equal(t, c.Peer.CAFile, "/tmp/peer/file.ca", "")
  324. })
  325. }
  326. // Ensures that a the Peer CA file flag can be parsed.
  327. func TestConfigPeerCAFileFlag(t *testing.T) {
  328. c := NewConfig()
  329. assert.Nil(t, c.LoadFlags([]string{"-peer-ca-file", "/tmp/peer/file.ca"}), "")
  330. assert.Equal(t, c.Peer.CAFile, "/tmp/peer/file.ca", "")
  331. }
  332. // Ensures that the Peer Cert File can be parsed from the environment.
  333. func TestConfigPeerCertFileEnv(t *testing.T) {
  334. withEnv("ETCD_PEER_CERT_FILE", "/tmp/peer/file.cert", func(c *Config) {
  335. assert.Nil(t, c.LoadEnv(), "")
  336. assert.Equal(t, c.Peer.CertFile, "/tmp/peer/file.cert", "")
  337. })
  338. }
  339. // Ensures that a the Cert file flag can be parsed.
  340. func TestConfigPeerCertFileFlag(t *testing.T) {
  341. c := NewConfig()
  342. assert.Nil(t, c.LoadFlags([]string{"-peer-cert-file", "/tmp/peer/file.cert"}), "")
  343. assert.Equal(t, c.Peer.CertFile, "/tmp/peer/file.cert", "")
  344. }
  345. // Ensures that the Peer Key File can be parsed from the environment.
  346. func TestConfigPeerKeyFileEnv(t *testing.T) {
  347. withEnv("ETCD_PEER_KEY_FILE", "/tmp/peer/file.key", func(c *Config) {
  348. assert.Nil(t, c.LoadEnv(), "")
  349. assert.Equal(t, c.Peer.KeyFile, "/tmp/peer/file.key", "")
  350. })
  351. }
  352. // Ensures that a the Peer Key file flag can be parsed.
  353. func TestConfigPeerKeyFileFlag(t *testing.T) {
  354. c := NewConfig()
  355. assert.Nil(t, c.LoadFlags([]string{"-peer-key-file", "/tmp/peer/file.key"}), "")
  356. assert.Equal(t, c.Peer.KeyFile, "/tmp/peer/file.key", "")
  357. }
  358. // Ensures that the Peer Listen Host can be parsed from the environment.
  359. func TestConfigPeerBindAddrEnv(t *testing.T) {
  360. withEnv("ETCD_PEER_BIND_ADDR", "localhost:7004", func(c *Config) {
  361. assert.Nil(t, c.LoadEnv(), "")
  362. assert.Equal(t, c.Peer.BindAddr, "localhost:7004", "")
  363. })
  364. }
  365. // Ensures that a the Peer Listen Host file flag can be parsed.
  366. func TestConfigPeerBindAddrFlag(t *testing.T) {
  367. c := NewConfig()
  368. assert.Nil(t, c.LoadFlags([]string{"-peer-bind-addr", "127.0.0.1:4003"}), "")
  369. assert.Equal(t, c.Peer.BindAddr, "127.0.0.1:4003", "")
  370. }
  371. // Ensures that a system config field is overridden by a custom config field.
  372. func TestConfigCustomConfigOverrideSystemConfig(t *testing.T) {
  373. system := `addr = "127.0.0.1:5000"`
  374. custom := `addr = "127.0.0.1:6000"`
  375. withTempFile(system, func(p1 string) {
  376. withTempFile(custom, func(p2 string) {
  377. c := NewConfig()
  378. c.SystemPath = p1
  379. assert.Nil(t, c.Load([]string{"-config", p2}), "")
  380. assert.Equal(t, c.Addr, "http://127.0.0.1:6000", "")
  381. })
  382. })
  383. }
  384. // Ensures that a custom config field is overridden by an environment variable.
  385. func TestConfigEnvVarOverrideCustomConfig(t *testing.T) {
  386. os.Setenv("ETCD_PEER_ADDR", "127.0.0.1:8000")
  387. defer os.Setenv("ETCD_PEER_ADDR", "")
  388. custom := `[peer]` + "\n" + `advertised_url = "127.0.0.1:9000"`
  389. withTempFile(custom, func(path string) {
  390. c := NewConfig()
  391. c.SystemPath = ""
  392. assert.Nil(t, c.Load([]string{"-config", path}), "")
  393. assert.Equal(t, c.Peer.Addr, "http://127.0.0.1:8000", "")
  394. })
  395. }
  396. // Ensures that an environment variable field is overridden by a command line argument.
  397. func TestConfigCLIArgsOverrideEnvVar(t *testing.T) {
  398. os.Setenv("ETCD_ADDR", "127.0.0.1:1000")
  399. defer os.Setenv("ETCD_ADDR", "")
  400. c := NewConfig()
  401. c.SystemPath = ""
  402. assert.Nil(t, c.Load([]string{"-addr", "127.0.0.1:2000"}), "")
  403. assert.Equal(t, c.Addr, "http://127.0.0.1:2000", "")
  404. }
  405. //--------------------------------------
  406. // Helpers
  407. //--------------------------------------
  408. // Sets up the environment with a given environment variable set.
  409. func withEnv(key, value string, f func(c *Config)) {
  410. os.Setenv(key, value)
  411. defer os.Setenv(key, "")
  412. c := NewConfig()
  413. f(c)
  414. }
  415. // Creates a temp file and calls a function with the context.
  416. func withTempFile(content string, fn func(string)) {
  417. f, _ := ioutil.TempFile("", "")
  418. f.WriteString(content)
  419. f.Close()
  420. defer os.Remove(f.Name())
  421. fn(f.Name())
  422. }