burndown_test.go 18 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528
  1. package hercules
  2. import (
  3. "bytes"
  4. "io"
  5. "testing"
  6. "github.com/gogo/protobuf/proto"
  7. "github.com/stretchr/testify/assert"
  8. "gopkg.in/src-d/go-git.v4/plumbing"
  9. "gopkg.in/src-d/go-git.v4/plumbing/object"
  10. "gopkg.in/src-d/hercules.v3/pb"
  11. )
  12. func TestBurndownMeta(t *testing.T) {
  13. burndown := BurndownAnalysis{}
  14. assert.Equal(t, burndown.Name(), "Burndown")
  15. assert.Equal(t, len(burndown.Provides()), 0)
  16. required := [...]string{"file_diff", "changes", "blob_cache", "day", "author"}
  17. for _, name := range required {
  18. assert.Contains(t, burndown.Requires(), name)
  19. }
  20. opts := burndown.ListConfigurationOptions()
  21. matches := 0
  22. for _, opt := range opts {
  23. switch opt.Name {
  24. case ConfigBurndownGranularity, ConfigBurndownSampling, ConfigBurndownTrackFiles,
  25. ConfigBurndownTrackPeople, ConfigBurndownDebug:
  26. matches++
  27. }
  28. }
  29. assert.Len(t, opts, matches)
  30. assert.Equal(t, burndown.Flag(), "burndown")
  31. }
  32. func TestBurndownConfigure(t *testing.T) {
  33. burndown := BurndownAnalysis{}
  34. facts := map[string]interface{}{}
  35. facts[ConfigBurndownGranularity] = 100
  36. facts[ConfigBurndownSampling] = 200
  37. facts[ConfigBurndownTrackFiles] = true
  38. facts[ConfigBurndownTrackPeople] = true
  39. facts[ConfigBurndownDebug] = true
  40. facts[FactIdentityDetectorPeopleCount] = 5
  41. facts[FactIdentityDetectorReversedPeopleDict] = burndown.Requires()
  42. burndown.Configure(facts)
  43. assert.Equal(t, burndown.Granularity, 100)
  44. assert.Equal(t, burndown.Sampling, 200)
  45. assert.Equal(t, burndown.TrackFiles, true)
  46. assert.Equal(t, burndown.PeopleNumber, 5)
  47. assert.Equal(t, burndown.Debug, true)
  48. assert.Equal(t, burndown.reversedPeopleDict, burndown.Requires())
  49. facts[ConfigBurndownTrackPeople] = false
  50. facts[FactIdentityDetectorPeopleCount] = 50
  51. burndown.Configure(facts)
  52. assert.Equal(t, burndown.PeopleNumber, 0)
  53. facts = map[string]interface{}{}
  54. burndown.Configure(facts)
  55. assert.Equal(t, burndown.Granularity, 100)
  56. assert.Equal(t, burndown.Sampling, 200)
  57. assert.Equal(t, burndown.TrackFiles, true)
  58. assert.Equal(t, burndown.PeopleNumber, 0)
  59. assert.Equal(t, burndown.Debug, true)
  60. assert.Equal(t, burndown.reversedPeopleDict, burndown.Requires())
  61. }
  62. func TestBurndownRegistration(t *testing.T) {
  63. tp, exists := Registry.registered[(&BurndownAnalysis{}).Name()]
  64. assert.True(t, exists)
  65. assert.Equal(t, tp.Elem().Name(), "BurndownAnalysis")
  66. tp, exists = Registry.flags[(&BurndownAnalysis{}).Flag()]
  67. assert.True(t, exists)
  68. assert.Equal(t, tp.Elem().Name(), "BurndownAnalysis")
  69. }
  70. func TestBurndownConsumeFinalize(t *testing.T) {
  71. burndown := BurndownAnalysis{
  72. Granularity: 30,
  73. Sampling: 30,
  74. PeopleNumber: 2,
  75. TrackFiles: true,
  76. }
  77. burndown.Initialize(testRepository)
  78. deps := map[string]interface{}{}
  79. // stage 1
  80. deps["author"] = 0
  81. deps["day"] = 0
  82. cache := map[plumbing.Hash]*object.Blob{}
  83. hash := plumbing.NewHash("291286b4ac41952cbd1389fda66420ec03c1a9fe")
  84. cache[hash], _ = testRepository.BlobObject(hash)
  85. hash = plumbing.NewHash("c29112dbd697ad9b401333b80c18a63951bc18d9")
  86. cache[hash], _ = testRepository.BlobObject(hash)
  87. hash = plumbing.NewHash("baa64828831d174f40140e4b3cfa77d1e917a2c1")
  88. cache[hash], _ = testRepository.BlobObject(hash)
  89. hash = plumbing.NewHash("dc248ba2b22048cc730c571a748e8ffcf7085ab9")
  90. cache[hash], _ = testRepository.BlobObject(hash)
  91. deps["blob_cache"] = cache
  92. changes := make(object.Changes, 3)
  93. treeFrom, _ := testRepository.TreeObject(plumbing.NewHash(
  94. "a1eb2ea76eb7f9bfbde9b243861474421000eb96"))
  95. treeTo, _ := testRepository.TreeObject(plumbing.NewHash(
  96. "994eac1cd07235bb9815e547a75c84265dea00f5"))
  97. changes[0] = &object.Change{From: object.ChangeEntry{
  98. Name: "analyser.go",
  99. Tree: treeFrom,
  100. TreeEntry: object.TreeEntry{
  101. Name: "analyser.go",
  102. Mode: 0100644,
  103. Hash: plumbing.NewHash("dc248ba2b22048cc730c571a748e8ffcf7085ab9"),
  104. },
  105. }, To: object.ChangeEntry{
  106. Name: "analyser.go",
  107. Tree: treeTo,
  108. TreeEntry: object.TreeEntry{
  109. Name: "analyser.go",
  110. Mode: 0100644,
  111. Hash: plumbing.NewHash("baa64828831d174f40140e4b3cfa77d1e917a2c1"),
  112. },
  113. }}
  114. changes[1] = &object.Change{From: object.ChangeEntry{}, To: object.ChangeEntry{
  115. Name: "cmd/hercules/main.go",
  116. Tree: treeTo,
  117. TreeEntry: object.TreeEntry{
  118. Name: "cmd/hercules/main.go",
  119. Mode: 0100644,
  120. Hash: plumbing.NewHash("c29112dbd697ad9b401333b80c18a63951bc18d9"),
  121. },
  122. },
  123. }
  124. changes[2] = &object.Change{From: object.ChangeEntry{}, To: object.ChangeEntry{
  125. Name: ".travis.yml",
  126. Tree: treeTo,
  127. TreeEntry: object.TreeEntry{
  128. Name: ".travis.yml",
  129. Mode: 0100644,
  130. Hash: plumbing.NewHash("291286b4ac41952cbd1389fda66420ec03c1a9fe"),
  131. },
  132. },
  133. }
  134. deps["changes"] = changes
  135. fd := fixtureFileDiff()
  136. result, err := fd.Consume(deps)
  137. assert.Nil(t, err)
  138. deps["file_diff"] = result["file_diff"]
  139. result, err = burndown.Consume(deps)
  140. assert.Nil(t, result)
  141. assert.Nil(t, err)
  142. assert.Equal(t, burndown.previousDay, 0)
  143. assert.Equal(t, len(burndown.files), 3)
  144. assert.Equal(t, burndown.files["cmd/hercules/main.go"].Len(), 207)
  145. assert.Equal(t, burndown.files["analyser.go"].Len(), 926)
  146. assert.Equal(t, burndown.files[".travis.yml"].Len(), 12)
  147. assert.Equal(t, len(burndown.people), 2)
  148. assert.Equal(t, burndown.people[0][0], int64(12+207+926))
  149. assert.Equal(t, len(burndown.globalStatus), 1)
  150. assert.Equal(t, burndown.globalStatus[0], int64(12+207+926))
  151. assert.Equal(t, len(burndown.globalHistory), 0)
  152. assert.Equal(t, len(burndown.fileHistories), 0)
  153. burndown2 := BurndownAnalysis{
  154. Granularity: 30,
  155. Sampling: 0,
  156. }
  157. burndown2.Initialize(testRepository)
  158. _, err = burndown2.Consume(deps)
  159. assert.Nil(t, err)
  160. assert.Equal(t, len(burndown2.people), 0)
  161. assert.Equal(t, len(burndown2.peopleHistories), 0)
  162. assert.Equal(t, len(burndown2.fileHistories), 0)
  163. // stage 2
  164. // 2b1ed978194a94edeabbca6de7ff3b5771d4d665
  165. deps["author"] = 1
  166. deps["day"] = 30
  167. cache = map[plumbing.Hash]*object.Blob{}
  168. hash = plumbing.NewHash("291286b4ac41952cbd1389fda66420ec03c1a9fe")
  169. cache[hash], _ = testRepository.BlobObject(hash)
  170. hash = plumbing.NewHash("baa64828831d174f40140e4b3cfa77d1e917a2c1")
  171. cache[hash], _ = testRepository.BlobObject(hash)
  172. hash = plumbing.NewHash("29c9fafd6a2fae8cd20298c3f60115bc31a4c0f2")
  173. cache[hash], _ = testRepository.BlobObject(hash)
  174. hash = plumbing.NewHash("c29112dbd697ad9b401333b80c18a63951bc18d9")
  175. cache[hash], _ = testRepository.BlobObject(hash)
  176. hash = plumbing.NewHash("f7d918ec500e2f925ecde79b51cc007bac27de72")
  177. cache[hash], _ = testRepository.BlobObject(hash)
  178. deps["blob_cache"] = cache
  179. changes = make(object.Changes, 3)
  180. treeFrom, _ = testRepository.TreeObject(plumbing.NewHash(
  181. "96c6ece9b2f3c7c51b83516400d278dea5605100"))
  182. treeTo, _ = testRepository.TreeObject(plumbing.NewHash(
  183. "251f2094d7b523d5bcc60e663b6cf38151bf8844"))
  184. changes[0] = &object.Change{From: object.ChangeEntry{
  185. Name: "analyser.go",
  186. Tree: treeFrom,
  187. TreeEntry: object.TreeEntry{
  188. Name: "analyser.go",
  189. Mode: 0100644,
  190. Hash: plumbing.NewHash("baa64828831d174f40140e4b3cfa77d1e917a2c1"),
  191. },
  192. }, To: object.ChangeEntry{
  193. Name: "burndown.go",
  194. Tree: treeTo,
  195. TreeEntry: object.TreeEntry{
  196. Name: "burndown.go",
  197. Mode: 0100644,
  198. Hash: plumbing.NewHash("29c9fafd6a2fae8cd20298c3f60115bc31a4c0f2"),
  199. },
  200. },
  201. }
  202. changes[1] = &object.Change{From: object.ChangeEntry{
  203. Name: "cmd/hercules/main.go",
  204. Tree: treeFrom,
  205. TreeEntry: object.TreeEntry{
  206. Name: "cmd/hercules/main.go",
  207. Mode: 0100644,
  208. Hash: plumbing.NewHash("c29112dbd697ad9b401333b80c18a63951bc18d9"),
  209. },
  210. }, To: object.ChangeEntry{
  211. Name: "cmd/hercules/main.go",
  212. Tree: treeTo,
  213. TreeEntry: object.TreeEntry{
  214. Name: "cmd/hercules/main.go",
  215. Mode: 0100644,
  216. Hash: plumbing.NewHash("f7d918ec500e2f925ecde79b51cc007bac27de72"),
  217. },
  218. },
  219. }
  220. changes[2] = &object.Change{From: object.ChangeEntry{
  221. Name: ".travis.yml",
  222. Tree: treeTo,
  223. TreeEntry: object.TreeEntry{
  224. Name: ".travis.yml",
  225. Mode: 0100644,
  226. Hash: plumbing.NewHash("291286b4ac41952cbd1389fda66420ec03c1a9fe"),
  227. },
  228. }, To: object.ChangeEntry{},
  229. }
  230. deps["changes"] = changes
  231. fd = fixtureFileDiff()
  232. result, err = fd.Consume(deps)
  233. assert.Nil(t, err)
  234. deps["file_diff"] = result["file_diff"]
  235. result, err = burndown.Consume(deps)
  236. assert.Nil(t, result)
  237. assert.Nil(t, err)
  238. assert.Equal(t, burndown.previousDay, 30)
  239. assert.Equal(t, len(burndown.files), 2)
  240. assert.Equal(t, burndown.files["cmd/hercules/main.go"].Len(), 290)
  241. assert.Equal(t, burndown.files["burndown.go"].Len(), 543)
  242. assert.Equal(t, len(burndown.people), 2)
  243. assert.Equal(t, len(burndown.globalStatus), 2)
  244. assert.Equal(t, burndown.globalStatus[0], int64(464))
  245. assert.Equal(t, burndown.globalStatus[1], int64(0))
  246. assert.Equal(t, len(burndown.globalHistory), 1)
  247. assert.Equal(t, len(burndown.globalHistory[0]), 2)
  248. assert.Equal(t, len(burndown.fileHistories), 3)
  249. out := burndown.Finalize().(BurndownResult)
  250. /*
  251. GlobalHistory [][]int64
  252. FileHistories map[string][][]int64
  253. PeopleHistories [][][]int64
  254. PeopleMatrix [][]int64
  255. */
  256. assert.Equal(t, len(out.GlobalHistory), 2)
  257. for i := 0; i < 2; i++ {
  258. assert.Equal(t, len(out.GlobalHistory[i]), 2)
  259. }
  260. assert.Equal(t, len(out.GlobalHistory), 2)
  261. assert.Equal(t, out.GlobalHistory[0][0], int64(1145))
  262. assert.Equal(t, out.GlobalHistory[0][1], int64(0))
  263. assert.Equal(t, out.GlobalHistory[1][0], int64(464))
  264. assert.Equal(t, out.GlobalHistory[1][1], int64(369))
  265. assert.Equal(t, len(out.FileHistories), 2)
  266. assert.Equal(t, len(out.FileHistories["cmd/hercules/main.go"]), 2)
  267. assert.Equal(t, len(out.FileHistories["burndown.go"]), 2)
  268. assert.Equal(t, len(out.FileHistories["cmd/hercules/main.go"][0]), 2)
  269. assert.Equal(t, len(out.FileHistories["burndown.go"][0]), 2)
  270. assert.Equal(t, len(out.PeopleMatrix), 2)
  271. assert.Equal(t, len(out.PeopleMatrix[0]), 4)
  272. assert.Equal(t, len(out.PeopleMatrix[1]), 4)
  273. assert.Equal(t, out.PeopleMatrix[0][0], int64(1145))
  274. assert.Equal(t, out.PeopleMatrix[0][1], int64(0))
  275. assert.Equal(t, out.PeopleMatrix[0][2], int64(0))
  276. assert.Equal(t, out.PeopleMatrix[0][3], int64(-681))
  277. assert.Equal(t, out.PeopleMatrix[1][0], int64(369))
  278. assert.Equal(t, out.PeopleMatrix[1][1], int64(0))
  279. assert.Equal(t, out.PeopleMatrix[1][2], int64(0))
  280. assert.Equal(t, out.PeopleMatrix[1][3], int64(0))
  281. assert.Equal(t, len(out.PeopleHistories), 2)
  282. for i := 0; i < 2; i++ {
  283. assert.Equal(t, len(out.PeopleHistories[i]), 2)
  284. assert.Equal(t, len(out.PeopleHistories[i][0]), 2)
  285. assert.Equal(t, len(out.PeopleHistories[i][1]), 2)
  286. }
  287. }
  288. func TestBurndownAnalysisSerialize(t *testing.T) {
  289. burndown := BurndownAnalysis{
  290. Granularity: 30,
  291. Sampling: 30,
  292. PeopleNumber: 2,
  293. TrackFiles: true,
  294. }
  295. burndown.Initialize(testRepository)
  296. deps := map[string]interface{}{}
  297. // stage 1
  298. deps["author"] = 0
  299. deps["day"] = 0
  300. cache := map[plumbing.Hash]*object.Blob{}
  301. hash := plumbing.NewHash("291286b4ac41952cbd1389fda66420ec03c1a9fe")
  302. cache[hash], _ = testRepository.BlobObject(hash)
  303. hash = plumbing.NewHash("c29112dbd697ad9b401333b80c18a63951bc18d9")
  304. cache[hash], _ = testRepository.BlobObject(hash)
  305. hash = plumbing.NewHash("baa64828831d174f40140e4b3cfa77d1e917a2c1")
  306. cache[hash], _ = testRepository.BlobObject(hash)
  307. hash = plumbing.NewHash("dc248ba2b22048cc730c571a748e8ffcf7085ab9")
  308. cache[hash], _ = testRepository.BlobObject(hash)
  309. deps["blob_cache"] = cache
  310. changes := make(object.Changes, 3)
  311. treeFrom, _ := testRepository.TreeObject(plumbing.NewHash(
  312. "a1eb2ea76eb7f9bfbde9b243861474421000eb96"))
  313. treeTo, _ := testRepository.TreeObject(plumbing.NewHash(
  314. "994eac1cd07235bb9815e547a75c84265dea00f5"))
  315. changes[0] = &object.Change{From: object.ChangeEntry{
  316. Name: "analyser.go",
  317. Tree: treeFrom,
  318. TreeEntry: object.TreeEntry{
  319. Name: "analyser.go",
  320. Mode: 0100644,
  321. Hash: plumbing.NewHash("dc248ba2b22048cc730c571a748e8ffcf7085ab9"),
  322. },
  323. }, To: object.ChangeEntry{
  324. Name: "analyser.go",
  325. Tree: treeTo,
  326. TreeEntry: object.TreeEntry{
  327. Name: "analyser.go",
  328. Mode: 0100644,
  329. Hash: plumbing.NewHash("baa64828831d174f40140e4b3cfa77d1e917a2c1"),
  330. },
  331. }}
  332. changes[1] = &object.Change{From: object.ChangeEntry{}, To: object.ChangeEntry{
  333. Name: "cmd/hercules/main.go",
  334. Tree: treeTo,
  335. TreeEntry: object.TreeEntry{
  336. Name: "cmd/hercules/main.go",
  337. Mode: 0100644,
  338. Hash: plumbing.NewHash("c29112dbd697ad9b401333b80c18a63951bc18d9"),
  339. },
  340. },
  341. }
  342. changes[2] = &object.Change{From: object.ChangeEntry{}, To: object.ChangeEntry{
  343. Name: ".travis.yml",
  344. Tree: treeTo,
  345. TreeEntry: object.TreeEntry{
  346. Name: ".travis.yml",
  347. Mode: 0100644,
  348. Hash: plumbing.NewHash("291286b4ac41952cbd1389fda66420ec03c1a9fe"),
  349. },
  350. },
  351. }
  352. deps["changes"] = changes
  353. fd := fixtureFileDiff()
  354. result, _ := fd.Consume(deps)
  355. deps["file_diff"] = result["file_diff"]
  356. burndown.Consume(deps)
  357. // stage 2
  358. // 2b1ed978194a94edeabbca6de7ff3b5771d4d665
  359. deps["author"] = 1
  360. deps["day"] = 30
  361. cache = map[plumbing.Hash]*object.Blob{}
  362. hash = plumbing.NewHash("291286b4ac41952cbd1389fda66420ec03c1a9fe")
  363. cache[hash], _ = testRepository.BlobObject(hash)
  364. hash = plumbing.NewHash("baa64828831d174f40140e4b3cfa77d1e917a2c1")
  365. cache[hash], _ = testRepository.BlobObject(hash)
  366. hash = plumbing.NewHash("29c9fafd6a2fae8cd20298c3f60115bc31a4c0f2")
  367. cache[hash], _ = testRepository.BlobObject(hash)
  368. hash = plumbing.NewHash("c29112dbd697ad9b401333b80c18a63951bc18d9")
  369. cache[hash], _ = testRepository.BlobObject(hash)
  370. hash = plumbing.NewHash("f7d918ec500e2f925ecde79b51cc007bac27de72")
  371. cache[hash], _ = testRepository.BlobObject(hash)
  372. deps["blob_cache"] = cache
  373. changes = make(object.Changes, 3)
  374. treeFrom, _ = testRepository.TreeObject(plumbing.NewHash(
  375. "96c6ece9b2f3c7c51b83516400d278dea5605100"))
  376. treeTo, _ = testRepository.TreeObject(plumbing.NewHash(
  377. "251f2094d7b523d5bcc60e663b6cf38151bf8844"))
  378. changes[0] = &object.Change{From: object.ChangeEntry{
  379. Name: "analyser.go",
  380. Tree: treeFrom,
  381. TreeEntry: object.TreeEntry{
  382. Name: "analyser.go",
  383. Mode: 0100644,
  384. Hash: plumbing.NewHash("baa64828831d174f40140e4b3cfa77d1e917a2c1"),
  385. },
  386. }, To: object.ChangeEntry{
  387. Name: "burndown.go",
  388. Tree: treeTo,
  389. TreeEntry: object.TreeEntry{
  390. Name: "burndown.go",
  391. Mode: 0100644,
  392. Hash: plumbing.NewHash("29c9fafd6a2fae8cd20298c3f60115bc31a4c0f2"),
  393. },
  394. },
  395. }
  396. changes[1] = &object.Change{From: object.ChangeEntry{
  397. Name: "cmd/hercules/main.go",
  398. Tree: treeFrom,
  399. TreeEntry: object.TreeEntry{
  400. Name: "cmd/hercules/main.go",
  401. Mode: 0100644,
  402. Hash: plumbing.NewHash("c29112dbd697ad9b401333b80c18a63951bc18d9"),
  403. },
  404. }, To: object.ChangeEntry{
  405. Name: "cmd/hercules/main.go",
  406. Tree: treeTo,
  407. TreeEntry: object.TreeEntry{
  408. Name: "cmd/hercules/main.go",
  409. Mode: 0100644,
  410. Hash: plumbing.NewHash("f7d918ec500e2f925ecde79b51cc007bac27de72"),
  411. },
  412. },
  413. }
  414. changes[2] = &object.Change{From: object.ChangeEntry{
  415. Name: ".travis.yml",
  416. Tree: treeTo,
  417. TreeEntry: object.TreeEntry{
  418. Name: ".travis.yml",
  419. Mode: 0100644,
  420. Hash: plumbing.NewHash("291286b4ac41952cbd1389fda66420ec03c1a9fe"),
  421. },
  422. }, To: object.ChangeEntry{},
  423. }
  424. deps["changes"] = changes
  425. fd = fixtureFileDiff()
  426. result, _ = fd.Consume(deps)
  427. deps["file_diff"] = result["file_diff"]
  428. burndown.Consume(deps)
  429. out := burndown.Finalize().(BurndownResult)
  430. people := [...]string{"one@srcd", "two@srcd"}
  431. burndown.reversedPeopleDict = people[:]
  432. buffer := &bytes.Buffer{}
  433. burndown.Serialize(out, false, buffer)
  434. assert.Equal(t, buffer.String(), ` granularity: 30
  435. sampling: 30
  436. "project": |-
  437. 1145 0
  438. 464 369
  439. files:
  440. "burndown.go": |-
  441. 0 0
  442. 293 250
  443. "cmd/hercules/main.go": |-
  444. 207 0
  445. 171 119
  446. people_sequence:
  447. - "one@srcd"
  448. - "two@srcd"
  449. people:
  450. "one@srcd": |-
  451. 1145 0
  452. 464 0
  453. "two@srcd": |-
  454. 0 0
  455. 0 369
  456. people_interaction: |-
  457. 1145 0 0 -681
  458. 369 0 0 0
  459. `)
  460. buffer = &bytes.Buffer{}
  461. burndown.Serialize(out, true, buffer)
  462. msg := pb.BurndownAnalysisResults{}
  463. proto.Unmarshal(buffer.Bytes(), &msg)
  464. assert.Equal(t, msg.Granularity, int32(30))
  465. assert.Equal(t, msg.Sampling, int32(30))
  466. assert.Equal(t, msg.Project.Name, "project")
  467. assert.Equal(t, msg.Project.NumberOfRows, int32(2))
  468. assert.Equal(t, msg.Project.NumberOfColumns, int32(2))
  469. assert.Len(t, msg.Project.Rows, 2)
  470. assert.Len(t, msg.Project.Rows[0].Columns, 1)
  471. assert.Equal(t, msg.Project.Rows[0].Columns[0], uint32(1145))
  472. assert.Len(t, msg.Project.Rows[1].Columns, 2)
  473. assert.Equal(t, msg.Project.Rows[1].Columns[0], uint32(464))
  474. assert.Equal(t, msg.Project.Rows[1].Columns[1], uint32(369))
  475. assert.Len(t, msg.Files, 2)
  476. assert.Equal(t, msg.Files[0].Name, "burndown.go")
  477. assert.Equal(t, msg.Files[1].Name, "cmd/hercules/main.go")
  478. assert.Len(t, msg.Files[0].Rows, 2)
  479. assert.Len(t, msg.Files[0].Rows[0].Columns, 0)
  480. assert.Len(t, msg.Files[0].Rows[1].Columns, 2)
  481. assert.Equal(t, msg.Files[0].Rows[1].Columns[0], uint32(293))
  482. assert.Equal(t, msg.Files[0].Rows[1].Columns[1], uint32(250))
  483. assert.Len(t, msg.People, 2)
  484. assert.Equal(t, msg.People[0].Name, "one@srcd")
  485. assert.Equal(t, msg.People[1].Name, "two@srcd")
  486. assert.Len(t, msg.People[0].Rows, 2)
  487. assert.Len(t, msg.People[0].Rows[0].Columns, 1)
  488. assert.Len(t, msg.People[0].Rows[1].Columns, 1)
  489. assert.Equal(t, msg.People[0].Rows[0].Columns[0], uint32(1145))
  490. assert.Equal(t, msg.People[0].Rows[1].Columns[0], uint32(464))
  491. assert.Len(t, msg.People[1].Rows, 2)
  492. assert.Len(t, msg.People[1].Rows[0].Columns, 0)
  493. assert.Len(t, msg.People[1].Rows[1].Columns, 2)
  494. assert.Equal(t, msg.People[1].Rows[1].Columns[0], uint32(0))
  495. assert.Equal(t, msg.People[1].Rows[1].Columns[1], uint32(369))
  496. assert.Equal(t, msg.PeopleInteraction.NumberOfRows, int32(2))
  497. assert.Equal(t, msg.PeopleInteraction.NumberOfColumns, int32(4))
  498. data := [...]int64{1145, -681, 369}
  499. assert.Equal(t, msg.PeopleInteraction.Data, data[:])
  500. indices := [...]int32{0, 3, 0}
  501. assert.Equal(t, msg.PeopleInteraction.Indices, indices[:])
  502. indptr := [...]int64{0, 2, 3}
  503. assert.Equal(t, msg.PeopleInteraction.Indptr, indptr[:])
  504. }
  505. type panickingCloser struct {
  506. }
  507. func (c panickingCloser) Close() error {
  508. return io.EOF
  509. }
  510. func TestCheckClose(t *testing.T) {
  511. closer := panickingCloser{}
  512. assert.Panics(t, func() { checkClose(closer) })
  513. }