[ONOS-5907] Implementing unit test on Security-Mode ONOS
Change-Id: I1bd8e1df60ad3e5115f0a46ff9f621ec8fd82c36
diff --git a/core/security/src/test/java/org/onosproject/security/store/DistributedSecurityModeStoreTest.java b/core/security/src/test/java/org/onosproject/security/store/DistributedSecurityModeStoreTest.java
new file mode 100755
index 0000000..b4247aa
--- /dev/null
+++ b/core/security/src/test/java/org/onosproject/security/store/DistributedSecurityModeStoreTest.java
@@ -0,0 +1,238 @@
+/*
+ * Copyright 2017-present Open Networking Laboratory
+ *
+ * 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.
+ */
+
+package org.onosproject.security.store;
+
+import static java.util.concurrent.Executors.newSingleThreadExecutor;
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertNotNull;
+import static org.junit.Assert.assertNull;
+import static org.junit.Assert.assertTrue;
+import static org.onlab.util.Tools.groupedThreads;
+import static org.onosproject.security.store.SecurityModeState.*;
+import static org.slf4j.LoggerFactory.getLogger;
+
+import java.util.ArrayList;
+import java.util.HashSet;
+import java.util.List;
+import java.util.Optional;
+import java.util.Set;
+import java.util.concurrent.ConcurrentHashMap;
+import java.util.concurrent.ExecutorService;
+
+import org.junit.Before;
+import org.junit.Test;
+import org.onosproject.core.ApplicationId;
+import org.onosproject.core.ApplicationRole;
+import org.onosproject.core.DefaultApplication;
+import org.onosproject.core.DefaultApplicationId;
+import org.onosproject.core.Version;
+import org.onosproject.security.Permission;
+import org.slf4j.Logger;
+
+import com.google.common.collect.ImmutableSet;
+import com.google.common.collect.Sets;
+
+/**
+ * Unit Test on DistributedSecurityModeStore.
+ */
+public class DistributedSecurityModeStoreTest {
+
+ private final Logger log = getLogger(getClass());
+
+ private DefaultApplicationId appId;
+ private DefaultApplication app;
+
+ private Permission testPermission;
+ private Set<Permission> testPermissions;
+ private List<String> testFeatures;
+ private List<String> testRequiredApps;
+ private Set<String> testLocations;
+ private ConcurrentHashMap<String, Set<ApplicationId>> localBundleAppDirectory;
+ private ConcurrentHashMap<ApplicationId, Set<String>> localAppBundleDirectory;
+ private ConcurrentHashMap<ApplicationId, Set<Permission>> violations;
+ private SecurityInfo testSecInfo;
+ private ConcurrentHashMap<ApplicationId, SecurityInfo> states;
+
+ private ExecutorService eventHandler;
+
+ @Before
+ public void setUp() throws Exception {
+ appId = new DefaultApplicationId(1, "test");
+ testPermissions = new HashSet<Permission>();
+ testPermission = new Permission("testClass", "testName");
+ testPermissions.add(testPermission);
+ testFeatures = new ArrayList<String>();
+ testFeatures.add("testFeature");
+ testRequiredApps = new ArrayList<String>();
+ testRequiredApps.add("testRequiredApp");
+ app = new DefaultApplication(appId, Version.version(1, 1, "patch", "build"), "testTitle",
+ "testDes", "testOri", "testCT",
+ "testurl", "test", null,
+ ApplicationRole.ADMIN, testPermissions,
+ Optional.ofNullable(null), testFeatures, testRequiredApps);
+
+ testLocations = new HashSet<String>();
+ testLocations.add("locationA");
+ testLocations.add("locationB");
+
+ Set<ApplicationId> appIdSet = new HashSet<ApplicationId>();
+ appIdSet.add(appId);
+ localBundleAppDirectory = new ConcurrentHashMap<>();
+ localBundleAppDirectory.put("testLocation", appIdSet);
+ localAppBundleDirectory = new ConcurrentHashMap<>();
+ localAppBundleDirectory.put(appId, testLocations);
+
+ violations = new ConcurrentHashMap<ApplicationId, Set<Permission>>();
+ violations.put(appId, testPermissions);
+
+ testSecInfo = new SecurityInfo(testPermissions, SECURED);
+ states = new ConcurrentHashMap<ApplicationId, SecurityInfo>();
+ states.put(appId, testSecInfo);
+ }
+
+ @Test
+ public void testActivate() {
+ eventHandler = newSingleThreadExecutor(groupedThreads("onos/security/store", "event-handler", log));
+ assertNotNull(eventHandler);
+ }
+
+ @Test
+ public void testDeactivate() {
+ eventHandler = newSingleThreadExecutor(groupedThreads("onos/security/store", "event-handler", log));
+ eventHandler.shutdown();
+ assertTrue(eventHandler.isShutdown());
+ }
+
+ @Test
+ public void testGetBundleLocations() {
+ Set<String> locations = localAppBundleDirectory.get(appId);
+ assertTrue(locations.contains("locationA"));
+ }
+
+ @Test
+ public void testGetApplicationIds() {
+ Set<ApplicationId> appIds = localBundleAppDirectory.get("testLocation");
+ assertTrue(appIds.contains(appId));
+ }
+
+ @Test
+ public void testGetRequestedPermissions() {
+ Set<Permission> permissions = violations.get(appId);
+ assertTrue(permissions.contains(testPermission));
+ }
+
+ @Test
+ public void testGetGrantedPermissions() {
+ Set<Permission> permissions = states.get(appId).getPermissions();
+ assertTrue(permissions.contains(testPermission));
+ }
+
+ @Test
+ public void testRequestPermission() {
+ states.compute(appId, (id, securityInfo) -> new SecurityInfo(securityInfo.getPermissions(), POLICY_VIOLATED));
+ assertEquals(POLICY_VIOLATED, states.get(appId).getState());
+ Permission testPermissionB = new Permission("testClassB", "testNameB");
+ violations.compute(appId,
+ (k, v) -> v == null ? Sets.newHashSet(testPermissionB) : addAndGet(v, testPermissionB));
+ assertTrue(violations.get(appId).contains(testPermissionB));
+ }
+
+ private Set<Permission> addAndGet(Set<Permission> oldSet, Permission newPerm) {
+ oldSet.add(newPerm);
+ return oldSet;
+ }
+
+ @Test
+ public void testIsSecured() {
+ SecurityInfo info = states.get(appId);
+ assertEquals(SECURED, info.getState());
+ }
+
+ @Test
+ public void testReviewPolicy() {
+ assertEquals(SECURED, states.get(appId).getState());
+ states.computeIfPresent(appId, (applicationId, securityInfo) -> {
+ if (securityInfo.getState().equals(SECURED)) {
+ return new SecurityInfo(ImmutableSet.of(), REVIEWED);
+ }
+ return securityInfo;
+ });
+ assertEquals(REVIEWED, states.get(appId).getState());
+ }
+
+ @Test
+ public void testAcceptPolicy() {
+ assertEquals(SECURED, states.get(appId).getState());
+ states.compute(appId,
+ (id, securityInfo) -> {
+ switch (securityInfo.getState()) {
+ case POLICY_VIOLATED:
+ return new SecurityInfo(securityInfo.getPermissions(), SECURED);
+ case SECURED:
+ return new SecurityInfo(securityInfo.getPermissions(), POLICY_VIOLATED);
+ case INSTALLED:
+ return new SecurityInfo(securityInfo.getPermissions(), REVIEWED);
+ case REVIEWED:
+ return new SecurityInfo(securityInfo.getPermissions(), INSTALLED);
+ default:
+ return securityInfo;
+ }
+ });
+ assertEquals(POLICY_VIOLATED, states.get(appId).getState());
+ }
+
+ @Test
+ public void testRegisterApplication() {
+ states.remove(appId);
+ assertNull(states.get(appId));
+
+ for (String location : localAppBundleDirectory.get(appId)) {
+ if (!localBundleAppDirectory.containsKey(location)) {
+ localBundleAppDirectory.put(location, new HashSet<>());
+ }
+ if (!localBundleAppDirectory.get(location).contains(appId)) {
+ localBundleAppDirectory.get(location).add(appId);
+ }
+ }
+ states.put(appId, new SecurityInfo(Sets.newHashSet(), INSTALLED));
+ assertNotNull(states.get(appId));
+ assertEquals(INSTALLED, states.get(appId).getState());
+ }
+
+ @Test
+ public void testUnregisterApplication() {
+ if (localAppBundleDirectory.containsKey(appId)) {
+ for (String location : localAppBundleDirectory.get(appId)) {
+ if (localBundleAppDirectory.get(location) != null) {
+ if (localBundleAppDirectory.get(location).size() == 1) {
+ localBundleAppDirectory.remove(location);
+ } else {
+ localBundleAppDirectory.get(location).remove(appId);
+ }
+ }
+ }
+ localAppBundleDirectory.remove(appId);
+ }
+ assertNull(localAppBundleDirectory.get(appId));
+ }
+
+ @Test
+ public void testGetState() {
+ assertEquals(SECURED, states.get(appId).getState());
+ }
+
+}