/** * Copyright (C) 2014 KAIST * @author Janggwan Im <limg00n@kaist.ac.kr> */ package org.fosstrak.ale.server.test; import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertTrue; import java.util.ArrayList; import java.util.List; import javax.xml.namespace.QName; import junit.framework.Assert; import org.apache.log4j.Logger; import org.fosstrak.ale.exception.SecurityException; import org.fosstrak.ale.server.ALE; import org.fosstrak.ale.server.ac.ALEACImpl; import org.fosstrak.ale.server.cc.ALECC; import org.fosstrak.ale.server.readers.LogicalReaderManager; import org.fosstrak.ale.server.tm.ALETM; import org.fosstrak.ale.util.DeserializerUtil; import org.fosstrak.ale.wsdl.aleac.epcglobal.ClientIdentityValidationExceptionResponse; import org.fosstrak.ale.wsdl.aleac.epcglobal.DuplicateClientIdentityExceptionResponse; import org.fosstrak.ale.wsdl.aleac.epcglobal.DuplicatePermissionExceptionResponse; import org.fosstrak.ale.wsdl.aleac.epcglobal.DuplicateRoleExceptionResponse; import org.fosstrak.ale.wsdl.aleac.epcglobal.NoSuchClientIdentityExceptionResponse; import org.fosstrak.ale.wsdl.aleac.epcglobal.NoSuchPermissionExceptionResponse; import org.fosstrak.ale.wsdl.aleac.epcglobal.NoSuchRoleExceptionResponse; import org.fosstrak.ale.wsdl.aleac.epcglobal.PermissionValidationExceptionResponse; import org.fosstrak.ale.wsdl.aleac.epcglobal.RoleValidationExceptionResponse; import org.fosstrak.ale.wsdl.aleac.epcglobal.UnsupportedOperationExceptionResponse; import org.fosstrak.ale.xsd.ale.epcglobal.ACClientCredential; import org.fosstrak.ale.xsd.ale.epcglobal.ACClientIdentity; import org.fosstrak.ale.xsd.ale.epcglobal.ACRole; import org.fosstrak.ale.xsd.ale.epcglobal.LRSpec; import org.fosstrak.ale.xsd.ale.epcglobal.ACClientIdentity.Credentials; import org.fosstrak.ale.xsd.ale.epcglobal.ACClientIdentity.RoleNames; import org.fosstrak.ale.xsd.ale.epcglobal.ACPermission; import org.fosstrak.ale.xsd.ale.epcglobal.ACPermission.Instances; import org.fosstrak.ale.xsd.ale.epcglobal.ACRole.PermissionNames; import org.fosstrak.ale.xsd.ale.epcglobal.CCSpec; import org.junit.Before; import org.junit.BeforeClass; import org.junit.Test; import org.springframework.context.ApplicationContext; import org.springframework.context.support.ClassPathXmlApplicationContext; public class ALEACConformanceTest { /** logger. */ private static final Logger LOG = Logger.getLogger(ALEACConformanceTest.class); static ALEACImpl aleac = null; static ALE ale = null; static ALECC alecc = null; static LogicalReaderManager alelr = null; static ALETM aletm = null; @BeforeClass public static void beforeClass() throws Exception { LOG.info("Initializing Spring context."); ApplicationContext applicationContext = new ClassPathXmlApplicationContext("/applicationContext.xml"); LOG.info("Spring context initialized."); aleac = (ALEACImpl) applicationContext.getBean("aleac"); aleac.login("admin", "1111"); ale = (ALE) applicationContext.getBean("ale"); alecc = (ALECC) applicationContext.getBean("alecc"); alelr = (LogicalReaderManager) applicationContext.getBean("logicalReaderManager"); aletm = (ALETM) applicationContext.getBean("aletm"); LRSpec lrspec = DeserializerUtil.deserializeLRSpec(ALEACConformanceTest.class.getResourceAsStream("/lrspecs/LRSpec_A.xml")); System.out.println("Please connect reader... (timeout: 5000ms)"); Thread.sleep(5000); alelr.define("LogicalReader1", lrspec); for(String permName : aleac.getPermissionNames()) { aleac.undefinePermission(permName); } for(String roleName : aleac.getRoleNames()) { aleac.undefineRole(roleName); } for(String userId : aleac.getClientIdentityNames()) { if(!userId.equalsIgnoreCase("admin")) { aleac.undefineClientIdentity(userId); } } } @Before public void beforeEachTest() { } @Test public void test_A1() { assertEquals("1.1", aleac.getStandardVersion()); assertEquals("", aleac.getVendorVersion()); } @Test public void test_A2() { // step 1 List<String> supportedOperations = aleac.getSupportedOperations(); assertTrue(supportedOperations.contains("getStandardVersion")); assertTrue(supportedOperations.contains("getVendorVersion")); assertTrue(supportedOperations.contains("getSupportedOperations")); // step 2 : list subset of methods => TODO try { aleac.setRoles("Client1", new ArrayList<String>()); Assert.fail(); } catch(UnsupportedOperationExceptionResponse e) { } try { aleac.setPermissions("perm1", new ArrayList<String>()); Assert.fail(); } catch(UnsupportedOperationExceptionResponse e) { } // step 3 : no anonymous user => skip // step 4 : documentation on how at least one client establishes permissions => skip } @Test public void test_A3() throws Exception { String specName = "CCSpec_A3_31"; CCSpec spec = DeserializerUtil.deserializeCCSpec(getClass().getResourceAsStream("/ccspecs/CCSpec_A3_31.xml")); //ACClass acClass = new ACClass(); ACPermission perm1 = new ACPermission(); perm1.setPermissionClass("METHOD"); perm1.setInstances(new Instances()); perm1.getInstances().getInstance().add("ALE"); ACPermission perm2 = new ACPermission(); perm2.setPermissionClass("METHOD"); perm2.setInstances(new Instances()); perm2.getInstances().getInstance().add("*"); ACPermission perm3 = new ACPermission(); perm3.setPermissionClass("METHOD"); perm3.setInstances(new Instances()); perm3.getInstances().getInstance().add("ALECC.subscribe"); ACClientCredential cred1 = new ACClientCredential(); cred1.getOtherAttributes().put(new QName("password"), "1111"); ACClientCredential cred2 = new ACClientCredential(); cred2.getOtherAttributes().put(new QName("password"), "1111"); ACClientIdentity client1 = new ACClientIdentity(); client1.setCredentials(new Credentials()); client1.getCredentials().getCredential().add(cred1); client1.setRoleNames(new RoleNames()); client1.getRoleNames().getRoleName().add("role1"); ACClientIdentity client2 = new ACClientIdentity(); client2.setCredentials(new Credentials()); client2.getCredentials().getCredential().add(cred1); client2.setRoleNames(new RoleNames()); client2.getRoleNames().getRoleName().add("role2"); ACRole role1 = new ACRole(); role1.setPermissionNames(new PermissionNames()); role1.getPermissionNames().getPermissionName().add("perm1"); ACRole role2 = new ACRole(); role2.setPermissionNames(new PermissionNames()); role2.getPermissionNames().getPermissionName().add("perm2"); ACPermission perm4 = new ACPermission(); perm4.setPermissionClass("METHOD"); perm4.setInstances(new Instances()); perm4.getInstances().getInstance().add("ALE.subscribe"); ACPermission perm5 = new ACPermission(); perm5.setPermissionClass("METHOD"); perm5.setInstances(new Instances()); perm5.getInstances().getInstance().add("ALELR.update"); ACPermission perm6 = new ACPermission(); perm6.setPermissionClass("METHOD"); perm6.setInstances(new Instances()); perm6.getInstances().getInstance().add("ALETM.defineTMSpec"); // step 1 try { aleac.definePermission("perm1", perm1); } catch (DuplicatePermissionExceptionResponse e) { Assert.fail(); } // step 2 assertTrue(aleac.getPermissionNames().contains("perm1")); // step 3 ACPermission perm1_3 = aleac.getPermission("perm1"); assertTrue(perm1.getPermissionClass().equalsIgnoreCase(perm1_3.getPermissionClass())); assertTrue(perm1.getInstances().getInstance().get(0).equalsIgnoreCase(perm1_3.getInstances().getInstance().get(0))); // step 4 try { aleac.defineRole("role1", role1); } catch (RoleValidationExceptionResponse e1) { Assert.fail(); } catch (DuplicateRoleExceptionResponse e) { Assert.fail(); } // step 5 assertTrue(aleac.getRoleNames().contains("role1")); // step 6 aleac.getRole("role1"); // step 7 : update permission => skip aleac.undefinePermission("perm1"); try { aleac.definePermission("perm1", perm2); } catch (DuplicatePermissionExceptionResponse e) { Assert.fail(); } List<String> perm1InList = new ArrayList<String>(); perm1InList.add("perm1"); aleac.addPermissions("role1", perm1InList); // step 8 ACPermission perm2_8 = aleac.getPermission("perm1"); assertTrue(perm2.getPermissionClass().equalsIgnoreCase(perm2_8.getPermissionClass())); assertTrue(perm2.getInstances().getInstance().get(0).equalsIgnoreCase(perm2_8.getInstances().getInstance().get(0))); // step 9 try { aleac.definePermission("perm2", perm3); } catch (DuplicatePermissionExceptionResponse e) { Assert.fail(); } // step 10 List<String> permissionNames = new ArrayList<String>(); permissionNames.add("perm2"); aleac.addPermissions("role1", permissionNames); // step 11 ACRole role1_11 = aleac.getRole("role1"); assertTrue(role1_11.getPermissionNames().getPermissionName().contains("perm1")); assertTrue(role1_11.getPermissionNames().getPermissionName().contains("perm2")); // step 12 aleac.removePermissions("role1", permissionNames); // step 13 ACRole role1_13 = aleac.getRole("role1"); assertTrue(role1_13.getPermissionNames().getPermissionName().contains("perm1")); // step 14 try { aleac.defineRole("role2", role2); } catch (RoleValidationExceptionResponse e1) { Assert.fail(); } catch (DuplicateRoleExceptionResponse e) { Assert.fail(); } // step 15 assertTrue(aleac.getRoleNames().contains("role1")); assertTrue(aleac.getRoleNames().contains("role2")); // step 16 try { aleac.defineClientIdentity("Client1", client1); } catch (ClientIdentityValidationExceptionResponse e3) { Assert.fail(); } catch (DuplicateClientIdentityExceptionResponse e) { Assert.fail(); } // step 17 assertTrue(aleac.getClientIdentityNames().contains("Client1")); // step 18 try { ACClientIdentity client1_18 = aleac.getClientIdentity("Client1"); } catch (NoSuchClientIdentityExceptionResponse e2) { Assert.fail(); } //TODO assert (there is bug in Fortress, no role info is returned) //assertTrue(client1_18.getCredentials().getCredential().get(0).getOtherAttributes().get(new QName("password")).equalsIgnoreCase("1111")); //assertTrue(client1_18.getRoleNames().getRoleName().contains("role1")); // step 19 : getClientPermissionNames unsupported => skip // step 20 try { aleac.updateRole("role1", role2); } catch (RoleValidationExceptionResponse e1) { Assert.fail(); } // step 21 ACRole role1_21 = aleac.getRole("role1"); assertTrue(role1_21.getPermissionNames().getPermissionName().contains("perm2")); // step 22 : getClientPermissionNames unsupported => skip // step 23 try { aleac.updateRole("role1", role1); } catch (RoleValidationExceptionResponse e1) { Assert.fail(); } // step 24 ACRole role1_24 = aleac.getRole("role1"); assertTrue(role1_24.getPermissionNames().getPermissionName().contains("perm1")); // step 25 try { List<String> roleNames_25 = new ArrayList<String>(); roleNames_25.add("role2"); aleac.addRoles("Client1", roleNames_25); } catch (NoSuchClientIdentityExceptionResponse e) { Assert.fail(); } // step 26 : getClientPermissionNames unsupported => skip // step 27 try { ACClientIdentity client1_27 = aleac.getClientIdentity("Client1"); } catch (NoSuchClientIdentityExceptionResponse e) { // TODO Auto-generated catch block e.printStackTrace(); } //TODO assert (there is bug in Fortress, no role info is returned) //assertTrue(client1_27.getRoleNames().getRoleName().contains("role1")); //assertTrue(client1_27.getRoleNames().getRoleName().contains("role2")); // step 28 List<String> roleNames_28 = new ArrayList<String>(); roleNames_28.add("role2"); try { aleac.removeRoles("Client1", roleNames_28); } catch (NoSuchClientIdentityExceptionResponse e) { Assert.fail(); } // step 29 : getClientPermissionNames unsupported => skip // step 30 try { ACClientIdentity client1_30 = aleac.getClientIdentity("Client1"); } catch (NoSuchClientIdentityExceptionResponse e) { Assert.fail(); } //TODO assert (there is bug in Fortress, no role info is returned) //assertTrue(client1_30.getRoleNames().getRoleName().size() == 1); //assertTrue(client1_30.getRoleNames().getRoleName().contains("role1")); // -------------------- step 31~36 : Writing API /* System.out.println(aleac.getPermissionNames()); System.out.println("perm1: "+aleac.getPermission("perm1").getPermissionClass()+"/"+aleac.getPermission("perm1").getInstances().getInstance()); System.out.println("perm2: "+aleac.getPermission("perm2").getPermissionClass()+"/"+aleac.getPermission("perm2").getInstances().getInstance()); System.out.println(); System.out.println(aleac.getRoleNames()); System.out.println("role1: "+aleac.getRole("role1").getPermissionNames().getPermissionName()); System.out.println("role2: "+aleac.getRole("role2").getPermissionNames().getPermissionName()); System.out.println(); System.out.println(aleac.getClientIdentityNames()); System.out.println("Client1:"+aleac.getClientIdentity("Client1").getRoleNames().getRoleName()); System.out.println(aleac.getSupportedOperations()); */ System.out.println(aleac.login("Client1", "1111")); try { alecc.define(specName, spec); } catch(SecurityException e) { } aleac.login("admin", "1111"); List<String> roleList = new ArrayList<String>(); roleList.add("role1"); aleac.addRoles("Client1", roleList); System.out.println(aleac.login("Client1", "1111")); // step 31 TODO alecc.define(specName, spec); // step 32 try { aleac.updateClientIdentity("Client1", client2); } catch (NoSuchClientIdentityExceptionResponse e) { Assert.fail(); } catch (ClientIdentityValidationExceptionResponse e) { Assert.fail(); } // step 33 aleac.updatePermission("perm2", perm3); // step 34 // step 37~42 : Reading API // step 43~48 : LR API // step 49~54 : TM API // step 55~64 : } @Test public void test_A4() throws SecurityException { // step 1 try { aleac.getPermission("unknown_perm"); Assert.fail(); } catch(NoSuchPermissionExceptionResponse e) { } // step 2 try { ACPermission perm1 = new ACPermission(); perm1.setPermissionClass("METHOD"); perm1.setInstances(new Instances()); perm1.getInstances().getInstance().add("ALE"); aleac.updatePermission("unknown_perm", perm1); Assert.fail(); } catch (PermissionValidationExceptionResponse e1) { Assert.fail(); } catch (NoSuchPermissionExceptionResponse e) { } // step 3 try { aleac.undefinePermission("unknown_perm"); Assert.fail(); } catch(NoSuchPermissionExceptionResponse e) { } // step 4 try { List<String> perms = new ArrayList<String>(); perms.add("unknown_perm"); aleac.addPermissions("unknown_role", perms); Assert.fail(); } catch(NoSuchPermissionExceptionResponse e) { } catch(NoSuchRoleExceptionResponse e) { } // step 5 : setPermission unsupported => skip // step 6 try { ACPermission perm = new ACPermission(); perm.setPermissionClass("invalud_name"); perm.setInstances(new Instances()); perm.getInstances().getInstance().add("*"); aleac.definePermission("perm1", perm); Assert.fail(); } catch(PermissionValidationExceptionResponse e) { } catch (DuplicatePermissionExceptionResponse e) { Assert.fail(); } // step 7 try { ACPermission perm = new ACPermission(); perm.setPermissionClass("invalud_name"); perm.setInstances(new Instances()); perm.getInstances().getInstance().add("*"); aleac.updatePermission("perm1", perm); Assert.fail(); } catch(PermissionValidationExceptionResponse e) { } catch (NoSuchPermissionExceptionResponse e) { Assert.fail(); } // step 8 try { ACPermission perm = new ACPermission(); perm.setPermissionClass("invalud_name"); perm.setInstances(new Instances()); perm.getInstances().getInstance().add("invalid_instance_string"); aleac.definePermission("perm1", perm); Assert.fail(); } catch(PermissionValidationExceptionResponse e) { } catch (DuplicatePermissionExceptionResponse e) { Assert.fail(); } // step 9 try { ACPermission perm = new ACPermission(); perm.setPermissionClass("invalud_name"); perm.setInstances(new Instances()); perm.getInstances().getInstance().add("invalid_instance_string"); aleac.updatePermission("perm1", perm); Assert.fail(); } catch(PermissionValidationExceptionResponse e) { } catch (NoSuchPermissionExceptionResponse e) { Assert.fail(); } // step 10 try { ACPermission perm1 = new ACPermission(); perm1.setPermissionClass("METHOD"); perm1.setInstances(new Instances()); perm1.getInstances().getInstance().add("ALE"); aleac.definePermission("perm1", perm1); aleac.definePermission("perm1", perm1); Assert.fail(); } catch(PermissionValidationExceptionResponse e) { Assert.fail(); } catch (DuplicatePermissionExceptionResponse e) { } finally { try { aleac.undefinePermission("perm1"); } catch (NoSuchPermissionExceptionResponse e) { Assert.fail(); } } // step 11 try { ACRole role1 = new ACRole(); role1.setPermissionNames(new PermissionNames()); role1.getPermissionNames().getPermissionName().add("perm1"); aleac.updateRole("unknown_role", role1); Assert.fail(); } catch(NoSuchRoleExceptionResponse e) { } catch (RoleValidationExceptionResponse e) { Assert.fail(); } // step 12 try { aleac.getRole("unknown_role"); Assert.fail(); } catch(NoSuchRoleExceptionResponse e) { } // step 13 try { aleac.undefineRole("unknown_role"); Assert.fail(); } catch(NoSuchRoleExceptionResponse e) { } // step 14 try { aleac.addPermissions("unknown_role", new ArrayList<String>()); Assert.fail(); } catch(NoSuchRoleExceptionResponse e) { } catch (NoSuchPermissionExceptionResponse e) { Assert.fail(); } // step 15 : setPermissions not supported => skip // step 16 try { aleac.removePermissions("unknown_role", new ArrayList<String>()); Assert.fail(); } catch(NoSuchRoleExceptionResponse e) { } catch (NoSuchPermissionExceptionResponse e) { Assert.fail(); } // step 17 try { List<String> roleNames = new ArrayList<String>(); roleNames.add("unknown_role"); aleac.addRoles("Client1", roleNames); Assert.fail(); } catch(NoSuchRoleExceptionResponse e) { } catch (NoSuchClientIdentityExceptionResponse e) { Assert.fail(); } // step 18 : setRoles not supported => skip // step 19 try { ACRole invalid_role = new ACRole(); invalid_role.setPermissionNames(new PermissionNames()); invalid_role.getPermissionNames().getPermissionName().add("invalid_perm"); aleac.defineRole("invalid_role", invalid_role); Assert.fail(); } catch(RoleValidationExceptionResponse e) { } catch (DuplicateRoleExceptionResponse e) { Assert.fail(); } // step 20 try { ACRole invalid_role = new ACRole(); invalid_role.setPermissionNames(new PermissionNames()); invalid_role.getPermissionNames().getPermissionName().add("invalid_perm"); aleac.updateRole("role1", invalid_role); Assert.fail(); } catch(RoleValidationExceptionResponse e) { } catch (NoSuchRoleExceptionResponse e) { Assert.fail(); } // step 21 try { ACRole role1 = new ACRole(); role1.setPermissionNames(new PermissionNames()); role1.getPermissionNames().getPermissionName().add("perm1"); aleac.defineRole("role1", role1); } catch(DuplicateRoleExceptionResponse e) { } catch (RoleValidationExceptionResponse e) { Assert.fail(); } // step 22 try { ACClientCredential cred1 = new ACClientCredential(); cred1.getOtherAttributes().put(new QName("password"), "1111"); ACClientIdentity client1 = new ACClientIdentity(); client1.setCredentials(new Credentials()); client1.getCredentials().getCredential().add(cred1); client1.setRoleNames(new RoleNames()); client1.getRoleNames().getRoleName().add("role1"); aleac.updateClientIdentity("unknown_clientId", client1); Assert.fail(); } catch(NoSuchClientIdentityExceptionResponse e) { } catch (ClientIdentityValidationExceptionResponse e) { Assert.fail(); } // step 23 try { aleac.getClientIdentity("unknown_client"); Assert.fail(); } catch(NoSuchClientIdentityExceptionResponse e) { } // step 24 : getClientPermissionNames not supported => skip // step 25 try { aleac.undefineClientIdentity("unknown_client"); Assert.fail(); } catch(NoSuchClientIdentityExceptionResponse e) { } // step 26 try { aleac.addRoles("unknown_client", new ArrayList<String>()); Assert.fail(); } catch(NoSuchClientIdentityExceptionResponse e) { } catch (NoSuchRoleExceptionResponse e) { Assert.fail(); } // step 27 try { aleac.removeRoles("unknown_client", new ArrayList<String>()); Assert.fail(); } catch(NoSuchClientIdentityExceptionResponse e) { } // step 28 try { ACClientCredential cred1 = new ACClientCredential(); cred1.getOtherAttributes().put(new QName("password"), "1111"); ACClientIdentity client1 = new ACClientIdentity(); client1.setCredentials(new Credentials()); client1.getCredentials().getCredential().add(cred1); client1.setRoleNames(new RoleNames()); client1.getRoleNames().getRoleName().add("unknown_role"); aleac.defineClientIdentity("invalid_client", client1); Assert.fail(); } catch(ClientIdentityValidationExceptionResponse e) { } catch (DuplicateClientIdentityExceptionResponse e) { Assert.fail(); } // step 29 try { ACClientCredential cred1 = new ACClientCredential(); cred1.getOtherAttributes().put(new QName("password"), "1111"); ACClientIdentity client1 = new ACClientIdentity(); client1.setCredentials(new Credentials()); client1.getCredentials().getCredential().add(cred1); client1.setRoleNames(new RoleNames()); client1.getRoleNames().getRoleName().add("unknown_role"); aleac.updateClientIdentity("Client1", client1); Assert.fail(); } catch(ClientIdentityValidationExceptionResponse e) { } catch (NoSuchClientIdentityExceptionResponse e) { Assert.fail(); } // step 30 try { ACClientCredential cred1 = new ACClientCredential(); cred1.getOtherAttributes().put(new QName("password"), "1111"); ACClientIdentity client1 = new ACClientIdentity(); client1.setCredentials(new Credentials()); client1.getCredentials().getCredential().add(cred1); client1.setRoleNames(new RoleNames()); client1.getRoleNames().getRoleName().add("unknown_role"); aleac.defineClientIdentity("Client1", client1); Assert.fail(); } catch(ClientIdentityValidationExceptionResponse e) { Assert.fail(); } catch (DuplicateClientIdentityExceptionResponse e) { } } }