helpers_test.go 7.6 KB

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