Merge branch '9017-apiserver-short-tests'
[arvados.git] / services / api / test / unit / container_test.rb
index 3ba35c4f4d52f1e010f12577d2b0416666edb1c7..0cac6acd936332eaa3b76eb28fad3c84479b1f5a 100644 (file)
@@ -1,7 +1,229 @@
 require 'test_helper'
 
 class ContainerTest < ActiveSupport::TestCase
-  # test "the truth" do
-  #   assert true
-  # end
+  def check_illegal_modify c
+    c.reload
+    c.command = ["echo", "bar"]
+    assert_raises(ActiveRecord::RecordInvalid) do
+      c.save!
+    end
+
+    c.reload
+    c.container_image = "img2"
+    assert_raises(ActiveRecord::RecordInvalid) do
+      c.save!
+    end
+
+    c.reload
+    c.cwd = "/tmp2"
+    assert_raises(ActiveRecord::RecordInvalid) do
+      c.save!
+    end
+
+    c.reload
+    c.environment = {"FOO" => "BAR"}
+    assert_raises(ActiveRecord::RecordInvalid) do
+      c.save!
+    end
+
+    c.reload
+    c.mounts = {"FOO" => "BAR"}
+    assert_raises(ActiveRecord::RecordInvalid) do
+      c.save!
+    end
+
+    c.reload
+    c.output_path = "/tmp3"
+    assert_raises(ActiveRecord::RecordInvalid) do
+      c.save!
+    end
+
+    c.reload
+    c.runtime_constraints = {"FOO" => "BAR"}
+    assert_raises(ActiveRecord::RecordInvalid) do
+      c.save!
+    end
+  end
+
+  def check_bogus_states c
+    c.reload
+    c.state = nil
+    assert_raises(ActiveRecord::RecordInvalid) do
+      c.save!
+    end
+
+    c.reload
+    c.state = "Flubber"
+    assert_raises(ActiveRecord::RecordInvalid) do
+      c.save!
+    end
+  end
+
+  def check_no_change_from_complete c
+    check_illegal_modify c
+    check_bogus_states c
+
+    c.reload
+    c.priority = 3
+    assert_raises(ActiveRecord::RecordInvalid) do
+      c.save!
+    end
+
+    c.reload
+    c.state = "Queued"
+    assert_raises(ActiveRecord::RecordInvalid) do
+      c.save!
+    end
+
+    c.reload
+    c.state = "Running"
+    assert_raises(ActiveRecord::RecordInvalid) do
+      c.save!
+    end
+
+    c.reload
+    c.state = "Complete"
+    assert_raises(ActiveRecord::RecordInvalid) do
+      c.save!
+    end
+  end
+
+  test "Container create" do
+    act_as_system_user do
+      c = Container.new
+      c.command = ["echo", "foo"]
+      c.container_image = "img"
+      c.cwd = "/tmp"
+      c.environment = {}
+      c.mounts = {"BAR" => "FOO"}
+      c.output_path = "/tmp"
+      c.priority = 1
+      c.runtime_constraints = {}
+      c.save!
+
+      check_illegal_modify c
+      check_bogus_states c
+
+      c.reload
+      c.priority = 2
+      c.save!
+    end
+  end
+
+  test "Container running" do
+    act_as_system_user do
+      c = Container.new
+      c.command = ["echo", "foo"]
+      c.container_image = "img"
+      c.output_path = "/tmp"
+      c.save!
+
+      c.reload
+      c.state = "Complete"
+      assert_raises(ActiveRecord::RecordInvalid) do
+        c.save!
+      end
+
+      c.reload
+      c.state = "Running"
+      c.save!
+
+      check_illegal_modify c
+      check_bogus_states c
+
+      c.reload
+      c.state = "Queued"
+      assert_raises(ActiveRecord::RecordInvalid) do
+        c.save!
+      end
+
+      c.reload
+      c.priority = 3
+      c.save!
+    end
+  end
+
+  test "Container queued cancel" do
+    act_as_system_user do
+      c = Container.new
+      c.command = ["echo", "foo"]
+      c.container_image = "img"
+      c.output_path = "/tmp"
+      c.save!
+
+      c.reload
+      c.state = "Cancelled"
+      c.save!
+
+      check_no_change_from_complete c
+    end
+  end
+
+  test "Container running cancel" do
+    act_as_system_user do
+      c = Container.new
+      c.command = ["echo", "foo"]
+      c.container_image = "img"
+      c.output_path = "/tmp"
+      c.save!
+
+      c.reload
+      c.state = "Running"
+      c.save!
+
+      c.reload
+      c.state = "Cancelled"
+      c.save!
+
+      check_no_change_from_complete c
+    end
+  end
+
+  test "Container create forbidden for non-admin" do
+    set_user_from_auth :active_trustedclient
+    c = Container.new
+    c.command = ["echo", "foo"]
+    c.container_image = "img"
+    c.cwd = "/tmp"
+    c.environment = {}
+    c.mounts = {"BAR" => "FOO"}
+    c.output_path = "/tmp"
+    c.priority = 1
+    c.runtime_constraints = {}
+    assert_raises(ArvadosModel::PermissionDeniedError) do
+      c.save!
+    end
+  end
+
+  test "Container only set exit code on complete" do
+    act_as_system_user do
+      c = Container.new
+      c.command = ["echo", "foo"]
+      c.container_image = "img"
+      c.output_path = "/tmp"
+      c.save!
+
+      c.reload
+      c.state = "Running"
+      c.save!
+
+      c.reload
+      c.exit_code = 1
+      assert_raises(ActiveRecord::RecordInvalid) do
+        c.save!
+      end
+
+      c.reload
+      c.exit_code = 1
+      c.state = "Cancelled"
+      assert_raises(ActiveRecord::RecordInvalid) do
+        c.save!
+      end
+
+      c.reload
+      c.exit_code = 1
+      c.state = "Complete"
+      c.save!
+    end
+  end
 end