api_test.go 16 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680
  1. // Copyright 2016 The go-ethereum Authors
  2. // This file is part of the go-ethereum library.
  3. //
  4. // The go-ethereum library is free software: you can redistribute it and/or modify
  5. // it under the terms of the GNU Lesser General Public License as published by
  6. // the Free Software Foundation, either version 3 of the License, or
  7. // (at your option) any later version.
  8. //
  9. // The go-ethereum library is distributed in the hope that it will be useful,
  10. // but WITHOUT ANY WARRANTY; without even the implied warranty of
  11. // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
  12. // GNU Lesser General Public License for more details.
  13. //
  14. // You should have received a copy of the GNU Lesser General Public License
  15. // along with the go-ethereum library. If not, see <http://www.gnu.org/licenses/>.
  16. package whisperv5
  17. import (
  18. "bytes"
  19. "encoding/json"
  20. "testing"
  21. "time"
  22. "github.com/ethereum/go-ethereum/common"
  23. "github.com/ethereum/go-ethereum/common/hexutil"
  24. )
  25. func TestBasic(t *testing.T) {
  26. var id string = "test"
  27. w := New()
  28. api := NewPublicWhisperAPI(w)
  29. if api == nil {
  30. t.Fatalf("failed to create API.")
  31. }
  32. ver, err := api.Version()
  33. if err != nil {
  34. t.Fatalf("failed generateFilter: %s.", err)
  35. }
  36. if uint64(ver) != ProtocolVersion {
  37. t.Fatalf("wrong version: %d.", ver)
  38. }
  39. mail := api.GetNewSubscriptionMessages("non-existent-id")
  40. if len(mail) != 0 {
  41. t.Fatalf("failed GetFilterChanges: premature result")
  42. }
  43. exist, err := api.HasKeyPair(id)
  44. if err != nil {
  45. t.Fatalf("failed initial HasIdentity: %s.", err)
  46. }
  47. if exist {
  48. t.Fatalf("failed initial HasIdentity: false positive.")
  49. }
  50. success, err := api.DeleteKeyPair(id)
  51. if err != nil {
  52. t.Fatalf("failed DeleteIdentity: %s.", err)
  53. }
  54. if success {
  55. t.Fatalf("deleted non-existing identity: false positive.")
  56. }
  57. pub, err := api.NewKeyPair()
  58. if err != nil {
  59. t.Fatalf("failed NewIdentity: %s.", err)
  60. }
  61. if len(pub) == 0 {
  62. t.Fatalf("failed NewIdentity: empty")
  63. }
  64. exist, err = api.HasKeyPair(pub)
  65. if err != nil {
  66. t.Fatalf("failed HasIdentity: %s.", err)
  67. }
  68. if !exist {
  69. t.Fatalf("failed HasIdentity: false negative.")
  70. }
  71. success, err = api.DeleteKeyPair(pub)
  72. if err != nil {
  73. t.Fatalf("failed to delete second identity: %s.", err)
  74. }
  75. if !success {
  76. t.Fatalf("failed to delete second identity.")
  77. }
  78. exist, err = api.HasKeyPair(pub)
  79. if err != nil {
  80. t.Fatalf("failed HasIdentity(): %s.", err)
  81. }
  82. if exist {
  83. t.Fatalf("failed HasIdentity(): false positive.")
  84. }
  85. id = "arbitrary text"
  86. id2 := "another arbitrary string"
  87. exist, err = api.HasSymmetricKey(id)
  88. if err != nil {
  89. t.Fatalf("failed HasSymKey: %s.", err)
  90. }
  91. if exist {
  92. t.Fatalf("failed HasSymKey: false positive.")
  93. }
  94. id, err = api.GenerateSymmetricKey()
  95. if err != nil {
  96. t.Fatalf("failed GenerateSymKey: %s.", err)
  97. }
  98. exist, err = api.HasSymmetricKey(id)
  99. if err != nil {
  100. t.Fatalf("failed HasSymKey(): %s.", err)
  101. }
  102. if !exist {
  103. t.Fatalf("failed HasSymKey(): false negative.")
  104. }
  105. const password = "some stuff here"
  106. id, err = api.AddSymmetricKeyFromPassword(password)
  107. if err != nil {
  108. t.Fatalf("failed AddSymKey: %s.", err)
  109. }
  110. id2, err = api.AddSymmetricKeyFromPassword(password)
  111. if err != nil {
  112. t.Fatalf("failed AddSymKey: %s.", err)
  113. }
  114. exist, err = api.HasSymmetricKey(id2)
  115. if err != nil {
  116. t.Fatalf("failed HasSymKey(id2): %s.", err)
  117. }
  118. if !exist {
  119. t.Fatalf("failed HasSymKey(id2): false negative.")
  120. }
  121. k1, err := api.GetSymmetricKey(id)
  122. if err != nil {
  123. t.Fatalf("failed GetSymKey(id): %s.", err)
  124. }
  125. k2, err := api.GetSymmetricKey(id2)
  126. if err != nil {
  127. t.Fatalf("failed GetSymKey(id2): %s.", err)
  128. }
  129. if !bytes.Equal(k1, k2) {
  130. t.Fatalf("installed keys are not equal")
  131. }
  132. exist, err = api.DeleteSymmetricKey(id)
  133. if err != nil {
  134. t.Fatalf("failed DeleteSymKey(id): %s.", err)
  135. }
  136. if !exist {
  137. t.Fatalf("failed DeleteSymKey(id): false negative.")
  138. }
  139. exist, err = api.HasSymmetricKey(id)
  140. if err != nil {
  141. t.Fatalf("failed HasSymKey(id): %s.", err)
  142. }
  143. if exist {
  144. t.Fatalf("failed HasSymKey(id): false positive.")
  145. }
  146. }
  147. func TestUnmarshalFilterArgs(t *testing.T) {
  148. s := []byte(`{
  149. "type":"sym",
  150. "key":"0x70c87d191324e6712a591f304b4eedef6ad9bb9d",
  151. "sig":"0x9b2055d370f73ec7d8a03e965129118dc8f5bf83",
  152. "minPoW":2.34,
  153. "topics":["0x00000000", "0x007f80ff", "0xff807f00", "0xf26e7779"],
  154. "allowP2P":true
  155. }`)
  156. var f WhisperFilterArgs
  157. err := f.UnmarshalJSON(s)
  158. if err != nil {
  159. t.Fatalf("failed UnmarshalJSON: %s.", err)
  160. }
  161. if !f.Symmetric {
  162. t.Fatalf("wrong type.")
  163. }
  164. if f.Key != "0x70c87d191324e6712a591f304b4eedef6ad9bb9d" {
  165. t.Fatalf("wrong key: %s.", f.Key)
  166. }
  167. if f.Sig != "0x9b2055d370f73ec7d8a03e965129118dc8f5bf83" {
  168. t.Fatalf("wrong sig: %s.", f.Sig)
  169. }
  170. if f.MinPoW != 2.34 {
  171. t.Fatalf("wrong MinPoW: %f.", f.MinPoW)
  172. }
  173. if !f.AllowP2P {
  174. t.Fatalf("wrong AllowP2P.")
  175. }
  176. if len(f.Topics) != 4 {
  177. t.Fatalf("wrong topics number: %d.", len(f.Topics))
  178. }
  179. i := 0
  180. if !bytes.Equal(f.Topics[i], []byte{0x00, 0x00, 0x00, 0x00}) {
  181. t.Fatalf("wrong topic[%d]: %x.", i, f.Topics[i])
  182. }
  183. i++
  184. if !bytes.Equal(f.Topics[i], []byte{0x00, 0x7f, 0x80, 0xff}) {
  185. t.Fatalf("wrong topic[%d]: %x.", i, f.Topics[i])
  186. }
  187. i++
  188. if !bytes.Equal(f.Topics[i], []byte{0xff, 0x80, 0x7f, 0x00}) {
  189. t.Fatalf("wrong topic[%d]: %x.", i, f.Topics[i])
  190. }
  191. i++
  192. if !bytes.Equal(f.Topics[i], []byte{0xf2, 0x6e, 0x77, 0x79}) {
  193. t.Fatalf("wrong topic[%d]: %x.", i, f.Topics[i])
  194. }
  195. }
  196. func TestUnmarshalPostArgs(t *testing.T) {
  197. s := []byte(`{
  198. "type":"sym",
  199. "ttl":12345,
  200. "sig":"0x70c87d191324e6712a591f304b4eedef6ad9bb9d",
  201. "key":"0x9b2055d370f73ec7d8a03e965129118dc8f5bf83",
  202. "topic":"0xf26e7779",
  203. "padding":"0x74686973206973206D79207465737420737472696E67",
  204. "payload":"0x7061796C6F61642073686F756C642062652070736575646F72616E646F6D",
  205. "powTime":777,
  206. "powTarget":3.1416,
  207. "targetPeer":"enode://915533f667b1369793ebb9bda022416b1295235a1420799cd87a969467372546d808ebf59c5c9ce23f103d59b61b97df8af91f0908552485975397181b993461@127.0.0.1:12345"
  208. }`)
  209. var a PostArgs
  210. err := json.Unmarshal(s, &a)
  211. if err != nil {
  212. t.Fatalf("failed UnmarshalJSON: %s.", err)
  213. }
  214. if a.Type != "sym" {
  215. t.Fatalf("wrong Type: %s.", a.Type)
  216. }
  217. if a.TTL != 12345 {
  218. t.Fatalf("wrong ttl: %d.", a.TTL)
  219. }
  220. if a.Sig != "0x70c87d191324e6712a591f304b4eedef6ad9bb9d" {
  221. t.Fatalf("wrong From: %s.", a.Sig)
  222. }
  223. if a.Key != "0x9b2055d370f73ec7d8a03e965129118dc8f5bf83" {
  224. t.Fatalf("wrong Key: %s.", a.Key)
  225. }
  226. if BytesToTopic(a.Topic) != (TopicType{0xf2, 0x6e, 0x77, 0x79}) {
  227. t.Fatalf("wrong topic: %x.", a.Topic)
  228. }
  229. if string(a.Padding) != "this is my test string" {
  230. t.Fatalf("wrong Padding: %s.", string(a.Padding))
  231. }
  232. if string(a.Payload) != "payload should be pseudorandom" {
  233. t.Fatalf("wrong Payload: %s.", string(a.Payload))
  234. }
  235. if a.PowTime != 777 {
  236. t.Fatalf("wrong PowTime: %d.", a.PowTime)
  237. }
  238. if a.PowTarget != 3.1416 {
  239. t.Fatalf("wrong PowTarget: %f.", a.PowTarget)
  240. }
  241. if a.TargetPeer != "enode://915533f667b1369793ebb9bda022416b1295235a1420799cd87a969467372546d808ebf59c5c9ce23f103d59b61b97df8af91f0908552485975397181b993461@127.0.0.1:12345" {
  242. t.Fatalf("wrong PeerID: %s.", a.TargetPeer)
  243. }
  244. }
  245. func waitForMessages(api *PublicWhisperAPI, id string, target int) []*WhisperMessage {
  246. // timeout: 2 seconds
  247. result := make([]*WhisperMessage, 0, target)
  248. for i := 0; i < 100; i++ {
  249. mail := api.GetNewSubscriptionMessages(id)
  250. if len(mail) > 0 {
  251. for _, m := range mail {
  252. result = append(result, m)
  253. }
  254. if len(result) >= target {
  255. break
  256. }
  257. }
  258. time.Sleep(time.Millisecond * 20)
  259. }
  260. return result
  261. }
  262. func TestIntegrationAsym(t *testing.T) {
  263. w := New()
  264. api := NewPublicWhisperAPI(w)
  265. if api == nil {
  266. t.Fatalf("failed to create API.")
  267. }
  268. api.Start()
  269. defer api.Stop()
  270. sig, err := api.NewKeyPair()
  271. if err != nil {
  272. t.Fatalf("failed NewIdentity: %s.", err)
  273. }
  274. if len(sig) == 0 {
  275. t.Fatalf("wrong signature")
  276. }
  277. exist, err := api.HasKeyPair(sig)
  278. if err != nil {
  279. t.Fatalf("failed HasIdentity: %s.", err)
  280. }
  281. if !exist {
  282. t.Fatalf("failed HasIdentity: false negative.")
  283. }
  284. sigPubKey, err := api.GetPublicKey(sig)
  285. if err != nil {
  286. t.Fatalf("failed GetPublicKey: %s.", err)
  287. }
  288. key, err := api.NewKeyPair()
  289. if err != nil {
  290. t.Fatalf("failed NewIdentity(): %s.", err)
  291. }
  292. if len(key) == 0 {
  293. t.Fatalf("wrong key")
  294. }
  295. dstPubKey, err := api.GetPublicKey(key)
  296. if err != nil {
  297. t.Fatalf("failed GetPublicKey: %s.", err)
  298. }
  299. var topics [2]TopicType
  300. topics[0] = TopicType{0x00, 0x64, 0x00, 0xff}
  301. topics[1] = TopicType{0xf2, 0x6e, 0x77, 0x79}
  302. var f WhisperFilterArgs
  303. f.Symmetric = false
  304. f.Key = key
  305. f.Sig = sigPubKey.String()
  306. f.Topics = make([][]byte, 2)
  307. f.Topics[0] = topics[0][:]
  308. f.Topics[1] = topics[1][:]
  309. f.MinPoW = DefaultMinimumPoW / 2
  310. f.AllowP2P = true
  311. id, err := api.Subscribe(f)
  312. if err != nil {
  313. t.Fatalf("failed to create new filter: %s.", err)
  314. }
  315. var p PostArgs
  316. p.Type = "asym"
  317. p.TTL = 2
  318. p.Sig = sig
  319. p.Key = dstPubKey.String()
  320. p.Padding = []byte("test string")
  321. p.Payload = []byte("extended test string")
  322. p.PowTarget = DefaultMinimumPoW
  323. p.PowTime = 2
  324. p.Topic = hexutil.Bytes{0xf2, 0x6e, 0x77, 0x79} // topics[1]
  325. err = api.Post(p)
  326. if err != nil {
  327. t.Errorf("failed to post message: %s.", err)
  328. }
  329. mail := waitForMessages(api, id, 1)
  330. if len(mail) != 1 {
  331. t.Fatalf("failed to GetFilterChanges: got %d messages.", len(mail))
  332. }
  333. text := string(common.FromHex(mail[0].Payload))
  334. if text != string("extended test string") {
  335. t.Fatalf("failed to decrypt first message: %s.", text)
  336. }
  337. p.Padding = []byte("new value")
  338. p.Payload = []byte("extended new value")
  339. err = api.Post(p)
  340. if err != nil {
  341. t.Fatalf("failed to post next message: %s.", err)
  342. }
  343. mail = waitForMessages(api, id, 1)
  344. if len(mail) != 1 {
  345. t.Fatalf("failed to GetFilterChanges: got %d messages.", len(mail))
  346. }
  347. text = string(common.FromHex(mail[0].Payload))
  348. if text != string("extended new value") {
  349. t.Fatalf("failed to decrypt second message: %s.", text)
  350. }
  351. }
  352. func TestIntegrationSym(t *testing.T) {
  353. w := New()
  354. api := NewPublicWhisperAPI(w)
  355. if api == nil {
  356. t.Fatalf("failed to create API.")
  357. }
  358. api.Start()
  359. defer api.Stop()
  360. symKeyID, err := api.GenerateSymmetricKey()
  361. if err != nil {
  362. t.Fatalf("failed GenerateSymKey: %s.", err)
  363. }
  364. sig, err := api.NewKeyPair()
  365. if err != nil {
  366. t.Fatalf("failed NewKeyPair: %s.", err)
  367. }
  368. if len(sig) == 0 {
  369. t.Fatalf("wrong signature")
  370. }
  371. sigPubKey, err := api.GetPublicKey(sig)
  372. if err != nil {
  373. t.Fatalf("failed GetPublicKey: %s.", err)
  374. }
  375. exist, err := api.HasKeyPair(sig)
  376. if err != nil {
  377. t.Fatalf("failed HasIdentity: %s.", err)
  378. }
  379. if !exist {
  380. t.Fatalf("failed HasIdentity: false negative.")
  381. }
  382. var topics [2]TopicType
  383. topics[0] = TopicType{0x00, 0x7f, 0x80, 0xff}
  384. topics[1] = TopicType{0xf2, 0x6e, 0x77, 0x79}
  385. var f WhisperFilterArgs
  386. f.Symmetric = true
  387. f.Key = symKeyID
  388. f.Topics = make([][]byte, 2)
  389. f.Topics[0] = topics[0][:]
  390. f.Topics[1] = topics[1][:]
  391. f.MinPoW = DefaultMinimumPoW / 2
  392. f.Sig = sigPubKey.String()
  393. f.AllowP2P = false
  394. id, err := api.Subscribe(f)
  395. if err != nil {
  396. t.Fatalf("failed to create new filter: %s.", err)
  397. }
  398. var p PostArgs
  399. p.Type = "sym"
  400. p.TTL = 1
  401. p.Key = symKeyID
  402. p.Sig = sig
  403. p.Padding = []byte("test string")
  404. p.Payload = []byte("extended test string")
  405. p.PowTarget = DefaultMinimumPoW
  406. p.PowTime = 2
  407. p.Topic = hexutil.Bytes{0xf2, 0x6e, 0x77, 0x79}
  408. err = api.Post(p)
  409. if err != nil {
  410. t.Fatalf("failed to post first message: %s.", err)
  411. }
  412. mail := waitForMessages(api, id, 1)
  413. if len(mail) != 1 {
  414. t.Fatalf("failed GetFilterChanges: got %d messages.", len(mail))
  415. }
  416. text := string(common.FromHex(mail[0].Payload))
  417. if text != string("extended test string") {
  418. t.Fatalf("failed to decrypt first message: %s.", text)
  419. }
  420. p.Padding = []byte("new value")
  421. p.Payload = []byte("extended new value")
  422. err = api.Post(p)
  423. if err != nil {
  424. t.Fatalf("failed to post second message: %s.", err)
  425. }
  426. mail = waitForMessages(api, id, 1)
  427. if len(mail) != 1 {
  428. t.Fatalf("failed second GetFilterChanges: got %d messages.", len(mail))
  429. }
  430. text = string(common.FromHex(mail[0].Payload))
  431. if text != string("extended new value") {
  432. t.Fatalf("failed to decrypt second message: %s.", text)
  433. }
  434. }
  435. func TestIntegrationSymWithFilter(t *testing.T) {
  436. w := New()
  437. api := NewPublicWhisperAPI(w)
  438. if api == nil {
  439. t.Fatalf("failed to create API.")
  440. }
  441. api.Start()
  442. defer api.Stop()
  443. symKeyID, err := api.GenerateSymmetricKey()
  444. if err != nil {
  445. t.Fatalf("failed to GenerateSymKey: %s.", err)
  446. }
  447. sigKeyID, err := api.NewKeyPair()
  448. if err != nil {
  449. t.Fatalf("failed NewIdentity: %s.", err)
  450. }
  451. if len(sigKeyID) == 0 {
  452. t.Fatalf("wrong signature.")
  453. }
  454. exist, err := api.HasKeyPair(sigKeyID)
  455. if err != nil {
  456. t.Fatalf("failed HasIdentity: %s.", err)
  457. }
  458. if !exist {
  459. t.Fatalf("failed HasIdentity: does not exist.")
  460. }
  461. sigPubKey, err := api.GetPublicKey(sigKeyID)
  462. if err != nil {
  463. t.Fatalf("failed GetPublicKey: %s.", err)
  464. }
  465. var topics [2]TopicType
  466. topics[0] = TopicType{0x00, 0x7f, 0x80, 0xff}
  467. topics[1] = TopicType{0xf2, 0x6e, 0x77, 0x79}
  468. var f WhisperFilterArgs
  469. f.Symmetric = true
  470. f.Key = symKeyID
  471. f.Topics = make([][]byte, 2)
  472. f.Topics[0] = topics[0][:]
  473. f.Topics[1] = topics[1][:]
  474. f.MinPoW = DefaultMinimumPoW / 2
  475. f.Sig = sigPubKey.String()
  476. f.AllowP2P = false
  477. id, err := api.Subscribe(f)
  478. if err != nil {
  479. t.Fatalf("failed to create new filter: %s.", err)
  480. }
  481. var p PostArgs
  482. p.Type = "sym"
  483. p.TTL = 1
  484. p.Key = symKeyID
  485. p.Sig = sigKeyID
  486. p.Padding = []byte("test string")
  487. p.Payload = []byte("extended test string")
  488. p.PowTarget = DefaultMinimumPoW
  489. p.PowTime = 2
  490. p.Topic = hexutil.Bytes{0xf2, 0x6e, 0x77, 0x79}
  491. err = api.Post(p)
  492. if err != nil {
  493. t.Fatalf("failed to post message: %s.", err)
  494. }
  495. mail := waitForMessages(api, id, 1)
  496. if len(mail) != 1 {
  497. t.Fatalf("failed to GetFilterChanges: got %d messages.", len(mail))
  498. }
  499. text := string(common.FromHex(mail[0].Payload))
  500. if text != string("extended test string") {
  501. t.Fatalf("failed to decrypt first message: %s.", text)
  502. }
  503. p.Padding = []byte("new value")
  504. p.Payload = []byte("extended new value")
  505. err = api.Post(p)
  506. if err != nil {
  507. t.Fatalf("failed to post next message: %s.", err)
  508. }
  509. mail = waitForMessages(api, id, 1)
  510. if len(mail) != 1 {
  511. t.Fatalf("failed to GetFilterChanges: got %d messages.", len(mail))
  512. }
  513. text = string(common.FromHex(mail[0].Payload))
  514. if text != string("extended new value") {
  515. t.Fatalf("failed to decrypt second message: %s.", text)
  516. }
  517. }
  518. func TestKey(t *testing.T) {
  519. w := New()
  520. api := NewPublicWhisperAPI(w)
  521. if api == nil {
  522. t.Fatalf("failed to create API.")
  523. }
  524. k, err := api.AddSymmetricKeyFromPassword("wwww")
  525. if err != nil {
  526. t.Fatalf("failed to create key: %s.", err)
  527. }
  528. s, err := api.GetSymmetricKey(k)
  529. if err != nil {
  530. t.Fatalf("failed to get sym key: %s.", err)
  531. }
  532. k2, err := api.AddSymmetricKeyDirect(s)
  533. if err != nil {
  534. t.Fatalf("failed to add sym key: %s.", err)
  535. }
  536. s2, err := api.GetSymmetricKey(k2)
  537. if err != nil {
  538. t.Fatalf("failed to get sym key: %s.", err)
  539. }
  540. if s.String() != "0x448652d595bd6ec00b2a9ea220ad6c26592d9bf4cf79023d3c1b30cb681e6e07" {
  541. t.Fatalf("wrong key from password: %s", s.String())
  542. }
  543. if !bytes.Equal(s, s2) {
  544. t.Fatalf("wrong key")
  545. }
  546. }
  547. func TestSubscribe(t *testing.T) {
  548. var err error
  549. var s string
  550. w := New()
  551. api := NewPublicWhisperAPI(w)
  552. if api == nil {
  553. t.Fatalf("failed to create API.")
  554. }
  555. symKeyID, err := api.GenerateSymmetricKey()
  556. if err != nil {
  557. t.Fatalf("failed to GenerateSymKey: %s.", err)
  558. }
  559. var f WhisperFilterArgs
  560. f.Symmetric = true
  561. f.Key = symKeyID
  562. f.Topics = make([][]byte, 5)
  563. f.Topics[0] = []byte{0x21}
  564. f.Topics[1] = []byte{0xd2, 0xe3}
  565. f.Topics[2] = []byte{0x64, 0x75, 0x76}
  566. f.Topics[3] = []byte{0xf8, 0xe9, 0xa0, 0xba}
  567. f.Topics[4] = []byte{0xcb, 0x3c, 0xdd, 0xee, 0xff}
  568. s, err = api.Subscribe(f)
  569. if err == nil {
  570. t.Fatalf("Subscribe: false positive.")
  571. }
  572. f.Topics[4] = []byte{}
  573. if err == nil {
  574. t.Fatalf("Subscribe: false positive again.")
  575. }
  576. f.Topics[4] = []byte{0x00}
  577. s, err = api.Subscribe(f)
  578. if err != nil {
  579. t.Fatalf("failed to subscribe: %s.", err)
  580. } else {
  581. api.Unsubscribe(s)
  582. }
  583. }