/**
* Copyright 2010 JBoss Inc
*
* 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.drools.guvnor.server.files;
import java.io.BufferedWriter;
import java.io.ByteArrayInputStream;
import java.io.ByteArrayOutputStream;
import java.io.File;
import java.io.FileWriter;
import java.io.Writer;
import java.util.HashMap;
import java.util.Map;
import junit.framework.TestCase;
import org.apache.commons.httpclient.Header;
import org.apache.commons.httpclient.HttpClient;
import org.apache.commons.httpclient.methods.HeadMethod;
import org.drools.KnowledgeBase;
import org.drools.agent.KnowledgeAgent;
import org.drools.agent.KnowledgeAgentFactory;
import org.drools.core.util.DroolsStreamUtils;
import org.drools.core.util.FileManager;
import org.drools.definition.KnowledgePackage;
import org.drools.guvnor.client.common.AssetFormats;
import org.drools.guvnor.server.ServiceImplementation;
import org.drools.guvnor.server.util.TestEnvironmentSessionHelper;
import org.drools.io.ResourceChangeScannerConfiguration;
import org.drools.io.ResourceFactory;
import org.drools.repository.AssetItem;
import org.drools.repository.PackageItem;
import org.drools.repository.RulesRepository;
import org.drools.util.codec.Base64;
import org.mortbay.jetty.Server;
import org.mortbay.jetty.servlet.Context;
import org.mortbay.jetty.servlet.ServletHolder;
public class PackageDeploymentServletTest extends TestCase {
public void FIXMEtestLoadingRules() throws Exception {
RulesRepository repo = new RulesRepository( TestEnvironmentSessionHelper.getSession( true ) );
ServiceImplementation impl = new ServiceImplementation();
impl.repository = repo;
PackageItem pkg = repo.createPackage("testPDSGetPackage", "");
AssetItem header = pkg.addAsset("drools", "");
header.updateFormat("package");
header.updateContent("import org.drools.SampleFact\n global org.drools.SampleFact sf");
header.checkin("");
AssetItem asset = pkg.addAsset("someRule", "");
asset.updateContent("when \n SampleFact() \n then \n System.err.println(42);");
asset.updateFormat(AssetFormats.DRL);
asset.checkin("");
assertNull(impl.buildPackage(pkg.getUUID(), true));
//check source
PackageDeploymentServlet serv = new PackageDeploymentServlet();
MockHTTPRequest req = new MockHTTPRequest("/package/testPDSGetPackage/LATEST.drl", null);
MockHTTPResponse res = new MockHTTPResponse();
serv.doGet(req, res);
assertNotNull(res.extractContentBytes());
String drl = res.extractContent();
assertTrue(drl.indexOf("rule") > -1);
//now binary
serv = new PackageDeploymentServlet();
req = new MockHTTPRequest("/package/testPDSGetPackage/LATEST", null);
res = new MockHTTPResponse();
serv.doGet(req, res);
assertNotNull(res.extractContentBytes());
byte[] bin = res.extractContentBytes();
byte[] bin_ = pkg.getCompiledPackageBytes();
org.drools.rule.Package o = (org.drools.rule.Package) DroolsStreamUtils.streamIn( new ByteArrayInputStream(bin) );
assertNotNull(o);
assertEquals(1, o.getRules().length);
assertEquals(1, o.getGlobals().size());
assertEquals(bin_.length, bin.length);
assertSameArray(bin_, bin);
//now some snapshots
impl.createPackageSnapshot("testPDSGetPackage", "SNAP1", false, "hey");
serv = new PackageDeploymentServlet();
req = new MockHTTPRequest("/package/testPDSGetPackage/SNAP1.drl", null);
res = new MockHTTPResponse();
serv.doGet(req, res);
assertNotNull(res.extractContentBytes());
drl = new String(res.extractContentBytes());
assertTrue(drl.indexOf("rule") > -1);
//now binary
serv = new PackageDeploymentServlet();
req = new MockHTTPRequest("/package/testPDSGetPackage/SNAP1", null);
res = new MockHTTPResponse();
serv.doGet(req, res);
assertNotNull(res.extractContentBytes());
bin = res.extractContentBytes();
bin_ = pkg.getCompiledPackageBytes();
assertEquals(bin_.length, bin.length);
//now get an individual asset source
serv = new PackageDeploymentServlet();
req = new MockHTTPRequest("/package/testPDSGetPackage/SNAP1/someRule.drl", null);
res = new MockHTTPResponse();
serv.doGet(req, res);
assertNotNull(res.extractContentBytes());
drl = res.extractContent();
System.err.println(drl);
assertTrue(drl.indexOf("rule") > -1);
assertEquals(-1, drl.indexOf("package"));
//now test HEAD
serv = new PackageDeploymentServlet();
req = new MockHTTPRequest("/package/testPDSGetPackage/LATEST", null);
req.method = "HEAD";
res = new MockHTTPResponse();
serv.doHead(req, res);
assertTrue(res.headers.size() > 0);
String lm = res.headers.get("Last-Modified");
assertNotNull(lm);
serv = new PackageDeploymentServlet();
req = new MockHTTPRequest("/package/testPDSGetPackage/LATEST", null);
req.method = "HEAD";
res = new MockHTTPResponse();
serv.doHead(req, res);
assertTrue(res.headers.size() > 0);
assertEquals(lm, res.headers.get("Last-Modified"));
serv = new PackageDeploymentServlet();
req = new MockHTTPRequest("/package/testPDSGetPackage/LATEST.drl", null);
req.method = "HEAD";
res = new MockHTTPResponse();
serv.doHead(req, res);
assertTrue(res.headers.size() > 0);
assertEquals(lm, res.headers.get("Last-Modified"));
System.out.println(lm);
//
//now lets run it in a real server !
//
Server server = new Server(9000);
Context ctx = new Context(server, "/", Context.SESSIONS);
ctx.addServlet(new ServletHolder(new PackageDeploymentServlet()), "/package/*");
server.setStopAtShutdown(true);
server.start();
ResourceFactory.getResourceChangeNotifierService().start();
ResourceFactory.getResourceChangeScannerService().start();
ResourceChangeScannerConfiguration sconf = ResourceFactory.getResourceChangeScannerService().newResourceChangeScannerConfiguration();
sconf.setProperty( "drools.resource.scanner.interval", "1" );
ResourceFactory.getResourceChangeScannerService().configure( sconf );
String xml = "";
xml += "<change-set xmlns='http://drools.org/drools-5.0/change-set'";
xml += " xmlns:xs='http://www.w3.org/2001/XMLSchema-instance'";
xml += " xs:schemaLocation='http://drools.org/drools-5.0/change-set http://anonsvn.jboss.org/repos/labs/labs/jbossrules/trunk/drools-api/src/main/resources/change-set-1.0.0.xsd' >";
xml += " <add> ";
xml += " <resource source='http://localhost:9000/package/testPDSGetPackage/LATEST.drl' type='DRL' />";
xml += " </add> ";
xml += "</change-set>";
FileManager fileManager = new FileManager();
fileManager.setUp();
File fxml = fileManager.newFile( "changeset.xml" );
Writer output = new BufferedWriter( new FileWriter( fxml ) );
output.write( xml );
output.close();
KnowledgeAgent ag = KnowledgeAgentFactory.newKnowledgeAgent("fii", KnowledgeAgentFactory.newKnowledgeAgentConfiguration());
ag.applyChangeSet( ResourceFactory.newUrlResource( fxml.toURI().toURL() ) );
KnowledgeBase kb = ag.getKnowledgeBase();
assertEquals(1, kb.getKnowledgePackages().size());
KnowledgePackage kp = kb.getKnowledgePackages().iterator().next();
assertTrue(kb.getKnowledgePackages().size() > 0);
assertEquals(1, kp.getRules().size());
//check the HEAD method
HttpClient client = new HttpClient();
HeadMethod hm = new HeadMethod("http://localhost:9000/package/testPDSGetPackage/LATEST.drl");
client.executeMethod(hm);
Header lastMod = hm.getResponseHeader("lastModified");
Thread.sleep(50);
long now = System.currentTimeMillis();
long before = Long.parseLong(lastMod.getValue());
assertTrue(before < now);
//now lets add a rule
asset = pkg.addAsset("someRule2", "");
asset.updateContent("when \n SampleFact() \n then \n System.err.println(43);");
asset.updateFormat(AssetFormats.DRL);
asset.checkin("");
assertNull(impl.buildPackage(pkg.getUUID(), true));
Thread.sleep(3000);
kb = ag.getKnowledgeBase();
assertEquals(1, kb.getKnowledgePackages().size());
kp = kb.getKnowledgePackages().iterator().next();
if (kp.getRules().size() != 2) {
Thread.sleep(2000);
kb = ag.getKnowledgeBase();
assertEquals(1, kb.getKnowledgePackages().size());
kp = kb.getKnowledgePackages().iterator().next();
}
if (kp.getRules().size() != 2) {
Thread.sleep(2000);
kb = ag.getKnowledgeBase();
assertEquals(1, kb.getKnowledgePackages().size());
kp = kb.getKnowledgePackages().iterator().next();
}
assertEquals(2, kp.getRules().size());
server.stop();
repo.logout();
}
public void testScenariosAndChangeSet() throws Exception {
RulesRepository repo = new RulesRepository( TestEnvironmentSessionHelper.getSession( true ) );
ServiceImplementation impl = new ServiceImplementation();
impl.repository = repo;
repo.createPackage("testScenariosURL", "");
impl.createPackageSnapshot("testScenariosURL", "SNAP1", false, "");
Base64 enc = new Base64();
String userpassword = "test" + ":" + "password";
final String encodedAuthorization = enc.encodeToString( userpassword.getBytes() );
Map<String, String> headers = new HashMap<String, String>() {
{
put("Authorization", "BASIC " + encodedAuthorization);
}
};
//now run the scenarios
PackageDeploymentServlet serv = new PackageDeploymentServlet();
MockHTTPRequest req = new MockHTTPRequest("/package/testScenariosURL/LATEST/SCENARIOS", headers);
MockHTTPResponse res = new MockHTTPResponse();
serv.doGet(req, res);
String testResult = res.extractContent();
assertNotNull(testResult);
assertEquals("No test scenarios found.", testResult);
serv = new PackageDeploymentServlet();
req = new MockHTTPRequest("/package/testScenariosURL/SNAP1/SCENARIOS", headers);
res = new MockHTTPResponse();
serv.doGet(req, res);
testResult = res.extractContent();
assertNotNull(testResult);
assertEquals("No test scenarios found.", testResult);
serv = new PackageDeploymentServlet();
req = new MockHTTPRequest("/package/testScenariosURL/SNAP1/ChangeSet.xml", headers);
req.url = new StringBuffer("http://foo/ChangeSet.xml");
res = new MockHTTPResponse();
serv.doGet(req, res);
testResult = res.extractContent();
assertNotNull(testResult);
assertTrue(testResult.indexOf("<resource source='http://foo' type='PKG' />") > 0);
}
private void assertSameArray(byte[] bin_, byte[] bin) {
for (int i = 0; i < bin.length; i++) {
assertEquals(bin_[i], bin[i]);
}
}
@Override
protected void tearDown() throws Exception {
TestEnvironmentSessionHelper.shutdown();
super.tearDown();
}
}