content: /**
   *  Licensed to the Apache Software Foundation (ASF) under one or more
   *  contributor license agreements.  See the NOTICE file distributed with
   *  this work for additional information regarding copyright ownership.
   *  The ASF licenses this file to You under the Apache License, Version 2.0
   *  (the "License"); you may not use this file except in compliance with
   *  the License.  You may obtain a copy of the License at
   *
   *     http://www.apache.org/licenses/LICENSE-2.0
   *
   *  Unless required by applicable law or agreed to in writing, software
   *  distributed under the License is distributed on an "AS IS" BASIS,
   *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
   *  See the License for the specific language governing permissions and
   *  limitations under the License.
   */
  package org.apache.aries.jmx.useradmin;
  
  import static org.junit.Assert.assertArrayEquals;
  import static org.junit.Assert.assertEquals;
  import static org.junit.Assert.assertNotNull;
  import static org.junit.Assert.assertThrows;
  import static org.junit.Assert.assertTrue;
  
  import java.io.IOException;
  import java.util.Dictionary;
  import java.util.Hashtable;
  import javax.management.openmbean.CompositeData;
  import javax.management.openmbean.TabularData;
  
  import org.apache.aries.jmx.codec.AuthorizationData;
  import org.apache.aries.jmx.codec.GroupData;
  import org.apache.aries.jmx.codec.RoleData;
  import org.apache.aries.jmx.codec.UserData;
  import org.junit.Before;
  import org.junit.Test;
  import org.mockito.Mock;
  import org.mockito.Mockito;
  import org.mockito.MockitoAnnotations;
  import org.osgi.jmx.JmxConstants;
  import org.osgi.service.useradmin.Authorization;
  import org.osgi.service.useradmin.Group;
  import org.osgi.service.useradmin.Role;
  import org.osgi.service.useradmin.User;
  
  /**
   * UserAdminMBean test case.
   * 
   * @version $Rev$ $Date$
   */
  public class UserAdminTest {
  
      @Mock
      private org.osgi.service.useradmin.UserAdmin userAdmin;
      private UserAdmin mbean;
  
      /**
       * @throws java.lang.Exception
       */
      @Before
      public void setUp() throws Exception {
          MockitoAnnotations.initMocks(this);
          mbean = new UserAdmin(userAdmin);
      }
  
      /**
       * Test method for
       * {@link org.apache.aries.jmx.useradmin.UserAdmin#addCredential(java.lang.String, byte[], java.lang.String)}.
       * 
       * @throws IOException
       */
      @Test
      public void testAddCredential() throws IOException {
          User user1 = Mockito.mock(User.class);
          Dictionary<String, Object> credentials = new Hashtable<String, Object>();
          Mockito.when(userAdmin.getRole("user1")).thenReturn(user1);
          Mockito.when(user1.getType()).thenReturn(Role.USER);
          Mockito.when(user1.getCredentials()).thenReturn(credentials);
          mbean.addCredential("password", new byte[] { 1, 2 }, "user1");
          assertArrayEquals(new byte[] { 1, 2 }, (byte[]) credentials.get("password"));
  
      }
  
      /**
       * Test method for
       * {@link org.apache.aries.jmx.useradmin.UserAdmin#addCredentialString(String, String, String)}
       * .
       * 
       * @throws IOException
       */
      @Test
      public void testAddCredentialString() throws IOException {
          User user1 = Mockito.mock(User.class);
          Dictionary<String, Object> credentials = new Hashtable<String, Object>();
          Mockito.when(userAdmin.getRole("user1")).thenReturn(user1);
          Mockito.when(user1.getType()).thenReturn(Role.USER);
          Mockito.when(user1.getCredentials()).thenReturn(credentials);
          mbean.addCredentialString("password", "1234", "user1");
          assertEquals("1234", (String) credentials.get("password"));
      }
  
      /**
       * Test method for {@link org.apache.aries.jmx.useradmin.UserAdmin#addMember(java.lang.String, java.lang.String)}.
       * 
       * @throws IOException
       */
      @Test
      public void testAddMember() throws IOException {
          Group group1 = Mockito.mock(Group.class);
          User user1 = Mockito.mock(User.class);
          Mockito.when(userAdmin.getRole("group1")).thenReturn(group1);
          Mockito.when(userAdmin.getRole("user1")).thenReturn(user1);
          Mockito.when(group1.getType()).thenReturn(Role.GROUP);
          Mockito.when(group1.addMember(user1)).thenReturn(true);
          boolean isAdded = mbean.addMember("group1", "user1");
          assertTrue(isAdded);
          Mockito.verify(group1).addMember(user1);
      }
  
      /**
       * Test method for
       * {@link org.apache.aries.jmx.useradmin.UserAdmin#addPropertyString(String, String, String)}
       * .
       * 
       * @throws IOException
       */
      @Test
      public void testAddPropertyString() throws IOException {
          User user1 = Mockito.mock(User.class);
          Dictionary<String, Object> props = new Hashtable<String, Object>();
          Mockito.when(userAdmin.getRole("user1")).thenReturn(user1);
          Mockito.when(user1.getType()).thenReturn(Role.USER);
          Mockito.when(user1.getProperties()).thenReturn(props);
          mbean.addPropertyString("key", "1234", "user1");
          assertEquals("1234", (String) props.get("key"));
      }
  
      /**
       * Test method for
       * {@link org.apache.aries.jmx.useradmin.UserAdmin#addProperty(java.lang.String, byte[], java.lang.String)}.
       * 
       * @throws IOException
       */
      @Test
      public void testAddProperty() throws IOException {
          User user1 = Mockito.mock(User.class);
          Dictionary<String, Object> props = new Hashtable<String, Object>();
          Mockito.when(userAdmin.getRole("user1")).thenReturn(user1);
          Mockito.when(user1.getType()).thenReturn(Role.USER);
          Mockito.when(user1.getProperties()).thenReturn(props);
          mbean.addProperty("key", new byte[] { 1, 2 }, "user1");
          assertArrayEquals(new byte[] { 1, 2 }, (byte[]) props.get("key"));
      }
  
      /**
       * Test method for
       * {@link org.apache.aries.jmx.useradmin.UserAdmin#addRequiredMember(java.lang.String, java.lang.String)}.
       * 
       * @throws IOException
       */
      @Test
      public void testAddRequiredMember() throws IOException {
          Group group1 = Mockito.mock(Group.class);
          User user1 = Mockito.mock(User.class);
          Mockito.when(userAdmin.getRole("group1")).thenReturn(group1);
          Mockito.when(userAdmin.getRole("user1")).thenReturn(user1);
          Mockito.when(group1.getType()).thenReturn(Role.GROUP);
          Mockito.when(group1.addRequiredMember(user1)).thenReturn(true);
          boolean isAdded = mbean.addRequiredMember("group1", "user1");
          assertTrue(isAdded);
          Mockito.verify(group1).addRequiredMember(user1);
      }
  
      /**
       * Test method for {@link org.apache.aries.jmx.useradmin.UserAdmin#createGroup(java.lang.String)}.
       * 
       * @throws IOException
       */
      @Test
      public void testCreateGroup() throws IOException {
          mbean.createGroup("group1");
          Mockito.verify(userAdmin).createRole("group1", Role.GROUP);
      }
  
      /**
       * Test method for {@link org.apache.aries.jmx.useradmin.UserAdmin#createRole(java.lang.String)}.
       * 
       * @throws IOException
       */
      @Test
      public void testCreateRole() throws IOException {
          assertThrows(IOException.class, () -> mbean.createRole("role1"));
      }
  
      /**
       * Test method for {@link org.apache.aries.jmx.useradmin.UserAdmin#createUser(java.lang.String)}.
       * 
       * @throws IOException
       */
      @Test
      public void testCreateUser() throws IOException {
          mbean.createUser("user1");
          Mockito.verify(userAdmin).createRole("user1", Role.USER);
      }
  
      /**
       * Test method for {@link org.apache.aries.jmx.useradmin.UserAdmin#getAuthorization(java.lang.String)}.
       * 
       * @throws IOException
       */
      @Test
      public void testGetAuthorization() throws IOException {
          Authorization auth = Mockito.mock(Authorization.class);
          User user = Mockito.mock(User.class);
          Mockito.when(user.getType()).thenReturn(Role.USER);
          Mockito.when(userAdmin.getAuthorization(user)).thenReturn(auth);
          Mockito.when(userAdmin.getRole("role1")).thenReturn(user);
          Mockito.when(auth.getName()).thenReturn("auth1");
          Mockito.when(auth.getRoles()).thenReturn(new String[]{"role1"});
          CompositeData data = mbean.getAuthorization("role1");
          assertNotNull(data);
          AuthorizationData authData = AuthorizationData.from(data);
          assertNotNull(authData);
          assertEquals("auth1", authData.getName());
          assertArrayEquals(new String[] { "role1" }, authData.getRoles());
      }
  
      /**
       * Test method for {@link org.apache.aries.jmx.useradmin.UserAdmin#getCredentials(java.lang.String)}.
       * 
       * @throws IOException
       */
      @Test
      public void testGetCredentials() throws IOException {
          User user1 = Mockito.mock(User.class);
          Dictionary<String, Object> properties = new Hashtable<String, Object>();
          properties.put("key", "value");
          Mockito.when(user1.getCredentials()).thenReturn(properties);
          Mockito.when(user1.getType()).thenReturn(Role.USER);
          Mockito.when(userAdmin.getRole(Mockito.anyString())).thenReturn(user1);
          TabularData data = mbean.getCredentials("user1");
          assertNotNull(data);
          assertEquals(JmxConstants.PROPERTIES_TYPE, data.getTabularType());
          CompositeData composite = data.get(new Object[] { "key" });
          assertNotNull(composite);
          assertEquals("key", (String) composite.get(JmxConstants.KEY));
          assertEquals("value", (String) composite.get(JmxConstants.VALUE));
      }
  
      /**
       * Test method for {@link org.apache.aries.jmx.useradmin.UserAdmin#getGroup(java.lang.String)}.
       * 
       * @throws IOException
       */
      @Test
      public void testGetGroup() throws IOException {
          Group group1 = Mockito.mock(Group.class);
          Mockito.when(group1.getType()).thenReturn(Role.GROUP);
          Mockito.when(group1.getName()).thenReturn("group1");
          Role role1 = Mockito.mock(Role.class);
          Mockito.when(role1.getName()).thenReturn("role1");
          Role role2 = Mockito.mock(Role.class);
          Mockito.when(role2.getName()).thenReturn("role2");
          Mockito.when(group1.getRequiredMembers()).thenReturn(new Role[] { role1 });
          Mockito.when(group1.getMembers()).thenReturn(new Role[] { role2 });
          Mockito.when(userAdmin.getRole(Mockito.anyString())).thenReturn(group1);
          CompositeData data = mbean.getGroup("group1");
          assertNotNull(data);
          GroupData group = GroupData.from(data);
          assertNotNull(group);
          assertEquals("group1", group.getName());
          assertEquals(Role.GROUP, group.getType());
          assertArrayEquals(new String[] { "role2" }, group.getMembers());
          assertArrayEquals(new String[] { "role1" }, group.getRequiredMembers());
          Mockito.verify(userAdmin).getRole(Mockito.anyString());
      }
  
      /**
       * Test method for {@link org.apache.aries.jmx.useradmin.UserAdmin#getGroups(java.lang.String)}.
       * 
       * @throws Exception
       */
      @Test
      public void testGetGroups() throws Exception {
          Group group1 = Mockito.mock(Group.class);
          Mockito.when(group1.getType()).thenReturn(Role.GROUP);
          Mockito.when(group1.getName()).thenReturn("group1");
          Mockito.when(userAdmin.getRoles("name=group1")).thenReturn(new Role[] { group1 });
          String[] groups = mbean.getGroups("name=group1");
          assertArrayEquals(new String[] { "group1" }, groups);
      }
  
      /**
       * Test method for {@link org.apache.aries.jmx.useradmin.UserAdmin#getImpliedRoles(java.lang.String)}.
       * 
       * @throws IOException
       */
      @Test
      public void testGetImpliedRoles() throws IOException {
          User user1 = Mockito.mock(User.class);
          Authorization auth = Mockito.mock(Authorization.class);
          Mockito.when(user1.getType()).thenReturn(Role.USER);
          Mockito.when(auth.getRoles()).thenReturn(new String[] { "role1" });
          Mockito.when(userAdmin.getRole("role1")).thenReturn(user1);
          Mockito.when(userAdmin.getAuthorization(user1)).thenReturn(auth);
          String[] roles = mbean.getImpliedRoles("role1");
          assertArrayEquals(new String[] { "role1" }, roles);
      }
  
      /**
       * Test method for {@link org.apache.aries.jmx.useradmin.UserAdmin#getMembers(java.lang.String)}.
       * 
       * @throws IOException
       */
      @Test
      public void testGetMembers() throws IOException {
          Group group1 = Mockito.mock(Group.class);
          Mockito.when(group1.getType()).thenReturn(Role.GROUP);
          Mockito.when(group1.getName()).thenReturn("group1");
          User user1 = Mockito.mock(Group.class);
          Mockito.when(user1.getName()).thenReturn("user1");
          Mockito.when(group1.getMembers()).thenReturn(new Role[] { user1 });
          Mockito.when(userAdmin.getRole("group1")).thenReturn(group1);
          String[] members = mbean.getMembers("group1");
          assertArrayEquals(new String[] { "user1" }, members);
      }
  
      /**
       * Test method for {@link org.apache.aries.jmx.useradmin.UserAdmin#getProperties(java.lang.String)}.
       * 
       * @throws IOException
       */
      @Test
      public void testGetProperties() throws IOException {
          User user1 = Mockito.mock(User.class);
          Dictionary<String, Object> properties = new Hashtable<String, Object>();
          properties.put("key", "value");
          Mockito.when(user1.getProperties()).thenReturn(properties);
          Mockito.when(userAdmin.getRole(Mockito.anyString())).thenReturn(user1);
          TabularData data = mbean.getProperties("user1");
          assertNotNull(data);
          assertEquals(JmxConstants.PROPERTIES_TYPE, data.getTabularType());
          CompositeData composite = data.get(new Object[] { "key" });
          assertNotNull(composite);
          assertEquals("key", (String) composite.get(JmxConstants.KEY));
          assertEquals("value", (String) composite.get(JmxConstants.VALUE));
      }
  
      /**
       * Test method for {@link org.apache.aries.jmx.useradmin.UserAdmin#getRequiredMembers(java.lang.String)}.
       * 
       * @throws IOException
       */
      @Test
      public void testGetRequiredMembers() throws IOException {
          Group group1 = Mockito.mock(Group.class);
          Mockito.when(group1.getType()).thenReturn(Role.GROUP);
          Mockito.when(group1.getName()).thenReturn("group1");
          User user1 = Mockito.mock(Group.class);
          Mockito.when(user1.getName()).thenReturn("user1");
          Mockito.when(group1.getRequiredMembers()).thenReturn(new Role[] { user1 });
          Mockito.when(userAdmin.getRole("group1")).thenReturn(group1);
          String[] members = mbean.getRequiredMembers("group1");
          assertArrayEquals(new String[] { "user1" }, members);
      }
  
      /**
       * Test method for {@link org.apache.aries.jmx.useradmin.UserAdmin#getRole(java.lang.String)}.
       * 
       * @throws IOException
       */
      @Test
      public void testGetRole() throws IOException {
          User user1 = Mockito.mock(User.class);
          Mockito.when(user1.getType()).thenReturn(Role.USER);
          Mockito.when(user1.getName()).thenReturn("user1");
          Mockito.when(userAdmin.getRole(Mockito.anyString())).thenReturn(user1);
          CompositeData data = mbean.getRole("user1");
          assertNotNull(data);
          RoleData role = RoleData.from(data);
          assertNotNull(role);
          assertEquals("user1", role.getName());
          assertEquals(Role.USER, role.getType());
          Mockito.verify(userAdmin).getRole(Mockito.anyString());
      }
  
      /**
       * Test method for {@link org.apache.aries.jmx.useradmin.UserAdmin#getRoles(java.lang.String)}.
       * 
       * @throws Exception
       */
      @Test
      public void testGetRoles() throws Exception {
          User user1 = Mockito.mock(User.class);
          Mockito.when(user1.getType()).thenReturn(Role.USER);
          Mockito.when(user1.getName()).thenReturn("user1");
          Mockito.when(userAdmin.getRoles("name=user1")).thenReturn(new Role[] { user1 });
          String[] roles = mbean.getRoles("name=user1");
          assertArrayEquals(new String[] { "user1" }, roles);
      }
  
      /**
       * Test method for {@link org.apache.aries.jmx.useradmin.UserAdmin#getUser(java.lang.String)}.
       * 
       * @throws IOException
       */
      @Test
      public void testGetUser() throws IOException {
          User user1 = Mockito.mock(User.class);
          Mockito.when(user1.getType()).thenReturn(Role.USER);
          Mockito.when(user1.getName()).thenReturn("user1");
          Mockito.when(userAdmin.getRole(Mockito.anyString())).thenReturn(user1);
          CompositeData data = mbean.getUser("user1");
          assertNotNull(data);
          UserData user = UserData.from(data);
          assertNotNull(user);
          assertEquals("user1", user.getName());
          assertEquals(Role.USER, user.getType());
          Mockito.verify(userAdmin).getRole(Mockito.anyString());
      }
  
      /**
       * Test method for {@link org.apache.aries.jmx.useradmin.UserAdmin#getUserWithProperty(String, String)}.
       * 
       * @throws IOException
       */
      @Test
      public void testGetUserString() throws IOException {
          User user1 = Mockito.mock(User.class);
          Mockito.when(user1.getType()).thenReturn(Role.USER);
          Mockito.when(user1.getName()).thenReturn("user1");
          Mockito.when(userAdmin.getUser("key", "valuetest")).thenReturn(user1);
          String username = mbean.getUserWithProperty("key", "valuetest");
          assertEquals(username, "user1");
      }
  
      /**
       * Test method for {@link org.apache.aries.jmx.useradmin.UserAdmin#getUsers(java.lang.String)}.
       * 
       * @throws Exception
       */
      @Test
      public void testGetUsers() throws Exception {
          User user1 = Mockito.mock(User.class);
          Mockito.when(user1.getType()).thenReturn(Role.USER);
          Mockito.when(user1.getName()).thenReturn("user1");
          Mockito.when(userAdmin.getRoles("name=user1")).thenReturn(new Role[] { user1 });
          String[] roles = mbean.getUsers("name=user1");
          assertArrayEquals(new String[] { "user1" }, roles);
      }
  
      /**
       * Test method for {@link org.apache.aries.jmx.useradmin.UserAdmin#listGroups()}.
       * 
       * @throws Exception
       */
      @Test
      public void testListGroups() throws Exception {
          Group group1 = Mockito.mock(Group.class);
          Mockito.when(group1.getType()).thenReturn(Role.GROUP);
          Mockito.when(group1.getName()).thenReturn("group1");
          Group group2 = Mockito.mock(Group.class);
          Mockito.when(group2.getType()).thenReturn(Role.GROUP);
          Mockito.when(group2.getName()).thenReturn("group2");
          Mockito.when(userAdmin.getRoles(null)).thenReturn(new Role[] { group1, group2 });
          String[] groups = mbean.listGroups();
          assertArrayEquals(new String[] { "group1", "group2" }, groups);
      }
  
      /**
       * Test method for {@link org.apache.aries.jmx.useradmin.UserAdmin#listRoles()}.
       * 
       * @throws Exception
       */
      @Test
      public void testListRoles() throws Exception {
          User user1 = Mockito.mock(User.class);
          Mockito.when(user1.getType()).thenReturn(Role.USER);
          Mockito.when(user1.getName()).thenReturn("user1");
          User user2 = Mockito.mock(User.class);
          Mockito.when(user2.getType()).thenReturn(Role.USER);
          Mockito.when(user2.getName()).thenReturn("user2");
          Mockito.when(userAdmin.getRoles(null)).thenReturn(new Role[] { user1, user2 });
          String[] roles = mbean.listRoles();
          assertArrayEquals(new String[] { "user1", "user2" }, roles);
      }
  
      /**
       * Test method for {@link org.apache.aries.jmx.useradmin.UserAdmin#listUsers()}.
       * 
       * @throws Exception
       */
      @Test
      public void testListUsers() throws Exception {
          User user1 = Mockito.mock(User.class);
          Mockito.when(user1.getType()).thenReturn(Role.USER);
          Mockito.when(user1.getName()).thenReturn("user1");
          User user2 = Mockito.mock(User.class);
          Mockito.when(user2.getType()).thenReturn(Role.USER);
          Mockito.when(user2.getName()).thenReturn("user2");
          Mockito.when(userAdmin.getRoles(null)).thenReturn(new Role[] { user1, user2 });
          String[] roles = mbean.listUsers();
          assertArrayEquals(new String[] { "user1", "user2" }, roles);
      }
  
      /**
       * Test method for
       * {@link org.apache.aries.jmx.useradmin.UserAdmin#removeCredential(java.lang.String, java.lang.String)}.
       * 
       * @throws IOException
       */
      @Test
      public void testRemoveCredential() throws IOException {
          User user1 = Mockito.mock(User.class);
          Dictionary<String, Object> cred = new Hashtable<String, Object>();
          Mockito.when(userAdmin.getRole("user1")).thenReturn(user1);
          Mockito.when(user1.getType()).thenReturn(Role.USER);
          Mockito.when(user1.getCredentials()).thenReturn(cred);
          mbean.removeCredential("key", "user1");
          assertEquals(0, cred.size());
      }
  
      /**
       * Test method for {@link org.apache.aries.jmx.useradmin.UserAdmin#removeGroup(java.lang.String)}.
       * 
       * @throws IOException
       */
      @Test
      public void testRemoveGroup() throws IOException {
          Mockito.when(userAdmin.removeRole("group1")).thenReturn(true);
          boolean isRemoved = mbean.removeGroup("group1");
          assertTrue(isRemoved);
      }
  
      /**
       * Test method for {@link org.apache.aries.jmx.useradmin.UserAdmin#removeMember(java.lang.String, java.lang.String)}
       * .
       * 
       * @throws IOException
       */
      @Test
      public void testRemoveMember() throws IOException {
          Group group1 = Mockito.mock(Group.class);
          User user1 = Mockito.mock(User.class);
          Mockito.when(userAdmin.getRole("group1")).thenReturn(group1);
          Mockito.when(userAdmin.getRole("user1")).thenReturn(user1);
          Mockito.when(group1.getType()).thenReturn(Role.GROUP);
          Mockito.when(group1.removeMember(user1)).thenReturn(true);
          boolean isAdded = mbean.removeMember("group1", "user1");
          assertTrue(isAdded);
          Mockito.verify(group1).removeMember(user1);
      }
  
      /**
       * Test method for
       * {@link org.apache.aries.jmx.useradmin.UserAdmin#removeProperty(java.lang.String, java.lang.String)}.
       * 
       * @throws IOException
       */
      @Test
      public void testRemoveProperty() throws IOException {
          User user1 = Mockito.mock(User.class);
          Dictionary<String, Object> props = new Hashtable<String, Object>();
          Mockito.when(userAdmin.getRole("user1")).thenReturn(user1);
          Mockito.when(user1.getType()).thenReturn(Role.USER);
          Mockito.when(user1.getProperties()).thenReturn(props);
          mbean.removeProperty("key", "user1");
          assertEquals(0, props.size());
      }
  
      /**
       * Test method for {@link org.apache.aries.jmx.useradmin.UserAdmin#removeRole(java.lang.String)}.
       * 
       * @throws IOException
       */
      @Test
      public void testRemoveRole() throws IOException {
          Mockito.when(userAdmin.removeRole("role1")).thenReturn(true);
          boolean isRemoved = mbean.removeRole("role1");
          assertTrue(isRemoved);
      }
  
      /**
       * Test method for {@link org.apache.aries.jmx.useradmin.UserAdmin#removeUser(java.lang.String)}.
       * 
       * @throws IOException
       */
      @Test
      public void testRemoveUser() throws IOException {
          Mockito.when(userAdmin.removeRole("user1")).thenReturn(true);
          boolean isRemoved = mbean.removeUser("user1");
          assertTrue(isRemoved);
      }
  
  }
  