parse_test.go 13 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583
  1. package rfc5321
  2. import (
  3. "strings"
  4. "testing"
  5. )
  6. func TestParseParam(t *testing.T) {
  7. s := NewParser([]byte("SIZE=2000"))
  8. params, err := s.param()
  9. if strings.Compare(params[0], "SIZE") != 0 {
  10. t.Error("SIZE ecpected")
  11. }
  12. if strings.Compare(params[1], "2000") != 0 {
  13. t.Error("2000 ecpected")
  14. }
  15. if err != nil {
  16. t.Error("error not expected ", err)
  17. }
  18. s = NewParser([]byte("SI--ZE=2000 BODY=8BITMIME"))
  19. tup, err := s.parameters()
  20. if strings.Compare(tup[0][0], "SI--ZE") != 0 {
  21. t.Error("SI--ZE ecpected")
  22. }
  23. if strings.Compare(tup[0][1], "2000") != 0 {
  24. t.Error("2000 ecpected")
  25. }
  26. if strings.Compare(tup[1][0], "BODY") != 0 {
  27. t.Error("BODY expected", err)
  28. }
  29. if strings.Compare(tup[1][1], "8BITMIME") != 0 {
  30. t.Error("8BITMIME expected", err)
  31. }
  32. s = NewParser([]byte("SI--ZE-=2000 BODY=8BITMIME")) // illegal - after ZE
  33. tup, err = s.parameters()
  34. if err == nil {
  35. t.Error("error was expected ")
  36. }
  37. }
  38. func TestParseRcptTo(t *testing.T) {
  39. var s Parser
  40. err := s.RcptTo([]byte("<Postmaster>"))
  41. if err != nil {
  42. t.Error("error not expected ", err)
  43. }
  44. err = s.RcptTo([]byte("<[email protected]>"))
  45. if err != nil {
  46. t.Error("error not expected ", err)
  47. }
  48. if s.LocalPart != "Postmaster" {
  49. t.Error("s.LocalPart should be: Postmaster")
  50. }
  51. err = s.RcptTo([]byte("<[email protected]> NOTIFY=SUCCESS,FAILURE"))
  52. if err != nil {
  53. t.Error("error not expected ", err)
  54. }
  55. //
  56. }
  57. func TestParseForwardPath(t *testing.T) {
  58. s := NewParser([]byte("<@a,@b:user@[227.0.0.1>")) // missing ]
  59. err := s.forwardPath()
  60. if err == nil {
  61. t.Error("error expected ", err)
  62. }
  63. s = NewParser([]byte("<@a,@b:user@[527.0.0.1>")) // ip out of range
  64. err = s.forwardPath()
  65. if err == nil {
  66. t.Error("error expected ", err)
  67. }
  68. // with a 'size' estmp param
  69. s = NewParser([]byte("<[email protected]> NOTIFY=FAILURE ORCPT=rfc822;[email protected]"))
  70. err = s.forwardPath()
  71. if err != nil {
  72. t.Error("error not expected ", err)
  73. }
  74. // tolerate a space at the front
  75. s = NewParser([]byte(" <[email protected]>"))
  76. err = s.forwardPath()
  77. if err != nil {
  78. t.Error("error not expected ", err)
  79. }
  80. // tolerate a space at the front, invalid
  81. s = NewParser([]byte(" <"))
  82. err = s.forwardPath()
  83. if err == nil {
  84. t.Error("error expected ", err)
  85. }
  86. // tolerate a space at the front, invalid
  87. s = NewParser([]byte(" "))
  88. err = s.forwardPath()
  89. if err == nil {
  90. t.Error("error expected ", err)
  91. }
  92. // empty
  93. s = NewParser([]byte(""))
  94. err = s.forwardPath()
  95. if err == nil {
  96. t.Error("error expected ", err)
  97. }
  98. }
  99. func TestParseReversePath(t *testing.T) {
  100. s := NewParser([]byte("<@a,@b:user@d>"))
  101. err := s.reversePath()
  102. if err != nil {
  103. t.Error("error not expected ", err)
  104. }
  105. s = NewParser([]byte("<@a,@b:user@d> param=some-value")) // includes a mail parameter
  106. err = s.reversePath()
  107. if err != nil {
  108. t.Error("error not expected ", err)
  109. }
  110. s = NewParser([]byte("<@a,@b:user@[227.0.0.1]>"))
  111. err = s.reversePath()
  112. if err != nil {
  113. t.Error("error not expected ", err)
  114. }
  115. s = NewParser([]byte("<>"))
  116. err = s.reversePath()
  117. if err != nil {
  118. t.Error("error not expected ", err)
  119. }
  120. s = NewParser([]byte(""))
  121. err = s.reversePath()
  122. if err == nil {
  123. t.Error("error expected ", err)
  124. }
  125. s = NewParser([]byte("[email protected]"))
  126. err = s.reversePath()
  127. if err == nil {
  128. t.Error("error expected ", err)
  129. }
  130. s = NewParser([]byte("<@ghg;$7@65"))
  131. err = s.reversePath()
  132. if err == nil {
  133. t.Error("error expected ", err)
  134. }
  135. // tolerate a space at the front
  136. s = NewParser([]byte(" <>"))
  137. err = s.reversePath()
  138. if err != nil {
  139. t.Error("error not expected ", err)
  140. }
  141. // tolerate a space at the front, invalid
  142. s = NewParser([]byte(" <"))
  143. err = s.reversePath()
  144. if err == nil {
  145. t.Error("error expected ", err)
  146. }
  147. // tolerate a space at the front, invalid
  148. s = NewParser([]byte(" "))
  149. err = s.reversePath()
  150. if err == nil {
  151. t.Error("error expected ", err)
  152. }
  153. // empty
  154. s = NewParser([]byte(" "))
  155. err = s.reversePath()
  156. if err == nil {
  157. t.Error("error expected ", err)
  158. }
  159. }
  160. func TestParseIpv6Address(t *testing.T) {
  161. s := NewParser([]byte("2001:0000:3238:DFE1:0063:0000:0000:FEFB"))
  162. err := s.ipv6AddressLiteral()
  163. if s.accept.String() != "2001:0000:3238:DFE1:0063:0000:0000:FEFB" {
  164. t.Error("expected 2001:0000:3238:DFE1:0063:0000:0000:FEFB, got:", s.accept.String())
  165. }
  166. if err != nil {
  167. t.Error("error not expected ", err)
  168. }
  169. s = NewParser([]byte("2001:3238:DFE1:6323:FEFB:2536:1.2.3.2"))
  170. err = s.ipv6AddressLiteral()
  171. if s.accept.String() != "2001:3238:DFE1:6323:FEFB:2536:1.2.3.2" {
  172. t.Error("expected 2001:3238:DFE1:6323:FEFB:2536:1.2.3.2, got:", s.accept.String())
  173. }
  174. if err != nil {
  175. t.Error("error not expected ", err)
  176. }
  177. s = NewParser([]byte("2001:0000:3238:DFE1:63:0000:0000:FEFB"))
  178. err = s.ipv6AddressLiteral()
  179. if s.accept.String() != "2001:0000:3238:DFE1:63:0000:0000:FEFB" {
  180. t.Error("expected 2001:0000:3238:DFE1:63:0000:0000:FEFB, got:", s.accept.String())
  181. }
  182. if err != nil {
  183. t.Error("error not expected ", err)
  184. }
  185. s = NewParser([]byte("2001:0000:3238:DFE1:63::FEFB"))
  186. err = s.ipv6AddressLiteral()
  187. if s.accept.String() != "2001:0000:3238:DFE1:63::FEFB" {
  188. t.Error("expected 2001:0000:3238:DFE1:63::FEFB, got:", s.accept.String())
  189. }
  190. if err != nil {
  191. t.Error("error not expected ", err)
  192. }
  193. s = NewParser([]byte("2001:0:3238:DFE1:63::FEFB"))
  194. err = s.ipv6AddressLiteral()
  195. if s.accept.String() != "2001:0:3238:DFE1:63::FEFB" {
  196. t.Error("expected 2001:0:3238:DFE1:63::FEFB, got:", s.accept.String())
  197. }
  198. if err != nil {
  199. t.Error("error not expected ", err)
  200. }
  201. s = NewParser([]byte("g001:0:3238:DFE1:63::FEFB"))
  202. err = s.ipv6AddressLiteral()
  203. if s.accept.String() != "" {
  204. t.Error("expected \"\", got:", s.accept.String())
  205. }
  206. if err == nil {
  207. t.Error("error expected ", err)
  208. }
  209. s = NewParser([]byte("g001:0:3238:DFE1::63::FEFB"))
  210. err = s.ipv6AddressLiteral()
  211. if s.accept.String() != "" {
  212. t.Error("expected \"\", got:", s.accept.String())
  213. }
  214. if err == nil {
  215. t.Error("error expected ", err)
  216. }
  217. }
  218. func TestParseIpv4Address(t *testing.T) {
  219. s := NewParser([]byte("0.0.0.255"))
  220. err := s.ipv4AddressLiteral()
  221. if s.accept.String() != "0.0.0.255" {
  222. t.Error("expected 0.0.0.255, got:", s.accept.String())
  223. }
  224. if err != nil {
  225. t.Error("error not expected ", err)
  226. }
  227. s = NewParser([]byte("0.0.0.256"))
  228. err = s.ipv4AddressLiteral()
  229. if s.accept.String() != "0.0.0.256" {
  230. t.Error("expected 0.0.0.256, got:", s.accept.String())
  231. }
  232. if err == nil {
  233. t.Error("error expected ", err)
  234. }
  235. }
  236. func TestParseMailBoxBad(t *testing.T) {
  237. // must be quoted
  238. s := NewParser([]byte("Abc\\@[email protected]"))
  239. err := s.mailbox()
  240. if err == nil {
  241. t.Error("error expected")
  242. }
  243. // must be quoted
  244. s = NewParser([]byte("Fred\\ [email protected]"))
  245. err = s.mailbox()
  246. if err == nil {
  247. t.Error("error expected")
  248. }
  249. }
  250. func TestParseMailbox(t *testing.T) {
  251. s := NewParser([]byte("jsmith@[IPv6:2001:db8::1]"))
  252. err := s.mailbox()
  253. if s.Domain != "2001:db8::1" {
  254. t.Error("expected domain:2001:db8::1, got:", s.Domain)
  255. }
  256. if err != nil {
  257. t.Error("error not expected ")
  258. }
  259. s = NewParser([]byte("\"qu\\{oted\"@test.com"))
  260. err = s.mailbox()
  261. if err != nil {
  262. t.Error("error not expected ")
  263. }
  264. s = NewParser([]byte("\"qu\\{oted\"@[127.0.0.1]"))
  265. err = s.mailbox()
  266. if err != nil {
  267. t.Error("error not expected ")
  268. }
  269. s = NewParser([]byte("jsmith@[IPv6:2001:db8::1]"))
  270. err = s.mailbox()
  271. if err != nil {
  272. t.Error("error not expected ")
  273. }
  274. s = NewParser([]byte("Joe.\\[email protected]"))
  275. err = s.mailbox()
  276. if err != nil {
  277. t.Error("error not expected ")
  278. }
  279. s = NewParser([]byte("\"Abc@def\"@example.com"))
  280. err = s.mailbox()
  281. if err != nil {
  282. t.Error("error not expected ")
  283. }
  284. s = NewParser([]byte("\"Fred Bloggs\"@example.com"))
  285. err = s.mailbox()
  286. if err != nil {
  287. t.Error("error not expected ")
  288. }
  289. s = NewParser([]byte("customer/[email protected]"))
  290. err = s.mailbox()
  291. if err != nil {
  292. t.Error("error not expected ")
  293. }
  294. s = NewParser([]byte("[email protected]"))
  295. err = s.mailbox()
  296. if err != nil {
  297. t.Error("error not expected ")
  298. }
  299. s = NewParser([]byte("!def!xyz%[email protected]"))
  300. err = s.mailbox()
  301. if err != nil {
  302. t.Error("error not expected ")
  303. }
  304. s = NewParser([]byte("[email protected]"))
  305. err = s.mailbox()
  306. if err != nil {
  307. t.Error("error not expected ")
  308. }
  309. }
  310. func TestParseLocalPart(t *testing.T) {
  311. s := NewParser([]byte("\"qu\\{oted\""))
  312. err := s.localPart()
  313. if s.LocalPart != "qu\\{oted" {
  314. t.Error("expected qu\\{oted, got:", s.LocalPart)
  315. }
  316. if err != nil {
  317. t.Error("error not expected ")
  318. }
  319. s = NewParser([]byte("dot.string"))
  320. err = s.localPart()
  321. if s.LocalPart != "dot.string" {
  322. t.Error("expected dot.string, got:", s.LocalPart)
  323. }
  324. if err != nil {
  325. t.Error("error not expected ")
  326. }
  327. s = NewParser([]byte("dot.st!ring"))
  328. err = s.localPart()
  329. if s.LocalPart != "dot.st!ring" {
  330. t.Error("expected dot.st!ring, got:", s.LocalPart)
  331. }
  332. if err != nil {
  333. t.Error("error not expected ")
  334. }
  335. s = NewParser([]byte("dot..st!ring")) // fail
  336. err = s.localPart()
  337. if err == nil {
  338. t.Error("error expected ")
  339. }
  340. }
  341. func TestParseQuotedString(t *testing.T) {
  342. s := NewParser([]byte("\"qu\\ oted\""))
  343. err := s.quotedString()
  344. if s.accept.String() != "qu\\ oted" {
  345. t.Error("Expected qu\\ oted, got:", s.accept.String())
  346. }
  347. if err != nil {
  348. t.Error("error not expected ")
  349. }
  350. s = NewParser([]byte("\"@\""))
  351. err = s.quotedString()
  352. if s.accept.String() != "@" {
  353. t.Error("Expected @, got:", s.accept.String())
  354. }
  355. if err != nil {
  356. t.Error("error not expected ")
  357. }
  358. }
  359. func TestParseDotString(t *testing.T) {
  360. s := NewParser([]byte("Joe..\\\\Blow"))
  361. err := s.dotString()
  362. if err == nil {
  363. t.Error("error expected ")
  364. }
  365. s = NewParser([]byte("Joe.\\\\Blow"))
  366. err = s.dotString()
  367. if s.accept.String() != "Joe.\\\\Blow" {
  368. t.Error("Expected Joe.\\\\Blow, got:", s.accept.String())
  369. }
  370. if err != nil {
  371. t.Error("error not expected ")
  372. }
  373. }
  374. func TestParsePath(t *testing.T) {
  375. s := NewParser([]byte("<foo>")) // requires @
  376. err := s.path()
  377. if err == nil {
  378. t.Error("error expected ")
  379. }
  380. s = NewParser([]byte("<@example.com,@test.com:[email protected]>"))
  381. err = s.path()
  382. if err != nil {
  383. t.Error("error not expected ")
  384. }
  385. s = NewParser([]byte("<@example.com>")) // no mailbox
  386. err = s.path()
  387. if err == nil {
  388. t.Error("error expected ")
  389. }
  390. s = NewParser([]byte("<[email protected] 1")) // no closing >
  391. err = s.path()
  392. if err == nil {
  393. t.Error("error expected ")
  394. }
  395. }
  396. func TestParseADL(t *testing.T) {
  397. s := NewParser([]byte("@example.com,@test.com"))
  398. err := s.adl()
  399. if err != nil {
  400. t.Error("error not expected ")
  401. }
  402. }
  403. func TestParseAtDomain(t *testing.T) {
  404. s := NewParser([]byte("@example.com"))
  405. err := s.atDomain()
  406. if err != nil {
  407. t.Error("error not expected ")
  408. }
  409. }
  410. func TestParseDomain(t *testing.T) {
  411. s := NewParser([]byte("a"))
  412. err := s.domain()
  413. if err != nil {
  414. t.Error("error not expected ")
  415. }
  416. s = NewParser([]byte("a.com.gov"))
  417. err = s.domain()
  418. if err != nil {
  419. t.Error("error not expected ")
  420. }
  421. s = NewParser([]byte("wrong-.com"))
  422. err = s.domain()
  423. if err == nil {
  424. t.Error("error was expected ")
  425. }
  426. s = NewParser([]byte("wrong."))
  427. err = s.domain()
  428. if err == nil {
  429. t.Error("error was expected ")
  430. }
  431. }
  432. func TestParseSubDomain(t *testing.T) {
  433. s := NewParser([]byte("a"))
  434. err := s.subdomain()
  435. if err != nil {
  436. t.Error("error not expected ")
  437. }
  438. s = NewParser([]byte("-a"))
  439. err = s.subdomain()
  440. if err == nil {
  441. t.Error("error was expected ")
  442. }
  443. s = NewParser([]byte("a--"))
  444. err = s.subdomain()
  445. if err == nil {
  446. t.Error("error was expected ")
  447. }
  448. s = NewParser([]byte("a--"))
  449. err = s.subdomain()
  450. if err == nil {
  451. t.Error("error was expected ")
  452. }
  453. s = NewParser([]byte("a--b"))
  454. err = s.subdomain()
  455. if err != nil {
  456. t.Error("error was not expected ")
  457. }
  458. // although a---b looks like an illegal subdomain, it is rfc5321 grammar spec
  459. s = NewParser([]byte("a---b"))
  460. err = s.subdomain()
  461. if err != nil {
  462. t.Error("error was not expected ")
  463. }
  464. s = NewParser([]byte("abc"))
  465. err = s.subdomain()
  466. if err != nil {
  467. t.Error("error was not expected ")
  468. }
  469. s = NewParser([]byte("a-b-c"))
  470. err = s.subdomain()
  471. if err != nil {
  472. t.Error("error was not expected ")
  473. }
  474. }
  475. func TestParse(t *testing.T) {
  476. s := NewParser([]byte("<"))
  477. err := s.reversePath()
  478. if err == nil {
  479. t.Error("< expected parse error")
  480. }
  481. // the @ needs to be quoted
  482. s = NewParser([]byte("<@[email protected]>"))
  483. err = s.reversePath()
  484. if err == nil {
  485. t.Error("expected parse error", err)
  486. }
  487. s = NewParser([]byte("<\"@m.conm\"@test.com>"))
  488. err = s.reversePath()
  489. if err != nil {
  490. t.Error("not expected parse error", err)
  491. }
  492. s = NewParser([]byte("<[email protected]>"))
  493. err = s.reversePath()
  494. if err != nil {
  495. t.Error("not expected parse error")
  496. }
  497. s = NewParser([]byte("<@test:[email protected]>"))
  498. err = s.reversePath()
  499. if err != nil {
  500. t.Error("not expected parse error")
  501. }
  502. s = NewParser([]byte("<@test,@test2:[email protected]>"))
  503. err = s.reversePath()
  504. if err != nil {
  505. t.Error("not expected parse error")
  506. }
  507. }