package org.ovirt.engine.core.bll;
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertFalse;
import static org.junit.Assert.assertNotNull;
import static org.junit.Assert.assertNull;
import static org.junit.Assert.assertTrue;
import static org.mockito.Matchers.any;
import static org.mockito.Mockito.doNothing;
import static org.mockito.Mockito.doReturn;
import static org.mockito.Mockito.when;
import java.io.File;
import java.util.ArrayList;
import java.util.Collections;
import java.util.HashSet;
import java.util.List;
import java.util.Set;
import junit.framework.Assert;
import org.apache.commons.collections.Transformer;
import org.apache.commons.collections.TransformerUtils;
import org.apache.commons.lang.StringUtils;
import org.junit.AfterClass;
import org.junit.Before;
import org.junit.BeforeClass;
import org.junit.Test;
import org.mockito.Mock;
import org.mockito.MockitoAnnotations;
import org.mockito.Spy;
import org.ovirt.engine.core.common.businessentities.TagsType;
import org.ovirt.engine.core.common.businessentities.tags;
import org.ovirt.engine.core.compat.Guid;
import org.ovirt.engine.core.dao.TagDAO;
public class TagsDirectorTest {
@Spy
private TagsDirector tagsDirector = new TagsDirector();
@Mock
private TagDAO tagDao;
@BeforeClass
public static void beforeClass() {
System.setProperty("jboss.server.log.dir", "/tmp");
}
@AfterClass
public static void afterClass() {
File f = new File("/tmp/engine.log");
f.delete();
}
@Before
public void setup() {
MockitoAnnotations.initMocks(this);
when(tagDao.getAllForParent(any(Guid.class))).thenReturn((List<tags>) Collections.EMPTY_LIST);
doReturn(tagDao).when(tagsDirector).getTagDAO();
doNothing().when(tagsDirector).updateTagInBackend(any(tags.class));
tagsDirector.init();
}
protected tags createTag(String name, String description) {
Guid tagId = Guid.NewGuid();
tags tag = new tags();
tag.setdescription(description);
tag.settag_id(tagId);
tag.settag_name(name);
tag.settype(TagsType.GeneralTag);
tag.setparent_id(tagsDirector.GetRootTag().gettag_id());
return tag;
}
@Test
public void testCloneTag() {
tags tag = createTag("a", "b");
tags tag2 = createTag("c", "d");
tag.getChildren().add(tag2);
tag2.setparent_id(tag.gettag_id());
Transformer cloner = TransformerUtils.cloneTransformer();
tags newTag = (tags) cloner.transform(tag);
assertEquals(1, newTag.getChildren().size());
}
@Test
public void testAddTag() {
tags tag = createTag("tag1", "desc1");
tags tagFromDirector = tagsDirector.GetTagById(tag.gettag_id());
assertNull(tagFromDirector);
tagsDirector.AddTag(tag);
tagFromDirector = tagsDirector.GetTagById(tag.gettag_id());
assertNotNull(tagFromDirector);
assertEquals(tag, tagFromDirector);
}
@Test
public void testChangeValueAfterAdd() {
tags tag = createTag("tag1", "desc1");
tagsDirector.AddTag(tag);
tag.settag_name("tag2");
tags tagFromDirector = tagsDirector.GetTagById(tag.gettag_id());
assertNotNull(tagFromDirector);
assertEquals("tag1", tagFromDirector.gettag_name());
}
@Test
public void testGetRootTag() {
tags tags = tagsDirector.GetRootTag();
assertNotNull(tags);
}
@Test
public void testGetRootWithHierarchy() {
tags tag = createTag("tag1", "desc1");
tagsDirector.AddTag(tag);
tags tags = tagsDirector.GetRootTag();
assertNotNull(tags);
assertEquals(tags.gettag_id(), TagsDirector.ROOT_TAG_ID);
assertEquals(1, tags.getChildren().size());
assertEquals("tag1", tags.getChildren().get(0).gettag_name());
}
@Test
public void testUpdateChildren() {
tags tag = createTag("tag1", "desc1");
tagsDirector.AddTag(tag);
tag.settag_name("booboo");
tagsDirector.UpdateTag(tag);
tags rootTag = tagsDirector.GetRootTag();
tag = rootTag.getChildren().get(0);
assertEquals("booboo", tag.gettag_name());
}
@Test
public void testMoveTag() {
//let's have two top level tag under root
tags level1obj1 = createTag("level1obj1", "");
level1obj1.settag_id(Guid.NewGuid());
level1obj1.setparent_id(tagsDirector.GetRootTag().gettag_id());
tagsDirector.AddTag(level1obj1);
tags level1obj2 = createTag("level1obj2", "");
level1obj2.settag_id(Guid.NewGuid());
level1obj2.setparent_id(tagsDirector.GetRootTag().gettag_id());
tagsDirector.AddTag(level1obj2);
//now none of these should have any children
Assert.assertEquals(0, tagsDirector.GetTagById(level1obj1.gettag_id()).getChildren().size());
Assert.assertEquals(0, tagsDirector.GetTagById(level1obj2.gettag_id()).getChildren().size());
//now let's add a child tag o the first top level tag
tags level2obj1 = createTag("level2obj1", "");
level2obj1.settag_id(Guid.NewGuid());
level2obj1.setparent_id(level1obj1.gettag_id());
tagsDirector.AddTag(level2obj1);
//now check the number of children
Assert.assertEquals(1, tagsDirector.GetTagById(level1obj1.gettag_id()).getChildren().size());
Assert.assertEquals(0, tagsDirector.GetTagById(level1obj2.gettag_id()).getChildren().size());
//should be all right so far.
//now let's do the trick: move the second level tag to under the other first level tag
tagsDirector.MoveTag(level2obj1.gettag_id(), level1obj2.gettag_id());
//and now let's recheck, the first top level should have 0 children, the second should have 1
Assert.assertEquals(0, tagsDirector.GetTagById(level1obj1.gettag_id()).getChildren().size());
Assert.assertEquals(1, tagsDirector.GetTagById(level1obj2.gettag_id()).getChildren().size());
}
@Test
public void testMoveTag_root() {
//let's have two top level tag under root
tags level1obj1 = createTag("level1obj1", "");
level1obj1.settag_id(Guid.NewGuid());
level1obj1.setparent_id(tagsDirector.GetRootTag().gettag_id());
tagsDirector.AddTag(level1obj1);
tags level1obj2 = createTag("level1obj2", "");
level1obj2.settag_id(Guid.NewGuid());
level1obj2.setparent_id(tagsDirector.GetRootTag().gettag_id());
tagsDirector.AddTag(level1obj2);
//now none of these should have any children
Assert.assertEquals(0, tagsDirector.GetTagById(level1obj1.gettag_id()).getChildren().size());
Assert.assertEquals(0, tagsDirector.GetTagById(level1obj2.gettag_id()).getChildren().size());
Assert.assertEquals(2, tagsDirector.GetRootTag().getChildren().size());
//should be all right so far.
//now let's do the trick: move the second level tag to under the other first level tag
tagsDirector.MoveTag(level1obj1.gettag_id(), level1obj2.gettag_id());
//and now let's recheck, the first top level should have 0 children, the second should have 1
Assert.assertEquals(1, tagsDirector.GetTagById(level1obj2.gettag_id()).getChildren().size());
Assert.assertEquals(1, tagsDirector.GetRootTag().getChildren().size());
}
@Test
public void testUpdateParentTag() {
tags tag = createTag("tag1", "desc1");
tag.settag_id(Guid.NewGuid());
tagsDirector.AddTag(tag);
tags rootTag = tagsDirector.GetRootTag();
tag = rootTag.getChildren().get(0);
assertEquals("tag1", tag.gettag_name());
// now let's add another tag
tags sub = createTag("subtag1", "subdesc");
sub.settag_id(Guid.NewGuid());
sub.setparent_id(tag.gettag_id());
tagsDirector.AddTag(sub);
//so now the root tag must have 1 child
Assert.assertEquals(1, tagsDirector.GetRootTag().getChildren().size());
Assert.assertEquals(1, tagsDirector.GetTagById(tag.gettag_id()).getChildren().size());
// get the parent, and rename it
tag.settag_name("subtag1_up");
tagsDirector.UpdateTag(tag);
// now let's see the number of children in the tag objects
//this is the assertion that fails without fix for #732640
Assert.assertEquals(1, tagsDirector.GetRootTag().getChildren().size());
Assert.assertEquals(1, tagsDirector.GetTagById(tag.gettag_id()).getChildren().size());
//let's check the same thing on overwriting description
tag.setdescription("TEST TEST TEST TEST");
tagsDirector.UpdateTag(tag);
// and all the checks once again just to make sure
Assert.assertEquals(1, tagsDirector.GetRootTag().getChildren().size());
Assert.assertEquals(1, tagsDirector.GetTagById(tag.gettag_id()).getChildren().size());
}
@Test
public void testGetTagByNameNotExists() {
tags fromTagsDirector = tagsDirector.GetTagByName("does not exist");
assertNull(fromTagsDirector);
}
@Test
public void testGetByName() {
tags tag = createTag("tag1", "desc1");
tagsDirector.AddTag(tag);
tags fromTagsDirector = tagsDirector.GetTagByName("tag1");
assertNotNull(fromTagsDirector);
assertEquals(tag, fromTagsDirector);
}
@Test
public void testGetAllTags() {
ArrayList<tags> allTags = tagsDirector.GetAllTags();
assertEquals(0, allTags.size());
tags tag = createTag("tag1", "desc1");
tagsDirector.AddTag(tag);
allTags = tagsDirector.GetAllTags();
assertEquals(1, allTags.size());
tag = createTag("tag2", "desc2");
tagsDirector.AddTag(tag);
allTags = tagsDirector.GetAllTags();
assertEquals(2, allTags.size());
}
@Test
public void testGetTagIdAndChildrenIdsNotExists() {
tags tag = createTag("tag1", "desc1");
String idsStr = tagsDirector.GetTagIdAndChildrenIds(tag.gettag_id());
assertEquals(StringUtils.EMPTY, idsStr);
}
@Test
public void testGetTagIdAndChildrenIds() {
tags tag = createTag("tag1", "desc1");
tags tag2 = createTag("tag2", "desc2");
tag.getChildren().add(tag2);
tag2.setparent_id(tag.getparent_id());
tagsDirector.AddTag(tag);
String idsStr = tagsDirector.GetTagIdAndChildrenIds(tag.gettag_id());
String[] ids = idsStr.split("[,]");
assertEquals(2, ids.length);
assertEquals(ids[0], "'" + tag.gettag_id().toString() + "'");
assertEquals(ids[1], "'" + tag2.gettag_id().toString() + "'");
}
@Test
public void testGetTagIdAndChildrenIdsAsSet() {
tags tag = createTag("tag1", "desc1");
tags tag2 = createTag("tag2", "desc2");
tag.getChildren().add(tag2);
tag2.setparent_id(tag.getparent_id());
tagsDirector.AddTag(tag);
Set<Guid> idsToCheck = new HashSet<Guid>();
idsToCheck.add(tag.gettag_id());
idsToCheck.add(tag2.gettag_id());
HashSet<Guid> idsFromTagsDirector = tagsDirector.GetTagIdAndChildrenIdsAsSet(tag.gettag_id());
assertEquals(idsToCheck, idsFromTagsDirector);
}
@Test
public void testGetTagIdAndChildrenIdsByName() {
tags tag = createTag("tag1", "desc1");
tags tag2 = createTag("tag2", "desc2");
tag.getChildren().add(tag2);
tag2.setparent_id(tag.getparent_id());
tagsDirector.AddTag(tag);
String idsStr = tagsDirector.GetTagIdAndChildrenIds(tag.gettag_name());
String[] ids = idsStr.split("[,]");
assertEquals(2, ids.length);
assertEquals(ids[0], "'" + tag.gettag_id().toString() + "'");
assertEquals(ids[1], "'" + tag2.gettag_id().toString() + "'");
}
/**
* Test to check that bz https://bugzilla.redhat.com/722203 got solved. The test is a java translation of an
* automation test that takes 4 tags, adds them to the tags director, changes one of the tags parent to be the other
* tag, updates the tag, and queries the tags.
*/
@Test
public void testUpdate() {
tags tag = createTag("tag1", "desc1");
tagsDirector.AddTag(tag);
tag.settag_name("new name");
tagsDirector.UpdateTag(tag);
tags fromDirector = tagsDirector.GetTagById(tag.gettag_id());
assertEquals(tag.gettag_name(), fromDirector.gettag_name());
}
@Test
public void testUpdateParent() {
tags tag1 = createTag("tag1", "desc1");
tags tag2 = createTag("tag2", "desc2");
tags tag3 = createTag("tag3", "desc3");
tags tag4 = createTag("tag4", "desc4");
tagsDirector.AddTag(tag1);
tagsDirector.AddTag(tag2);
tagsDirector.AddTag(tag3);
tagsDirector.AddTag(tag4);
// Emulates the REST API behavior of getting all the tags prior to updating
ArrayList<tags> tags = tagsDirector.GetAllTags();
tags tagToChange = null;
for (tags tag : tags) {
if (tag.gettag_name().equals("tag1")) {
tagToChange = tag;
break;
}
}
tagToChange.setparent_id(tag2.gettag_id());
tagsDirector.UpdateTag(tagToChange);
// Emulates the REST API behavior of getting all the tags after updating
tags = tagsDirector.GetAllTags();
tags changedTag = null;
for (tags tag : tags) {
if (tag.gettag_name().equals("tag1")) {
changedTag = tag;
break;
}
}
assertEquals(tag2.gettag_id(), changedTag.getparent_id());
}
@Test
public void testGetTagIdsAndChildrenIdsByRegExpNoTagMatches() {
String result = tagsDirector.GetTagIdsAndChildrenIdsByRegExp("tag*");
assertEquals(StringUtils.EMPTY, result);
}
@Test
public void testGetTagIdsAndChildrenIdsByRegExp() {
tags tag1 = createTag("tag1", "desc1");
tagsDirector.AddTag(tag1);
validateRegexpQueryResult("tag1", tag1);
}
@Test
public void testGetTagIdsAndChildrenIdsByRegExpWithWildcard() {
tags tag1 = createTag("tag1", "desc1");
tagsDirector.AddTag(tag1);
validateRegexpQueryResult("tag1*", tag1);
}
@Test
public void testGetTagIdsAndChildrenIdsByRegExpWithWildcardAndSeveralChildren() {
tags tag1 = createTag("tag1", "desc1");
tagsDirector.AddTag(tag1);
tags tag2 = createTag("tag2", "desc2");
tagsDirector.AddTag(tag2);
validateRegexpQueryResult("tag*", tag1, tag2);
}
@Test
public void testGetTagIdsAndChildrenIdsByRegExpWithWildcardAndSeveralChildrenAndHierachy() {
tags tag1 = createTag("tag1", "desc1");
tags tag2 = createTag("tag2", "desc2");
tag2.getChildren().add(tag1);
tag1.setparent_id(tag2.gettag_id());
tagsDirector.AddTag(tag2);
tagsDirector.AddTag(tag1);
validateRegexpQueryResult("tag*", tag1, tag2);
}
private void validateRegexpQueryResult(String regexp, tags... tagArray) {
String result = tagsDirector.GetTagIdsAndChildrenIdsByRegExp(regexp);
for (int counter = 0; counter < tagArray.length; counter++) {
tags tagToCheck = tagArray[counter];
assertTrue(result.indexOf(tagToCheck.gettag_id().toString()) > -1);
}
}
public void testDirectDescetor() {
tags tag1 = createTag("tag1", "desc1");
tags tag2 = createTag("tag2", "desc2");
tagsDirector.AddTag(tag1);
tagsDirector.AddTag(tag2);
tagsDirector.MoveTag(tag2.gettag_id(), tag1.gettag_id());
assertTrue(tagsDirector.IsTagDescestorOfTag(tag1.gettag_id(), tag2.gettag_id()));
}
@Test
public void testIsNonDirectDescetor() {
tags tag1 = createTag("tag1", "desc1");
tags tag2 = createTag("tag2", "desc2");
tags tag3 = createTag("tag3", "desc3");
tagsDirector.AddTag(tag1);
tagsDirector.AddTag(tag2);
tagsDirector.AddTag(tag3);
tagsDirector.MoveTag(tag3.gettag_id(), tag1.gettag_id());
tagsDirector.MoveTag(tag2.gettag_id(), tag3.gettag_id());
assertTrue(tagsDirector.IsTagDescestorOfTag(tag1.gettag_id(), tag2.gettag_id()));
}
@Test
public void testNotDescetor() {
tags tag1 = createTag("tag1", "desc1");
tags tag2 = createTag("tag2", "desc2");
assertFalse(tagsDirector.IsTagDescestorOfTag(tag1.gettag_id(), tag2.gettag_id()));
}
}