diff --git a/pkg/plugins/plugin_test.go b/pkg/plugins/plugin_test.go index 837e63a16..7c8e2ad88 100644 --- a/pkg/plugins/plugin_test.go +++ b/pkg/plugins/plugin_test.go @@ -24,7 +24,7 @@ func TestInstall(t *testing.T) { config := &TestConfig{} config.InitConfig() manifestContent, _ := os.ReadFile("./test_artifacts/plugins.toml") - testServers := setUpServers(t, manifestContent) + testServers := setUpServers(t, manifestContent, nil) plugin, _ := LookUpPlugin(context.Background(), config, fs, "appA") err := plugin.Install(context.Background(), config, fs, "2.0.1", testServers.StripeServer.URL) @@ -42,7 +42,7 @@ func TestInstallFailsIfChecksumCouldNotBeFound(t *testing.T) { config := &TestConfig{} config.InitConfig() manifestContent, _ := os.ReadFile("./test_artifacts/plugins.toml") - testServers := setUpServers(t, manifestContent) + testServers := setUpServers(t, manifestContent, nil) plugin, _ := LookUpPlugin(context.Background(), config, fs, "appA") err := plugin.Install(context.Background(), config, fs, "0.0.0", testServers.StripeServer.URL) @@ -62,7 +62,7 @@ func TestInstallationFailsIfChecksumDoesNotMatch(t *testing.T) { config := &TestConfig{} config.InitConfig() manifestContent, _ := os.ReadFile("./test_artifacts/plugins.toml") - testServers := setUpServers(t, manifestContent) + testServers := setUpServers(t, manifestContent, nil) plugin, _ := LookUpPlugin(context.Background(), config, fs, "appB") err := plugin.Install(context.Background(), config, fs, "1.2.1", testServers.StripeServer.URL) @@ -82,7 +82,7 @@ func TestInstallCleansOtherVersionsOfPlugin(t *testing.T) { config := &TestConfig{} config.InitConfig() manifestContent, _ := os.ReadFile("./test_artifacts/plugins.toml") - testServers := setUpServers(t, manifestContent) + testServers := setUpServers(t, manifestContent, nil) // Download plugin version 0.0.1 plugin, _ := LookUpPlugin(context.Background(), config, fs, "appA") @@ -111,7 +111,7 @@ func TestInstallDoesNotCleanIfInstallFails(t *testing.T) { config := &TestConfig{} config.InitConfig() manifestContent, _ := os.ReadFile("./test_artifacts/plugins.toml") - testServers := setUpServers(t, manifestContent) + testServers := setUpServers(t, manifestContent, nil) // Download valid plugin plugin, _ := LookUpPlugin(context.Background(), config, fs, "appA") @@ -138,7 +138,7 @@ func TestUninstall(t *testing.T) { config := &TestConfig{} config.InitConfig() manifestContent, _ := os.ReadFile("./test_artifacts/plugins.toml") - testServers := setUpServers(t, manifestContent) + testServers := setUpServers(t, manifestContent, nil) // install a plugin to be uninstalled plugin, _ := LookUpPlugin(context.Background(), config, fs, "appA") diff --git a/pkg/plugins/test_artifacts/plugins-2-merged-foo-1.toml b/pkg/plugins/test_artifacts/plugins-2-merged-foo-1.toml new file mode 100644 index 000000000..5c64f5a5f --- /dev/null +++ b/pkg/plugins/test_artifacts/plugins-2-merged-foo-1.toml @@ -0,0 +1,134 @@ +[[Plugin]] + Shortname = "appA" + Binary = "stripe-cli-app-a" + MagicCookieValue = "0337A75A-C3C4-4DCF-A9EF-E7A144E5A291" + + [[Plugin.Release]] + Arch = "amd64" + OS = "darwin" + Version = "0.0.1" + Sum = "125653c37803a51a048f6687f7f66d511be614f675f199cd6c71928b74875238" + + [[Plugin.Release]] + Arch = "arm64" + OS = "darwin" + Version = "0.0.1" + Sum = "125653c37803a51a048f6687f7f66d511be614f675f199cd6c71928b74875238" + + [[Plugin.Release]] + Arch = "amd64" + OS = "linux" + Version = "0.0.1" + Sum = "125653c37803a51a048f6687f7f66d511be614f675f199cd6c71928b74875238" + + [[Plugin.Release]] + Arch = "amd64" + OS = "windows" + Version = "0.0.1" + Sum = "125653c37803a51a048f6687f7f66d511be614f675f199cd6c71928b74875238" + + [[Plugin.Release]] + Arch = "amd64" + OS = "darwin" + Version = "1.0.1" + Sum = "3c909ec628b7d32536a65fd15545db527a7509e734995d4ef4806694fbd89c3a" + + [[Plugin.Release]] + Arch = "arm64" + OS = "darwin" + Version = "1.0.1" + Sum = "3c909ec628b7d32536a65fd15545db527a7509e734995d4ef4806694fbd89c3a" + + [[Plugin.Release]] + Arch = "amd64" + OS = "linux" + Version = "1.0.1" + Sum = "3c909ec628b7d32536a65fd15545db527a7509e734995d4ef4806694fbd89c3a" + + [[Plugin.Release]] + Arch = "amd64" + OS = "windows" + Version = "1.0.1" + Sum = "3c909ec628b7d32536a65fd15545db527a7509e734995d4ef4806694fbd89c3a" + + [[Plugin.Release]] + Arch = "amd64" + OS = "darwin" + Version = "2.0.1" + Sum = "3752e4e3a9f1b17f85b542b355893b8614ad8662a3fb8eba6ebed66d1f9e2a87" + + [[Plugin.Release]] + Arch = "arm64" + OS = "darwin" + Version = "2.0.1" + Sum = "3752e4e3a9f1b17f85b542b355893b8614ad8662a3fb8eba6ebed66d1f9e2a87" + + [[Plugin.Release]] + Arch = "amd64" + OS = "linux" + Version = "2.0.1" + Sum = "3752e4e3a9f1b17f85b542b355893b8614ad8662a3fb8eba6ebed66d1f9e2a87" + + [[Plugin.Release]] + Arch = "amd64" + OS = "windows" + Version = "2.0.1" + Sum = "3752e4e3a9f1b17f85b542b355893b8614ad8662a3fb8eba6ebed66d1f9e2a87" + +[[Plugin]] + Shortname = "appB" + Binary = "stripe-cli-app-b" + MagicCookieValue = "FDBE6FB9-A149-44BD-9639-4D33D8B594E8" + + [[Plugin.Release]] + Arch = "amd64" + OS = "darwin" + Version = "1.2.1" + Sum = "2f05d4b689d270cafb02285f35f44866f7dc8a2d368a3f9d1124373eeab31fb1" + + [[Plugin.Release]] + Arch = "arm64" + OS = "darwin" + Version = "1.2.1" + Sum = "2f05d4b689d270cafb02285f35f44866f7dc8a2d368a3f9d1124373eeab31fb1" + + [[Plugin.Release]] + Arch = "amd64" + OS = "linux" + Version = "1.2.1" + Sum = "2f05d4b689d270cafb02285f35f44866f7dc8a2d368a3f9d1124373eeab31fb1" + + [[Plugin.Release]] + Arch = "amd64" + OS = "windows" + Version = "1.2.1" + Sum = "2f05d4b689d270cafb02285f35f44866f7dc8a2d368a3f9d1124373eeab31fb1" + +[[Plugin]] + Shortname = "foo" + Binary = "stripe-cli-foo" + MagicCookieValue = "6C5CFD81-F43C-447B-BBCF-803FF31CD3D1" + + [[Plugin.Release]] + Arch = "amd64" + OS = "darwin" + Version = "0.0.1" + Sum = "125653c37803a51a048f6687f7f66d511be614f675f199cd6c71928b74875238" + + [[Plugin.Release]] + Arch = "arm64" + OS = "darwin" + Version = "0.0.1" + Sum = "125653c37803a51a048f6687f7f66d511be614f675f199cd6c71928b74875238" + + [[Plugin.Release]] + Arch = "amd64" + OS = "darwin" + Version = "0.0.2" + Sum = "125653c37803a51a048f6687f7f66d511be614f675f199cd6c71928b74875238" + + [[Plugin.Release]] + Arch = "arm64" + OS = "darwin" + Version = "0.0.2" + Sum = "125653c37803a51a048f6687f7f66d511be614f675f199cd6c71928b74875238" diff --git a/pkg/plugins/test_artifacts/plugins-2.toml b/pkg/plugins/test_artifacts/plugins-2.toml new file mode 100644 index 000000000..f41496873 --- /dev/null +++ b/pkg/plugins/test_artifacts/plugins-2.toml @@ -0,0 +1,126 @@ +# This is a made up manifest file for unit test purposes. +# The checksums are the same for all OS versions of a single release for testing simplicity +# The checksums for appA were generated to match the response returned in the test servers (see ../test_utils.go) +# The checksums for appB do not match the actual contents returned from the test server. +[[Plugin]] + Shortname = "appA" + Binary = "stripe-cli-app-a" + MagicCookieValue = "0337A75A-C3C4-4DCF-A9EF-E7A144E5A291" + + [[Plugin.Release]] + Arch = "amd64" + OS = "darwin" + Version = "0.0.1" + Sum = "125653c37803a51a048f6687f7f66d511be614f675f199cd6c71928b74875238" + + [[Plugin.Release]] + Arch = "arm64" + OS = "darwin" + Version = "0.0.1" + Sum = "125653c37803a51a048f6687f7f66d511be614f675f199cd6c71928b74875238" + + [[Plugin.Release]] + Arch = "amd64" + OS = "linux" + Version = "0.0.1" + Sum = "125653c37803a51a048f6687f7f66d511be614f675f199cd6c71928b74875238" + + [[Plugin.Release]] + Arch = "amd64" + OS = "windows" + Version = "0.0.1" + Sum = "125653c37803a51a048f6687f7f66d511be614f675f199cd6c71928b74875238" + + [[Plugin.Release]] + Arch = "amd64" + OS = "darwin" + Version = "1.0.1" + Sum = "3c909ec628b7d32536a65fd15545db527a7509e734995d4ef4806694fbd89c3a" + + [[Plugin.Release]] + Arch = "arm64" + OS = "darwin" + Version = "1.0.1" + Sum = "3c909ec628b7d32536a65fd15545db527a7509e734995d4ef4806694fbd89c3a" + + [[Plugin.Release]] + Arch = "amd64" + OS = "linux" + Version = "1.0.1" + Sum = "3c909ec628b7d32536a65fd15545db527a7509e734995d4ef4806694fbd89c3a" + + [[Plugin.Release]] + Arch = "amd64" + OS = "windows" + Version = "1.0.1" + Sum = "3c909ec628b7d32536a65fd15545db527a7509e734995d4ef4806694fbd89c3a" + + [[Plugin.Release]] + Arch = "amd64" + OS = "darwin" + Version = "2.0.1" + Sum = "3752e4e3a9f1b17f85b542b355893b8614ad8662a3fb8eba6ebed66d1f9e2a87" + + [[Plugin.Release]] + Arch = "arm64" + OS = "darwin" + Version = "2.0.1" + Sum = "3752e4e3a9f1b17f85b542b355893b8614ad8662a3fb8eba6ebed66d1f9e2a87" + + [[Plugin.Release]] + Arch = "amd64" + OS = "linux" + Version = "2.0.1" + Sum = "3752e4e3a9f1b17f85b542b355893b8614ad8662a3fb8eba6ebed66d1f9e2a87" + + [[Plugin.Release]] + Arch = "amd64" + OS = "windows" + Version = "2.0.1" + Sum = "3752e4e3a9f1b17f85b542b355893b8614ad8662a3fb8eba6ebed66d1f9e2a87" + +[[Plugin]] + Shortname = "appB" + Binary = "stripe-cli-app-b" + MagicCookieValue = "FDBE6FB9-A149-44BD-9639-4D33D8B594E8" + + [[Plugin.Release]] + Arch = "amd64" + OS = "darwin" + Version = "1.2.1" + Sum = "2f05d4b689d270cafb02285f35f44866f7dc8a2d368a3f9d1124373eeab31fb1" + + [[Plugin.Release]] + Arch = "arm64" + OS = "darwin" + Version = "1.2.1" + Sum = "2f05d4b689d270cafb02285f35f44866f7dc8a2d368a3f9d1124373eeab31fb1" + + [[Plugin.Release]] + Arch = "amd64" + OS = "linux" + Version = "1.2.1" + Sum = "2f05d4b689d270cafb02285f35f44866f7dc8a2d368a3f9d1124373eeab31fb1" + + [[Plugin.Release]] + Arch = "amd64" + OS = "windows" + Version = "1.2.1" + Sum = "2f05d4b689d270cafb02285f35f44866f7dc8a2d368a3f9d1124373eeab31fb1" + +[[Plugin]] + Shortname = "foo" + Binary = "stripe-cli-foo" + MagicCookieValue = "6C5CFD81-F43C-447B-BBCF-803FF31CD3D1" + + [[Plugin.Release]] + Arch = "amd64" + OS = "darwin" + Version = "0.0.1" + Sum = "125653c37803a51a048f6687f7f66d511be614f675f199cd6c71928b74875238" + + [[Plugin.Release]] + Arch = "arm64" + OS = "darwin" + Version = "0.0.1" + Sum = "125653c37803a51a048f6687f7f66d511be614f675f199cd6c71928b74875238" diff --git a/pkg/plugins/test_artifacts/plugins-3-merged-foo-1.toml b/pkg/plugins/test_artifacts/plugins-3-merged-foo-1.toml new file mode 100644 index 000000000..c12e5b89d --- /dev/null +++ b/pkg/plugins/test_artifacts/plugins-3-merged-foo-1.toml @@ -0,0 +1,146 @@ +[[Plugin]] + Shortname = "appA" + Binary = "stripe-cli-app-a" + MagicCookieValue = "0337A75A-C3C4-4DCF-A9EF-E7A144E5A291" + + [[Plugin.Release]] + Arch = "amd64" + OS = "darwin" + Version = "0.0.1" + Sum = "125653c37803a51a048f6687f7f66d511be614f675f199cd6c71928b74875238" + + [[Plugin.Release]] + Arch = "arm64" + OS = "darwin" + Version = "0.0.1" + Sum = "125653c37803a51a048f6687f7f66d511be614f675f199cd6c71928b74875238" + + [[Plugin.Release]] + Arch = "amd64" + OS = "linux" + Version = "0.0.1" + Sum = "125653c37803a51a048f6687f7f66d511be614f675f199cd6c71928b74875238" + + [[Plugin.Release]] + Arch = "amd64" + OS = "windows" + Version = "0.0.1" + Sum = "125653c37803a51a048f6687f7f66d511be614f675f199cd6c71928b74875238" + + [[Plugin.Release]] + Arch = "amd64" + OS = "darwin" + Version = "1.0.1" + Sum = "3c909ec628b7d32536a65fd15545db527a7509e734995d4ef4806694fbd89c3a" + + [[Plugin.Release]] + Arch = "arm64" + OS = "darwin" + Version = "1.0.1" + Sum = "3c909ec628b7d32536a65fd15545db527a7509e734995d4ef4806694fbd89c3a" + + [[Plugin.Release]] + Arch = "amd64" + OS = "linux" + Version = "1.0.1" + Sum = "3c909ec628b7d32536a65fd15545db527a7509e734995d4ef4806694fbd89c3a" + + [[Plugin.Release]] + Arch = "amd64" + OS = "windows" + Version = "1.0.1" + Sum = "3c909ec628b7d32536a65fd15545db527a7509e734995d4ef4806694fbd89c3a" + + [[Plugin.Release]] + Arch = "amd64" + OS = "darwin" + Version = "2.0.1" + Sum = "3752e4e3a9f1b17f85b542b355893b8614ad8662a3fb8eba6ebed66d1f9e2a87" + + [[Plugin.Release]] + Arch = "arm64" + OS = "darwin" + Version = "2.0.1" + Sum = "3752e4e3a9f1b17f85b542b355893b8614ad8662a3fb8eba6ebed66d1f9e2a87" + + [[Plugin.Release]] + Arch = "amd64" + OS = "linux" + Version = "2.0.1" + Sum = "3752e4e3a9f1b17f85b542b355893b8614ad8662a3fb8eba6ebed66d1f9e2a87" + + [[Plugin.Release]] + Arch = "amd64" + OS = "windows" + Version = "2.0.1" + Sum = "3752e4e3a9f1b17f85b542b355893b8614ad8662a3fb8eba6ebed66d1f9e2a87" + +[[Plugin]] + Shortname = "appB" + Binary = "stripe-cli-app-b" + MagicCookieValue = "FDBE6FB9-A149-44BD-9639-4D33D8B594E8" + + [[Plugin.Release]] + Arch = "amd64" + OS = "darwin" + Version = "1.2.1" + Sum = "2f05d4b689d270cafb02285f35f44866f7dc8a2d368a3f9d1124373eeab31fb1" + + [[Plugin.Release]] + Arch = "arm64" + OS = "darwin" + Version = "1.2.1" + Sum = "2f05d4b689d270cafb02285f35f44866f7dc8a2d368a3f9d1124373eeab31fb1" + + [[Plugin.Release]] + Arch = "amd64" + OS = "linux" + Version = "1.2.1" + Sum = "2f05d4b689d270cafb02285f35f44866f7dc8a2d368a3f9d1124373eeab31fb1" + + [[Plugin.Release]] + Arch = "amd64" + OS = "windows" + Version = "1.2.1" + Sum = "2f05d4b689d270cafb02285f35f44866f7dc8a2d368a3f9d1124373eeab31fb1" + +[[Plugin]] + Shortname = "foo" + Binary = "stripe-cli-foo" + MagicCookieValue = "6C5CFD81-F43C-447B-BBCF-803FF31CD3D1" + + [[Plugin.Release]] + Arch = "amd64" + OS = "darwin" + Version = "0.0.1" + Sum = "125653c37803a51a048f6687f7f66d511be614f675f199cd6c71928b74875238" + + [[Plugin.Release]] + Arch = "arm64" + OS = "darwin" + Version = "0.0.1" + Sum = "125653c37803a51a048f6687f7f66d511be614f675f199cd6c71928b74875238" + + [[Plugin.Release]] + Arch = "amd64" + OS = "darwin" + Version = "0.0.2" + Sum = "125653c37803a51a048f6687f7f66d511be614f675f199cd6c71928b74875238" + + [[Plugin.Release]] + Arch = "arm64" + OS = "darwin" + Version = "0.0.2" + Sum = "125653c37803a51a048f6687f7f66d511be614f675f199cd6c71928b74875238" + + [[Plugin.Release]] + Arch = "amd64" + OS = "darwin" + Version = "0.0.3" + Sum = "125653c37803a51a048f6687f7f66d511be614f675f199cd6c71928b74875238" + + [[Plugin.Release]] + Arch = "arm64" + OS = "darwin" + Version = "0.0.3" + Sum = "125653c37803a51a048f6687f7f66d511be614f675f199cd6c71928b74875238" diff --git a/pkg/plugins/test_artifacts/plugins-3.toml b/pkg/plugins/test_artifacts/plugins-3.toml new file mode 100644 index 000000000..d0998ee36 --- /dev/null +++ b/pkg/plugins/test_artifacts/plugins-3.toml @@ -0,0 +1,138 @@ +# This is a made up manifest file for unit test purposes. +# The checksums are the same for all OS versions of a single release for testing simplicity +# The checksums for appA were generated to match the response returned in the test servers (see ../test_utils.go) +# The checksums for appB do not match the actual contents returned from the test server. +[[Plugin]] + Shortname = "appA" + Binary = "stripe-cli-app-a" + MagicCookieValue = "0337A75A-C3C4-4DCF-A9EF-E7A144E5A291" + + [[Plugin.Release]] + Arch = "amd64" + OS = "darwin" + Version = "0.0.1" + Sum = "125653c37803a51a048f6687f7f66d511be614f675f199cd6c71928b74875238" + + [[Plugin.Release]] + Arch = "arm64" + OS = "darwin" + Version = "0.0.1" + Sum = "125653c37803a51a048f6687f7f66d511be614f675f199cd6c71928b74875238" + + [[Plugin.Release]] + Arch = "amd64" + OS = "linux" + Version = "0.0.1" + Sum = "125653c37803a51a048f6687f7f66d511be614f675f199cd6c71928b74875238" + + [[Plugin.Release]] + Arch = "amd64" + OS = "windows" + Version = "0.0.1" + Sum = "125653c37803a51a048f6687f7f66d511be614f675f199cd6c71928b74875238" + + [[Plugin.Release]] + Arch = "amd64" + OS = "darwin" + Version = "1.0.1" + Sum = "3c909ec628b7d32536a65fd15545db527a7509e734995d4ef4806694fbd89c3a" + + [[Plugin.Release]] + Arch = "arm64" + OS = "darwin" + Version = "1.0.1" + Sum = "3c909ec628b7d32536a65fd15545db527a7509e734995d4ef4806694fbd89c3a" + + [[Plugin.Release]] + Arch = "amd64" + OS = "linux" + Version = "1.0.1" + Sum = "3c909ec628b7d32536a65fd15545db527a7509e734995d4ef4806694fbd89c3a" + + [[Plugin.Release]] + Arch = "amd64" + OS = "windows" + Version = "1.0.1" + Sum = "3c909ec628b7d32536a65fd15545db527a7509e734995d4ef4806694fbd89c3a" + + [[Plugin.Release]] + Arch = "amd64" + OS = "darwin" + Version = "2.0.1" + Sum = "3752e4e3a9f1b17f85b542b355893b8614ad8662a3fb8eba6ebed66d1f9e2a87" + + [[Plugin.Release]] + Arch = "arm64" + OS = "darwin" + Version = "2.0.1" + Sum = "3752e4e3a9f1b17f85b542b355893b8614ad8662a3fb8eba6ebed66d1f9e2a87" + + [[Plugin.Release]] + Arch = "amd64" + OS = "linux" + Version = "2.0.1" + Sum = "3752e4e3a9f1b17f85b542b355893b8614ad8662a3fb8eba6ebed66d1f9e2a87" + + [[Plugin.Release]] + Arch = "amd64" + OS = "windows" + Version = "2.0.1" + Sum = "3752e4e3a9f1b17f85b542b355893b8614ad8662a3fb8eba6ebed66d1f9e2a87" + +[[Plugin]] + Shortname = "appB" + Binary = "stripe-cli-app-b" + MagicCookieValue = "FDBE6FB9-A149-44BD-9639-4D33D8B594E8" + + [[Plugin.Release]] + Arch = "amd64" + OS = "darwin" + Version = "1.2.1" + Sum = "2f05d4b689d270cafb02285f35f44866f7dc8a2d368a3f9d1124373eeab31fb1" + + [[Plugin.Release]] + Arch = "arm64" + OS = "darwin" + Version = "1.2.1" + Sum = "2f05d4b689d270cafb02285f35f44866f7dc8a2d368a3f9d1124373eeab31fb1" + + [[Plugin.Release]] + Arch = "amd64" + OS = "linux" + Version = "1.2.1" + Sum = "2f05d4b689d270cafb02285f35f44866f7dc8a2d368a3f9d1124373eeab31fb1" + + [[Plugin.Release]] + Arch = "amd64" + OS = "windows" + Version = "1.2.1" + Sum = "2f05d4b689d270cafb02285f35f44866f7dc8a2d368a3f9d1124373eeab31fb1" + +[[Plugin]] + Shortname = "foo" + Binary = "stripe-cli-foo" + MagicCookieValue = "6C5CFD81-F43C-447B-BBCF-803FF31CD3D1" + +[[Plugin.Release]] + Arch = "amd64" + OS = "darwin" + Version = "0.0.3" + Sum = "125653c37803a51a048f6687f7f66d511be614f675f199cd6c71928b74875238" + + [[Plugin.Release]] + Arch = "arm64" + OS = "darwin" + Version = "0.0.3" + Sum = "125653c37803a51a048f6687f7f66d511be614f675f199cd6c71928b74875238" + + [[Plugin.Release]] + Arch = "amd64" + OS = "darwin" + Version = "0.0.1" + Sum = "125653c37803a51a048f6687f7f66d511be614f675f199cd6c71928b74875238" + + [[Plugin.Release]] + Arch = "arm64" + OS = "darwin" + Version = "0.0.1" + Sum = "125653c37803a51a048f6687f7f66d511be614f675f199cd6c71928b74875238" diff --git a/pkg/plugins/test_artifacts/plugins-foo-1.toml b/pkg/plugins/test_artifacts/plugins-foo-1.toml new file mode 100644 index 000000000..2d7def851 --- /dev/null +++ b/pkg/plugins/test_artifacts/plugins-foo-1.toml @@ -0,0 +1,18 @@ +# This is a made up manifest file for unit test purposes. +# The checksums are the same for all OS versions of a single release for testing simplicity +[[Plugin]] + Shortname = "foo" + Binary = "stripe-cli-foo" + MagicCookieValue = "6C5CFD81-F43C-447B-BBCF-803FF31CD3D1" + + [[Plugin.Release]] + Arch = "amd64" + OS = "darwin" + Version = "0.0.2" + Sum = "125653c37803a51a048f6687f7f66d511be614f675f199cd6c71928b74875238" + + [[Plugin.Release]] + Arch = "arm64" + OS = "darwin" + Version = "0.0.2" + Sum = "125653c37803a51a048f6687f7f66d511be614f675f199cd6c71928b74875238" diff --git a/pkg/plugins/test_artifacts/plugins-merged-foo-1.toml b/pkg/plugins/test_artifacts/plugins-merged-foo-1.toml new file mode 100644 index 000000000..aa8c7352d --- /dev/null +++ b/pkg/plugins/test_artifacts/plugins-merged-foo-1.toml @@ -0,0 +1,122 @@ +[[Plugin]] + Shortname = "appA" + Binary = "stripe-cli-app-a" + MagicCookieValue = "0337A75A-C3C4-4DCF-A9EF-E7A144E5A291" + + [[Plugin.Release]] + Arch = "amd64" + OS = "darwin" + Version = "0.0.1" + Sum = "125653c37803a51a048f6687f7f66d511be614f675f199cd6c71928b74875238" + + [[Plugin.Release]] + Arch = "arm64" + OS = "darwin" + Version = "0.0.1" + Sum = "125653c37803a51a048f6687f7f66d511be614f675f199cd6c71928b74875238" + + [[Plugin.Release]] + Arch = "amd64" + OS = "linux" + Version = "0.0.1" + Sum = "125653c37803a51a048f6687f7f66d511be614f675f199cd6c71928b74875238" + + [[Plugin.Release]] + Arch = "amd64" + OS = "windows" + Version = "0.0.1" + Sum = "125653c37803a51a048f6687f7f66d511be614f675f199cd6c71928b74875238" + + [[Plugin.Release]] + Arch = "amd64" + OS = "darwin" + Version = "1.0.1" + Sum = "3c909ec628b7d32536a65fd15545db527a7509e734995d4ef4806694fbd89c3a" + + [[Plugin.Release]] + Arch = "arm64" + OS = "darwin" + Version = "1.0.1" + Sum = "3c909ec628b7d32536a65fd15545db527a7509e734995d4ef4806694fbd89c3a" + + [[Plugin.Release]] + Arch = "amd64" + OS = "linux" + Version = "1.0.1" + Sum = "3c909ec628b7d32536a65fd15545db527a7509e734995d4ef4806694fbd89c3a" + + [[Plugin.Release]] + Arch = "amd64" + OS = "windows" + Version = "1.0.1" + Sum = "3c909ec628b7d32536a65fd15545db527a7509e734995d4ef4806694fbd89c3a" + + [[Plugin.Release]] + Arch = "amd64" + OS = "darwin" + Version = "2.0.1" + Sum = "3752e4e3a9f1b17f85b542b355893b8614ad8662a3fb8eba6ebed66d1f9e2a87" + + [[Plugin.Release]] + Arch = "arm64" + OS = "darwin" + Version = "2.0.1" + Sum = "3752e4e3a9f1b17f85b542b355893b8614ad8662a3fb8eba6ebed66d1f9e2a87" + + [[Plugin.Release]] + Arch = "amd64" + OS = "linux" + Version = "2.0.1" + Sum = "3752e4e3a9f1b17f85b542b355893b8614ad8662a3fb8eba6ebed66d1f9e2a87" + + [[Plugin.Release]] + Arch = "amd64" + OS = "windows" + Version = "2.0.1" + Sum = "3752e4e3a9f1b17f85b542b355893b8614ad8662a3fb8eba6ebed66d1f9e2a87" + +[[Plugin]] + Shortname = "appB" + Binary = "stripe-cli-app-b" + MagicCookieValue = "FDBE6FB9-A149-44BD-9639-4D33D8B594E8" + + [[Plugin.Release]] + Arch = "amd64" + OS = "darwin" + Version = "1.2.1" + Sum = "2f05d4b689d270cafb02285f35f44866f7dc8a2d368a3f9d1124373eeab31fb1" + + [[Plugin.Release]] + Arch = "arm64" + OS = "darwin" + Version = "1.2.1" + Sum = "2f05d4b689d270cafb02285f35f44866f7dc8a2d368a3f9d1124373eeab31fb1" + + [[Plugin.Release]] + Arch = "amd64" + OS = "linux" + Version = "1.2.1" + Sum = "2f05d4b689d270cafb02285f35f44866f7dc8a2d368a3f9d1124373eeab31fb1" + + [[Plugin.Release]] + Arch = "amd64" + OS = "windows" + Version = "1.2.1" + Sum = "2f05d4b689d270cafb02285f35f44866f7dc8a2d368a3f9d1124373eeab31fb1" + +[[Plugin]] + Shortname = "foo" + Binary = "stripe-cli-foo" + MagicCookieValue = "6C5CFD81-F43C-447B-BBCF-803FF31CD3D1" + + [[Plugin.Release]] + Arch = "amd64" + OS = "darwin" + Version = "0.0.2" + Sum = "125653c37803a51a048f6687f7f66d511be614f675f199cd6c71928b74875238" + + [[Plugin.Release]] + Arch = "arm64" + OS = "darwin" + Version = "0.0.2" + Sum = "125653c37803a51a048f6687f7f66d511be614f675f199cd6c71928b74875238" diff --git a/pkg/plugins/test_utils.go b/pkg/plugins/test_utils.go index e9263bd5d..82b871108 100644 --- a/pkg/plugins/test_utils.go +++ b/pkg/plugins/test_utils.go @@ -1,7 +1,7 @@ package plugins import ( - "fmt" + "encoding/json" "net/http" "net/http/httptest" "os" @@ -11,6 +11,7 @@ import ( "github.com/spf13/afero" "github.com/stripe/stripe-cli/pkg/config" + "github.com/stripe/stripe-cli/pkg/requests" ) // TestConfig Implementations out several methods @@ -64,11 +65,18 @@ func (ts *TestServers) CloseAll() { } // setUpServers sets up a local stripe server and artifactory server for unit tests -func setUpServers(t *testing.T, manifestContent []byte) TestServers { +func setUpServers(t *testing.T, manifestContent []byte, additionalManifests map[string][]byte) TestServers { + additionalManifestNames := []string{} + for name := range additionalManifests { + additionalManifestNames = append(additionalManifestNames, name) + } + artifactoryServer := httptest.NewServer(http.HandlerFunc(func(res http.ResponseWriter, req *http.Request) { switch url := req.URL.String(); { case url == "/plugins.toml": res.Write(manifestContent) + case contains(additionalManifestNames, strings.TrimPrefix(url, "/")): + res.Write(additionalManifests[strings.TrimPrefix(url, "/")]) case strings.Contains(url, "/appA/2.0.1"): res.Write([]byte("hello, I am appA_2.0.1")) case strings.Contains(url, "/appA/1.0.1"): @@ -90,7 +98,15 @@ func setUpServers(t *testing.T, manifestContent []byte) TestServers { stripeServer := httptest.NewServer(http.HandlerFunc(func(res http.ResponseWriter, req *http.Request) { switch url := req.URL.String(); url { case "/v1/stripecli/get-plugin-url": - res.Write([]byte(fmt.Sprintf(`{"base_url": "%s"}`, artifactoryServer.URL))) + pd := requests.PluginData{ + PluginBaseURL: artifactoryServer.URL, + AdditionalManifests: additionalManifestNames, + } + body, err := json.Marshal(pd) + if err != nil { + t.Error(err) + } + res.Write(body) default: t.Errorf("Received an unexpected request URL: %s", req.URL.String()) } @@ -101,3 +117,12 @@ func setUpServers(t *testing.T, manifestContent []byte) TestServers { StripeServer: stripeServer, } } + +func contains(sl []string, str string) bool { + for _, s := range sl { + if s == str { + return true + } + } + return false +} diff --git a/pkg/plugins/utilities.go b/pkg/plugins/utilities.go index 08a9090ad..c824de4ac 100644 --- a/pkg/plugins/utilities.go +++ b/pkg/plugins/utilities.go @@ -12,6 +12,7 @@ import ( "os" "path/filepath" "runtime" + "sort" "strings" log "github.com/sirupsen/logrus" @@ -113,20 +114,20 @@ func RefreshPluginManifest(ctx context.Context, config config.IConfig, fs afero. return err } - pluginManifestURL := fmt.Sprintf("%s/%s", pluginData.PluginBaseURL, "plugins.toml") - body, err := FetchRemoteResource(pluginManifestURL) + pluginList, err := fetchAndMergeManifests(pluginData) if err != nil { return err } - if err := validatePluginManifest(body); err != nil { - return err - } - configPath := config.GetConfigFolder(os.Getenv("XDG_CONFIG_HOME")) pluginManifestPath := filepath.Join(configPath, "plugins.toml") - err = afero.WriteFile(fs, pluginManifestPath, body, 0644) + body := new(bytes.Buffer) + if err := toml.NewEncoder(body).Encode(pluginList); err != nil { + return err + } + + err = afero.WriteFile(fs, pluginManifestPath, body.Bytes(), 0644) if err != nil { return err @@ -135,16 +136,77 @@ func RefreshPluginManifest(ctx context.Context, config config.IConfig, fs afero. return nil } -func validatePluginManifest(body []byte) error { +func fetchAndMergeManifests(pluginData requests.PluginData) (*PluginList, error) { + pluginList, err := fetchPluginList(pluginData.PluginBaseURL, "plugins.toml") + if err != nil { + return nil, err + } + + additionalPluginLists := []*PluginList{} + for _, filename := range pluginData.AdditionalManifests { + additionalPluginList, err := fetchPluginList(pluginData.PluginBaseURL, filename) + if err != nil { + return nil, err + } + additionalPluginLists = append(additionalPluginLists, additionalPluginList) + } + + mergePluginLists(pluginList, additionalPluginLists) + + return pluginList, nil +} + +func fetchPluginList(baseURL, manifestFilename string) (*PluginList, error) { + pluginManifestURL := fmt.Sprintf("%s/%s", baseURL, manifestFilename) + body, err := FetchRemoteResource(pluginManifestURL) + if err != nil { + return nil, err + } + return validatePluginManifest(body) +} + +func validatePluginManifest(body []byte) (*PluginList, error) { var manifestBody PluginList if err := toml.Unmarshal(body, &manifestBody); err != nil { - return fmt.Errorf("Received an invalid plugin manifest. Error: %s", err) + return nil, fmt.Errorf("Received an invalid plugin manifest. Error: %s", err) } if len(manifestBody.Plugins) == 0 { - return fmt.Errorf("Received an empty plugin manifest") + return nil, fmt.Errorf("Received an empty plugin manifest") } - return nil + return &manifestBody, nil +} + +// mergePluginLists merges additional plugin lists into the main plugin list, in place +func mergePluginLists(pluginList *PluginList, additionalPluginLists []*PluginList) { + for _, list := range additionalPluginLists { + for _, pl := range list.Plugins { + addPluginToList(pluginList, pl) + } + } +} + +func addPluginToList(pluginList *PluginList, pl Plugin) { + idx := findPluginIndex(pluginList, pl) + if idx == -1 { + pluginList.Plugins = append(pluginList.Plugins, pl) + } else { + pluginList.Plugins[idx].Releases = append(pluginList.Plugins[idx].Releases, pl.Releases...) + + // Other code assumes the releases are sorted with latest version last. + sort.Slice(pluginList.Plugins[idx].Releases, func(i, j int) bool { + return pluginList.Plugins[idx].Releases[i].Version < pluginList.Plugins[idx].Releases[j].Version + }) + } +} + +func findPluginIndex(list *PluginList, p Plugin) int { + for i, pp := range list.Plugins { + if pp.MagicCookieValue == p.MagicCookieValue { + return i + } + } + return -1 } // AddEntryToPluginManifest update plugins.toml with a new release version @@ -247,6 +309,10 @@ func FetchRemoteResource(url string) ([]byte, error) { return nil, err } + if resp.StatusCode == http.StatusNotFound { + return nil, fmt.Errorf("remote resource not found: url=%s", url) + } + defer resp.Body.Close() body, err := io.ReadAll(resp.Body) diff --git a/pkg/plugins/utilities_test.go b/pkg/plugins/utilities_test.go index d23361a2c..6145fb0d6 100644 --- a/pkg/plugins/utilities_test.go +++ b/pkg/plugins/utilities_test.go @@ -5,6 +5,7 @@ import ( "os" "testing" + "github.com/BurntSushi/toml" "github.com/spf13/afero" "github.com/spf13/cobra" "github.com/stretchr/testify/require" @@ -49,7 +50,7 @@ func TestRefreshPluginManifest(t *testing.T) { config := &TestConfig{} config.InitConfig() updatedManifestContent, _ := os.ReadFile("./test_artifacts/plugins_updated.toml") - testServers := setUpServers(t, updatedManifestContent) + testServers := setUpServers(t, updatedManifestContent, nil) defer func() { testServers.CloseAll() }() err := RefreshPluginManifest(context.Background(), config, fs, testServers.StripeServer.URL) @@ -58,7 +59,115 @@ func TestRefreshPluginManifest(t *testing.T) { // We expect the /plugins.toml file in the test fs is updated pluginManifestContent, err := afero.ReadFile(fs, "/plugins.toml") require.Nil(t, err) - require.Equal(t, updatedManifestContent, pluginManifestContent) + + actualPluginList := PluginList{} + err = toml.Unmarshal(pluginManifestContent, &actualPluginList) + require.Nil(t, err) + + expectedPluginList := PluginList{} + err = toml.Unmarshal(updatedManifestContent, &expectedPluginList) + require.Nil(t, err) + + require.Equal(t, expectedPluginList, actualPluginList) +} + +func TestRefreshPluginManifestMergesAdditionalManifest(t *testing.T) { + fs := setUpFS() + config := &TestConfig{} + config.InitConfig() + manifestContent, _ := os.ReadFile("./test_artifacts/plugins.toml") + mergedManifestContent, _ := os.ReadFile("./test_artifacts/plugins-merged-foo-1.toml") + + fooManifest, _ := os.ReadFile("./test_artifacts/plugins-foo-1.toml") + additionalManifests := map[string][]byte{ + "plugins-foo-1.toml": fooManifest, + } + + testServers := setUpServers(t, manifestContent, additionalManifests) + defer func() { testServers.CloseAll() }() + + err := RefreshPluginManifest(context.Background(), config, fs, testServers.StripeServer.URL) + require.Nil(t, err) + + // We expect the /plugins.toml file in the test fs is updated + pluginManifestContent, err := afero.ReadFile(fs, "/plugins.toml") + require.Nil(t, err) + + actualPluginList := PluginList{} + err = toml.Unmarshal(pluginManifestContent, &actualPluginList) + require.Nil(t, err) + + expectedPluginList := PluginList{} + err = toml.Unmarshal(mergedManifestContent, &expectedPluginList) + require.Nil(t, err) + + require.Equal(t, expectedPluginList, actualPluginList) +} + +func TestRefreshPluginManifestMergesExisitingPlugin(t *testing.T) { + fs := setUpFS() + config := &TestConfig{} + config.InitConfig() + manifestContent, _ := os.ReadFile("./test_artifacts/plugins-2.toml") + mergedManifestContent, _ := os.ReadFile("./test_artifacts/plugins-2-merged-foo-1.toml") + + fooManifest, _ := os.ReadFile("./test_artifacts/plugins-foo-1.toml") + additionalManifests := map[string][]byte{ + "plugins-foo-1.toml": fooManifest, + } + + testServers := setUpServers(t, manifestContent, additionalManifests) + defer func() { testServers.CloseAll() }() + + err := RefreshPluginManifest(context.Background(), config, fs, testServers.StripeServer.URL) + require.Nil(t, err) + + // We expect the /plugins.toml file in the test fs is updated + pluginManifestContent, err := afero.ReadFile(fs, "/plugins.toml") + require.Nil(t, err) + + actualPluginList := PluginList{} + err = toml.Unmarshal(pluginManifestContent, &actualPluginList) + require.Nil(t, err) + + expectedPluginList := PluginList{} + err = toml.Unmarshal(mergedManifestContent, &expectedPluginList) + require.Nil(t, err) + + require.Equal(t, expectedPluginList, actualPluginList) +} + +func TestRefreshPluginManifestSortsPluginReleases(t *testing.T) { + fs := setUpFS() + config := &TestConfig{} + config.InitConfig() + manifestContent, _ := os.ReadFile("./test_artifacts/plugins-3.toml") + mergedManifestContent, _ := os.ReadFile("./test_artifacts/plugins-3-merged-foo-1.toml") + + fooManifest, _ := os.ReadFile("./test_artifacts/plugins-foo-1.toml") + additionalManifests := map[string][]byte{ + "plugins-foo-1.toml": fooManifest, + } + + testServers := setUpServers(t, manifestContent, additionalManifests) + defer func() { testServers.CloseAll() }() + + err := RefreshPluginManifest(context.Background(), config, fs, testServers.StripeServer.URL) + require.Nil(t, err) + + // We expect the /plugins.toml file in the test fs is updated + pluginManifestContent, err := afero.ReadFile(fs, "/plugins.toml") + require.Nil(t, err) + + actualPluginList := PluginList{} + err = toml.Unmarshal(pluginManifestContent, &actualPluginList) + require.Nil(t, err) + + expectedPluginList := PluginList{} + err = toml.Unmarshal(mergedManifestContent, &expectedPluginList) + require.Nil(t, err) + + require.Equal(t, expectedPluginList, actualPluginList) } func TestRefreshPluginManifestFailsInvalidManifest(t *testing.T) { @@ -66,7 +175,7 @@ func TestRefreshPluginManifestFailsInvalidManifest(t *testing.T) { config := &TestConfig{} config.InitConfig() emptyManifestContent := []byte{} - testServers := setUpServers(t, emptyManifestContent) + testServers := setUpServers(t, emptyManifestContent, nil) defer func() { testServers.CloseAll() }() err := RefreshPluginManifest(context.Background(), config, fs, testServers.StripeServer.URL) diff --git a/pkg/requests/plugin.go b/pkg/requests/plugin.go index 1d05e94e2..a279b7d0d 100644 --- a/pkg/requests/plugin.go +++ b/pkg/requests/plugin.go @@ -10,7 +10,8 @@ import ( // PluginData contains the plugin download information type PluginData struct { - PluginBaseURL string `json:"base_url"` + PluginBaseURL string `json:"base_url"` + AdditionalManifests []string `json:"additional_manifests,omitempty"` } // GetPluginData returns the plugin download information