blob_cache_test.go 5.8 KB

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