CORD Subscriber GUI - Added levels OFF, G, and NONE to UrlFilterFunction.Level enum.
- added some unit tests for UrlFilterFunction.

Change-Id: Ic241818e260b84541665031e659c87f61f8899cf
diff --git a/apps/demo/cord-gui/src/main/java/org/onosproject/cord/gui/model/Bundle.java b/apps/demo/cord-gui/src/main/java/org/onosproject/cord/gui/model/Bundle.java
index 622d0e3..c51cc84 100644
--- a/apps/demo/cord-gui/src/main/java/org/onosproject/cord/gui/model/Bundle.java
+++ b/apps/demo/cord-gui/src/main/java/org/onosproject/cord/gui/model/Bundle.java
@@ -72,7 +72,7 @@
         XosFunction func;
         switch (xfd) {
             case URL_FILTER:
-                func = new UrlFilterFunction(xfd);
+                func = new UrlFilterFunction();
                 break;
 
             default:
diff --git a/apps/demo/cord-gui/src/main/java/org/onosproject/cord/gui/model/UrlFilterFunction.java b/apps/demo/cord-gui/src/main/java/org/onosproject/cord/gui/model/UrlFilterFunction.java
index a2e2f2c..863681c 100644
--- a/apps/demo/cord-gui/src/main/java/org/onosproject/cord/gui/model/UrlFilterFunction.java
+++ b/apps/demo/cord-gui/src/main/java/org/onosproject/cord/gui/model/UrlFilterFunction.java
@@ -29,17 +29,19 @@
     private static final String LEVEL = "level";
 
     /**
-     * Denotes the URL filtering levels available.
+     * Denotes the URL filtering levels available. From most restrictive
+     * to least restrictive. Note: <em>OFF</em> denies everything;
+     * <em>NONE</em> allows everything.
      */
-    public enum Level { PG, PG_13, R }
+    public enum Level { OFF, G, PG, PG_13, R, NONE }
 
     /**
      * The default URL filtering level
      */
-    public static final Level DEFAULT_LEVEL = Level.PG;
+    public static final Level DEFAULT_LEVEL = Level.G;
 
-    public UrlFilterFunction(XosFunctionDescriptor xfd) {
-        super(xfd);
+    public UrlFilterFunction() {
+        super(XosFunctionDescriptor.URL_FILTER);
     }
 
     @Override
diff --git a/apps/demo/cord-gui/src/main/java/org/onosproject/cord/gui/model/XosFunctionFactory.java b/apps/demo/cord-gui/src/main/java/org/onosproject/cord/gui/model/XosFunctionFactory.java
index 991b72b..a91dbfb 100644
--- a/apps/demo/cord-gui/src/main/java/org/onosproject/cord/gui/model/XosFunctionFactory.java
+++ b/apps/demo/cord-gui/src/main/java/org/onosproject/cord/gui/model/XosFunctionFactory.java
@@ -17,9 +17,6 @@
     private static final String LEVEL = "level";
     private static final String LEVELS = "levels";
 
-    private static final UrlFilterFunction.Level DEFAULT_FILTER_LEVEL =
-        UrlFilterFunction.Level.PG;
-
 
     // no instantiation
     private XosFunctionFactory() {}
@@ -91,7 +88,7 @@
         @Override
         ObjectNode params() {
             ObjectNode result = objectNode();
-            result.put(LEVEL, DEFAULT_FILTER_LEVEL.name());
+            result.put(LEVEL, UrlFilterFunction.DEFAULT_LEVEL.name());
             ArrayNode levels = arrayNode();
             for (UrlFilterFunction.Level lvl: UrlFilterFunction.Level.values()) {
                 levels.add(lvl.name());
diff --git a/apps/demo/cord-gui/src/test/org/onosproject/cord/gui/CoreModelCacheTest.java b/apps/demo/cord-gui/src/test/org/onosproject/cord/gui/CoreModelCacheTest.java
index 373f2e4..746d145 100644
--- a/apps/demo/cord-gui/src/test/org/onosproject/cord/gui/CoreModelCacheTest.java
+++ b/apps/demo/cord-gui/src/test/org/onosproject/cord/gui/CoreModelCacheTest.java
@@ -95,7 +95,7 @@
     public void setNewLevel() {
         cache.setCurrentBundle("family");
         JsonNode node = fromString(cache.jsonUsers());
-        assertEquals("wrong level", "PG", getMomsLevel(node));
+        assertEquals("wrong level", "G", getMomsLevel(node));
 
         cache.applyPerUserParam("1", "url_filter", "level", "R");
 
@@ -191,11 +191,14 @@
             "                \"name\": \"Parental Control\",\n" +
             "                \"desc\": \"Variable levels of URL filtering.\",\n" +
             "                \"params\": {\n" +
-            "                    \"level\": \"PG\",\n" +
+            "                    \"level\": \"G\",\n" +
             "                    \"levels\": [\n" +
+            "                        \"OFF\",\n" +
+            "                        \"G\",\n" +
             "                        \"PG\",\n" +
             "                        \"PG_13\",\n" +
-            "                        \"R\"\n" +
+            "                        \"R\",\n" +
+            "                        \"NONE\"\n" +
             "                    ]\n" +
             "                }\n" +
             "            }\n" +
@@ -252,7 +255,7 @@
             "      \"mac\": \"010203040506\",\n" +
             "      \"profile\": {\n" +
             "        \"url_filter\": {\n" +
-            "          \"level\": \"PG\"\n" +
+            "          \"level\": \"G\"\n" +
             "        }\n" +
             "      }\n" +
             "    },\n" +
@@ -262,7 +265,7 @@
             "      \"mac\": \"010203040507\",\n" +
             "      \"profile\": {\n" +
             "        \"url_filter\": {\n" +
-            "          \"level\": \"PG\"\n" +
+            "          \"level\": \"G\"\n" +
             "        }\n" +
             "      }\n" +
             "    },\n" +
@@ -272,7 +275,7 @@
             "      \"mac\": \"010203040508\",\n" +
             "      \"profile\": {\n" +
             "        \"url_filter\": {\n" +
-            "          \"level\": \"PG\"\n" +
+            "          \"level\": \"G\"\n" +
             "        }\n" +
             "      }\n" +
             "    },\n" +
@@ -282,7 +285,7 @@
             "      \"mac\": \"010203040509\",\n" +
             "      \"profile\": {\n" +
             "        \"url_filter\": {\n" +
-            "          \"level\": \"PG\"\n" +
+            "          \"level\": \"G\"\n" +
             "        }\n" +
             "      }\n" +
             "    }\n" +
diff --git a/apps/demo/cord-gui/src/test/org/onosproject/cord/gui/model/UrlFilterFunctionTest.java b/apps/demo/cord-gui/src/test/org/onosproject/cord/gui/model/UrlFilterFunctionTest.java
new file mode 100644
index 0000000..6bc75de
--- /dev/null
+++ b/apps/demo/cord-gui/src/test/org/onosproject/cord/gui/model/UrlFilterFunctionTest.java
@@ -0,0 +1,74 @@
+/*
+ * Copyright 2015 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.cord.gui.model;
+
+import org.junit.Before;
+import org.junit.Test;
+
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertTrue;
+
+/**
+ * Unit tests for {@link UrlFilterFunction}.
+ */
+public class UrlFilterFunctionTest {
+
+    private SubscriberUser user = new SubscriberUser(1, "foo", "fooMAC");
+    private UrlFilterFunction fn;
+
+    @Before
+    public void setUp() {
+        fn = new UrlFilterFunction();
+    }
+
+    @Test
+    public void basic() {
+        assertEquals("wrong enum const count",
+                     6, UrlFilterFunction.Level.values().length);
+    }
+
+    @Test
+    public void memento() {
+        XosFunction.Memento memo = fn.createMemento();
+        assertTrue("wrong class", memo instanceof UrlFilterFunction.UrlFilterMemento);
+        UrlFilterFunction.UrlFilterMemento umemo =
+                (UrlFilterFunction.UrlFilterMemento) memo;
+        assertEquals("wrong default level", "G", umemo.level());
+    }
+
+    @Test
+    public void memoNewLevel() {
+        XosFunction.Memento memo = fn.createMemento();
+        assertTrue("wrong class", memo instanceof UrlFilterFunction.UrlFilterMemento);
+        UrlFilterFunction.UrlFilterMemento umemo =
+                (UrlFilterFunction.UrlFilterMemento) memo;
+        assertEquals("wrong default level", "G", umemo.level());
+        umemo.setLevel(UrlFilterFunction.Level.R);
+        assertEquals("wrong new level", "R", umemo.level());
+    }
+
+    @Test
+    public void applyMemo() {
+        UrlFilterFunction.UrlFilterMemento memo =
+                (UrlFilterFunction.UrlFilterMemento) fn.createMemento();
+        memo.setLevel(UrlFilterFunction.Level.PG_13);
+        user.setMemento(XosFunctionDescriptor.URL_FILTER, memo);
+
+        assertEquals("wrong URL suffix", "url_filter/PG_13", fn.xosUrlApply(user));
+    }
+}