<html>
<head>
<title>Colorized Diff</title>
</head>
<style>
.diffdiv  { border: solid 1px black;           }
.comment  { color: gray;                       }
.diff     { color: #8A2BE2;                    }
.minus3   { color: blue;                       }
.plus3    { color: maroon;                     }
.at2      { color: lime;                       }
.plus     { color: green; background: #E7E7E7; }
.minus    { color: red;   background: #D7D7D7; }
.only     { color: purple;                     }
</style>
<body>
<pre>
<span class="comment">From 510de733bd92039cff551140b7b1060b828f58de Mon Sep 17 00:00:00 2001
From: Adam Young &lt;ayoung@redhat.com&gt;
Date: Mon, 15 Mar 2010 19:23:16 -0400
Subject: [PATCH] Added unit test for default rules, and modified classes the unit test to run outside of the container.

<span class="minus3">---</span>
 .../candlepin/controller/Entitler.java             |   58 ++++++++------
 .../candlepin/policy/js/JavascriptEnforcer.java    |   84 +++++++++++--------
 proxy/src/main/resources/rules/default-rules.js    |   34 ++++++--
 .../candlepin/policy/test/DefaultRulesTest.java    |   83 +++++++++++++++++++
 4 files changed, 192 insertions(+), 67 deletions(-)
 create mode 100644 proxy/src/test/java/org/fedoraproject/candlepin/policy/test/DefaultRulesTest.java
</span><div class='diffdiv'>

<span class="diff">diff --git a/proxy/src/main/java/org/fedoraproject/candlepin/controller/Entitler.java b/proxy/src/main/java/org/fedoraproject/candlepin/controller/Entitler.java</span>
index 5f5a060..19264b3 100644
<span class="minus3">--- a/proxy/src/main/java/org/fedoraproject/candlepin/controller/Entitler.java</span>
<span class="plus3">+++ b/proxy/src/main/java/org/fedoraproject/candlepin/controller/Entitler.java</span>
<span class="at2">@@ -37,17 +37,17 @@ import java.util.Date;</span>
  * Entitler
  */
 public class Entitler {
<span class="minus">-    </span>
<span class="plus">+</span>
     private PoolCurator epCurator;
     private EntitlementCurator entitlementCurator;
     private ConsumerCurator consumerCurator;
     private Enforcer enforcer;
     private static Logger log = Logger.getLogger(Entitler.class);
<span class="minus">-    </span>
<span class="plus">+</span>
     @Inject
     protected Entitler(PoolCurator epCurator,
<span class="minus">-            EntitlementCurator entitlementCurator, ConsumerCurator consumerCurator,</span>
<span class="minus">-            Enforcer enforcer) {</span>
<span class="plus">+        EntitlementCurator entitlementCurator, ConsumerCurator consumerCurator,</span>
<span class="plus">+        Enforcer enforcer) {</span>
         this.epCurator = epCurator;
         this.entitlementCurator = entitlementCurator;
         this.consumerCurator = consumerCurator;
<span class="at2">@@ -60,39 +60,47 @@ public class Entitler {</span>
      * If the entitlement cannot be granted, null will be returned.
      * 
      * TODO: Throw exception if entitlement not granted. Report why.
<span class="minus">-     *</span>
<span class="minus">-     * @param consumer consumer requesting to be entitled</span>
<span class="minus">-     * @param product product to be entitled.</span>
<span class="plus">+     * </span>
<span class="plus">+     * @param consumer</span>
<span class="plus">+     *            consumer requesting to be entitled</span>
<span class="plus">+     * @param product</span>
<span class="plus">+     *            product to be entitled.</span>
      * @return Entitlement
      */
     //
<span class="minus">-    // NOTE: after calling this method both entitlement pool and consumer parameters</span>
<span class="minus">-    //       will most certainly be stale. beware!</span>
<span class="plus">+    // NOTE: after calling this method both entitlement pool and consumer</span>
<span class="plus">+    // parameters</span>
<span class="plus">+    // will most certainly be stale. beware!</span>
     //
     @Transactional
     public Entitlement entitle(Consumer consumer, Product product) {
         Owner owner = consumer.getOwner();
<span class="minus">-        </span>
<span class="minus">-        // TODO: Don't assume we use the first pool here, once rules have support for </span>
<span class="minus">-        // specifying the pool to use. </span>
 
<span class="minus">-        Pool pool = epCurator.listByOwnerAndProduct(owner, product).get(0);</span>
<span class="plus">+        // TODO: Don't assume we use the first pool here, once rules have</span>
<span class="plus">+        // support for</span>
<span class="plus">+        // specifying the pool to use.</span>
<span class="plus">+</span>
<span class="plus">+        Pool pool = enforcer.selectBestPool(consumer, product.getId(),</span>
<span class="plus">+            epCurator.listByOwnerAndProduct(owner, product));</span>
         if (pool == null) {
<span class="minus">-            throw new RuntimeException("No entitlements for product: " + product.getName());</span>
<span class="plus">+            throw new RuntimeException("No entitlements for product: " +</span>
<span class="plus">+                product.getName());</span>
         }
<span class="minus">-        </span>
<span class="plus">+</span>
         return addEntitlement(consumer, pool);
     }
 
     /**
      * Request an entitlement by pool..
<span class="minus">-     *</span>
<span class="plus">+     * </span>
      * If the entitlement cannot be granted, null will be returned.
<span class="minus">-     *</span>
<span class="plus">+     * </span>
      * TODO: Throw exception if entitlement not granted. Report why.
<span class="minus">-     *</span>
<span class="minus">-     * @param consumer consumer requesting to be entitled</span>
<span class="minus">-     * @param pool entitlement pool to consume from</span>
<span class="plus">+     * </span>
<span class="plus">+     * @param consumer</span>
<span class="plus">+     *            consumer requesting to be entitled</span>
<span class="plus">+     * @param pool</span>
<span class="plus">+     *            entitlement pool to consume from</span>
      * @return Entitlement
      */
     @Transactional
<span class="at2">@@ -100,13 +108,13 @@ public class Entitler {</span>
         return addEntitlement(consumer, pool);
     }
 
<span class="minus">-</span>
     private Entitlement addEntitlement(Consumer consumer, Pool pool) {
         PreEntHelper preHelper = enforcer.pre(consumer, pool);
         ValidationResult result = preHelper.getResult();
<span class="minus">-        </span>
<span class="plus">+</span>
         if (!result.isSuccessful()) {
<span class="minus">-            log.warn("Entitlement not granted: " + result.getErrors().toString());</span>
<span class="plus">+            log.warn("Entitlement not granted: " +</span>
<span class="plus">+                result.getErrors().toString());</span>
             return null;
         }
 
<span class="at2">@@ -122,7 +130,7 @@ public class Entitler {</span>
         }
 
         enforcer.post(e);
<span class="minus">-        </span>
<span class="plus">+</span>
         entitlementCurator.create(e);
         consumerCurator.update(consumer);
         epCurator.merge(pool);
<span class="at2">@@ -130,7 +138,7 @@ public class Entitler {</span>
         return e;
     }
 
<span class="minus">-    // TODO:  Does the enforcer have any rules around removing entitlements?</span>
<span class="plus">+    // TODO: Does the enforcer have any rules around removing entitlements?</span>
     @Transactional
     public void revokeEntitlement(Entitlement entitlement) {
         if (!entitlement.isFree()) {</div>
<div class='diffdiv'>

<span class="diff">diff --git a/proxy/src/main/java/org/fedoraproject/candlepin/policy/js/JavascriptEnforcer.java b/proxy/src/main/java/org/fedoraproject/candlepin/policy/js/JavascriptEnforcer.java</span>
index a00e0a3..123ee74 100644
<span class="minus3">--- a/proxy/src/main/java/org/fedoraproject/candlepin/policy/js/JavascriptEnforcer.java</span>
<span class="plus3">+++ b/proxy/src/main/java/org/fedoraproject/candlepin/policy/js/JavascriptEnforcer.java</span>
<span class="at2">@@ -14,7 +14,6 @@</span>
  */
 package org.fedoraproject.candlepin.policy.js;
 
<span class="minus">-</span>
 import org.fedoraproject.candlepin.model.Consumer;
 import org.fedoraproject.candlepin.model.Entitlement;
 import org.fedoraproject.candlepin.model.Pool;
<span class="at2">@@ -45,7 +44,7 @@ public class JavascriptEnforcer implements Enforcer {</span>
 
     private static Logger log = Logger.getLogger(JavascriptEnforcer.class);
     private DateSource dateSource;
<span class="minus">-    private RulesCurator rulesCurator;</span>
<span class="plus">+</span>
     private ProductServiceAdapter prodAdapter;
     private PreEntHelper preHelper;
     private PostEntHelper postHelper;
<span class="at2">@@ -55,29 +54,36 @@ public class JavascriptEnforcer implements Enforcer {</span>
     private static final String PRE_PREFIX = "pre_";
     private static final String POST_PREFIX = "post_";
     private static final String SELECT_POOL_PREFIX = "select_pool_";
<span class="minus">-    private static final String GLOBAL_SELECT_POOL_FUNCTION = SELECT_POOL_PREFIX + "global";</span>
<span class="plus">+    private static final String GLOBAL_SELECT_POOL_FUNCTION = SELECT_POOL_PREFIX +</span>
<span class="plus">+        "global";</span>
     private static final String GLOBAL_PRE_FUNCTION = PRE_PREFIX + "global";
     private static final String GLOBAL_POST_FUNCTION = POST_PREFIX + "global";
 
     @Inject
<span class="minus">-    public JavascriptEnforcer(DateSource dateSource,</span>
<span class="minus">-            RulesCurator rulesCurator, PreEntHelper preHelper,</span>
<span class="minus">-            PostEntHelper postHelper, ProductServiceAdapter prodAdapter) {</span>
<span class="plus">+    public JavascriptEnforcer(DateSource dateSource, RulesCurator rulesCurator,</span>
<span class="plus">+        PreEntHelper preHelper, PostEntHelper postHelper,</span>
<span class="plus">+        ProductServiceAdapter prodAdapter) {</span>
<span class="plus">+        this(dateSource, new StringReader(rulesCurator.getRules().getRules()),</span>
<span class="plus">+            preHelper, postHelper, prodAdapter, new ScriptEngineManager()</span>
<span class="plus">+                .getEngineByName("JavaScript"));</span>
<span class="plus">+    }</span>
<span class="plus">+</span>
<span class="plus">+    @Inject</span>
<span class="plus">+    public JavascriptEnforcer(DateSource dateSource, Reader rulesReader,</span>
<span class="plus">+        PreEntHelper preHelper, PostEntHelper postHelper,</span>
<span class="plus">+        ProductServiceAdapter prodAdapter, ScriptEngine jsEngine) {</span>
         this.dateSource = dateSource;
<span class="minus">-        this.rulesCurator = rulesCurator;</span>
         this.preHelper = preHelper;
         this.postHelper = postHelper;
         this.prodAdapter = prodAdapter;
<span class="minus">-</span>
<span class="minus">-        ScriptEngineManager mgr = new ScriptEngineManager();</span>
<span class="minus">-        jsEngine = mgr.getEngineByName("JavaScript");</span>
<span class="plus">+        this.jsEngine = jsEngine;</span>
<span class="plus">+        </span>
         if (jsEngine == null) {
<span class="minus">-            throw new RuntimeException("No Javascript engine found");</span>
<span class="plus">+            throw new RuntimeException("No Javascript engine");</span>
         }
 
         try {
<span class="minus">-            Reader reader = new StringReader(this.rulesCurator.getRules().getRules());</span>
<span class="minus">-            jsEngine.eval(reader);</span>
<span class="plus">+            this.jsEngine.eval(rulesReader);</span>
         }
         catch (ScriptException ex) {
             throw new RuleParseException(ex);
<span class="at2">@@ -90,23 +96,24 @@ public class JavascriptEnforcer implements Enforcer {</span>
         runPre(preHelper, consumer, entitlementPool);
 
         if (entitlementPool.isExpired(dateSource)) {
<span class="minus">-            preHelper.getResult().addError(new ValidationError("Entitlements for " +</span>
<span class="minus">-                    entitlementPool.getProductId() +</span>
<span class="minus">-                    " expired on: " + entitlementPool.getEndDate()));</span>
<span class="plus">+            preHelper.getResult().addError(</span>
<span class="plus">+                new ValidationError("Entitlements for " +</span>
<span class="plus">+                    entitlementPool.getProductId() + " expired on: " +</span>
<span class="plus">+                    entitlementPool.getEndDate()));</span>
             return preHelper;
         }
 
         return preHelper;
     }
 
<span class="minus">-    private void runPre(PreEntHelper preHelper, Consumer consumer,</span>
<span class="minus">-            Pool pool) {</span>
<span class="plus">+    private void runPre(PreEntHelper preHelper, Consumer consumer, Pool pool) {</span>
         Invocable inv = (Invocable) jsEngine;
         String productId = pool.getProductId();
 
         // Provide objects for the script:
         jsEngine.put("consumer", new ReadOnlyConsumer(consumer));
<span class="minus">-        jsEngine.put("product", new ReadOnlyProduct(prodAdapter.getProductById(productId)));</span>
<span class="plus">+        jsEngine.put("product", new ReadOnlyProduct(prodAdapter</span>
<span class="plus">+            .getProductById(productId)));</span>
         jsEngine.put("pool", new ReadOnlyEntitlementPool(pool));
         jsEngine.put("pre", preHelper);
 
<span class="at2">@@ -151,12 +158,13 @@ public class JavascriptEnforcer implements Enforcer {</span>
 
         // Provide objects for the script:
         jsEngine.put("consumer", new ReadOnlyConsumer(c));
<span class="minus">-        jsEngine.put("product", new ReadOnlyProduct(prodAdapter.getProductById(productId)));</span>
<span class="plus">+        jsEngine.put("product", new ReadOnlyProduct(prodAdapter</span>
<span class="plus">+            .getProductById(productId)));</span>
         jsEngine.put("post", postHelper);
         jsEngine.put("entitlement", new ReadOnlyEntitlement(ent));
 
<span class="minus">-        log.debug("Running post-entitlement rules for: " + c.getUuid() + " product: " +</span>
<span class="minus">-            pool.getProductId());</span>
<span class="plus">+        log.debug("Running post-entitlement rules for: " + c.getUuid() +</span>
<span class="plus">+            " product: " + pool.getProductId());</span>
 
         try {
             inv.invokeFunction(POST_PREFIX + productId);
<span class="at2">@@ -182,13 +190,13 @@ public class JavascriptEnforcer implements Enforcer {</span>
         }
     }
 
<span class="minus">-    public Pool selectBestPool(Consumer consumer, String productId, List&lt;Pool&gt; pools) {</span>
<span class="plus">+    public Pool selectBestPool(Consumer consumer, String productId,</span>
<span class="plus">+        List&lt;Pool&gt; pools) {</span>
 
         Invocable inv = (Invocable) jsEngine;
 
         log.info("Selecting best entitlement pool for product: " + productId);
<span class="minus">-        List&lt;ReadOnlyEntitlementPool&gt; readOnlyPools =</span>
<span class="minus">-            new LinkedList&lt;ReadOnlyEntitlementPool&gt;();</span>
<span class="plus">+        List&lt;ReadOnlyEntitlementPool&gt; readOnlyPools = new LinkedList&lt;ReadOnlyEntitlementPool&gt;();</span>
         for (Pool p : pools) {
             log.info("   " + p);
             readOnlyPools.add(new ReadOnlyEntitlementPool(p));
<span class="at2">@@ -199,20 +207,23 @@ public class JavascriptEnforcer implements Enforcer {</span>
 
         ReadOnlyEntitlementPool result = null;
         try {
<span class="minus">-            result = (ReadOnlyEntitlementPool) inv.invokeFunction(</span>
<span class="minus">-                SELECT_POOL_PREFIX + productId);</span>
<span class="minus">-            log.info("Excuted javascript rule: " + SELECT_POOL_PREFIX + productId);</span>
<span class="plus">+            result = (ReadOnlyEntitlementPool) inv</span>
<span class="plus">+                .invokeFunction(SELECT_POOL_PREFIX + productId);</span>
<span class="plus">+            log.info("Excuted javascript rule: " + SELECT_POOL_PREFIX +</span>
<span class="plus">+                productId);</span>
         }
         catch (NoSuchMethodException e) {
             // No method for this product, try to find a global function, if
             // neither exists this is ok and we'll just carry on.
             try {
<span class="minus">-                result = (ReadOnlyEntitlementPool) inv.invokeFunction(</span>
<span class="plus">+                result = (ReadOnlyEntitlementPool) inv</span>
<span class="plus">+                    .invokeFunction(GLOBAL_SELECT_POOL_FUNCTION);</span>
<span class="plus">+                log.info("Excuted javascript rule: " +</span>
                     GLOBAL_SELECT_POOL_FUNCTION);
<span class="minus">-                log.info("Excuted javascript rule: " + GLOBAL_SELECT_POOL_FUNCTION);</span>
             }
             catch (NoSuchMethodException ex) {
<span class="minus">-                log.warn("No default rule found: " + GLOBAL_SELECT_POOL_FUNCTION);</span>
<span class="plus">+                log.warn("No default rule found: " +</span>
<span class="plus">+                    GLOBAL_SELECT_POOL_FUNCTION);</span>
                 log.warn("Resorting to default pool selection behavior.");
                 return selectBestPoolDefault(pools);
             }
<span class="at2">@@ -225,8 +236,8 @@ public class JavascriptEnforcer implements Enforcer {</span>
         }
 
         if (pools.size() &gt; 0 &amp;&amp; result == null) {
<span class="minus">-            throw new RuleExecutionException("Rule did not select a pool for product: " +</span>
<span class="minus">-                productId);</span>
<span class="plus">+            throw new RuleExecutionException(</span>
<span class="plus">+                "Rule did not select a pool for product: " + productId);</span>
         }
 
         for (Pool p : pools) {
<span class="at2">@@ -240,8 +251,11 @@ public class JavascriptEnforcer implements Enforcer {</span>
     }
 
     /**
<span class="minus">-     * Default behavior if no product specific and no global pool select rules exist.</span>
<span class="minus">-     * @param pools Pools to choose from.</span>
<span class="plus">+     * Default behavior if no product specific and no global pool select rules</span>
<span class="plus">+     * exist.</span>
<span class="plus">+     * </span>
<span class="plus">+     * @param pools</span>
<span class="plus">+     *            Pools to choose from.</span>
      * @return First pool in the list. (default behavior)
      */
     private Pool selectBestPoolDefault(List&lt;Pool&gt; pools) {</div>
<div class='diffdiv'>

<span class="diff">diff --git a/proxy/src/main/resources/rules/default-rules.js b/proxy/src/main/resources/rules/default-rules.js</span>
index 71de8f2..7caf73b 100644
<span class="minus3">--- a/proxy/src/main/resources/rules/default-rules.js</span>
<span class="plus3">+++ b/proxy/src/main/resources/rules/default-rules.js</span>
<span class="at2">@@ -12,7 +12,8 @@ function virtualization_common() {</span>
                 return;
         }
 
<span class="minus">-        // Host must not have any guests currently (could be changed but for simplicities sake):</span>
<span class="plus">+        // Host must not have any guests currently (could be changed but for</span>
<span class="plus">+        // simplicities sake):</span>
         if (parseInt(consumer.getFact("total_guests")) &gt; 0) {
                 pre.addError("rulefailed.host.already.has.guests");
         }
<span class="at2">@@ -36,16 +37,16 @@ function post_virtualization_host_platform() {</span>
 
 function pre_global() {
 
<span class="minus">-        // Support free entitlements for guests, if their parent has virt host or platform,</span>
<span class="plus">+        // Support free entitlements for guests, if their parent has virt host or</span>
<span class="plus">+        // platform,</span>
         // and is entitled to the product the guest is requesting:
         if (consumer.getType() == "virt_system" &amp;&amp; consumer.getParent() != null) {
<span class="minus">-                if ((consumer.getParent().hasEntitlement("virtualization_host") ||</span>
<span class="minus">-                                consumer.getParent().hasEntitlement("virtualization_host_platform")) &amp;&amp;</span>
<span class="minus">-                                consumer.getParent().hasEntitlement(product.getLabel())) {</span>
<span class="plus">+                if ((consumer.getParent().hasEntitlement("virtualization_host") || consumer</span>
<span class="plus">+                                .getParent().hasEntitlement("virtualization_host_platform"))</span>
<span class="plus">+                                &amp;&amp; consumer.getParent().hasEntitlement(product.getLabel())) {</span>
                         pre.grantFreeEntitlement();
                 }
<span class="minus">-        }</span>
<span class="minus">-        else {</span>
<span class="plus">+        } else {</span>
                 pre.checkQuantity(pool);
         }
 }
<span class="at2">@@ -53,3 +54,22 @@ function pre_global() {</span>
 function post_global() {
 
 }
<span class="plus">+</span>
<span class="plus">+function select_pool_global() {</span>
<span class="plus">+        return pools.getFirst();</span>
<span class="plus">+}</span>
<span class="plus">+</span>
<span class="plus">+function select_pool_monitoring() {</span>
<span class="plus">+        var pool;</span>
<span class="plus">+        var poolItr;</span>
<span class="plus">+</span>
<span class="plus">+        for (poolItr = pools.iterator(); poolItr.hasNext();) {</span>
<span class="plus">+                pool = poolItr.next();</span>
<span class="plus">+                if (pool.productId == "monitoring") {</span>
<span class="plus">+                        return pool;</span>
<span class="plus">+                }</span>
<span class="plus">+        }</span>
<span class="plus">+</span>
<span class="plus">+        return pools.getFirst();</span>
<span class="plus">+</span>
<span class="plus">+}</span></div>
<div class='diffdiv'>

<span class="diff">diff --git a/proxy/src/test/java/org/fedoraproject/candlepin/policy/test/DefaultRulesTest.java b/proxy/src/test/java/org/fedoraproject/candlepin/policy/test/DefaultRulesTest.java</span>
new file mode 100644
index 0000000..1af7eb8
<span class="minus3">--- /dev/null</span>
<span class="plus3">+++ b/proxy/src/test/java/org/fedoraproject/candlepin/policy/test/DefaultRulesTest.java</span>
<span class="at2">@@ -0,0 +1,83 @@</span>
<span class="plus">+/**</span>
<span class="plus">+ * Copyright (c) 2009 Red Hat, Inc.</span>
<span class="plus">+ *</span>
<span class="plus">+ * This software is licensed to you under the GNU General Public License,</span>
<span class="plus">+ * version 2 (GPLv2). There is NO WARRANTY for this software, express or</span>
<span class="plus">+ * implied, including the implied warranties of MERCHANTABILITY or FITNESS</span>
<span class="plus">+ * FOR A PARTICULAR PURPOSE. You should have received a copy of GPLv2</span>
<span class="plus">+ * along with this software; if not, see</span>
<span class="plus">+ * http://www.gnu.org/licenses/old-licenses/gpl-2.0.txt.</span>
<span class="plus">+ *</span>
<span class="plus">+ * Red Hat trademarks are not licensed under GPLv2. No permission is</span>
<span class="plus">+ * granted to use or replicate Red Hat trademarks that are incorporated</span>
<span class="plus">+ * in this software or its documentation.</span>
<span class="plus">+ */</span>
<span class="plus">+package org.fedoraproject.candlepin.policy.test;</span>
<span class="plus">+</span>
<span class="plus">+import java.io.File;</span>
<span class="plus">+import java.io.FileNotFoundException;</span>
<span class="plus">+import java.io.FileReader;</span>
<span class="plus">+import java.io.IOException;</span>
<span class="plus">+import java.io.InputStream;</span>
<span class="plus">+import java.io.InputStreamReader;</span>
<span class="plus">+import java.io.Reader;</span>
<span class="plus">+import java.net.URL;</span>
<span class="plus">+import java.util.ArrayList;</span>
<span class="plus">+import java.util.Date;</span>
<span class="plus">+import java.util.List;</span>
<span class="plus">+</span>
<span class="plus">+import javax.script.ScriptEngineManager;</span>
<span class="plus">+</span>
<span class="plus">+import junit.framework.Assert;</span>
<span class="plus">+</span>
<span class="plus">+import org.fedoraproject.candlepin.model.Consumer;</span>
<span class="plus">+import org.fedoraproject.candlepin.model.Pool;</span>
<span class="plus">+import org.fedoraproject.candlepin.model.RulesCurator;</span>
<span class="plus">+import org.fedoraproject.candlepin.policy.Enforcer;</span>
<span class="plus">+import org.fedoraproject.candlepin.policy.js.JavascriptEnforcer;</span>
<span class="plus">+import org.fedoraproject.candlepin.policy.js.PostEntHelper;</span>
<span class="plus">+import org.fedoraproject.candlepin.policy.js.PreEntHelper;</span>
<span class="plus">+import org.fedoraproject.candlepin.service.ProductServiceAdapter;</span>
<span class="plus">+import org.fedoraproject.candlepin.util.DateSource;</span>
<span class="plus">+import org.junit.Before;</span>
<span class="plus">+import org.junit.Test;</span>
<span class="plus">+</span>
<span class="plus">+import com.sun.jersey.spi.StringReader;</span>
<span class="plus">+</span>
<span class="plus">+/**</span>
<span class="plus">+ * DefaultRulesTest</span>
<span class="plus">+ */</span>
<span class="plus">+public class DefaultRulesTest {</span>
<span class="plus">+    private Enforcer enforcer;</span>
<span class="plus">+    private DateSource dateSource;</span>
<span class="plus">+    private PreEntHelper preHelper;</span>
<span class="plus">+    private PostEntHelper postHelper;</span>
<span class="plus">+    private ProductServiceAdapter prodAdapter;</span>
<span class="plus">+</span>
<span class="plus">+    @Before</span>
<span class="plus">+    public void createEnforcer() throws IOException {</span>
<span class="plus">+        // InputStream inStream = this</span>
<span class="plus">+        URL url =  this.getClass().getClassLoader().getResource("rules/default-rules.js");</span>
<span class="plus">+</span>
<span class="plus">+        InputStreamReader inputStreamReader = new InputStreamReader(url</span>
<span class="plus">+            .openStream());</span>
<span class="plus">+</span>
<span class="plus">+        enforcer = new JavascriptEnforcer(dateSource, inputStreamReader,</span>
<span class="plus">+            preHelper, postHelper, prodAdapter, new ScriptEngineManager()</span>
<span class="plus">+                .getEngineByName("JavaScript"));</span>
<span class="plus">+    }</span>
<span class="plus">+</span>
<span class="plus">+    @Test</span>
<span class="plus">+    public void runDefaultRuels() {</span>
<span class="plus">+        Consumer consumer = new Consumer();</span>
<span class="plus">+        String productId = "Shampoo";</span>
<span class="plus">+        Pool pool = new Pool();</span>
<span class="plus">+        pool.setId(new Long(0));</span>
<span class="plus">+        pool.setProductId("default");</span>
<span class="plus">+        List&lt;Pool&gt; pools = new ArrayList&lt;Pool&gt;();</span>
<span class="plus">+        pools.add(pool);</span>
<span class="plus">+        Pool selected = enforcer.selectBestPool(consumer, productId, pools);</span>
<span class="plus">+        Assert.assertNotNull(selected);</span>
<span class="plus">+    }</span>
<span class="plus">+</span>
<span class="plus">+}</span>
<span class="minus">-- </span>
1.6.6.1
</div>

</pre>
</body>
</html>