helpers_test.go 7.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163
  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. UpgradeConfig(cfg, COLLECTIONS, "crowdsecurity/test_collection", false)
  35. assertCollectionDepsInstalled(t, "crowdsecurity/test_collection")
  36. require.True(t, hubIdx[SCENARIOS]["crowdsecurity/barfoo_scenario"].Downloaded)
  37. require.True(t, hubIdx[SCENARIOS]["crowdsecurity/barfoo_scenario"].Installed)
  38. }
  39. // Install a collection, disable a scenario.
  40. // Upgrade should install should not enable/download the disabled scenario.
  41. func TestUpgradeConfigInDisabledScenarioShouldNotBeInstalled(t *testing.T) {
  42. cfg := envSetup(t)
  43. defer envTearDown(cfg)
  44. // fresh install of collection
  45. getHubIdxOrFail(t)
  46. require.False(t, hubIdx[COLLECTIONS]["crowdsecurity/test_collection"].Downloaded)
  47. require.False(t, hubIdx[COLLECTIONS]["crowdsecurity/test_collection"].Installed)
  48. require.False(t, hubIdx[SCENARIOS]["crowdsecurity/foobar_scenario"].Installed)
  49. require.NoError(t, InstallItem(cfg, "crowdsecurity/test_collection", COLLECTIONS, false, false))
  50. require.True(t, hubIdx[COLLECTIONS]["crowdsecurity/test_collection"].Downloaded)
  51. require.True(t, hubIdx[COLLECTIONS]["crowdsecurity/test_collection"].Installed)
  52. require.True(t, hubIdx[COLLECTIONS]["crowdsecurity/test_collection"].UpToDate)
  53. require.False(t, hubIdx[COLLECTIONS]["crowdsecurity/test_collection"].Tainted)
  54. require.True(t, hubIdx[SCENARIOS]["crowdsecurity/foobar_scenario"].Installed)
  55. assertCollectionDepsInstalled(t, "crowdsecurity/test_collection")
  56. RemoveMany(cfg, SCENARIOS, "crowdsecurity/foobar_scenario", false, false, false)
  57. getHubIdxOrFail(t)
  58. // scenario referenced by collection was deleted hence, collection should be tainted
  59. require.False(t, hubIdx[SCENARIOS]["crowdsecurity/foobar_scenario"].Installed)
  60. require.True(t, hubIdx[COLLECTIONS]["crowdsecurity/test_collection"].Tainted)
  61. require.True(t, hubIdx[COLLECTIONS]["crowdsecurity/test_collection"].Downloaded)
  62. require.True(t, hubIdx[COLLECTIONS]["crowdsecurity/test_collection"].Installed)
  63. require.True(t, hubIdx[COLLECTIONS]["crowdsecurity/test_collection"].UpToDate)
  64. if err := UpdateHubIdx(cfg.Hub); err != nil {
  65. t.Fatalf("failed to download index : %s", err)
  66. }
  67. UpgradeConfig(cfg, COLLECTIONS, "crowdsecurity/test_collection", false)
  68. getHubIdxOrFail(t)
  69. require.False(t, hubIdx[SCENARIOS]["crowdsecurity/foobar_scenario"].Installed)
  70. }
  71. func getHubIdxOrFail(t *testing.T) {
  72. if err := GetHubIdx(getTestCfg().Hub); err != nil {
  73. t.Fatalf("failed to load hub index")
  74. }
  75. }
  76. // Install a collection. Disable a referenced scenario. Publish new version of collection with new scenario
  77. // Upgrade should not enable/download the disabled scenario.
  78. // Upgrade should install and enable the newly added scenario.
  79. func TestUpgradeConfigNewScenarioIsInstalledWhenReferencedScenarioIsDisabled(t *testing.T) {
  80. cfg := envSetup(t)
  81. defer envTearDown(cfg)
  82. // fresh install of collection
  83. getHubIdxOrFail(t)
  84. require.False(t, hubIdx[COLLECTIONS]["crowdsecurity/test_collection"].Downloaded)
  85. require.False(t, hubIdx[COLLECTIONS]["crowdsecurity/test_collection"].Installed)
  86. require.False(t, hubIdx[SCENARIOS]["crowdsecurity/foobar_scenario"].Installed)
  87. require.NoError(t, InstallItem(cfg, "crowdsecurity/test_collection", COLLECTIONS, false, false))
  88. require.True(t, hubIdx[COLLECTIONS]["crowdsecurity/test_collection"].Downloaded)
  89. require.True(t, hubIdx[COLLECTIONS]["crowdsecurity/test_collection"].Installed)
  90. require.True(t, hubIdx[COLLECTIONS]["crowdsecurity/test_collection"].UpToDate)
  91. require.False(t, hubIdx[COLLECTIONS]["crowdsecurity/test_collection"].Tainted)
  92. require.True(t, hubIdx[SCENARIOS]["crowdsecurity/foobar_scenario"].Installed)
  93. assertCollectionDepsInstalled(t, "crowdsecurity/test_collection")
  94. RemoveMany(cfg, SCENARIOS, "crowdsecurity/foobar_scenario", false, false, false)
  95. getHubIdxOrFail(t)
  96. // scenario referenced by collection was deleted hence, collection should be tainted
  97. require.False(t, hubIdx[SCENARIOS]["crowdsecurity/foobar_scenario"].Installed)
  98. require.True(t, hubIdx[SCENARIOS]["crowdsecurity/foobar_scenario"].Downloaded) // this fails
  99. require.True(t, hubIdx[COLLECTIONS]["crowdsecurity/test_collection"].Tainted)
  100. require.True(t, hubIdx[COLLECTIONS]["crowdsecurity/test_collection"].Downloaded)
  101. require.True(t, hubIdx[COLLECTIONS]["crowdsecurity/test_collection"].Installed)
  102. require.True(t, hubIdx[COLLECTIONS]["crowdsecurity/test_collection"].UpToDate)
  103. // collection receives an update. It now adds new scenario "crowdsecurity/barfoo_scenario"
  104. // we now attempt to upgrade the collection, however it shouldn't install the foobar_scenario
  105. // we just removed. Nor should it install the newly added scenario
  106. pushUpdateToCollectionInHub()
  107. if err := UpdateHubIdx(cfg.Hub); err != nil {
  108. t.Fatalf("failed to download index : %s", err)
  109. }
  110. require.False(t, hubIdx[SCENARIOS]["crowdsecurity/foobar_scenario"].Installed)
  111. getHubIdxOrFail(t)
  112. UpgradeConfig(cfg, COLLECTIONS, "crowdsecurity/test_collection", false)
  113. getHubIdxOrFail(t)
  114. require.False(t, hubIdx[SCENARIOS]["crowdsecurity/foobar_scenario"].Installed)
  115. require.True(t, hubIdx[SCENARIOS]["crowdsecurity/barfoo_scenario"].Installed)
  116. }
  117. func assertCollectionDepsInstalled(t *testing.T, collection string) {
  118. t.Helper()
  119. c := hubIdx[COLLECTIONS][collection]
  120. require.NoError(t, CollecDepsCheck(&c))
  121. }
  122. func pushUpdateToCollectionInHub() {
  123. responseByPath["/master/.index.json"] = fileToStringX("./testdata/index2.json")
  124. responseByPath["/master/collections/crowdsecurity/test_collection.yaml"] = fileToStringX("./testdata/collection_v2.yaml")
  125. }