Fixes #14 - Support zip files without dir entries (#15)
* Fixes #14 - Support zip files without dir entries
Ensure directories exist before unzipping files.
Add tests to validate this test case.
* re-formating scala tests to pass ci bot
diff --git a/.gitignore b/.gitignore
index ed2c749..0c3444f 100644
--- a/.gitignore
+++ b/.gitignore
@@ -69,4 +69,5 @@
!tests/dat/actions/python3_virtualenv.zip
!tests/dat/actions/python_virtualenv_dir.zip
!tests/dat/actions/python_virtualenv_name.zip
-!tests/dat/actions/zippedaction.zip
\ No newline at end of file
+!tests/dat/actions/zippedaction.zip
+!tests/dat/without_dir_entries.zip
diff --git a/core/ruby2.5Action/rackapp/init.rb b/core/ruby2.5Action/rackapp/init.rb
index eee1767..caefe52 100644
--- a/core/ruby2.5Action/rackapp/init.rb
+++ b/core/ruby2.5Action/rackapp/init.rb
@@ -84,7 +84,9 @@
def unzip(zipfile_path, destination_folder)
Zip::File.open(zipfile_path) do |zip|
zip.each do |file|
- zip.extract(file, destination_folder + file.name)
+ f_path = destination_folder + file.name
+ FileUtils.mkdir_p(File.dirname(f_path))
+ zip.extract(file, f_path)
end
end
true
diff --git a/tests/dat/without_dir_entries.zip b/tests/dat/without_dir_entries.zip
new file mode 100644
index 0000000..224a5f9
--- /dev/null
+++ b/tests/dat/without_dir_entries.zip
Binary files differ
diff --git a/tests/src/test/scala/actionContainers/Ruby25ActionContainerTests.scala b/tests/src/test/scala/actionContainers/Ruby25ActionContainerTests.scala
index 1090c14..68146bd 100644
--- a/tests/src/test/scala/actionContainers/Ruby25ActionContainerTests.scala
+++ b/tests/src/test/scala/actionContainers/Ruby25ActionContainerTests.scala
@@ -23,6 +23,8 @@
import actionContainers.{ActionContainer, BasicActionRunnerTests}
import actionContainers.ActionContainer.withContainer
import actionContainers.ResourceHelpers.ZipBuilder
+import actionContainers.ResourceHelpers
+import java.nio.file.FileSystems;
import spray.json._
@RunWith(classOf[JUnitRunner])
@@ -329,6 +331,21 @@
}
}
+ it should "support zip-encoded packages without directory entries" in {
+ val path = FileSystems.getDefault().getPath("dat", "without_dir_entries.zip");
+ val code = ResourceHelpers.readAsBase64(path)
+
+ val (out, err) = withRuby25Container { c =>
+ c.init(initPayload(code))._1 should be(200)
+
+ val (runCode, runRes) = c.run(runPayload(JsObject()))
+
+ runCode should be(200)
+ runRes.get.fields.get("greeting") shouldBe defined
+ runRes.get.fields.get("greeting") shouldBe Some(JsString("Hello stranger!"))
+ }
+ }
+
it should "fail gracefully on invalid zip files" in {
// Some text-file encoded to base64.
val code = "Q2VjaSBuJ2VzdCBwYXMgdW4gemlwLgo="