/*
* Copyright (C) 2008 Universidade Federal de Campina Grande
*
* This file is part of OurGrid.
*
* OurGrid is free software: you can redistribute it and/or modify it under the
* terms of the GNU Lesser General Public License as published by the Free
* Software Foundation, either version 3 of the License, or (at your option)
* any later version.
*
* 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 Lesser General Public License
* for more details.
*
* You should have received a copy of the GNU Lesser General Public License
* along with this program. If not, see <http://www.gnu.org/licenses/>.
*
*/
package org.ourgrid.peer.controller.matcher;
import junit.framework.TestCase;
import org.ourgrid.common.exception.InvalidExpressionException;
import org.ourgrid.peer.business.controller.matcher.ExpressionTranslator;
/**
* Test for expression translator class.
*/
public class ExpressionTranslatorTest extends TestCase {
String minimizeExpression;
String mgExpression;
ExpressionTranslator translator;
@Override
protected void setUp() throws Exception {
this.translator = new ExpressionTranslator();
}
public void testTranslateMGMinimize1() throws Exception {
String[ ] mgExpression = { "os == linux", "os >= linux", "os <= linux", "os > linux", "os < linux" };
String minimizeExpression = "a";
for ( int i = 0; i < mgExpression.length; i++ ) {
assertEquals( minimizeExpression, translator.translateToMinimizeLibraryForm( mgExpression[i] ) );
assertEquals( mgExpression[i], translator.translateToBrokerExpressionForm( minimizeExpression ) );
}
String[ ] mgExpression1 = { "( os == linux )", "( os >= linux )", "( os <= linux )", "( os > linux )",
"( os < linux )" };
minimizeExpression = "(a)";
for ( int i = 0; i < mgExpression.length; i++ ) {
assertEquals( minimizeExpression, translator.translateToMinimizeLibraryForm( mgExpression1[i] ) );
System.out.println( minimizeExpression );
assertEquals( mgExpression1[i], translator.translateToBrokerExpressionForm( minimizeExpression ) );
}
}
public void testTranslateMGMinimize2() throws Exception {
String mgExpression = "os == linux || mem >= 500";
String minimizeExpression = "a+b";
assertEquals( minimizeExpression, translator.translateToMinimizeLibraryForm( mgExpression ) );
mgExpression = "os == linux OR mem >= 500";
assertEquals( minimizeExpression, translator.translateToMinimizeLibraryForm( mgExpression ) );
assertEquals( mgExpression, translator.translateToBrokerExpressionForm( minimizeExpression ) );
mgExpression = "( os == linux ) OR ( mem >= 500 )";
minimizeExpression = "(a)+(b)";
assertEquals( minimizeExpression, translator.translateToMinimizeLibraryForm( mgExpression ) );
assertEquals( mgExpression, translator.translateToBrokerExpressionForm( minimizeExpression ) );
}
public void testTranslateMGMinimize3() throws Exception {
String mgExpression = "os == linux && num_procs < 5";
String minimizeExpression = "a*b";
assertEquals( minimizeExpression, translator.translateToMinimizeLibraryForm( mgExpression ) );
mgExpression = "os == linux AND num_procs < 5";
assertEquals( minimizeExpression, translator.translateToMinimizeLibraryForm( mgExpression ) );
assertEquals( mgExpression, translator.translateToBrokerExpressionForm( minimizeExpression ) );
mgExpression = "( os == linux ) AND ( num_procs < 5 )";
minimizeExpression = "(a)*(b)";
assertEquals( minimizeExpression, translator.translateToMinimizeLibraryForm( mgExpression ) );
assertEquals( mgExpression, translator.translateToBrokerExpressionForm( minimizeExpression ) );
}
public void testTranslateMGMinimize4() throws Exception {
String mgExpression = "os == linux && num_procs < 5 || mem == 500 ";
String minimizeExpression = "a*b+c";
assertEquals( minimizeExpression, translator.translateToMinimizeLibraryForm( mgExpression ) );
mgExpression = "os == linux AND num_procs < 5 OR mem == 500";
assertEquals( mgExpression, translator.translateToBrokerExpressionForm( minimizeExpression ) );
}
public void testTranslateMGMinimize5() throws Exception {
String mgExpression = "os == linux || num_procs < 5 AND mem == 500 ";
String minimizeExpression = "a+b*c";
assertEquals( minimizeExpression, translator.translateToMinimizeLibraryForm( mgExpression ) );
mgExpression = "os == linux OR num_procs < 5 AND mem == 500";
assertEquals( mgExpression, translator.translateToBrokerExpressionForm( minimizeExpression ) );
}
public void testTranslateMGMinimize6() throws Exception {
String mgExpression = "( os == linux ) OR ( num_procs < 5 ) || ( mem == 500 )";
String minimizeExpression = "(a)+(b)+(c)";
assertEquals( minimizeExpression, translator.translateToMinimizeLibraryForm( mgExpression ) );
mgExpression = "( os == linux ) OR ( num_procs < 5 ) OR ( mem == 500 )";
assertEquals( mgExpression, translator.translateToBrokerExpressionForm( minimizeExpression ) );
}
public void testTranslateMGMinimize7() throws Exception {
String mgExpression = "( ( ( os == linux ) AND ( num_procs < 5 ) ) || ( mem == 500 ) )";
String minimizeExpression = "(((a)*(b))+(c))";
assertEquals( minimizeExpression, translator.translateToMinimizeLibraryForm( mgExpression ) );
mgExpression = "( ( ( os == linux ) AND ( num_procs < 5 ) ) OR ( mem == 500 ) )";
assertEquals( mgExpression, translator.translateToBrokerExpressionForm( minimizeExpression ) );
}
// testes with not operator
public void testTranslateMGMinimize8() throws Exception {
String mgExpression = "NOT ( os == linux )";
String minimizeExpression = "(a)'";
assertEquals( minimizeExpression, translator.translateToMinimizeLibraryForm( mgExpression ) );
assertEquals( mgExpression, translator.translateToBrokerExpressionForm( minimizeExpression ) );
mgExpression = "! ( os == linux )";
assertEquals( minimizeExpression, translator.translateToMinimizeLibraryForm( mgExpression ) );
}
public void testTranslateMGMinimize9() throws Exception {
String mgExpression = "NOT ( os == linux AND ( mem == 500 ) )";
String minimizeExpression = "(a*(b))'";
assertEquals( minimizeExpression, translator.translateToMinimizeLibraryForm( mgExpression ) );
assertEquals( mgExpression, translator.translateToBrokerExpressionForm( minimizeExpression ) );
mgExpression = "NOT ( os == linux && mem == 500 )";
minimizeExpression = "(a*b)'";
assertEquals( minimizeExpression, translator.translateToMinimizeLibraryForm( mgExpression ) );
mgExpression = "NOT ( os == linux AND mem == 500 )";
assertEquals( mgExpression, translator.translateToBrokerExpressionForm( minimizeExpression ) );
}
public void testTranslateMGMinimize10() throws Exception {
String mgExpression = "num_procs < 10 OR ! ( os == linux && ( mem == 500 ) ) ";
String minimizeExpression = "a+(b*(c))'";
assertEquals( minimizeExpression, translator.translateToMinimizeLibraryForm( mgExpression ) );
mgExpression = "num_procs < 10 OR NOT ( os == linux AND ( mem == 500 ) )";
assertEquals( mgExpression, translator.translateToBrokerExpressionForm( minimizeExpression ) );
}
public void testTranslateMGMinimize11() throws Exception {
String mgExpression = "NOT ( num_procs < 10 OR ! ( os == linux && ( mem == 500 ) ) )";
String minimizeExpression = "(a+(b*(c))')'";
assertEquals( minimizeExpression, translator.translateToMinimizeLibraryForm( mgExpression ) );
mgExpression = "NOT ( num_procs < 10 OR NOT ( os == linux AND ( mem == 500 ) ) )";
assertEquals( mgExpression, translator.translateToBrokerExpressionForm( minimizeExpression ) );
}
public void testTranslateMGMinimize12() throws Exception {
String mgExpression = "NOT num_procs < 10";
String minimizeExpression = "a'";
assertEquals( minimizeExpression, translator.translateToMinimizeLibraryForm( mgExpression ) );
assertEquals( mgExpression, translator.translateToBrokerExpressionForm( minimizeExpression ) );
}
public void testTranslateMGMinimize13() throws Exception {
String mgExpression = "NOT ( NOT num_procs < 10 )";
String minimizeExpression = "(a')'";
assertEquals( minimizeExpression, translator.translateToMinimizeLibraryForm( mgExpression ) );
assertEquals( mgExpression, translator.translateToBrokerExpressionForm( minimizeExpression ) );
}
public void testTranslateMGMinimize14() throws Exception {
String mgExpression = "( NOT num_procs < 10 )";
String minimizeExpression = "(a')";
assertEquals( minimizeExpression, translator.translateToMinimizeLibraryForm( mgExpression ) );
assertEquals( mgExpression, translator.translateToBrokerExpressionForm( minimizeExpression ) );
}
public void testTranslateMGMinimize15() throws Exception {
String mgExpression = "NOT c < d || NOT ( a == b OR NOT num_procs < 10 )";
String minimizeExpression = "a'+(b+c')'";
assertEquals( minimizeExpression, translator.translateToMinimizeLibraryForm( mgExpression ) );
mgExpression = "NOT c < d OR NOT ( a == b OR NOT num_procs < 10 )";
assertEquals( mgExpression, translator.translateToBrokerExpressionForm( minimizeExpression ) );
}
public void testTranslateMGMInimize16() throws Exception {
String mgExpression = "os == linux AND os == linux";
String minimizeExpression = "a*a";
assertEquals( minimizeExpression, translator.translateToMinimizeLibraryForm( mgExpression ) );
assertEquals( mgExpression, translator.translateToBrokerExpressionForm( minimizeExpression ) );
}
public void testTranslateMGMInimize17() throws Exception {
String mgExpression = "NOT os == linux AND os == linux";
String minimizeExpression = "a'*a";
assertEquals( minimizeExpression, translator.translateToMinimizeLibraryForm( mgExpression ) );
assertEquals( mgExpression, translator.translateToBrokerExpressionForm( minimizeExpression ) );
}
public void testTranslateBothWithMoreThan25DifferentExpressions() throws Exception {
String mgExpression = "";
String minimizeExpression = "";
int init = 'a';
for ( int k = 0; k < 26; k++ ) {
mgExpression += "ram == " + k + "0 AND ";
minimizeExpression += (char) (init + k) + "*";
}
init = 'A';
int k = 0;
for ( k = 0; k <= 9; k++ ) {
mgExpression += "memory == " + k + "0 AND ";
minimizeExpression += (char) (init + k) + "*";
}
mgExpression += "os == windows";
minimizeExpression += (char) (init + k);
assertEquals( minimizeExpression, translator.translateToMinimizeLibraryForm( mgExpression ) );
assertEquals( mgExpression, translator.translateToBrokerExpressionForm( minimizeExpression ) );
}
public void testTranslateBothWIthMoreThan46DifferentExpressions() throws Exception {
String mgExpression = "";
String minimizeExpression = "";
int init = 'a';
for ( int k = 0; k < 26; k++ ) {
mgExpression += "ram == " + k + "0 AND ";
minimizeExpression += (char) (init + k) + "*";
}
init = 'A';
int k = 0;
for ( k = 0; k < 27; k++ ) {
mgExpression += "memory == " + k + "0 AND ";
minimizeExpression += (char) (init + k) + "*";
}
try {
assertEquals( minimizeExpression, translator.translateToMinimizeLibraryForm( mgExpression ) );
fail( "An exception should be thrown here." );
} catch ( Exception e ) {
System.out.println( "Exception expected: " + e );
}
}
public void testTranslateToMGWithouTranslateToMinimizeFirst() {
String mgExpression = "NOT os == linux AND os == linux";
String minimizeExpression = "a'*a";
try {
assertEquals( mgExpression, translator.translateToBrokerExpressionForm( minimizeExpression ) );
fail( "An exception should be thrown here." );
} catch ( InvalidExpressionException ite ) {
System.out.println( "Exception expected: " + ite );
}
}
public void testTranslateToMGWithWrongExpression() throws Exception {
String mgExpression = "NOT os == linux AND os == linux";
translator.translateToMinimizeLibraryForm( mgExpression );
try {
// The original translation must return only one variable ("a")
String minimizeExpression = "a'*b";
translator.translateToBrokerExpressionForm( minimizeExpression );
fail( "An exception should be thrown here." );
} catch ( InvalidExpressionException ite ) {
System.out.println( "Exception expected: " + ite );
}
}
public void testEmptyExpression() throws InvalidExpressionException {
assertEquals( "", translator.translateToMinimizeLibraryForm( "" ) );
assertEquals( "", translator.translateToBrokerExpressionForm( "" ) );
}
public void testTheStrangeAndOperator() throws InvalidExpressionException {
String mgExpression = "NOT os == linux AND os == windows";
// bellow we get two variable expression ( a->os==linux and
// b->os==windows)
translator.translateToMinimizeLibraryForm( mgExpression );
String minimizeExpression = "ab";
mgExpression = "os == linux AND os == windows";
assertEquals( mgExpression, translator.translateToBrokerExpressionForm( minimizeExpression ) );
minimizeExpression = "a'b";
mgExpression = "NOT os == linux AND os == windows";
assertEquals( mgExpression, translator.translateToBrokerExpressionForm( minimizeExpression ) );
minimizeExpression = "a(b)";
mgExpression = "os == linux AND ( os == windows )";
assertEquals( mgExpression, translator.translateToBrokerExpressionForm( minimizeExpression ) );
minimizeExpression = "a((b))";
mgExpression = "os == linux AND ( ( os == windows ) )";
assertEquals( mgExpression, translator.translateToBrokerExpressionForm( minimizeExpression ) );
minimizeExpression = "a'((b))";
mgExpression = "NOT os == linux AND ( ( os == windows ) )";
assertEquals( mgExpression, translator.translateToBrokerExpressionForm( minimizeExpression ) );
minimizeExpression = "(a)b";
mgExpression = "( os == linux ) AND os == windows";
assertEquals( mgExpression, translator.translateToBrokerExpressionForm( minimizeExpression ) );
minimizeExpression = "a*ba";
mgExpression = "os == linux AND os == windows AND os == linux";
assertEquals( mgExpression, translator.translateToBrokerExpressionForm( minimizeExpression ) );
}
public void testNotAtMidle() throws InvalidExpressionException {
String mgExpression = "NOT os == linux AND os == windows";
// bellow we get two variable expression ( a->os==linux and
// b->os==windows)
translator.translateToMinimizeLibraryForm( mgExpression );
String minimizeExpression = "ab'";
mgExpression = "os == linux AND NOT os == windows";
assertEquals( mgExpression, translator.translateToBrokerExpressionForm( minimizeExpression ) );
}
}