summaryrefslogtreecommitdiffstats
path: root/cadi/core/src
diff options
context:
space:
mode:
authorIanHowell <ian.howell@att.com>2018-03-29 15:04:28 -0500
committerIanHowell <ian.howell@att.com>2018-03-29 15:04:33 -0500
commitc2390f53793402252ca747ec3d52734e63f6a6b4 (patch)
tree673847b9fc4fc0e2e4b01196a2d30510ed418146 /cadi/core/src
parent3635fc5c8d8409d1c5e0f521469a6aaca4d19ffe (diff)
Add several JUnits for test coverage
This is several days worth of tests - future commits will be smaller Issue-ID: AAF-128 Change-Id: I32d9b76d3ff95b32f96eaaf3d2ab8a36167c5254 Signed-off-by: IanHowell <ian.howell@att.com>
Diffstat (limited to 'cadi/core/src')
-rw-r--r--cadi/core/src/main/java/org/onap/aaf/cadi/config/GetAccess.java7
-rw-r--r--cadi/core/src/test/java/org/onap/aaf/cadi/test/JU_AbsUserCache.java363
-rw-r--r--cadi/core/src/test/java/org/onap/aaf/cadi/test/JU_CadiException.java121
-rw-r--r--cadi/core/src/test/java/org/onap/aaf/cadi/test/JU_CadiWrap.java161
-rw-r--r--cadi/core/src/test/java/org/onap/aaf/cadi/test/config/JU_Get.java116
-rw-r--r--cadi/core/src/test/java/org/onap/aaf/cadi/test/config/JU_GetAccess.java107
-rw-r--r--cadi/core/src/test/java/org/onap/aaf/cadi/test/util/JU_Chmod.java75
-rw-r--r--cadi/core/src/test/java/org/onap/aaf/cadi/test/util/JU_Pool.java144
-rw-r--r--cadi/core/src/test/java/org/onap/aaf/cadi/test/util/JU_SubStandardConsole.java124
9 files changed, 1212 insertions, 6 deletions
diff --git a/cadi/core/src/main/java/org/onap/aaf/cadi/config/GetAccess.java b/cadi/core/src/main/java/org/onap/aaf/cadi/config/GetAccess.java
index 05ee90cd..b44de05f 100644
--- a/cadi/core/src/main/java/org/onap/aaf/cadi/config/GetAccess.java
+++ b/cadi/core/src/main/java/org/onap/aaf/cadi/config/GetAccess.java
@@ -48,12 +48,7 @@ public class GetAccess extends PropAccess {
*/
@Override
public String getProperty(String tag) {
- String rv;
- rv = super.getProperty(tag, null);
- if(rv==null && getter!=null) {
- rv = getter.get(tag, null, true);
- }
- return rv;
+ return getProperty(tag, null);
}
public Get get() {
diff --git a/cadi/core/src/test/java/org/onap/aaf/cadi/test/JU_AbsUserCache.java b/cadi/core/src/test/java/org/onap/aaf/cadi/test/JU_AbsUserCache.java
new file mode 100644
index 00000000..441765a6
--- /dev/null
+++ b/cadi/core/src/test/java/org/onap/aaf/cadi/test/JU_AbsUserCache.java
@@ -0,0 +1,363 @@
+/*******************************************************************************
+ * * org.onap.aaf
+ * * ===========================================================================
+ * * Copyright © 2017 AT&T Intellectual Property. All rights reserved.
+ * * ===========================================================================
+ * * Licensed 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.
+ * * ============LICENSE_END====================================================
+ * *
+ * *
+ ******************************************************************************/
+
+package org.onap.aaf.cadi.test;
+
+import static org.junit.Assert.*;
+import static org.hamcrest.CoreMatchers.*;
+import static org.mockito.Mockito.*;
+import org.junit.*;
+import org.mockito.*;
+
+import java.io.ByteArrayOutputStream;
+import java.io.IOException;
+import java.io.PrintStream;
+import java.lang.reflect.Field;
+import java.security.Principal;
+import java.util.ArrayList;
+import java.util.List;
+
+import org.onap.aaf.cadi.AbsUserCache;
+import org.onap.aaf.cadi.AbsUserCache.*;
+import org.onap.aaf.cadi.Access;
+import org.onap.aaf.cadi.CachedPrincipal.Resp;
+import org.onap.aaf.cadi.CachingLur;
+import org.onap.aaf.cadi.GetCred;
+import org.onap.aaf.cadi.Hash;
+import org.onap.aaf.cadi.Permission;
+import org.onap.aaf.cadi.PropAccess;
+import org.onap.aaf.cadi.User;
+import org.onap.aaf.cadi.lur.LocalPermission;
+import org.onap.aaf.cadi.principal.CachedBasicPrincipal;
+
+public class JU_AbsUserCache {
+
+ @Mock private CachingLur<Permission> cl;
+
+ @Mock private Principal principal;
+
+ @Mock private CachedBasicPrincipal cbp;
+
+ @Mock private LocalPermission permission1;
+ @Mock private LocalPermission permission2;
+
+
+ private Access access;
+
+ private ByteArrayOutputStream outStream;
+
+ private String name1 = "name1";
+ private String name2 = "name2";
+ private byte[] password = "password".getBytes();
+
+ private static Field timerField;
+
+ @BeforeClass
+ public static void setupOnce() throws Exception {
+ timerField = AbsUserCache.class.getDeclaredField("timer");
+ timerField.setAccessible(true);
+ }
+
+ @Before
+ public void setup() throws Exception {
+ MockitoAnnotations.initMocks(this);
+
+ outStream = new ByteArrayOutputStream();
+ System.setOut(new PrintStream(outStream));
+
+ // This must happen after changing System.out
+ access = new PropAccess();
+
+ when(permission1.getKey()).thenReturn("NewKey1");
+ when(permission2.getKey()).thenReturn("NewKey2");
+
+ timerField.set(null, null);
+ }
+
+ @After
+ public void tearDown() throws Exception {
+ System.setOut(System.out);
+ timerField.set(null, null);
+ }
+
+ @SuppressWarnings("unused")
+ @Test
+ public void constructorTest() {
+ int cleanInterval = 65000;
+ int maxInterval = 70000;
+
+ AbsUserCacheStub<Permission> aucs1 = new AbsUserCacheStub<Permission>(access, cleanInterval, maxInterval, Integer.MAX_VALUE);
+ String output = outStream.toString().split(" ", 2)[1];
+ StringBuilder expected = new StringBuilder();
+ expected.append("INIT [cadi] Cleaning Thread initialized with interval of ");
+ expected.append(String.valueOf(cleanInterval));
+ expected.append(" ms and max objects of ");
+ expected.append(String.valueOf(maxInterval));
+ expected.append("\n");
+ assertThat(output, is(expected.toString()));
+
+ outStream.reset();
+ AbsUserCacheStub<Permission> aucs2 = new AbsUserCacheStub<Permission>(access, cleanInterval, maxInterval, Integer.MAX_VALUE);
+ output = outStream.toString().split(" ", 2)[1];
+ expected = new StringBuilder();
+ expected.append("INIT [cadi] Cleaning Thread initialized with interval of ");
+ expected.append(String.valueOf(cleanInterval));
+ expected.append(" ms and max objects of ");
+ expected.append(String.valueOf(maxInterval));
+ expected.append("\n");
+ assertThat(output, is(expected.toString()));
+
+ AbsUserCacheStub<Permission> aucs3 = new AbsUserCacheStub<Permission>(access, 0, 0, Integer.MAX_VALUE);
+ AbsUserCacheStub<Permission> aucs4 = new AbsUserCacheStub<Permission>(aucs1);
+
+ // For coverage
+ AbsUserCacheCLStub<Permission> auccls1 = new AbsUserCacheCLStub<Permission>(aucs1);
+ aucs1.setLur(cl);
+ auccls1 = new AbsUserCacheCLStub<Permission>(aucs1);
+ AbsUserCacheCLStub<Permission> auccls2 = new AbsUserCacheCLStub<Permission>(aucs3);
+ }
+
+ @Test
+ public void setLurTest() {
+ AbsUserCacheStub<Permission> aucs1 = new AbsUserCacheStub<Permission>(access, 65000, 70000, Integer.MAX_VALUE);
+ AbsUserCacheStub<Permission> aucs2 = new AbsUserCacheStub<Permission>(access, 0, 0, Integer.MAX_VALUE);
+ aucs1.setLur(cl);
+ aucs2.setLur(cl);
+ }
+
+ @Test
+ public void addUserGetUserTest() throws NoSuchFieldException, SecurityException, IllegalArgumentException, IllegalAccessException {
+ AbsUserCacheStub<Permission> aucs = new AbsUserCacheStub<Permission>(access, 0, 0, Integer.MAX_VALUE);
+ User<Permission> user;
+
+ // Test adding a user with a principal (non-GetCred). user does not have a cred
+ // Then test getting that user
+ when(principal.getName()).thenReturn(name1);
+ user = new User<Permission>(principal, 0);
+ aucs.addUser(user);
+ assertThat(aucs.getUser(principal), is(user));
+
+ // Test adding a user with a principal (GetCred). user does not have a cred
+ // Then test getting that user
+ GetCredStub gc = new GetCredStub();
+ user = new User<Permission>(gc, 0);
+ aucs.addUser(user);
+ assertThat(aucs.getUser(gc), is(user));
+
+ // Test adding a user with no principal
+ // Then test getting that user via his name and cred
+ user = new User<Permission>(name2, password);
+ aucs.addUser(user);
+ assertThat(aucs.getUser(name2, password), is(user));
+
+ // Test getting a user by a CachedBasicPrincipal
+ when(cbp.getName()).thenReturn(name2);
+ when(cbp.getCred()).thenReturn(password);
+ assertThat(aucs.getUser(cbp), is(user));
+
+ // Force the user to expire, then test that he is no longer in the cache
+ Field permExpiresField = User.class.getDeclaredField("permExpires");
+ permExpiresField.setAccessible(true);
+ permExpiresField.set(user, 0);
+ assertThat(aucs.getUser(name2, password), is(nullValue()));
+
+ // Test adding a user with a custom key
+ // Then test gettin that user
+ user = new User<Permission>(principal, 0);
+ String key = principal.getName() + "NoCred";
+ aucs.addUser(key, user);
+ assertThat(aucs.getUser(principal), is(user));
+
+ // Test that getUser returns null for principals that don't match any users
+ when(principal.getName()).thenReturn("not in the cache");
+ assertThat(aucs.getUser(principal), is(nullValue()));
+
+ // That that getUser returns null for name/creds that are not in the cache
+ assertThat(aucs.getUser("not a real user", "not in the cache".getBytes()), is(nullValue()));
+ }
+
+ @Test
+ public void removeTest() {
+ AbsUserCacheStub<Permission> aucs = new AbsUserCacheStub<Permission>(access, 0, 0, Integer.MAX_VALUE);
+ User<Permission> user;
+
+ when(principal.getName()).thenReturn(name1);
+ user = new User<Permission>(principal);
+ // Add a user with a principal
+ aucs.addUser(user);
+ // Check that the user is in the cache
+ assertThat(aucs.getUser(principal), is(user));
+ // Remove the user
+ when(principal.getName()).thenReturn(name1 + "NoCred");
+ aucs.remove(user);
+ // Check that the user is no longer in the cache
+ when(principal.getName()).thenReturn(name1);
+ assertThat(aucs.getUser(principal), is(nullValue()));
+
+ // Add the user again
+ aucs.addUser(user);
+ // Check that the user is in the cache
+ assertThat(aucs.getUser(principal), is(user));
+ // Remove the user by name
+ aucs.remove(name1 + "NoCred");
+ // Check that the user is no longer in the cache
+ assertThat(aucs.getUser(principal), is(nullValue()));
+
+ // Coverage test - attempt to remove a user that is not in the cache
+ aucs.remove(name1 + "NoCred");
+ assertThat(aucs.getUser(principal), is(nullValue()));
+ }
+
+ @Test
+ public void clearAllTest() {
+ AbsUserCacheStub<Permission> aucs = new AbsUserCacheStub<Permission>(access, 0, 0, Integer.MAX_VALUE);
+ User<Permission> user1;
+ User<Permission> user2;
+
+ // Add some users to the cache
+ when(principal.getName()).thenReturn(name1);
+ user1 = new User<Permission>(principal);
+ when(principal.getName()).thenReturn(name2);
+ user2 = new User<Permission>(principal);
+ aucs.addUser(user1);
+ aucs.addUser(user2);
+
+ // Check that the users are in the cache
+ when(principal.getName()).thenReturn(name1);
+ assertThat(aucs.getUser(principal), is(user1));
+ when(principal.getName()).thenReturn(name2);
+ assertThat(aucs.getUser(principal), is(user2));
+
+ // Clear the cache
+ aucs.clearAll();
+
+ // Check that the users are no longer in the cache
+ when(principal.getName()).thenReturn(name1);
+ assertThat(aucs.getUser(principal), is(nullValue()));
+ when(principal.getName()).thenReturn(name2);
+ assertThat(aucs.getUser(principal), is(nullValue()));
+ }
+
+ @Test
+ public void dumpInfoTest() {
+ AbsUserCacheStub<Permission> aucs = new AbsUserCacheStub<Permission>(access, 0, 0, Integer.MAX_VALUE);
+ User<Permission> user1;
+ User<Permission> user2;
+
+ Principal principal1 = mock(Principal.class);
+ Principal principal2 = mock(Principal.class);
+ when(principal1.getName()).thenReturn(name1);
+ when(principal2.getName()).thenReturn(name2);
+
+ // Add some users with permissions to the cache
+ user1 = new User<Permission>(principal1);
+ user1.add(permission1);
+ user1.add(permission2);
+ user2 = new User<Permission>(principal2);
+ user2.add(permission1);
+ user2.add(permission2);
+ aucs.addUser(user1);
+ aucs.addUser(user2);
+
+ // Dump the info
+ List<AbsUserCache<Permission>.DumpInfo> dumpInfo = aucs.dumpInfo();
+ assertThat(dumpInfo.size(), is(2));
+
+ // Utility lists
+ List<String> names = new ArrayList<String>();
+ names.add(name1);
+ names.add(name2);
+ List<String> permissions = new ArrayList<String>();
+ permissions.add("NewKey1");
+ permissions.add("NewKey2");
+
+ // We need to use "contains" because the dumpInfo was created from a list, so we don't know it's order
+ for (AbsUserCache<Permission>.DumpInfo di : dumpInfo) {
+ assertTrue(names.contains(di.user));
+ for (String perm : di.perms) {
+ assertTrue(permissions.contains(perm));
+ }
+ }
+ }
+
+ @Test
+ public void handlesExclusivelyTest() {
+ AbsUserCacheStub<Permission> aucs = new AbsUserCacheStub<Permission>(access, 0, 0, Integer.MAX_VALUE);
+ assertFalse(aucs.handlesExclusively(permission1));
+ assertFalse(aucs.handlesExclusively(permission2));
+ }
+
+ @Test
+ public void destroyTest() {
+ AbsUserCacheStub<Permission> aucs = new AbsUserCacheStub<Permission>(access, 0, 0, Integer.MAX_VALUE);
+ aucs.destroy();
+ aucs = new AbsUserCacheStub<Permission>(access, 1, 1, Integer.MAX_VALUE);
+ aucs.destroy();
+ }
+
+ @Test
+ public void missTest() throws IOException {
+ AbsUserCacheStub<Permission> aucs = new AbsUserCacheStub<Permission>(access, 0, 0, Integer.MAX_VALUE);
+ // Add the Miss to the missmap
+ assertTrue(aucs.addMiss("key", password)); // This one actually adds it
+ assertTrue(aucs.addMiss("key", password)); // this one doesn't really do anything
+ assertTrue(aucs.addMiss("key", password)); // neither does this one
+ assertFalse(aucs.addMiss("key", password)); // By this time, the missMap is tired of this nonsense, and retaliates
+ assertFalse(aucs.addMiss("key", password)); // Oh yea. He's angry
+
+ // Can't really test this due to visibility
+ aucs.missed("key", password);
+
+ // Coverage
+ AbsUserCacheStub<Permission> aucs1 = new AbsUserCacheStub<Permission>(access, 1, 1, Integer.MAX_VALUE);
+ aucs1.addMiss("key", password);
+ }
+
+ class AbsUserCacheStub<PERM extends Permission> extends AbsUserCache<PERM> {
+ public AbsUserCacheStub(Access access, long cleanInterval, int highCount, int usageCount) { super(access, cleanInterval, highCount, usageCount); }
+ public AbsUserCacheStub(AbsUserCache<PERM> cache) { super(cache); }
+ @Override public void setLur(CachingLur<PERM> lur) { super.setLur(lur); }
+ @Override public void addUser(User<PERM> user) { super.addUser(user); }
+ @Override public void addUser(String key, User<PERM> user) { super.addUser(key, user); }
+ @Override public User<PERM> getUser(Principal p) { return super.getUser(p); }
+ @Override public User<PERM> getUser(CachedBasicPrincipal p) { return super.getUser(p); }
+ @Override public User<PERM> getUser(String user, byte[] cred) { return super.getUser(user, cred); }
+ @Override public void remove(User<PERM> user) { super.remove(user); }
+ @Override public boolean addMiss(String key, byte[] bs) { return super.addMiss(key, bs); }
+ @Override public Miss missed(String key, byte[] bs) throws IOException { return super.missed(key, bs); }
+ }
+
+ class AbsUserCacheCLStub<PERM extends Permission> extends AbsUserCache<PERM> implements CachingLur<PERM> {
+ public AbsUserCacheCLStub(AbsUserCache<PERM> cache) { super(cache); }
+ @Override public Permission createPerm(String p) { return null; }
+ @Override public boolean fish(Principal bait, Permission pond) { return false; }
+ @Override public void fishAll(Principal bait, List<Permission> permissions) { }
+ @Override public boolean handles(Principal principal) { return false; }
+ @Override public Resp reload(User<PERM> user) { return null; }
+ @Override public void setDebug(String commaDelimIDsOrNull) { }
+ }
+
+ class GetCredStub implements Principal, GetCred {
+ @Override public byte[] getCred() { return password; }
+ @Override public String getName() { return name1; }
+ }
+
+}
diff --git a/cadi/core/src/test/java/org/onap/aaf/cadi/test/JU_CadiException.java b/cadi/core/src/test/java/org/onap/aaf/cadi/test/JU_CadiException.java
new file mode 100644
index 00000000..fa3b5cc4
--- /dev/null
+++ b/cadi/core/src/test/java/org/onap/aaf/cadi/test/JU_CadiException.java
@@ -0,0 +1,121 @@
+/*******************************************************************************
+ * ============LICENSE_START====================================================
+ * * org.onap.aaf
+ * * ===========================================================================
+ * * Copyright © 2017 AT&T Intellectual Property. All rights reserved.
+ * * ===========================================================================
+ * * Licensed 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.
+ * * ============LICENSE_END====================================================
+ * *
+ * *
+ ******************************************************************************/
+package org.onap.aaf.cadi.test;
+
+import static org.junit.Assert.*;
+
+import org.junit.Test;
+import org.onap.aaf.cadi.CadiException;
+
+import static org.hamcrest.CoreMatchers.is;
+
+public class JU_CadiException {
+ @Test
+ public void testCadiException() {
+ CadiException exception = new CadiException();
+
+ assertNotNull(exception);
+ }
+
+ @Test
+ public void testCadiExceptionString() {
+ CadiException exception = new CadiException("New Exception");
+ assertNotNull(exception);
+ assertThat(exception.getMessage(), is("New Exception"));
+ }
+
+ @Test
+ public void testCadiExceptionThrowable() {
+ CadiException exception = new CadiException(new Throwable("New Exception"));
+ assertNotNull(exception);
+ assertThat(exception.getMessage(), is("java.lang.Throwable: New Exception"));
+ }
+
+ @Test
+ public void testCadiExceptionStringThrowable() {
+ CadiException exception = new CadiException("New Exception",new Throwable("New Exception"));
+ assertNotNull(exception);
+ assertThat(exception.getMessage(), is("New Exception"));
+
+ }
+
+ @Test
+ public void testCadiException1() {
+ CadiException exception = new CadiException();
+
+ assertNotNull(exception);
+ }
+
+ @Test
+ public void testCadiExceptionString1() {
+ CadiException exception = new CadiException("New Exception");
+ assertNotNull(exception);
+ assertThat(exception.getMessage(), is("New Exception"));
+ }
+
+ @Test
+ public void testCadiExceptionThrowable1() {
+ CadiException exception = new CadiException(new Throwable("New Exception"));
+ assertNotNull(exception);
+ assertThat(exception.getMessage(), is("java.lang.Throwable: New Exception"));
+ }
+
+ @Test
+ public void testCadiExceptionStringThrowable1() {
+ CadiException exception = new CadiException("New Exception",new Throwable("New Exception"));
+ assertNotNull(exception);
+ assertThat(exception.getMessage(), is("New Exception"));
+
+ }
+
+ @Test
+ public void testCadiException2() {
+ CadiException exception = new CadiException();
+
+ assertNotNull(exception);
+ }
+
+ @Test
+ public void testCadiExceptionString2() {
+ CadiException exception = new CadiException("New Exception");
+ assertNotNull(exception);
+ assertThat(exception.getMessage(), is("New Exception"));
+ }
+
+ @Test
+ public void testCadiExceptionThrowable2() {
+ CadiException exception = new CadiException(new Throwable("New Exception"));
+ assertNotNull(exception);
+ assertThat(exception.getMessage(), is("java.lang.Throwable: New Exception"));
+ }
+
+ @Test
+ public void testCadiExceptionStringThrowable2() {
+ CadiException exception = new CadiException("New Exception",new Throwable("New Exception"));
+ assertNotNull(exception);
+ assertThat(exception.getMessage(), is("New Exception"));
+
+ }
+
+
+
+}
diff --git a/cadi/core/src/test/java/org/onap/aaf/cadi/test/JU_CadiWrap.java b/cadi/core/src/test/java/org/onap/aaf/cadi/test/JU_CadiWrap.java
new file mode 100644
index 00000000..8bcb6329
--- /dev/null
+++ b/cadi/core/src/test/java/org/onap/aaf/cadi/test/JU_CadiWrap.java
@@ -0,0 +1,161 @@
+/*******************************************************************************
+ * ============LICENSE_START====================================================
+ * * org.onap.aaf
+ * * ===========================================================================
+ * * Copyright © 2017 AT&T Intellectual Property. All rights reserved.
+ * * ===========================================================================
+ * * Licensed 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.
+ * * ============LICENSE_END====================================================
+ * *
+ * *
+ ******************************************************************************/
+package org.onap.aaf.cadi.test;
+
+import org.junit.*;
+import org.mockito.Mock;
+import org.mockito.MockitoAnnotations;
+
+import static org.junit.Assert.*;
+import static org.mockito.Matchers.*;
+import static org.mockito.Mockito.*;
+
+import java.io.ByteArrayOutputStream;
+import java.io.PrintStream;
+import java.security.Principal;
+import java.util.List;
+
+import javax.servlet.http.HttpServletRequest;
+
+import org.onap.aaf.cadi.Access;
+import org.onap.aaf.cadi.CachingLur;
+import org.onap.aaf.cadi.CadiException;
+import org.onap.aaf.cadi.CadiWrap;
+import org.onap.aaf.cadi.Lur;
+import org.onap.aaf.cadi.Permission;
+import org.onap.aaf.cadi.PropAccess;
+import org.onap.aaf.cadi.User;
+import org.onap.aaf.cadi.CachedPrincipal.Resp;
+import org.onap.aaf.cadi.filter.MapPermConverter;
+import org.onap.aaf.cadi.lur.EpiLur;
+import org.onap.aaf.cadi.principal.TaggedPrincipal;
+import org.onap.aaf.cadi.taf.TafResp;
+
+public class JU_CadiWrap {
+
+ @Mock
+ private HttpServletRequest request;
+
+ @Mock
+ private TafResp tafResp;
+
+ @Mock
+ private TaggedPrincipal principle;
+
+ @Mock
+ private Lur lur;
+
+ @Before
+ public void setUp() throws Exception {
+ MockitoAnnotations.initMocks(this);
+
+ System.setOut(new PrintStream(new ByteArrayOutputStream()));
+ }
+
+ @After
+ public void tearDown() {
+ System.setOut(System.out);
+ }
+
+ @SuppressWarnings("unchecked")
+ @Test
+ public void testInstantiate() throws CadiException {
+ Access a = new PropAccess();
+ when(tafResp.getAccess()).thenReturn(a);
+
+ lur.fishAll(isA(Principal.class), (List<Permission>)isA(List.class));
+
+ EpiLur lur1 = new EpiLur(lur);
+
+ CadiWrap wrap = new CadiWrap(request, tafResp, lur1);
+
+ assertNull(wrap.getUserPrincipal());
+ assertNull(wrap.getRemoteUser());
+ assertNull(wrap.getUser());
+ assertEquals(wrap.getPermissions(principle).size(), 0);
+ assertTrue(wrap.access() instanceof PropAccess);
+
+ byte[] arr = {'1','2'};
+ wrap.setCred(arr);
+
+ assertEquals(arr, wrap.getCred());
+
+ wrap.setUser("User1");
+ assertEquals("User1", wrap.getUser());
+
+ wrap.invalidate("1");
+
+ assertFalse(wrap.isUserInRole(null));
+
+ wrap.set(tafResp, lur);
+
+ wrap.invalidate("2");
+
+ assertFalse(wrap.isUserInRole("User1"));
+ }
+
+ @Test
+ public void testInstantiateWithPermConverter() throws CadiException {
+ Access a = new PropAccess();
+ when(tafResp.getAccess()).thenReturn(a);
+ when(tafResp.getPrincipal()).thenReturn(principle);
+
+ // Anonymous object for testing purposes
+ CachingLur<Permission> lur1 = new CachingLur<Permission>() {
+ @Override public Permission createPerm(String p) { return null; }
+ @Override public boolean fish(Principal bait, Permission pond) { return true; }
+ @Override public void fishAll(Principal bait, List<Permission> permissions) { }
+ @Override public void destroy() { }
+ @Override public boolean handlesExclusively(Permission pond) { return false; }
+ @Override public boolean handles(Principal principal) { return false; }
+ @Override public void remove(String user) { }
+ @Override public Resp reload(User<Permission> user) { return null; }
+ @Override public void setDebug(String commaDelimIDsOrNull) { }
+ @Override public void clear(Principal p, StringBuilder sb) { }
+ };
+
+ MapPermConverter pc = new MapPermConverter();
+
+ CadiWrap wrap = new CadiWrap(request, tafResp, lur1, pc);
+
+ assertNotNull(wrap.getUserPrincipal());
+ assertNull(wrap.getRemoteUser());
+ assertNull(wrap.getUser());
+
+ byte[] arr = {'1','2'};
+ wrap.setCred(arr);
+
+ assertEquals(arr, wrap.getCred());
+
+ wrap.setUser("User1");
+ assertEquals("User1", wrap.getUser());
+
+ wrap.invalidate("1");
+ wrap.setPermConverter(new MapPermConverter());
+
+ assertTrue(wrap.getLur() instanceof CachingLur);
+ assertTrue(wrap.isUserInRole("User1"));
+
+ wrap.set(tafResp, lur);
+ assertFalse(wrap.isUserInRole("Perm1"));
+ }
+}
diff --git a/cadi/core/src/test/java/org/onap/aaf/cadi/test/config/JU_Get.java b/cadi/core/src/test/java/org/onap/aaf/cadi/test/config/JU_Get.java
new file mode 100644
index 00000000..5f89060e
--- /dev/null
+++ b/cadi/core/src/test/java/org/onap/aaf/cadi/test/config/JU_Get.java
@@ -0,0 +1,116 @@
+/*******************************************************************************
+ * * org.onap.aaf
+ * * ===========================================================================
+ * * Copyright © 2017 AT&T Intellectual Property. All rights reserved.
+ * * ===========================================================================
+ * * Licensed 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.
+ * * ============LICENSE_END====================================================
+ * *
+ * *
+ ******************************************************************************/
+
+package org.onap.aaf.cadi.test.config;
+
+import static org.junit.Assert.*;
+import static org.hamcrest.CoreMatchers.*;
+import org.junit.*;
+
+import java.io.ByteArrayOutputStream;
+import java.io.PrintStream;
+
+import org.onap.aaf.cadi.PropAccess;
+import org.onap.aaf.cadi.config.Get;
+
+public class JU_Get {
+
+ private String defaultVal = "some default value";
+
+ private ByteArrayOutputStream outStream;
+
+ private TestBean tb;
+
+ @Before
+ public void setup() {
+ outStream = new ByteArrayOutputStream();
+ System.setOut(new PrintStream(outStream));
+ }
+
+ @After
+ public void tearDown() {
+ System.setOut(System.out);
+ }
+
+ @Test
+ public void beanTest() {
+ tb = new TestBean();
+ tb.setProperty1("prop1");
+
+ Get.Bean testBean = new Get.Bean(tb);
+ assertThat(testBean.get("property1", defaultVal, true), is("prop1"));
+ assertThat(testBean.get("property2", defaultVal, true), is(defaultVal));
+ assertThat(testBean.get("thrower", defaultVal, true), is(defaultVal));
+ }
+
+ @Test
+ public void nullTest() {
+ assertThat(Get.NULL.get("name", defaultVal, true), is(defaultVal));
+ }
+
+ @Test
+ public void accessTest() {
+ String output;
+
+ PropAccess access = new PropAccess();
+ access.setProperty("tag", "value");
+ Get.AccessGet accessGet = new Get.AccessGet(access);
+
+ assertThat(accessGet.get("tag", defaultVal, true), is("value"));
+ output = outStream.toString().split(" ", 2)[1];
+ assertThat(output, is("INIT [cadi] tag is set to value\n"));
+
+ outStream.reset();
+
+ assertThat(accessGet.get("not a real tag", defaultVal, true), is(defaultVal));
+ output = outStream.toString().split(" ", 2)[1];
+ assertThat(output, is("INIT [cadi] not a real tag is set to " + defaultVal + "\n"));
+
+ outStream.reset();
+
+ assertThat(accessGet.get("not a real tag", null, true), is(nullValue()));
+ output = outStream.toString().split(" ", 2)[1];
+ assertThat(output, is("INIT [cadi] not a real tag is not set\n"));
+
+ outStream.reset();
+
+ assertThat(accessGet.get("tag", defaultVal, false), is("value"));
+ assertThat(outStream.toString(), is(""));
+ }
+
+ public class TestBean implements java.io.Serializable {
+
+ private static final long serialVersionUID = 1L;
+ private String property1 = null;
+ private String property2 = null;
+ @SuppressWarnings("unused")
+ private String thrower = null;
+
+ public TestBean() { }
+ public String getProperty1() { return property1; }
+ public void setProperty1(final String value) { this.property1 = value; }
+ public String getProperty2() { return property2; }
+ public void setProperty2(final String value) { this.property2 = value; }
+ public String getThrower() throws Exception { throw new Exception(); }
+ public void setThrower(final String value) { this.thrower = value; }
+
+ }
+}
diff --git a/cadi/core/src/test/java/org/onap/aaf/cadi/test/config/JU_GetAccess.java b/cadi/core/src/test/java/org/onap/aaf/cadi/test/config/JU_GetAccess.java
new file mode 100644
index 00000000..5acd39f9
--- /dev/null
+++ b/cadi/core/src/test/java/org/onap/aaf/cadi/test/config/JU_GetAccess.java
@@ -0,0 +1,107 @@
+/*******************************************************************************
+ * * org.onap.aaf
+ * * ===========================================================================
+ * * Copyright © 2017 AT&T Intellectual Property. All rights reserved.
+ * * ===========================================================================
+ * * Licensed 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.
+ * * ============LICENSE_END====================================================
+ * *
+ * *
+ ******************************************************************************/
+
+package org.onap.aaf.cadi.test.config;
+
+import static org.junit.Assert.*;
+import static org.hamcrest.CoreMatchers.*;
+import org.junit.*;
+
+import java.io.ByteArrayOutputStream;
+import java.io.File;
+import java.io.IOException;
+import java.io.PrintStream;
+
+import org.onap.aaf.cadi.PropAccess;
+import org.onap.aaf.cadi.config.Get;
+import org.onap.aaf.cadi.config.GetAccess;
+
+public class JU_GetAccess {
+
+ private String defaultVal = "some default value";
+
+ private ByteArrayOutputStream outStream;
+
+ private PropAccess access;
+ private Get.AccessGet accessGet;
+ private File file;
+ private String filePath;
+
+ @Before
+ public void setup() throws IOException {
+ outStream = new ByteArrayOutputStream();
+ System.setOut(new PrintStream(outStream));
+
+ file = File.createTempFile("GetAccess_test", "");
+ filePath = file.getAbsolutePath();
+
+ access = new PropAccess();
+ access.setProperty("cadi_prop_files", filePath);
+ accessGet = new Get.AccessGet(access);
+
+ }
+
+ @After
+ public void tearDown() {
+ System.setOut(System.out);
+
+ file.delete();
+ }
+
+ @Test
+ public void constructorTest() {
+ String output;
+
+ @SuppressWarnings("unused")
+ GetAccess getAccess = new GetAccess(accessGet);
+ String[] lines = outStream.toString().split("\n");
+ assertThat(lines.length, is(2));
+ output = lines[0].split(" ", 2)[1];
+ assertThat(output, is("INIT [cadi] cadi_prop_files is set to " + filePath));
+ output = lines[1].split(" ", 2)[1];
+ assertThat(output, is("INIT [cadi] Loading CADI Properties from " + filePath));
+ }
+
+ @Test
+ public void getPropertyTest1() {
+ GetAccess getAccess = new GetAccess(accessGet);
+
+ getAccess.setProperty("tag", "value");
+ assertThat(getAccess.getProperty("tag", defaultVal), is("value"));
+ assertThat(getAccess.getProperty("not_a_tag", defaultVal), is(defaultVal));
+ }
+
+ @Test
+ public void getPropertyTest2() {
+ GetAccess getAccess = new GetAccess(accessGet);
+
+ getAccess.setProperty("tag", "value");
+ assertThat(getAccess.getProperty("tag"), is("value"));
+ assertThat(getAccess.getProperty("not_a_tag"), is(nullValue()));
+ }
+
+ @Test
+ public void getTest() {
+ GetAccess getAccess = new GetAccess(accessGet);
+ assertThat((Get.AccessGet)getAccess.get(), is(accessGet));
+ }
+
+}
diff --git a/cadi/core/src/test/java/org/onap/aaf/cadi/test/util/JU_Chmod.java b/cadi/core/src/test/java/org/onap/aaf/cadi/test/util/JU_Chmod.java
new file mode 100644
index 00000000..215980ff
--- /dev/null
+++ b/cadi/core/src/test/java/org/onap/aaf/cadi/test/util/JU_Chmod.java
@@ -0,0 +1,75 @@
+/*******************************************************************************
+ * * org.onap.aaf
+ * * ===========================================================================
+ * * Copyright © 2017 AT&T Intellectual Property. All rights reserved.
+ * * ===========================================================================
+ * * Licensed 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.
+ * * ============LICENSE_END====================================================
+ * *
+ * *
+ ******************************************************************************/
+package org.onap.aaf.cadi.test.util;
+
+import static org.junit.Assert.*;
+
+import java.io.File;
+import java.io.IOException;
+import java.nio.file.Files;
+import java.nio.file.Paths;
+import java.nio.file.attribute.PosixFilePermission;
+import java.nio.file.attribute.PosixFilePermissions;
+import java.util.Set;
+
+import static org.hamcrest.CoreMatchers.*;
+import org.junit.*;
+
+import org.onap.aaf.cadi.util.Chmod;
+
+public class JU_Chmod {
+
+ private File file;
+ private String filePath;
+
+ @Before
+ public void setup() throws IOException {
+ file = File.createTempFile("chmod_test", "");
+ filePath = file.getAbsolutePath();
+ }
+
+ @After
+ public void tearDown() {
+ file.delete();
+ }
+
+ @Test
+ public void to755Test() throws IOException {
+ Chmod.to755.chmod(file);
+ Set<PosixFilePermission> set = Files.getPosixFilePermissions(Paths.get(filePath));
+ assertThat(PosixFilePermissions.toString(set), is("rwxr-xr-x"));
+ }
+
+ @Test
+ public void to644Test() throws IOException {
+ Chmod.to644.chmod(file);
+ Set<PosixFilePermission> set = Files.getPosixFilePermissions(Paths.get(filePath));
+ assertThat(PosixFilePermissions.toString(set), is("rw-r--r--"));
+ }
+
+ @Test
+ public void to400Test() throws IOException {
+ Chmod.to400.chmod(file);
+ Set<PosixFilePermission> set = Files.getPosixFilePermissions(Paths.get(filePath));
+ assertThat(PosixFilePermissions.toString(set), is("r--------"));
+ }
+
+}
diff --git a/cadi/core/src/test/java/org/onap/aaf/cadi/test/util/JU_Pool.java b/cadi/core/src/test/java/org/onap/aaf/cadi/test/util/JU_Pool.java
new file mode 100644
index 00000000..f4703bb8
--- /dev/null
+++ b/cadi/core/src/test/java/org/onap/aaf/cadi/test/util/JU_Pool.java
@@ -0,0 +1,144 @@
+/*******************************************************************************
+ * * org.onap.aaf
+ * * ===========================================================================
+ * * Copyright © 2017 AT&T Intellectual Property. All rights reserved.
+ * * ===========================================================================
+ * * Licensed 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.
+ * * ============LICENSE_END====================================================
+ * *
+ * *
+ ******************************************************************************/
+package org.onap.aaf.cadi.test.util;
+
+import static org.junit.Assert.*;
+
+import java.util.ArrayList;
+import java.util.List;
+
+import static org.hamcrest.CoreMatchers.*;
+import org.junit.*;
+import org.onap.aaf.cadi.CadiException;
+import org.onap.aaf.cadi.util.Pool;
+import org.onap.aaf.cadi.util.Pool.*;
+
+public class JU_Pool {
+
+ private StringBuilder sb = new StringBuilder();
+
+ private class IntegerCreator implements Creator<Integer> {
+ private int current = 0;
+ @Override public Integer create() { return current++; }
+ @Override public void destroy(Integer t) { t = 0; }
+ @Override public boolean isValid(Integer t) { return (t & 0x1) == 0; }
+ @Override public void reuse(Integer t) { }
+ }
+
+ private class CustomLogger implements Log {
+ @Override
+ public void log(Object ... o) {
+ for (Object item : o) {
+ sb.append(item.toString());
+ }
+ }
+ }
+
+ @Test
+ public void getTest() throws CadiException {
+ Pool<Integer> intPool = new Pool<Integer>(new IntegerCreator());
+
+ List<Pooled<Integer>> gotten = new ArrayList<Pooled<Integer>>();
+ for (int i = 0; i < 10; i++) {
+ gotten.add(intPool.get());
+ assertThat(gotten.get(i).content, is(i));
+ }
+
+ gotten.get(9).done();
+ gotten.set(9, intPool.get());
+ assertThat(gotten.get(9).content, is(9));
+
+ for (int i = 0; i < 10; i++) {
+ gotten.get(i).done();
+ }
+
+ for (int i = 0; i < 10; i++) {
+ gotten.set(i, intPool.get());
+ if (i < 5) {
+ assertThat(gotten.get(i).content, is(i));
+ } else {
+ assertThat(gotten.get(i).content, is(i + 5));
+ }
+ }
+
+ for (int i = 0; i < 10; i++) {
+ gotten.get(i).toss();
+ // Coverage calls
+ gotten.get(i).toss();
+ gotten.get(i).done();
+
+ // only set some objects to null -> this is for the finalize coverage test
+ if (i < 5) {
+ gotten.set(i, null);
+ }
+ }
+
+ // Coverage of finalize()
+ System.gc();
+ }
+
+ @Test
+ public void bulkTest() throws CadiException {
+ Pool<Integer> intPool = new Pool<Integer>(new IntegerCreator());
+
+ intPool.prime(10);
+ // Remove all of the invalid items (in this case, odd numbers)
+ assertFalse(intPool.validate());
+
+ // Make sure we got them all
+ assertTrue(intPool.validate());
+
+ // Get an item from the pool
+ Pooled<Integer> gotten = intPool.get();
+ assertThat(gotten.content, is(0));
+
+ // finalize that item, then check the next one to make sure we actually purged the odd numbers
+ gotten = intPool.get();
+ assertThat(gotten.content, is(2));
+
+ intPool.drain();
+
+ }
+
+
+ @Test
+ public void setMaxTest() {
+ Pool<Integer> intPool = new Pool<Integer>(new IntegerCreator());
+ intPool.setMaxRange(10);
+ assertThat(intPool.getMaxRange(), is(10));
+ intPool.setMaxRange(-10);
+ assertThat(intPool.getMaxRange(), is(0));
+ }
+
+ @Test
+ public void loggingTest() {
+ Pool<Integer> intPool = new Pool<Integer>(new IntegerCreator());
+
+ // Log to Log.NULL for coverage
+ intPool.log("Test log output");
+
+ intPool.setLogger(new CustomLogger());
+ intPool.log("Test log output");
+
+ assertThat(sb.toString(), is("Test log output"));
+ }
+
+}
diff --git a/cadi/core/src/test/java/org/onap/aaf/cadi/test/util/JU_SubStandardConsole.java b/cadi/core/src/test/java/org/onap/aaf/cadi/test/util/JU_SubStandardConsole.java
new file mode 100644
index 00000000..9e6a175c
--- /dev/null
+++ b/cadi/core/src/test/java/org/onap/aaf/cadi/test/util/JU_SubStandardConsole.java
@@ -0,0 +1,124 @@
+/*******************************************************************************
+ * * org.onap.aaf
+ * * ===========================================================================
+ * * Copyright © 2017 AT&T Intellectual Property. All rights reserved.
+ * * ===========================================================================
+ * * Licensed 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.
+ * * ============LICENSE_END====================================================
+ * *
+ * *
+ ******************************************************************************/
+package org.onap.aaf.cadi.test.util;
+
+import static org.junit.Assert.*;
+import static org.hamcrest.CoreMatchers.*;
+import static org.mockito.Mockito.*;
+import org.junit.*;
+
+import java.io.BufferedReader;
+import java.io.ByteArrayInputStream;
+import java.io.ByteArrayOutputStream;
+import java.io.IOException;
+import java.io.PrintStream;
+import java.lang.reflect.Field;
+
+import org.onap.aaf.cadi.util.SubStandardConsole;
+
+public class JU_SubStandardConsole {
+
+ private String inputString = "An input string";
+ private ByteArrayOutputStream outStream;
+ private ByteArrayOutputStream errStream;
+
+ @Before
+ public void setup() {
+ outStream = new ByteArrayOutputStream();
+ errStream = new ByteArrayOutputStream();
+ System.setOut(new PrintStream(outStream));
+ System.setErr(new PrintStream(errStream));
+ }
+
+ @After
+ public void tearDown() {
+ System.setOut(System.out);
+ System.setErr(System.err);
+ }
+
+ @Test
+ public void readLineTest() {
+ byte[] input = inputString.getBytes();
+ System.setIn(new ByteArrayInputStream(input));
+ SubStandardConsole ssc = new SubStandardConsole();
+ String output = ssc.readLine("%s\n", ">>> ");
+ assertThat(output, is(inputString));
+ assertThat(outStream.toString(), is(">>> \n"));
+ }
+
+ @Test
+ public void readLineTest2() {
+ byte[] input = inputString.getBytes();
+ System.setIn(new ByteArrayInputStream(input));
+ SubStandardConsole ssc = new SubStandardConsole();
+ String output = ssc.readLine("%s %s\n", ">>> ", "Another argument for coverage");
+ assertThat(output, is(inputString));
+ }
+
+ @Test
+ public void readLineTest3() {
+ byte[] input = "\n".getBytes();
+ System.setIn(new ByteArrayInputStream(input));
+ SubStandardConsole ssc = new SubStandardConsole();
+ String output = ssc.readLine("%s\n", ">>> ");
+ assertThat(output, is(">>> "));
+ assertThat(outStream.toString(), is(">>> \n"));
+ }
+
+ @Test
+ public void readPasswordTest() {
+ byte[] input = inputString.getBytes();
+ System.setIn(new ByteArrayInputStream(input));
+ SubStandardConsole ssc = new SubStandardConsole();
+ char[] output = ssc.readPassword("%s\n", ">>> ");
+ System.out.println(output);
+ assertThat(output, is(inputString.toCharArray()));
+ assertThat(outStream.toString(), is(">>> \nAn input string\n"));
+ }
+
+ @Test
+ public void printfTest() {
+ byte[] input = inputString.getBytes();
+ System.setIn(new ByteArrayInputStream(input));
+ SubStandardConsole ssc = new SubStandardConsole();
+ ssc.printf("%s", "A format specifier");
+ assertThat(outStream.toString(), is("A format specifier"));
+ }
+
+ @Test
+ public void throwsTest() throws IOException, NoSuchFieldException, SecurityException, IllegalArgumentException, IllegalAccessException {
+ BufferedReader brMock = mock(BufferedReader.class);
+ when(brMock.readLine()).thenThrow(new IOException());
+
+ SubStandardConsole ssc = new SubStandardConsole();
+
+ Field brField = SubStandardConsole.class.getDeclaredField("br");
+ brField.setAccessible(true);
+ brField.set(ssc, brMock);
+
+ assertThat(ssc.readLine(""), is(""));
+ assertThat(errStream.toString(), is("uh oh...\n"));
+ errStream.reset();
+ assertThat(ssc.readPassword("").length, is(0));
+ assertThat(errStream.toString(), is("uh oh...\n"));
+ }
+
+}