/* * RHQ Management Platform * Copyright (C) 2005-2008 Red Hat, Inc. * All rights reserved. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation version 2 of the License. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. */ package org.rhq.enterprise.server.plugins.jboss.software.test; import java.io.BufferedInputStream; import java.io.BufferedReader; import java.io.InputStreamReader; import java.net.URL; import java.util.Iterator; import java.util.Set; import churchillobjects.rss4j.RssDocument; import churchillobjects.rss4j.parser.RssParser; import org.testng.Assert; import org.testng.annotations.BeforeMethod; import org.testng.annotations.Test; import org.rhq.enterprise.server.plugin.pc.content.ContentProviderPackageDetails; import org.rhq.enterprise.server.plugin.pc.content.PackageSyncReport; import org.rhq.enterprise.server.plugins.jboss.software.RssFeedParser; /** * @author Jason Dobies */ public class RssFeedParserTest { // Constants -------------------------------------------- public static final String EXAMPLE_FILE_1 = "rss-feed-example-1.txt"; public static final String EXAMPLE_FILE_2 = "rss-feed-example-2.txt"; public static final String EXAMPLE_FILE_3 = "rss-feed-example-3.txt"; // Attributes -------------------------------------------- private RssFeedParser parser = new RssFeedParser(); private RssDocument rssDocument1; private RssDocument rssDocument2; // Setup -------------------------------------------- @BeforeMethod public void loadRssDocument() throws Exception { // Example set 1 URL exampleFeedUrl = this.getClass().getClassLoader().getResource(EXAMPLE_FILE_1); assert exampleFeedUrl != null : "Could not load " + EXAMPLE_FILE_1; rssDocument1 = loadDocument(exampleFeedUrl); // Example set 2 exampleFeedUrl = this.getClass().getClassLoader().getResource(EXAMPLE_FILE_2); assert exampleFeedUrl != null : "Coult not load " + EXAMPLE_FILE_2; rssDocument2 = loadDocument(exampleFeedUrl); } // Test Cases -------------------------------------------- /** * Tests parsing into the domain model when there is no prior existing packages. * * @throws Exception if any errors are hit */ @Test public void parse() throws Exception { // Setup PackageSyncReport report = new PackageSyncReport(); assert rssDocument1 != null : "Rss Document was not read properly in set up"; // Test #1 - Initial call with no prior server knowledge parser.parseResults(rssDocument1, report, null); // Verify Set<ContentProviderPackageDetails> newPackages = report.getNewPackages(); assert newPackages.size() == 59 : "Incorrect number of cumulative patches found. Expected: 59, Found: " + newPackages.size(); assert report.getDeletedPackages().size() == 0 : "Incorrect number of deleted packages. Expected: 0, Found: " + report.getDeletedPackages().size(); assert report.getUpdatedPackages().size() == 0 : "Incorrect number of updated packages. Expected: 0, Found: " + report.getUpdatedPackages().size(); int totalNumVersions = 0; for (ContentProviderPackageDetails pkg : newPackages) { totalNumVersions += pkg.getResourceVersions().size(); Assert.assertEquals("[sha256=" + pkg.getSHA256() + "]", pkg.getKey().getVersion()); } assert totalNumVersions == 282 : "Incorrect number of total versions represented. Expected: 282, Found: " + totalNumVersions; // Test #2 - Call again using the previous results as the existing package list, simulating the server passing in // its knowledge of the package list report = new PackageSyncReport(); parser.parseResults(rssDocument1, report, newPackages); // Verify assert report.getNewPackages().size() == 0 : "New packages incorrectly reported. Expected: 0, Found: " + report.getNewPackages().size(); assert report.getDeletedPackages().size() == 0 : "Incorrect number of deleted packages. Expected: 0, Found: " + report.getDeletedPackages().size(); assert report.getUpdatedPackages().size() == 0 : "Incorrect number of updated packages. Expected: 0, Found: " + report.getUpdatedPackages().size(); // Test #3 - Use second example set to trigger a deleted package report = new PackageSyncReport(); parser.parseResults(rssDocument2, report, newPackages); assert report.getNewPackages().size() == 1 : "New packages incorrectly reported. Expected: 1, Found: " + report.getNewPackages().size(); assert report.getDeletedPackages().size() == 1 : "Incorrect number of deleted packages. Expected: 0, Found: " + report.getDeletedPackages().size(); assert report.getUpdatedPackages().size() == 0 : "Incorrect number of updated packages. Expected: 0, Found: " + report.getUpdatedPackages().size(); for (ContentProviderPackageDetails pkg : report.getNewPackages()) { Assert.assertEquals("[sha256=" + pkg.getSHA256() + "]", pkg.getKey().getVersion()); } } @Test public void testInstallInstructions() throws Exception { // Example set 3 URL exampleFeedUrl = this.getClass().getClassLoader().getResource(EXAMPLE_FILE_3); assert exampleFeedUrl != null : "Could not load " + EXAMPLE_FILE_3; // Setup PackageSyncReport report = new PackageSyncReport(); RssDocument rssDocument3 = loadDocument(exampleFeedUrl); parser.parseResults(rssDocument3, report, null); Set<ContentProviderPackageDetails> newPackages = report.getNewPackages(); for (Iterator iterator = newPackages.iterator(); iterator.hasNext();) { ContentProviderPackageDetails contentSourcePackageDetails = (ContentProviderPackageDetails) iterator.next(); String installIns = new String(contentSourcePackageDetails.getMetadata()); assert installIns.startsWith("<?xml version=\"1.0\"?>"); installIns = installIns.substring(21).trim(); assert installIns.startsWith("<process-definition name=\"process\">") || installIns.startsWith("<!DOCTYPE process-definition [ <!ENTITY handler_A") : "installIns started with:" + installIns.substring(0, 100); assert installIns.endsWith("</process-definition>"); } } // Private -------------------------------------------- private RssDocument loadDocument(URL exampleFeedUrl) throws Exception { BufferedInputStream bis = new BufferedInputStream(exampleFeedUrl.openStream()); InputStreamReader isr = new InputStreamReader(bis); BufferedReader br = new BufferedReader(isr); StringBuffer rssFeedBuffer = new StringBuffer(); String temp; while ((temp = br.readLine()) != null) { rssFeedBuffer.append(temp).append("\n"); } br.close(); return RssParser.parseRss(rssFeedBuffer.toString()); } }