[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());
+    }
+
+}