burndown_test.go 18 KB

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