scan_test.go 2.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135
  1. package scan_test
  2. import (
  3. "encoding/json"
  4. "fmt"
  5. "io/ioutil"
  6. "os"
  7. "github.com/zricethezav/gitleaks/v7/scan"
  8. )
  9. const repoBasePath = "../testdata/repos/"
  10. const expectPath = "../testdata/expect/"
  11. func moveDotGit(from, to string) error {
  12. repoDirs, err := ioutil.ReadDir("../testdata/repos")
  13. if err != nil {
  14. return err
  15. }
  16. for _, dir := range repoDirs {
  17. if to == ".git" {
  18. _, err := os.Stat(fmt.Sprintf("%s/%s/%s", repoBasePath, dir.Name(), "dotGit"))
  19. if os.IsNotExist(err) {
  20. // dont want to delete the only copy of .git accidentally
  21. continue
  22. }
  23. os.RemoveAll(fmt.Sprintf("%s/%s/%s", repoBasePath, dir.Name(), ".git"))
  24. }
  25. if !dir.IsDir() {
  26. continue
  27. }
  28. _, err := os.Stat(fmt.Sprintf("%s/%s/%s", repoBasePath, dir.Name(), from))
  29. if os.IsNotExist(err) {
  30. continue
  31. }
  32. err = os.Rename(fmt.Sprintf("%s/%s/%s", repoBasePath, dir.Name(), from),
  33. fmt.Sprintf("%s/%s/%s", repoBasePath, dir.Name(), to))
  34. if err != nil {
  35. return err
  36. }
  37. }
  38. return nil
  39. }
  40. func fileCheck(wantPath, gotPath string) error {
  41. var (
  42. gotLeaks []scan.Leak
  43. wantLeaks []scan.Leak
  44. )
  45. want, err := ioutil.ReadFile(wantPath)
  46. if err != nil {
  47. return err
  48. }
  49. got, err := ioutil.ReadFile(gotPath)
  50. if err != nil {
  51. return err
  52. }
  53. err = json.Unmarshal(got, &gotLeaks)
  54. if err != nil {
  55. return err
  56. }
  57. err = json.Unmarshal(want, &wantLeaks)
  58. if err != nil {
  59. return err
  60. }
  61. if len(wantLeaks) != len(gotLeaks) {
  62. return fmt.Errorf("got %d leaks, want %d leaks", len(gotLeaks), len(wantLeaks))
  63. }
  64. for _, wantLeak := range wantLeaks {
  65. found := false
  66. for _, gotLeak := range gotLeaks {
  67. if same(gotLeak, wantLeak) {
  68. found = true
  69. }
  70. }
  71. if !found {
  72. return fmt.Errorf("unable to find %+v in %s", wantLeak, gotPath)
  73. }
  74. }
  75. if err := os.Remove(gotPath); err != nil {
  76. return err
  77. }
  78. return nil
  79. }
  80. func same(l1, l2 scan.Leak) bool {
  81. if l1.Commit != l2.Commit {
  82. return false
  83. }
  84. if l1.Offender != l2.Offender {
  85. return false
  86. }
  87. if l1.OffenderEntropy != l2.OffenderEntropy {
  88. return false
  89. }
  90. if l1.Line != l2.Line {
  91. return false
  92. }
  93. if l1.Tags != l2.Tags {
  94. return false
  95. }
  96. if l1.LineNumber != l2.LineNumber {
  97. return false
  98. }
  99. if l1.Author != l2.Author {
  100. return false
  101. }
  102. if l1.LeakURL != l2.LeakURL {
  103. return false
  104. }
  105. if l1.RepoURL != l2.RepoURL {
  106. return false
  107. }
  108. if l1.Repo != l2.Repo {
  109. return false
  110. }
  111. return true
  112. }