Merge branch '8784-dir-listings'
[arvados.git] / sdk / java / src / test / java / org / arvados / sdk / java / ArvadosTest.java
index e2dbc19ce18b4fa76d58774e8f81978b3fc5aff6..9de894669d847e62a8d4074cb2426f35da79e7fb 100644 (file)
-package org.arvados.sdk.java;
+// Copyright (C) The Arvados Authors. All rights reserved.
+//
+// SPDX-License-Identifier: Apache-2.0
+
+package org.arvados.sdk;
 
 import java.io.File;
+import java.io.FileInputStream;
+import java.math.BigDecimal;
 import java.util.ArrayList;
+import java.util.Calendar;
+import java.util.Date;
+import java.util.GregorianCalendar;
+import java.util.HashMap;
 import java.util.List;
 import java.util.Map;
+import java.util.Set;
 
 import org.junit.Test;
 
 import static org.junit.Assert.*;
 
-import com.google.api.services.discovery.model.RestDescription;
-import com.google.api.services.discovery.model.RestResource;
-
-import org.json.simple.JSONObject;
-import org.json.simple.parser.JSONParser;
-
 /**
  * Unit test for Arvados.
  */
 public class ArvadosTest {
 
-  @Test(expected=Exception.class)
-  public void testMainWithNoParams() throws Exception {
-    String[] args = new String[0];
-    Arvados.main(args);
-  }
+  /**
+   * Test users.list api
+   * @throws Exception
+   */
+  @Test
+  public void testCallUsersList() throws Exception {
+    Arvados arv = new Arvados("arvados", "v1");
 
-  @Test(expected=Exception.class)
-  public void testHelp() throws Exception {
-    String[] args = new String[1];
+    Map<String, Object> params = new HashMap<String, Object>();
 
-    args[0] = "help";
-    Arvados.help(args); // expect this to succeed with no problems
+    Map response = arv.call("users", "list", params);
+    assertEquals("Expected kind to be users.list", "arvados#userList", response.get("kind"));
 
-    args = new String[2];
+    List items = (List)response.get("items");
+    assertNotNull("expected users list items", items);
+    assertTrue("expected at least one item in users list", items.size()>0);
 
-    args[0] = "help";
-    args[1] = "call";
-    Arvados.main(args); // call via main
-    
-    args[0] = "help";
-    args[1] = "discover";
-    Arvados.help(args); // call help directly
+    Map firstUser = (Map)items.get(0);
+    assertNotNull ("Expcted at least one user", firstUser);
 
-    args[0] = "help";
-    args[1] = "unknown";
-    Arvados.help(args); // expect exception
+    assertEquals("Expected kind to be user", "arvados#user", firstUser.get("kind"));
+    assertNotNull("Expected uuid for first user", firstUser.get("uuid"));
   }
 
   /**
-   * test discover method
+   * Test users.get <uuid> api
    * @throws Exception
    */
   @Test
-  public void testDiscover() throws Exception {
-    Arvados arv = new Arvados("arvados");
+  public void testCallUsersGet() throws Exception {
+    Arvados arv = new Arvados("arvados", "v1");
 
-    List<String> params = new ArrayList<String>();
-    params.add("discover");
-    params.add("arvados");
-    params.add("v1");
+    // call user.system and get uuid of this user
+    Map<String, Object> params = new HashMap<String, Object>();
 
-    RestDescription restDescription = arv.discover(params);
+    Map response = arv.call("users", "list", params);
 
-    // The discover method returns the supported methods
-    Map<String, RestResource> resources = restDescription.getResources();
-    assertNotNull("Expected resources", resources);
+    assertNotNull("expected users list", response);
+    List items = (List)response.get("items");
+    assertNotNull("expected users list items", items);
 
-    Object users = resources.get("users");
-    assertNotNull ("Expected users.list method", users);
-    assertEquals("Exepcted users.list to be a RestResource type", RestResource.class, users.getClass());
+    Map firstUser = (Map)items.get(0);
+    String userUuid = (String)firstUser.get("uuid");
 
-    assertTrue("Root URL expected to match ARVADOS_API_HOST env paramdeter", 
-        restDescription.getRootUrl().contains(System.getenv().get("ARVADOS_API_HOST")));
+    // invoke users.get with the system user uuid
+    params = new HashMap<String, Object>();
+    params.put("uuid", userUuid);
+
+    response = arv.call("users", "get", params);
+
+    assertNotNull("Expected uuid for first user", response.get("uuid"));
+    assertEquals("Expected system user uuid", userUuid, response.get("uuid"));
   }
 
   /**
-   * Test users.list api
+   * Test users.create api
    * @throws Exception
    */
   @Test
-  public void testCallUsersList() throws Exception {
-    Arvados arv = new Arvados("arvados");
+  public void testCreateUser() throws Exception {
+    Arvados arv = new Arvados("arvados", "v1");
 
-    List<String> params = new ArrayList<String>();
-    params.add("call");
-    params.add("arvados");
-    params.add("v1");
-    params.add("users.list");
+    Map<String, Object> params = new HashMap<String, Object>();
+    params.put("user", "{}");
+    Map response = arv.call("users", "create", params);
 
-    String response = arv.call(params);
-    assertTrue("Expected users.list in response", response.contains("arvados#userList"));
-    assertTrue("Expected users.list in response", response.contains("uuid"));
+    assertEquals("Expected kind to be user", "arvados#user", response.get("kind"));
 
-    JSONParser parser = new JSONParser();
-    Object obj = parser.parse(response);
-    JSONObject jsonObject = (JSONObject) obj;
+    Object uuid = response.get("uuid");
+    assertNotNull("Expected uuid for first user", uuid);
 
-    assertEquals("Expected kind to be users.list", "arvados#userList", jsonObject.get("kind"));
+    // delete the object
+    params = new HashMap<String, Object>();
+    params.put("uuid", uuid);
+    response = arv.call("users", "delete", params);
 
-    List items = (List)jsonObject.get("items");
-    assertNotNull("expected users list items", items);
-    assertTrue("expected at least one item in users list", items.size()>0);
+    // invoke users.get with the system user uuid
+    params = new HashMap<String, Object>();
+    params.put("uuid", uuid);
 
-    JSONObject firstUser = (JSONObject)items.get(0);
-    assertNotNull ("Expcted at least one user", firstUser);
+    Exception caught = null;
+    try {
+      arv.call("users", "get", params);
+    } catch (Exception e) {
+      caught = e;
+    }
 
-    assertEquals("Expected kind to be user", "arvados#user", firstUser.get("kind"));
-    assertNotNull("Expected uuid for first user", firstUser.get("uuid"));
+    assertNotNull ("expected exception", caught);
+    assertTrue ("Expected 404", caught.getMessage().contains("Path not found"));
   }
 
-  /**
-   * Test users.get <uuid> api
-   * @throws Exception
-   */
   @Test
-  public void testCallUsersGet() throws Exception {
-    Arvados arv = new Arvados("arvados");
+  public void testCreateUserWithMissingRequiredParam() throws Exception {
+    Arvados arv = new Arvados("arvados", "v1");
 
-    // call user.system and get uuid of this user
-    List<String> params = new ArrayList<String>();
-    params.add("call");
-    params.add("arvados");
-    params.add("v1");
-    params.add("users.list");
-
-    String response = arv.call(params);
-    JSONParser parser = new JSONParser();
-    Object obj = parser.parse(response);
-    JSONObject jsonObject = (JSONObject) obj;
-    assertNotNull("expected users list", jsonObject);
-    List items = (List)jsonObject.get("items");
-    assertNotNull("expected users list items", items);
+    Map<String, Object> params = new HashMap<String, Object>();
 
-    JSONObject firstUser = (JSONObject)items.get(0);
-    String userUuid = (String)firstUser.get("uuid");
+    Exception caught = null;
+    try {
+      arv.call("users", "create", params);
+    } catch (Exception e) {
+      caught = e;
+    }
 
-    // invoke users.get with the system user uuid
-    params = new ArrayList<String>();
-    params.add("call");
-    params.add("arvados");
-    params.add("v1");
-    params.add("users.get");
-    params.add(userUuid);
-
-    response = arv.call(params);
-
-    //JSONParser parser = new JSONParser();
-    jsonObject = (JSONObject) parser.parse(response);;
-    assertNotNull("Expected uuid for first user", jsonObject.get("uuid"));
-    assertEquals("Expected system user uuid", userUuid, jsonObject.get("uuid"));
+    assertNotNull ("expected exception", caught);
+    assertTrue ("Expected POST method requires content object user", 
+        caught.getMessage().contains("ERROR: POST method requires content object user"));
   }
 
   /**
@@ -157,24 +139,33 @@ public class ArvadosTest {
    * @throws Exception
    */
   @Test
-  public void testCreateUser() throws Exception {
-    Arvados arv = new Arvados("arvados");
-
-    File file = new File(getClass().getResource( "/create_user.json" ).toURI());
-    String filePath = file.getPath();
-
-    List<String> params = new ArrayList<String>();
-    params.add("call");
-    params.add("arvados");
-    params.add("v1");
-    params.add("users.create");
-    params.add(filePath);
-    String response = arv.call(params);
-
-    JSONParser parser = new JSONParser();
-    JSONObject jsonObject = (JSONObject) parser.parse(response);
-    assertEquals("Expected kind to be user", "arvados#user", jsonObject.get("kind"));
-    assertNotNull("Expected uuid for first user", jsonObject.get("uuid"));
+  public void testCreateAndUpdateUser() throws Exception {
+    Arvados arv = new Arvados("arvados", "v1");
+
+    Map<String, Object> params = new HashMap<String, Object>();
+    params.put("user", "{}");
+    Map response = arv.call("users", "create", params);
+
+    assertEquals("Expected kind to be user", "arvados#user", response.get("kind"));
+
+    Object uuid = response.get("uuid");
+    assertNotNull("Expected uuid for first user", uuid);
+
+    // update this user
+    params = new HashMap<String, Object>();
+    params.put("user", "{}");
+    params.put("uuid", uuid);
+    response = arv.call("users", "update", params);
+
+    assertEquals("Expected kind to be user", "arvados#user", response.get("kind"));
+
+    uuid = response.get("uuid");
+    assertNotNull("Expected uuid for first user", uuid);
+
+    // delete the object
+    params = new HashMap<String, Object>();
+    params.put("uuid", uuid);
+    response = arv.call("users", "delete", params);
   }
 
   /**
@@ -183,17 +174,9 @@ public class ArvadosTest {
    */
   @Test
   public void testUnsupportedApiName() throws Exception {
-    Arvados arv = new Arvados("not_arvados");
-
-    List<String> params = new ArrayList<String>();
-    params.add("call");
-    params.add("not_arvados");
-    params.add("v1");
-    params.add("users.list");
-
     Exception caught = null;
     try {
-      arv.call(params);
+      Arvados arv = new Arvados("not_arvados", "v1");
     } catch (Exception e) {
       caught = e;
     }
@@ -208,17 +191,9 @@ public class ArvadosTest {
    */
   @Test
   public void testUnsupportedVersion() throws Exception {
-    Arvados arv = new Arvados("arvados");
-
-    List<String> params = new ArrayList<String>();
-    params.add("call");
-    params.add("arvados");
-    params.add("v2");         // no such version
-    params.add("users.list");
-
     Exception caught = null;
     try {
-      arv.call(params);
+      Arvados arv = new Arvados("arvados", "v2");
     } catch (Exception e) {
       caught = e;
     }
@@ -226,70 +201,267 @@ public class ArvadosTest {
     assertNotNull ("expected exception", caught);
     assertTrue ("Expected 404 when unsupported version is used", caught.getMessage().contains("404 Not Found"));
   }
-  
+
   /**
    * Test unsupported api version api
    * @throws Exception
    */
   @Test
-  public void testCallWithTooFewParams() throws Exception {
-    Arvados arv = new Arvados("arvados");
+  public void testCallForNoSuchResrouce() throws Exception {
+    Arvados arv = new Arvados("arvados", "v1");
 
-    List<String> params = new ArrayList<String>();
-    params.add("call");
-    params.add("arvados");
-    params.add("v1");
+    Exception caught = null;
+    try {
+      arv.call("abcd", "list", null);
+    } catch (Exception e) {
+      caught = e;
+    }
+
+    assertNotNull ("expected exception", caught);
+    assertTrue ("Expected ERROR: 404 not found", caught.getMessage().contains("ERROR: resource not found"));
+  }
+
+  /**
+   * Test unsupported api version api
+   * @throws Exception
+   */
+  @Test
+  public void testCallForNoSuchResrouceMethod() throws Exception {
+    Arvados arv = new Arvados("arvados", "v1");
 
     Exception caught = null;
     try {
-      arv.call(params);
+      arv.call("users", "abcd", null);
     } catch (Exception e) {
       caught = e;
     }
 
     assertNotNull ("expected exception", caught);
-    assertTrue ("Expected ERROR: missing method name", caught.getMessage().contains("ERROR: missing method name"));
+    assertTrue ("Expected ERROR: 404 not found", caught.getMessage().contains("ERROR: method not found"));
   }
-  
+
   /**
    * Test pipeline_tempates.create api
    * @throws Exception
    */
   @Test
   public void testCreateAndGetPipelineTemplate() throws Exception {
-    Arvados arv = new Arvados("arvados");
+    Arvados arv = new Arvados("arvados", "v1");
 
     File file = new File(getClass().getResource( "/first_pipeline.json" ).toURI());
-    String filePath = file.getPath();
-
-    List<String> params = new ArrayList<String>();
-    params.add("call");
-    params.add("arvados");
-    params.add("v1");
-    params.add("pipeline_templates.create");
-    params.add(filePath);
-    String response = arv.call(params);
-
-    JSONParser parser = new JSONParser();
-    JSONObject jsonObject = (JSONObject) parser.parse(response);
-    assertEquals("Expected kind to be user", "arvados#pipelineTemplate", jsonObject.get("kind"));
-    String uuid = (String)jsonObject.get("uuid");
+    byte[] data = new byte[(int)file.length()];
+    try {
+      FileInputStream is = new FileInputStream(file);
+      is.read(data);
+      is.close();
+    }catch(Exception e) {
+      e.printStackTrace();
+    }
+
+    Map<String, Object> params = new HashMap<String, Object>();
+    params.put("pipeline_template", new String(data));
+    Map response = arv.call("pipeline_templates", "create", params);
+    assertEquals("Expected kind to be user", "arvados#pipelineTemplate", response.get("kind"));
+    String uuid = (String)response.get("uuid");
     assertNotNull("Expected uuid for pipeline template", uuid);
-    
+
     // get the pipeline
-    params = new ArrayList<String>();
-    params.add("call");
-    params.add("arvados");
-    params.add("v1");
-    params.add("pipeline_templates.get");
-    params.add(uuid);
-    response = arv.call(params);
-
-    parser = new JSONParser();
-    jsonObject = (JSONObject) parser.parse(response);
-    assertEquals("Expected kind to be user", "arvados#pipelineTemplate", jsonObject.get("kind"));
-    assertEquals("Expected uuid for pipeline template", uuid, jsonObject.get("uuid"));
+    params = new HashMap<String, Object>();
+    params.put("uuid", uuid);
+    response = arv.call("pipeline_templates", "get", params);
+
+    assertEquals("Expected kind to be user", "arvados#pipelineTemplate", response.get("kind"));
+    assertEquals("Expected uuid for pipeline template", uuid, response.get("uuid"));
+
+    // delete the object
+    params = new HashMap<String, Object>();
+    params.put("uuid", uuid);
+    response = arv.call("pipeline_templates", "delete", params);
+  }
+
+  /**
+   * Test users.list api
+   * @throws Exception
+   */
+  @Test
+  public void testArvadosWithTokenPassed() throws Exception {
+    String token = System.getenv().get("ARVADOS_API_TOKEN");
+    String host = System.getenv().get("ARVADOS_API_HOST");      
+    String hostInsecure = System.getenv().get("ARVADOS_API_HOST_INSECURE");
+
+    Arvados arv = new Arvados("arvados", "v1", token, host, hostInsecure);
+
+    Map<String, Object> params = new HashMap<String, Object>();
+
+    Map response = arv.call("users", "list", params);
+    assertEquals("Expected kind to be users.list", "arvados#userList", response.get("kind"));
+  }
+
+  /**
+   * Test users.list api
+   * @throws Exception
+   */
+  @Test
+  public void testCallUsersListWithLimit() throws Exception {
+    Arvados arv = new Arvados("arvados", "v1");
+
+    Map<String, Object> params = new HashMap<String, Object>();
+
+    Map response = arv.call("users", "list", params);
+    assertEquals("Expected users.list in response", "arvados#userList", response.get("kind"));
+
+    List items = (List)response.get("items");
+    assertNotNull("expected users list items", items);
+    assertTrue("expected at least one item in users list", items.size()>0);
+
+    int numUsersListItems = items.size();
+
+    // make the request again with limit
+    params = new HashMap<String, Object>();
+    params.put("limit", numUsersListItems-1);
+
+    response = arv.call("users", "list", params);
+
+    assertEquals("Expected kind to be users.list", "arvados#userList", response.get("kind"));
+
+    items = (List)response.get("items");
+    assertNotNull("expected users list items", items);
+    assertTrue("expected at least one item in users list", items.size()>0);
+
+    int numUsersListItems2 = items.size();
+    assertEquals ("Got more users than requested", numUsersListItems-1, numUsersListItems2);
+  }
+
+  @Test
+  public void testGetLinksWithFilters() throws Exception {
+    Arvados arv = new Arvados("arvados", "v1");
+
+    Map<String, Object> params = new HashMap<String, Object>();
+
+    Map response = arv.call("links", "list", params);
+    assertEquals("Expected links.list in response", "arvados#linkList", response.get("kind"));
+
+    String[][] filters = new String[1][];
+    String[] condition = new String[3];
+    condition[0] = "name";
+    condition[1] = "=";
+    condition[2] = "can_manage";
+    filters[0] = condition;
+    params.put("filters", filters);
+    
+    response = arv.call("links", "list", params);
+    
+    assertEquals("Expected links.list in response", "arvados#linkList", response.get("kind"));
+    assertFalse("Expected no can_manage in response", response.toString().contains("\"name\":\"can_manage\""));
+  }
+
+  @Test
+  public void testGetLinksWithFiltersAsList() throws Exception {
+    Arvados arv = new Arvados("arvados", "v1");
+
+    Map<String, Object> params = new HashMap<String, Object>();
+
+    Map response = arv.call("links", "list", params);
+    assertEquals("Expected links.list in response", "arvados#linkList", response.get("kind"));
+
+    List<List> filters = new ArrayList<List>();
+    List<String> condition = new ArrayList<String>();
+    condition.add("name");
+    condition.add("is_a");
+    condition.add("can_manage");
+    filters.add(condition);
+    params.put("filters", filters);
+    
+    response = arv.call("links", "list", params);
+    
+    assertEquals("Expected links.list in response", "arvados#linkList", response.get("kind"));
+    assertFalse("Expected no can_manage in response", response.toString().contains("\"name\":\"can_manage\""));
+  }
+
+  @Test
+  public void testGetLinksWithTimestampFilters() throws Exception {
+    Arvados arv = new Arvados("arvados", "v1");
+
+    Map<String, Object> params = new HashMap<String, Object>();
+
+    Map response = arv.call("links", "list", params);
+    assertEquals("Expected links.list in response", "arvados#linkList", response.get("kind"));
+
+    // get links created "tomorrow". Expect none in response
+    Calendar calendar = new GregorianCalendar();
+    calendar.setTime(new Date());
+    calendar.add(Calendar.DAY_OF_MONTH, 1);
+    
+    Object[][] filters = new Object[1][];
+    Object[] condition = new Object[3];
+    condition[0] = "created_at";
+    condition[1] = ">";
+    condition[2] = calendar.get(Calendar.YEAR) + "-" + (calendar.get(Calendar.MONTH)+1) + "-" + calendar.get(Calendar.DAY_OF_MONTH);
+    filters[0] = condition;
+    params.put("filters", filters);
+    
+    response = arv.call("links", "list", params);
+    
+    assertEquals("Expected links.list in response", "arvados#linkList", response.get("kind"));
+    int items_avail = ((BigDecimal)response.get("items_available")).intValue();
+    assertEquals("Expected zero links", items_avail, 0);
+  }
+
+  @Test
+  public void testGetLinksWithWhereClause() throws Exception {
+    Arvados arv = new Arvados("arvados", "v1");
+
+    Map<String, Object> params = new HashMap<String, Object>();
+
+    Map<String, String> where = new HashMap<String, String>();
+    where.put("where", "updated_at > '2014-05-01'");
+    
+    params.put("where", where);
+    
+    Map response = arv.call("links", "list", params);
+    
+    assertEquals("Expected links.list in response", "arvados#linkList", response.get("kind"));
   }
 
+  @Test
+  public void testGetAvailableResources() throws Exception {
+    Arvados arv = new Arvados("arvados", "v1");
+    Set<String> resources = arv.getAvailableResourses();
+    assertNotNull("Expected resources", resources);
+    assertTrue("Excected users in resrouces", resources.contains("users"));
+  }
+
+  @Test
+  public void testGetAvailableMethodsResources() throws Exception {
+    Arvados arv = new Arvados("arvados", "v1");
+    Set<String> methods = arv.getAvailableMethodsForResourse("users");
+    assertNotNull("Expected resources", methods);
+    assertTrue("Excected create method for users", methods.contains("create"));
+  }
+
+  @Test
+  public void testGetAvailableParametersForUsersGetMethod() throws Exception {
+    Arvados arv = new Arvados("arvados", "v1");
+    Map<String,List<String>> parameters = arv.getAvailableParametersForMethod("users", "get");
+    assertNotNull("Expected parameters", parameters);
+    assertTrue("Excected uuid parameter for get method for users", parameters.get("required").contains("uuid"));
+  }
+
+  @Test
+  public void testGetAvailableParametersForUsersCreateMethod() throws Exception {
+    Arvados arv = new Arvados("arvados", "v1");
+    Map<String,List<String>> parameters = arv.getAvailableParametersForMethod("users", "create");
+    assertNotNull("Expected parameters", parameters);
+    assertTrue("Excected user parameter for get method for users", parameters.get("required").contains("user"));
+  }
+
+  @Test
+  public void testGetAvailableParametersForUsersListMethod() throws Exception {
+    Arvados arv = new Arvados("arvados", "v1");
+    Map<String,List<String>> parameters = arv.getAvailableParametersForMethod("users", "list");
+    assertNotNull("Expected parameters", parameters);
+    assertTrue("Excected no required parameter for list method for users", parameters.get("required").size() == 0);
+    assertTrue("Excected some optional parameters for list method for users", parameters.get("optional").contains("filters"));
+  }
 
-}
\ No newline at end of file
+}