<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 <ayoung@redhat.com>
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<Pool> pools) {</span>
<span class="plus">+ public Pool selectBestPool(Consumer consumer, String productId,</span>
<span class="plus">+ List<Pool> pools) {</span>
Invocable inv = (Invocable) jsEngine;
log.info("Selecting best entitlement pool for product: " + productId);
<span class="minus">- List<ReadOnlyEntitlementPool> readOnlyPools =</span>
<span class="minus">- new LinkedList<ReadOnlyEntitlementPool>();</span>
<span class="plus">+ List<ReadOnlyEntitlementPool> readOnlyPools = new LinkedList<ReadOnlyEntitlementPool>();</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() > 0 && 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<Pool> 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")) > 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" && consumer.getParent() != null) {
<span class="minus">-                if ((consumer.getParent().hasEntitlement("virtualization_host") ||</span>
<span class="minus">-                                consumer.getParent().hasEntitlement("virtualization_host_platform")) &&</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">+                                && 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<Pool> pools = new ArrayList<Pool>();</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>