/**
* Copyright (c) 2009--2014 Red Hat, Inc.
*
* This software is licensed to you under the GNU General Public License,
* version 2 (GPLv2). There is NO WARRANTY for this software, express or
* implied, including the implied warranties of MERCHANTABILITY or FITNESS
* FOR A PARTICULAR PURPOSE. You should have received a copy of GPLv2
* along with this software; if not, see
* http://www.gnu.org/licenses/old-licenses/gpl-2.0.txt.
*
* Red Hat trademarks are not licensed under GPLv2. No permission is
* granted to use or replicate Red Hat trademarks that are incorporated
* in this software or its documentation.
*/
package com.redhat.rhn.manager.profile.test;
import java.util.ArrayList;
import java.util.Date;
import java.util.HashSet;
import java.util.Iterator;
import java.util.List;
import java.util.Set;
import org.apache.commons.lang.StringUtils;
import com.redhat.rhn.common.db.datasource.DataResult;
import com.redhat.rhn.domain.action.rhnpackage.PackageAction;
import com.redhat.rhn.domain.channel.Channel;
import com.redhat.rhn.domain.channel.ChannelFactory;
import com.redhat.rhn.domain.channel.NoBaseChannelFoundException;
import com.redhat.rhn.domain.channel.test.ChannelFactoryTest;
import com.redhat.rhn.domain.rhnpackage.Package;
import com.redhat.rhn.domain.rhnpackage.PackageArch;
import com.redhat.rhn.domain.rhnpackage.PackageFactory;
import com.redhat.rhn.domain.rhnpackage.profile.Profile;
import com.redhat.rhn.domain.rhnpackage.test.PackageTest;
import com.redhat.rhn.domain.role.RoleFactory;
import com.redhat.rhn.domain.server.Server;
import com.redhat.rhn.domain.server.ServerConstants;
import com.redhat.rhn.domain.server.ServerFactory;
import com.redhat.rhn.domain.server.test.ServerFactoryTest;
import com.redhat.rhn.domain.user.User;
import com.redhat.rhn.domain.user.UserFactory;
import com.redhat.rhn.frontend.dto.PackageListItem;
import com.redhat.rhn.frontend.dto.PackageMetadata;
import com.redhat.rhn.frontend.dto.ProfileDto;
import com.redhat.rhn.manager.profile.ProfileManager;
import com.redhat.rhn.manager.rhnpackage.test.PackageManagerTest;
import com.redhat.rhn.testing.BaseTestCaseWithUser;
import com.redhat.rhn.testing.ChannelTestUtils;
import com.redhat.rhn.testing.ServerTestUtils;
import com.redhat.rhn.testing.TestUtils;
/**
* ProfileManagerTest
* @version $Rev$
*/
public class ProfileManagerTest extends BaseTestCaseWithUser {
public void setUp() throws Exception {
super.setUp();
// Give our user ORG_ADMIN
user.addPermanentRole(RoleFactory.ORG_ADMIN);
UserFactory.save(user);
}
public void testSyncSystems() throws Exception {
Channel testChannel = ChannelFactoryTest.createTestChannel(user);
Package p1 = PackageTest.createTestPackage(user.getOrg());
Package p2 = PackageTest.createTestPackage(user.getOrg());
testChannel.addPackage(p1);
testChannel.addPackage(p2);
ChannelFactory.save(testChannel);
Server s1 = ServerFactoryTest.createTestServer(user, true,
ServerConstants.getServerGroupTypeEnterpriseEntitled());
Server s2 = ServerFactoryTest.createTestServer(user, true,
ServerConstants.getServerGroupTypeEnterpriseEntitled());
s1.addChannel(testChannel);
s2.addChannel(testChannel);
PackageManagerTest.associateSystemToPackageWithArch(s1, p1);
PackageManagerTest.associateSystemToPackageWithArch(s2, p2);
ServerFactory.save(s1);
ServerFactory.save(s2);
StringBuilder idCombo = new StringBuilder();
idCombo.append(p1.getPackageName().getId()).append("|");
idCombo.append(p1.getPackageEvr().getId()).append("|");
idCombo.append(p1.getPackageArch().getId());
Set idCombos = new HashSet();
idCombos.add(idCombo.toString());
// This call has an embedded transaction in the stored procedure:
// lookup_transaction_package(:operation, :n, :e, :v, :r, :a)
// which can cause deadlocks. We are forced to call commitAndCloseTransaction()
commitAndCloseSession();
commitHappened();
PackageAction action = ProfileManager.syncToSystem(
user, s1.getId(), s2.getId(), idCombos,
ProfileManager.OPTION_REMOVE, new Date());
assertNotNull(action);
assertNotNull(action.getPrerequisite());
}
public void testCreateProfileFails() throws Exception {
Server server = ServerFactoryTest.createTestServer(user, true);
try {
ProfileManager.createProfile(user, server,
"Profile test name" + TestUtils.randomString(),
"Profile test description");
fail("Should not be able to create a profile for a server which " +
"has no basechannel");
}
catch (NoBaseChannelFoundException nbcfe) {
assertTrue(true);
}
}
public void testCreateProfile() throws Exception {
Server server = ServerFactoryTest.createTestServer(user, true);
Channel channel = ChannelFactoryTest.createTestChannel(user);
server.addChannel(channel);
TestUtils.saveAndFlush(server);
Profile p = ProfileManager.createProfile(user, server,
"Profile test name" + TestUtils.randomString(),
"Profile test description");
assertNotNull("Profile is null", p);
assertNotNull("Profile has no id", p.getId());
}
public void testCopyFrom() throws Exception {
Server server = ServerFactoryTest.createTestServer(user, true);
Channel channel = ChannelFactoryTest.createTestChannel(user);
server.addChannel(channel);
TestUtils.saveAndFlush(server);
Profile p = ProfileManager.createProfile(user, server,
"Profile test name" + TestUtils.randomString(),
"Profile test description");
assertNotNull("Profile is null", p);
assertNotNull("Profile has no id", p.getId());
ProfileManager.copyFrom(server, p);
}
public void testCompatibleWithServer() throws Exception {
Server server = ServerFactoryTest.createTestServer(user, true);
Channel channel = ChannelFactoryTest.createTestChannel(user);
server.addChannel(channel);
TestUtils.saveAndFlush(server);
Profile p = ProfileManager.createProfile(user, server,
"Profile test name" + TestUtils.randomString(),
"Profile test description");
assertNotNull("Profile is null", p);
assertNotNull("Profile has no id", p.getId());
List list = ProfileManager.compatibleWithServer(server, user.getOrg());
assertNotNull("List is null", list);
assertFalse("List is empty", list.isEmpty());
for (Iterator itr = list.iterator(); itr.hasNext();) {
Object o = itr.next();
assertEquals("List contains something other than Profiles",
Profile.class, o.getClass());
}
}
public void testCompareServerToProfile() {
Long sid = new Long(1005385254);
Long prid = new Long(4908);
Long orgid = new Long(4116748);
DataResult dr = ProfileManager.compareServerToProfile(sid, prid, orgid, null);
assertNotNull("DataResult was null", dr);
}
public void testCompatibleWithChannel() throws Exception {
Profile p = createProfileWithServer(user);
DataResult dr = ProfileManager.compatibleWithChannel(p.getBaseChannel(),
user.getOrg(), null);
assertNotNull(dr);
assertTrue(dr.size() > 0);
assertTrue(dr.iterator().next() instanceof ProfileDto);
}
public static Profile createProfileWithServer(User userIn) throws Exception {
Server server = ServerFactoryTest.createTestServer(userIn, true);
Channel channel = ChannelFactoryTest.createTestChannel(userIn);
server.addChannel(channel);
TestUtils.saveAndFlush(server);
return ProfileManager.createProfile(userIn, server,
"Profile test name" + TestUtils.randomString(),
"Profile test description");
}
public void testTwoVsOneKernelPackages() {
/*
* public static List comparePackageLists(DataResult profiles,
DataResult systems, String param) {
*/
List a = new ArrayList();
PackageListItem pli = new PackageListItem();
pli.setIdCombo("500000341|258204");
pli.setEvrId(new Long(258204));
pli.setName("kernel");
pli.setRelease("27.EL");
pli.setNameId(new Long(500000341));
pli.setEvr("kernel-2.4.21-27.EL");
pli.setVersion("2.4.21");
pli.setEpoch(null);
a.add(pli);
pli = new PackageListItem();
pli.setIdCombo("500000341|000000");
pli.setEvrId(new Long(000000));
pli.setName("kernel");
pli.setRelease("27.EL-bretm");
pli.setNameId(new Long(500000341));
pli.setEvr("kernel-2.4.22-27.EL-bretm");
pli.setVersion("2.4.22");
pli.setEpoch(null);
a.add(pli);
List b = new ArrayList();
pli = new PackageListItem();
pli.setIdCombo("500000341|258204");
pli.setEvrId(new Long(258204));
pli.setName("kernel");
pli.setRelease("27.EL");
pli.setNameId(new Long(500000341));
pli.setEvr("kernel-2.4.21-27.EL");
pli.setVersion("2.4.21");
pli.setEpoch(null);
b.add(pli);
List diff = ProfileManager.comparePackageLists(new DataResult(a),
new DataResult(b), "foo");
assertEquals(1, diff.size());
PackageMetadata pm = (PackageMetadata) diff.get(0);
assertNotNull(pm);
// assertEquals(PackageMetadata.KEY_OTHER_NEWER, pm.getComparisonAsInt());
// Changed this to KEY_OTHER_ONLY because for systems with multiple revs of
// same package we are now
assertEquals(PackageMetadata.KEY_OTHER_ONLY, pm.getComparisonAsInt());
assertEquals("kernel-2.4.22-27.EL-bretm", pm.getOther().getEvr());
}
public void testDifferingVersionsofSamePackage() {
List a = new ArrayList();
PackageListItem pli = new PackageListItem();
pli.setIdCombo("500000341|000000");
pli.setEvrId(new Long(000000));
pli.setName("kernel");
pli.setRelease("27.EL-bretm");
pli.setNameId(new Long(500000341));
pli.setEvr("kernel-2.4.22-27.EL-bretm");
pli.setVersion("2.4.22");
pli.setEpoch(null);
a.add(pli);
List b = new ArrayList();
pli = new PackageListItem();
pli.setIdCombo("500000341|258204");
pli.setEvrId(new Long(258204));
pli.setName("kernel");
pli.setRelease("27.EL");
pli.setNameId(new Long(500000341));
pli.setEvr("kernel-2.4.21-27.EL");
pli.setVersion("2.4.21");
pli.setEpoch(null);
b.add(pli);
List diff = ProfileManager.comparePackageLists(new DataResult(a),
new DataResult(b), "foo");
assertEquals(1, diff.size());
PackageMetadata pm = (PackageMetadata) diff.get(0);
assertNotNull(pm);
assertEquals(PackageMetadata.KEY_OTHER_NEWER, pm.getComparisonAsInt());
assertEquals("kernel-2.4.22-27.EL-bretm", pm.getOther().getEvr());
assertEquals("kernel-2.4.21-27.EL", pm.getSystem().getEvr());
}
public void testDifferentVersionsOfSamePackageReverseOrder() {
List b = new ArrayList();
PackageListItem pli = new PackageListItem();
pli.setIdCombo("500000341|000000");
pli.setEvrId(new Long(000000));
pli.setName("kernel");
pli.setRelease("27.EL-bretm");
pli.setNameId(new Long(500000341));
pli.setEvr("kernel-2.4.22-27.EL-bretm");
pli.setVersion("2.4.22");
pli.setEpoch(null);
b.add(pli);
List a = new ArrayList();
pli = new PackageListItem();
pli.setIdCombo("500000341|258204");
pli.setEvrId(new Long(258204));
pli.setName("kernel");
pli.setRelease("27.EL");
pli.setNameId(new Long(500000341));
pli.setEvr("kernel-2.4.21-27.EL");
pli.setVersion("2.4.21");
pli.setEpoch(null);
a.add(pli);
List diff = ProfileManager.comparePackageLists(new DataResult(a),
new DataResult(b), "foo");
assertEquals(1, diff.size());
PackageMetadata pm = (PackageMetadata) diff.get(0);
assertNotNull(pm);
assertEquals(PackageMetadata.KEY_THIS_NEWER, pm.getComparisonAsInt());
assertEquals("kernel-2.4.22-27.EL-bretm", pm.getSystem().getEvr());
assertEquals("kernel-2.4.21-27.EL", pm.getOther().getEvr());
}
public void testDifferingEpochsofSamePackage() {
// this test will perform a package comparison between 2 packages where
// the epochs in those packages vary, including null values
String[] pkg1Epochs = {null, "0", null, "0"};
String[] pkg2Epochs = {null, null, "0", "0"};
List<PackageListItem> a = new ArrayList<PackageListItem>();
PackageListItem pli1 = new PackageListItem();
pli1.setIdCombo("500000341|000000");
pli1.setEvrId(new Long(000000));
pli1.setName("kernel");
pli1.setRelease("27.EL-bretm");
pli1.setNameId(new Long(500000341));
pli1.setEvr("kernel-2.4.22-27.EL-bretm");
pli1.setVersion("2.4.22");
List<PackageListItem> b = new ArrayList<PackageListItem>();
PackageListItem pli2 = new PackageListItem();
pli2.setIdCombo("500000341|258204");
pli2.setEvrId(new Long(258204));
pli2.setName("kernel");
pli2.setRelease("27.EL");
pli2.setNameId(new Long(500000341));
pli2.setEvr("kernel-2.4.21-27.EL");
pli2.setVersion("2.4.21");
for (int i = 0; i < pkg1Epochs.length; i++) {
pli1.setEpoch(pkg1Epochs[i]);
pli2.setEpoch(pkg2Epochs[i]);
a.clear();
a.add(pli1);
b.clear();
b.add(pli2);
List diff = ProfileManager.comparePackageLists(
new DataResult(a), new DataResult(b), "foo");
assertEquals(1, diff.size());
PackageMetadata pm = (PackageMetadata) diff.get(0);
assertNotNull(pm);
assertEquals(PackageMetadata.KEY_OTHER_NEWER, pm.getComparisonAsInt());
assertEquals("kernel-2.4.22-27.EL-bretm", pm.getOther().getEvr());
assertEquals(pkg1Epochs[i], pm.getOther().getEpoch());
assertEquals("kernel-2.4.21-27.EL", pm.getSystem().getEvr());
assertEquals(pkg2Epochs[i], pm.getSystem().getEpoch());
}
}
public static PackageListItem createItem(String evrString, int nameId) {
PackageListItem pli = new PackageListItem();
String[] evr = StringUtils.split(evrString, "-");
pli.setName(evr[0]);
pli.setVersion(evr[1]);
pli.setRelease(evr[2]);
pli.setEvrId(new Long(evrString.hashCode()));
pli.setIdCombo(nameId + "|" + evrString.hashCode());
pli.setEvr(evrString);
pli.setNameId(new Long(nameId));
return pli;
}
public void testMorePackagesInProfile() {
List profileList = new ArrayList();
profileList.add(createItem("kernel-2.4.21-EL-mmccune", 500341));
profileList.add(createItem("kernel-2.4.22-EL-mmccune", 500341));
profileList.add(createItem("kernel-2.4.23-EL-mmccune", 500341));
profileList.add(createItem("other-2.4.23-EL-mmccune", 500400));
List systemList = new ArrayList();
systemList.add(createItem("kernel-2.4.23-EL-mmccune", 500341));
List diff = ProfileManager.comparePackageLists(new DataResult(profileList),
new DataResult(systemList), "system");
assertEquals(3, diff.size());
}
public void testMorePackagesInSystem() {
List profileList = new ArrayList();
profileList.add(createItem("kernel-2.4.23-EL-mmccune", 500341));
List systemList = new ArrayList();
systemList.add(createItem("kernel-2.4.21-EL-mmccune", 500341));
systemList.add(createItem("kernel-2.4.22-EL-mmccune", 500341));
systemList.add(createItem("kernel-2.4.23-EL-mmccune", 500341));
List diff = ProfileManager.comparePackageLists(new DataResult(profileList),
new DataResult(systemList), "system");
assertEquals(2, diff.size());
}
public static PackageListItem createPackageListItem(String evrString, int nameId) {
PackageListItem pli = new PackageListItem();
String[] evr = StringUtils.split(evrString, "-");
pli.setName(evr[0]);
pli.setVersion(evr[1]);
pli.setRelease(evr[2]);
pli.setEvrId(new Long(evrString.hashCode()));
pli.setIdCombo(nameId + "|" + evrString.hashCode());
pli.setEvr(evrString);
pli.setNameId(new Long(nameId));
PackageArch pa = PackageFactory.lookupPackageArchByLabel("x86_64");
pli.setArch(pa.getLabel());
pli.setArchId(pa.getId());
return pli;
}
public void testIdenticalPackages() {
List a = new ArrayList();
PackageListItem pli = new PackageListItem();
pli.setIdCombo("500000341|000000");
pli.setEvrId(new Long(000000));
pli.setName("kernel");
pli.setRelease("27.EL-bretm");
pli.setNameId(new Long(500000341));
pli.setEvr("kernel-2.4.22-27.EL-bretm");
pli.setVersion("2.4.22");
pli.setEpoch(null);
a.add(pli);
List b = new ArrayList();
pli = new PackageListItem();
pli.setIdCombo("500000341|000000");
pli.setEvrId(new Long(000000));
pli.setName("kernel");
pli.setRelease("27.EL-bretm");
pli.setNameId(new Long(500000341));
pli.setEvr("kernel-2.4.22-27.EL-bretm");
pli.setVersion("2.4.22");
pli.setEpoch(null);
b.add(pli);
List diff = ProfileManager.comparePackageLists(new DataResult(a),
new DataResult(b), "foo");
assertEquals(0, diff.size());
}
public void testVzlatkinTest() {
List a = new ArrayList();
PackageListItem pli = new PackageListItem();
pli.setIdCombo("390|2069");
pli.setEvrId(new Long(2069));
pli.setName("kernel");
pli.setRelease("5.0.3.EL");
pli.setNameId(new Long(390));
pli.setEvr("pkg1");
pli.setVersion("2.6.9");
pli.setEpoch(null);
pli.setArch(null);
a.add(pli);
pli = new PackageListItem();
pli.setIdCombo("390|1628");
pli.setEvrId(new Long(1628));
pli.setName("kernel");
pli.setRelease("5.EL");
pli.setNameId(new Long(390));
pli.setEvr("pkg2");
pli.setVersion("2.6.9");
pli.setEpoch(null);
pli.setArch(null);
a.add(pli);
pli = new PackageListItem();
pli.setIdCombo("1620|2069");
pli.setEvrId(new Long(2069));
pli.setName("kernel-devel");
pli.setRelease("5.0.3.EL");
pli.setNameId(new Long(1620));
pli.setEvr("pkg3");
pli.setVersion("2.6.9");
pli.setEpoch(null);
pli.setArch(null);
a.add(pli);
pli = new PackageListItem();
pli.setIdCombo("1620|1628");
pli.setEvrId(new Long(1628));
pli.setName("kernel-devel");
pli.setRelease("5.EL");
pli.setNameId(new Long(1620));
pli.setEvr("pkg4");
pli.setVersion("2.6.9");
pli.setEpoch(null);
pli.setArch(null);
a.add(pli);
pli = new PackageListItem();
pli.setIdCombo("398|1629");
pli.setEvrId(new Long(1629));
pli.setName("kernel-utils");
pli.setRelease("13.1.48");
pli.setNameId(new Long(398));
pli.setEvr("pkg5");
pli.setVersion("2.4");
pli.setEpoch("1");
pli.setArch(null);
a.add(pli);
// SETUP B
List b = new ArrayList();
pli = new PackageListItem();
pli.setIdCombo(null);
pli.setEvrId(new Long(1628));
pli.setName("kernel");
pli.setRelease("5.EL");
pli.setNameId(new Long(390));
pli.setEvr("pkg1b");
pli.setVersion("2.6.9");
pli.setEpoch(null);
pli.setArch(null);
b.add(pli);
pli = new PackageListItem();
pli.setIdCombo(null);
pli.setEvrId(new Long(1628));
pli.setName("kernel-devel");
pli.setRelease("5.EL");
pli.setNameId(new Long(1620));
pli.setEvr("pkg2b");
pli.setVersion("2.6.9");
pli.setEpoch(null);
pli.setArch(null);
b.add(pli);
pli = new PackageListItem();
pli.setIdCombo(null);
pli.setEvrId(new Long(1629));
pli.setName("kernel-utils");
pli.setRelease("13.1.48");
pli.setNameId(new Long(398));
pli.setEvr("pkg3b");
pli.setVersion("2.4");
pli.setEpoch("1");
pli.setArch(null);
b.add(pli);
List diff = ProfileManager.comparePackageLists(new DataResult(a),
new DataResult(b), "foo");
// This used to assert: assertEquals(0, diff.size());
// but we now support showing what older packages exist on a system
assertEquals(2, diff.size());
}
public void testBz204345() throws Exception {
// kernel-2.6.9-22.EL
// kernel-2.6.9-42.0.2.EL
List serverList = new ArrayList();
PackageListItem pli3 = new PackageListItem();
pli3.setIdCombo("500000341|000000");
pli3.setEvrId(new Long(000000));
pli3.setName("kernel");
pli3.setRelease("42.0.2.EL");
pli3.setNameId(new Long(500000341));
pli3.setEvr("kernel-2.6.9-42.0.2.EL");
pli3.setVersion("2.6.9");
pli3.setEpoch(null);
serverList.add(pli3);
List otherServerList = new ArrayList();
PackageListItem pli = new PackageListItem();
pli.setIdCombo("500000341|000001");
pli.setEvrId(new Long(000000));
pli.setName("kernel");
pli.setRelease("22.EL");
pli.setNameId(new Long(500000341));
pli.setEvr("kernel-2.6.9-22.EL");
pli.setVersion("2.6.9");
pli.setEpoch(null);
otherServerList.add(pli);
PackageListItem pli2 = new PackageListItem();
pli2.setIdCombo("500000341|000000");
pli2.setEvrId(new Long(000000));
pli2.setName("kernel");
pli2.setRelease("42.0.2.EL");
pli2.setNameId(new Long(500000341));
pli2.setEvr("kernel-2.6.9-42.0.2.EL");
pli2.setVersion("2.6.9");
pli2.setEpoch(null);
otherServerList.add(pli2);
List diff = ProfileManager.comparePackageLists(new DataResult(otherServerList),
new DataResult(serverList), "foo");
assertEquals(1, diff.size());
PackageMetadata pm = (PackageMetadata) diff.get(0);
assertNotNull(pm);
assertEquals("kernel-2.6.9-22.EL", pm.getOther().getEvr());
assertEquals(PackageMetadata.KEY_OTHER_ONLY, pm.getComparisonAsInt());
// assertEquals("kernel-2.4.21-27.EL", pm.getSystem().getEvr());
}
public void testGetChildChannelsNeededForProfile() throws Exception {
Server server = ServerTestUtils.createTestSystem(user);
Channel childChannel1 = ChannelTestUtils.createChildChannel(server.getCreator(),
server.getBaseChannel());
PackageManagerTest.addPackageToSystemAndChannel("child1-package1", server,
childChannel1);
PackageManagerTest.addPackageToSystemAndChannel("child1-package2", server,
childChannel1);
Channel childChannel2 = ChannelTestUtils.createChildChannel(server.getCreator(),
server.getBaseChannel());
PackageManagerTest.addPackageToSystemAndChannel("child2-package1", server,
childChannel2);
PackageManagerTest.addPackageToSystemAndChannel("child2-package2", server,
childChannel2);
Profile p = ProfileManager.createProfile(server.getCreator(), server,
"Profile test name" + TestUtils.randomString(), "test desc");
ProfileManager.copyFrom(server, p);
List channels = ProfileManager.getChildChannelsNeededForProfile(
server.getCreator(),
server.getBaseChannel(), p);
assertEquals(2, channels.size());
assertTrue(channels.contains(childChannel1));
assertTrue(channels.contains(childChannel2));
Profile p2 = ProfileManager.createProfile(server.getCreator(), server,
"Profile test name" + TestUtils.randomString(), "test desc");
channels = ProfileManager.getChildChannelsNeededForProfile(server.getCreator(),
server.getBaseChannel(), p2);
assertEquals(0, channels.size());
}
}