helpers_test.go 7.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171
  1. package cwhub
  2. import (
  3. "testing"
  4. "github.com/stretchr/testify/require"
  5. )
  6. // Download index, install collection. Add scenario to collection (hub-side), update index, upgrade collection
  7. // We expect the new scenario to be installed
  8. func TestUpgradeConfigNewScenarioInCollection(t *testing.T) {
  9. cfg := envSetup(t)
  10. defer envTearDown(cfg)
  11. // fresh install of collection
  12. getHubIdxOrFail(t)
  13. require.False(t, hubIdx[COLLECTIONS]["crowdsecurity/test_collection"].Downloaded)
  14. require.False(t, hubIdx[COLLECTIONS]["crowdsecurity/test_collection"].Installed)
  15. require.NoError(t, InstallItem(cfg, "crowdsecurity/test_collection", COLLECTIONS, false, false))
  16. require.True(t, hubIdx[COLLECTIONS]["crowdsecurity/test_collection"].Downloaded)
  17. require.True(t, hubIdx[COLLECTIONS]["crowdsecurity/test_collection"].Installed)
  18. require.True(t, hubIdx[COLLECTIONS]["crowdsecurity/test_collection"].UpToDate)
  19. require.False(t, hubIdx[COLLECTIONS]["crowdsecurity/test_collection"].Tainted)
  20. // This is the scenario that gets added in next version of collection
  21. require.False(t, hubIdx[SCENARIOS]["crowdsecurity/barfoo_scenario"].Downloaded)
  22. require.False(t, hubIdx[SCENARIOS]["crowdsecurity/barfoo_scenario"].Installed)
  23. assertCollectionDepsInstalled(t, "crowdsecurity/test_collection")
  24. // collection receives an update. It now adds new scenario "crowdsecurity/barfoo_scenario"
  25. pushUpdateToCollectionInHub()
  26. if err := UpdateHubIdx(cfg.Hub); err != nil {
  27. t.Fatalf("failed to download index : %s", err)
  28. }
  29. getHubIdxOrFail(t)
  30. require.True(t, hubIdx[COLLECTIONS]["crowdsecurity/test_collection"].Downloaded)
  31. require.True(t, hubIdx[COLLECTIONS]["crowdsecurity/test_collection"].Installed)
  32. require.False(t, hubIdx[COLLECTIONS]["crowdsecurity/test_collection"].UpToDate)
  33. require.False(t, hubIdx[COLLECTIONS]["crowdsecurity/test_collection"].Tainted)
  34. err := UpgradeConfig(cfg, COLLECTIONS, "crowdsecurity/test_collection", false)
  35. require.NoError(t, err)
  36. assertCollectionDepsInstalled(t, "crowdsecurity/test_collection")
  37. require.True(t, hubIdx[SCENARIOS]["crowdsecurity/barfoo_scenario"].Downloaded)
  38. require.True(t, hubIdx[SCENARIOS]["crowdsecurity/barfoo_scenario"].Installed)
  39. }
  40. // Install a collection, disable a scenario.
  41. // Upgrade should install should not enable/download the disabled scenario.
  42. func TestUpgradeConfigInDisabledScenarioShouldNotBeInstalled(t *testing.T) {
  43. cfg := envSetup(t)
  44. defer envTearDown(cfg)
  45. // fresh install of collection
  46. getHubIdxOrFail(t)
  47. require.False(t, hubIdx[COLLECTIONS]["crowdsecurity/test_collection"].Downloaded)
  48. require.False(t, hubIdx[COLLECTIONS]["crowdsecurity/test_collection"].Installed)
  49. require.False(t, hubIdx[SCENARIOS]["crowdsecurity/foobar_scenario"].Installed)
  50. require.NoError(t, InstallItem(cfg, "crowdsecurity/test_collection", COLLECTIONS, false, false))
  51. require.True(t, hubIdx[COLLECTIONS]["crowdsecurity/test_collection"].Downloaded)
  52. require.True(t, hubIdx[COLLECTIONS]["crowdsecurity/test_collection"].Installed)
  53. require.True(t, hubIdx[COLLECTIONS]["crowdsecurity/test_collection"].UpToDate)
  54. require.False(t, hubIdx[COLLECTIONS]["crowdsecurity/test_collection"].Tainted)
  55. require.True(t, hubIdx[SCENARIOS]["crowdsecurity/foobar_scenario"].Installed)
  56. assertCollectionDepsInstalled(t, "crowdsecurity/test_collection")
  57. err := RemoveMany(cfg, SCENARIOS, "crowdsecurity/foobar_scenario", false, false, false)
  58. require.NoError(t, err)
  59. getHubIdxOrFail(t)
  60. // scenario referenced by collection was deleted hence, collection should be tainted
  61. require.False(t, hubIdx[SCENARIOS]["crowdsecurity/foobar_scenario"].Installed)
  62. require.True(t, hubIdx[COLLECTIONS]["crowdsecurity/test_collection"].Tainted)
  63. require.True(t, hubIdx[COLLECTIONS]["crowdsecurity/test_collection"].Downloaded)
  64. require.True(t, hubIdx[COLLECTIONS]["crowdsecurity/test_collection"].Installed)
  65. require.True(t, hubIdx[COLLECTIONS]["crowdsecurity/test_collection"].UpToDate)
  66. if err = UpdateHubIdx(cfg.Hub); err != nil {
  67. t.Fatalf("failed to download index : %s", err)
  68. }
  69. err = UpgradeConfig(cfg, COLLECTIONS, "crowdsecurity/test_collection", false)
  70. require.NoError(t, err)
  71. getHubIdxOrFail(t)
  72. require.False(t, hubIdx[SCENARIOS]["crowdsecurity/foobar_scenario"].Installed)
  73. }
  74. func getHubIdxOrFail(t *testing.T) {
  75. if err := GetHubIdx(getTestCfg().Hub); err != nil {
  76. t.Fatalf("failed to load hub index")
  77. }
  78. }
  79. // Install a collection. Disable a referenced scenario. Publish new version of collection with new scenario
  80. // Upgrade should not enable/download the disabled scenario.
  81. // Upgrade should install and enable the newly added scenario.
  82. func TestUpgradeConfigNewScenarioIsInstalledWhenReferencedScenarioIsDisabled(t *testing.T) {
  83. cfg := envSetup(t)
  84. defer envTearDown(cfg)
  85. // fresh install of collection
  86. getHubIdxOrFail(t)
  87. require.False(t, hubIdx[COLLECTIONS]["crowdsecurity/test_collection"].Downloaded)
  88. require.False(t, hubIdx[COLLECTIONS]["crowdsecurity/test_collection"].Installed)
  89. require.False(t, hubIdx[SCENARIOS]["crowdsecurity/foobar_scenario"].Installed)
  90. require.NoError(t, InstallItem(cfg, "crowdsecurity/test_collection", COLLECTIONS, false, false))
  91. require.True(t, hubIdx[COLLECTIONS]["crowdsecurity/test_collection"].Downloaded)
  92. require.True(t, hubIdx[COLLECTIONS]["crowdsecurity/test_collection"].Installed)
  93. require.True(t, hubIdx[COLLECTIONS]["crowdsecurity/test_collection"].UpToDate)
  94. require.False(t, hubIdx[COLLECTIONS]["crowdsecurity/test_collection"].Tainted)
  95. require.True(t, hubIdx[SCENARIOS]["crowdsecurity/foobar_scenario"].Installed)
  96. assertCollectionDepsInstalled(t, "crowdsecurity/test_collection")
  97. err := RemoveMany(cfg, SCENARIOS, "crowdsecurity/foobar_scenario", false, false, false)
  98. require.NoError(t, err)
  99. getHubIdxOrFail(t)
  100. // scenario referenced by collection was deleted hence, collection should be tainted
  101. require.False(t, hubIdx[SCENARIOS]["crowdsecurity/foobar_scenario"].Installed)
  102. require.True(t, hubIdx[SCENARIOS]["crowdsecurity/foobar_scenario"].Downloaded) // this fails
  103. require.True(t, hubIdx[COLLECTIONS]["crowdsecurity/test_collection"].Tainted)
  104. require.True(t, hubIdx[COLLECTIONS]["crowdsecurity/test_collection"].Downloaded)
  105. require.True(t, hubIdx[COLLECTIONS]["crowdsecurity/test_collection"].Installed)
  106. require.True(t, hubIdx[COLLECTIONS]["crowdsecurity/test_collection"].UpToDate)
  107. // collection receives an update. It now adds new scenario "crowdsecurity/barfoo_scenario"
  108. // we now attempt to upgrade the collection, however it shouldn't install the foobar_scenario
  109. // we just removed. Nor should it install the newly added scenario
  110. pushUpdateToCollectionInHub()
  111. if err = UpdateHubIdx(cfg.Hub); err != nil {
  112. t.Fatalf("failed to download index : %s", err)
  113. }
  114. require.False(t, hubIdx[SCENARIOS]["crowdsecurity/foobar_scenario"].Installed)
  115. getHubIdxOrFail(t)
  116. err = UpgradeConfig(cfg, COLLECTIONS, "crowdsecurity/test_collection", false)
  117. require.NoError(t, err)
  118. getHubIdxOrFail(t)
  119. require.False(t, hubIdx[SCENARIOS]["crowdsecurity/foobar_scenario"].Installed)
  120. require.True(t, hubIdx[SCENARIOS]["crowdsecurity/barfoo_scenario"].Installed)
  121. }
  122. func assertCollectionDepsInstalled(t *testing.T, collection string) {
  123. t.Helper()
  124. c := hubIdx[COLLECTIONS][collection]
  125. require.NoError(t, CollecDepsCheck(&c))
  126. }
  127. func pushUpdateToCollectionInHub() {
  128. responseByPath["/master/.index.json"] = fileToStringX("./testdata/index2.json")
  129. responseByPath["/master/collections/crowdsecurity/test_collection.yaml"] = fileToStringX("./testdata/collection_v2.yaml")
  130. }