blob_cache_test.go 6.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217
  1. package hercules
  2. import (
  3. "testing"
  4. "github.com/stretchr/testify/assert"
  5. "gopkg.in/src-d/go-git.v4"
  6. "gopkg.in/src-d/go-git.v4/plumbing"
  7. "gopkg.in/src-d/go-git.v4/plumbing/object"
  8. )
  9. var testRepository *git.Repository
  10. func fixtureBlobCache() *BlobCache {
  11. cache := &BlobCache{}
  12. cache.Initialize(testRepository)
  13. return cache
  14. }
  15. func TestBlobCacheInitialize(t *testing.T) {
  16. cache := fixtureBlobCache()
  17. assert.Equal(t, testRepository, cache.repository)
  18. }
  19. func TestBlobCacheMetadata(t *testing.T) {
  20. cache := fixtureBlobCache()
  21. assert.Equal(t, cache.Name(), "BlobCache")
  22. assert.Equal(t, len(cache.Provides()), 1)
  23. assert.Equal(t, cache.Provides()[0], "blob_cache")
  24. assert.Equal(t, len(cache.Requires()), 1)
  25. changes := &TreeDiff{}
  26. assert.Equal(t, cache.Requires()[0], changes.Provides()[0])
  27. }
  28. func TestBlobCacheConsumeModification(t *testing.T) {
  29. commit, _ := testRepository.CommitObject(plumbing.NewHash(
  30. "af2d8db70f287b52d2428d9887a69a10bc4d1f46"))
  31. changes := make(object.Changes, 1)
  32. treeFrom, _ := testRepository.TreeObject(plumbing.NewHash(
  33. "80fe25955b8e725feee25c08ea5759d74f8b670d"))
  34. treeTo, _ := testRepository.TreeObject(plumbing.NewHash(
  35. "63076fa0dfd93e94b6d2ef0fc8b1fdf9092f83c4"))
  36. changes[0] = &object.Change{From: object.ChangeEntry{
  37. Name: "labours.py",
  38. Tree: treeFrom,
  39. TreeEntry: object.TreeEntry{
  40. Name: "labours.py",
  41. Mode: 0100644,
  42. Hash: plumbing.NewHash("1cacfc1bf0f048eb2f31973750983ae5d8de647a"),
  43. },
  44. }, To: object.ChangeEntry{
  45. Name: "labours.py",
  46. Tree: treeTo,
  47. TreeEntry: object.TreeEntry{
  48. Name: "labours.py",
  49. Mode: 0100644,
  50. Hash: plumbing.NewHash("c872b8d2291a5224e2c9f6edd7f46039b96b4742"),
  51. },
  52. }}
  53. deps := map[string]interface{}{}
  54. deps["commit"] = commit
  55. deps["changes"] = changes
  56. result, err := fixtureBlobCache().Consume(deps)
  57. assert.Nil(t, err)
  58. assert.Equal(t, len(result), 1)
  59. cacheIface, exists := result["blob_cache"]
  60. assert.True(t, exists)
  61. cache := cacheIface.(map[plumbing.Hash]*object.Blob)
  62. assert.Equal(t, len(cache), 2)
  63. blobFrom, exists := cache[plumbing.NewHash("1cacfc1bf0f048eb2f31973750983ae5d8de647a")]
  64. assert.True(t, exists)
  65. blobTo, exists := cache[plumbing.NewHash("c872b8d2291a5224e2c9f6edd7f46039b96b4742")]
  66. assert.True(t, exists)
  67. assert.Equal(t, blobFrom.Size, int64(8969))
  68. assert.Equal(t, blobTo.Size, int64(9481))
  69. }
  70. func TestBlobCacheConsumeInsertionDeletion(t *testing.T) {
  71. commit, _ := testRepository.CommitObject(plumbing.NewHash(
  72. "2b1ed978194a94edeabbca6de7ff3b5771d4d665"))
  73. changes := make(object.Changes, 2)
  74. treeFrom, _ := testRepository.TreeObject(plumbing.NewHash(
  75. "96c6ece9b2f3c7c51b83516400d278dea5605100"))
  76. treeTo, _ := testRepository.TreeObject(plumbing.NewHash(
  77. "251f2094d7b523d5bcc60e663b6cf38151bf8844"))
  78. changes[0] = &object.Change{From: object.ChangeEntry{
  79. Name: "analyser.go",
  80. Tree: treeFrom,
  81. TreeEntry: object.TreeEntry{
  82. Name: "analyser.go",
  83. Mode: 0100644,
  84. Hash: plumbing.NewHash("baa64828831d174f40140e4b3cfa77d1e917a2c1"),
  85. },
  86. }, To: object.ChangeEntry{},
  87. }
  88. changes[1] = &object.Change{From: object.ChangeEntry{}, To: object.ChangeEntry{
  89. Name: "pipeline.go",
  90. Tree: treeTo,
  91. TreeEntry: object.TreeEntry{
  92. Name: "pipeline.go",
  93. Mode: 0100644,
  94. Hash: plumbing.NewHash("db99e1890f581ad69e1527fe8302978c661eb473"),
  95. },
  96. },
  97. }
  98. deps := map[string]interface{}{}
  99. deps["commit"] = commit
  100. deps["changes"] = changes
  101. result, err := fixtureBlobCache().Consume(deps)
  102. assert.Nil(t, err)
  103. assert.Equal(t, len(result), 1)
  104. cacheIface, exists := result["blob_cache"]
  105. assert.True(t, exists)
  106. cache := cacheIface.(map[plumbing.Hash]*object.Blob)
  107. assert.Equal(t, len(cache), 2)
  108. blobFrom, exists := cache[plumbing.NewHash("baa64828831d174f40140e4b3cfa77d1e917a2c1")]
  109. assert.True(t, exists)
  110. blobTo, exists := cache[plumbing.NewHash("db99e1890f581ad69e1527fe8302978c661eb473")]
  111. assert.True(t, exists)
  112. assert.Equal(t, blobFrom.Size, int64(26446))
  113. assert.Equal(t, blobTo.Size, int64(5576))
  114. }
  115. func TestBlobCacheConsumeNoAction(t *testing.T) {
  116. commit, _ := testRepository.CommitObject(plumbing.NewHash(
  117. "af2d8db70f287b52d2428d9887a69a10bc4d1f46"))
  118. changes := make(object.Changes, 1)
  119. treeFrom, _ := testRepository.TreeObject(plumbing.NewHash(
  120. "80fe25955b8e725feee25c08ea5759d74f8b670d"))
  121. treeTo, _ := testRepository.TreeObject(plumbing.NewHash(
  122. "63076fa0dfd93e94b6d2ef0fc8b1fdf9092f83c4"))
  123. changes[0] = &object.Change{From: object.ChangeEntry{
  124. Name: "labours.py",
  125. Tree: treeFrom,
  126. TreeEntry: object.TreeEntry{},
  127. }, To: object.ChangeEntry{
  128. Name: "labours.py",
  129. Tree: treeTo,
  130. TreeEntry: object.TreeEntry{},
  131. }}
  132. deps := map[string]interface{}{}
  133. deps["commit"] = commit
  134. deps["changes"] = changes
  135. result, err := fixtureBlobCache().Consume(deps)
  136. assert.Nil(t, result)
  137. assert.NotNil(t, err)
  138. }
  139. func TestBlobCacheConsumeInvalidHash(t *testing.T) {
  140. commit, _ := testRepository.CommitObject(plumbing.NewHash(
  141. "af2d8db70f287b52d2428d9887a69a10bc4d1f46"))
  142. changes := make(object.Changes, 1)
  143. treeFrom, _ := testRepository.TreeObject(plumbing.NewHash(
  144. "80fe25955b8e725feee25c08ea5759d74f8b670d"))
  145. treeTo, _ := testRepository.TreeObject(plumbing.NewHash(
  146. "63076fa0dfd93e94b6d2ef0fc8b1fdf9092f83c4"))
  147. changes[0] = &object.Change{From: object.ChangeEntry{
  148. Name: "labours.py",
  149. Tree: treeFrom,
  150. TreeEntry: object.TreeEntry{
  151. Name: "labours.py",
  152. Mode: 0100644,
  153. Hash: plumbing.NewHash("ffffffffffffffffffffffffffffffffffffffff"),
  154. },
  155. }, To: object.ChangeEntry{
  156. Name: "labours.py",
  157. Tree: treeTo,
  158. TreeEntry: object.TreeEntry{},
  159. }}
  160. deps := map[string]interface{}{}
  161. deps["commit"] = commit
  162. deps["changes"] = changes
  163. result, err := fixtureBlobCache().Consume(deps)
  164. assert.Nil(t, result)
  165. assert.NotNil(t, err)
  166. }
  167. func TestBlobCacheFinalize(t *testing.T) {
  168. outcome := fixtureBlobCache().Finalize()
  169. assert.Nil(t, outcome)
  170. }
  171. func TestBlobCacheGetBlob(t *testing.T) {
  172. cache := fixtureBlobCache()
  173. treeFrom, _ := testRepository.TreeObject(plumbing.NewHash(
  174. "80fe25955b8e725feee25c08ea5759d74f8b670d"))
  175. entry := object.ChangeEntry{
  176. Name: "labours.py",
  177. Tree: treeFrom,
  178. TreeEntry: object.TreeEntry{
  179. Name: "labours.py",
  180. Mode: 0100644,
  181. Hash: plumbing.NewHash("80fe25955b8e725feee25c08ea5759d74f8b670d"),
  182. },
  183. }
  184. getter := func(path string) (*object.File, error) {
  185. assert.Equal(t, path, ".gitmodules")
  186. commit, _ := testRepository.CommitObject(plumbing.NewHash(
  187. "13272b66c55e1ba1237a34104f30b84d7f6e4082"))
  188. return commit.File("test_data/gitmodules")
  189. }
  190. blob, err := cache.getBlob(&entry, getter)
  191. assert.Nil(t, blob)
  192. assert.NotNil(t, err)
  193. assert.Equal(t, err.Error(), plumbing.ErrObjectNotFound.Error())
  194. getter = func(path string) (*object.File, error) {
  195. assert.Equal(t, path, ".gitmodules")
  196. commit, _ := testRepository.CommitObject(plumbing.NewHash(
  197. "13272b66c55e1ba1237a34104f30b84d7f6e4082"))
  198. return commit.File("test_data/gitmodules_empty")
  199. }
  200. blob, err = cache.getBlob(&entry, getter)
  201. assert.Nil(t, blob)
  202. assert.NotNil(t, err)
  203. assert.Equal(t, err.Error(), plumbing.ErrObjectNotFound.Error())
  204. }