/*
* Licensed to the Apache Software Foundation (ASF) under one
* or more contributor license agreements. See the NOTICE file
* distributed with this work for additional information
* regarding copyright ownership. The ASF licenses this file
* to you 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.apache.giraph.examples;
import static org.apache.giraph.examples.BrachaTouegDeadlockComputation.BRACHA_TOUEG_DL_INITIATOR_ID;
import java.util.Iterator;
import org.apache.giraph.conf.GiraphConfiguration;
import org.apache.giraph.examples.io.formats.BrachaTouegDeadlockInputFormat;
import org.apache.giraph.io.formats.IdWithValueTextOutputFormat;
import org.apache.giraph.utils.InternalVertexRunner;
import org.junit.Before;
import org.junit.Ignore;
import org.junit.Test;
/**
* Tests for {@link BrachaTouegDeadlockComputation}
*/
public class BrachaTouegDeadlockComputationTest {
/** Giraph shared configuration */
GiraphConfiguration conf = new GiraphConfiguration();
@Before
public void prepareConf() {
this.conf.setComputationClass(BrachaTouegDeadlockComputation.class);
this.conf.setVertexInputFormatClass(BrachaTouegDeadlockInputFormat.class);
this.conf.setVertexOutputFormatClass(IdWithValueTextOutputFormat.class);
}
@Test
public void testEmptyGraph() throws Exception {
Iterable<String> results;
Iterator<String> result;
String[] graph = {};
results = InternalVertexRunner.run(this.conf, graph);
assert results != null;
result = results.iterator();
assert !result.hasNext();
}
@Test
public void testOneInitNodeGraph() throws Exception {
Iterable<String> results;
String[] graph = { "[1,[]]" };
String[] expected = { "1\tisFree=true" };
results = InternalVertexRunner.run(this.conf, graph);
checkResults(results, expected);
}
@Test
public void testOneNotInitNodeGraph() throws Exception {
Iterable<String> results;
String[] graph = { "[0,[]]" };
String[] expected = { "0\tisFree=false" };
results = InternalVertexRunner.run(this.conf, graph);
checkResults(results, expected);
}
@Test
public void testThreeNodesAllNodesFreeGraph() throws Exception {
Iterable<String> results;
String[] graph = {
"[1,[]]",
"[2,[[1,0]]]",
"[3,[[1,0]]]"
};
String[] expected = {
"1\tisFree=true",
"2\tisFree=false",
"3\tisFree=false"
};
results = InternalVertexRunner.run(this.conf, graph);
checkResults(results, expected);
}
@Test
public void testThreeNodesAllNodesBlockedGraph() throws Exception {
Iterable<String> results;
String[] graph = {
"[1,[[2,0]]]",
"[2,[[3,0]]]",
"[3,[[1,0]]]"
};
String[] expected = {
"1\tisFree=false",
"2\tisFree=false",
"3\tisFree=false"
};
results = InternalVertexRunner.run(this.conf, graph);
checkResults(results, expected);
}
@Test
public void testThreeNodesAllNodesFreeMultiEdgesGraph() throws Exception {
Iterable<String> results;
String[] graph = {
"[1,[[2,0],[3,1]]]",
"[2,[]]",
"[3,[]]"
};
String[] expected = {
"1\tisFree=true",
"2\tisFree=true",
"3\tisFree=true"
};
results = InternalVertexRunner.run(this.conf, graph);
checkResults(results, expected);
}
@Test
public void testThreeNodesAllNodesFreeNOutOfMGraph() throws Exception {
Iterable<String> results;
String[] graph = {
"[1,[[2,0],[3,0]]]",
"[2,[]]",
"[3,[]]"
};
String[] expected = {
"1\tisFree=true",
"2\tisFree=true",
"3\tisFree=true"
};
results = InternalVertexRunner.run(this.conf, graph);
checkResults(results, expected);
}
@Test
public void testThreeNodesInitNodeFreeNOutOfMGraph() throws Exception {
Iterable<String> results;
String[] graph = {
"[1,[[2,0],[3,0]]]",
"[2,[]]",
"[3,[]]"
};
String[] expected = {
"1\tisFree=false",
"2\tisFree=true",
"3\tisFree=false"
};
BRACHA_TOUEG_DL_INITIATOR_ID.set(this.conf, 2);
results = InternalVertexRunner.run(this.conf, graph);
checkResults(results, expected);
BRACHA_TOUEG_DL_INITIATOR_ID.set(this.conf, 1);
}
@Test
public void testThreeNodesAllNodesBlockedNOutOfMGraph() throws Exception {
Iterable<String> results;
String[] graph = {
"[1,[[2,0],[3,0]]]",
"[2,[[3,0]]]",
"[3,[[2,0]]]"
};
String[] expected = {
"1\tisFree=false",
"2\tisFree=false",
"3\tisFree=false"
};
results = InternalVertexRunner.run(this.conf, graph);
checkResults(results, expected);
}
@Test
public void testFiveNodesAllNodesFreeNOutOfMGraph() throws Exception {
Iterable<String> results;
String[] graph = {
"[1,[[2,0], [5,0]]]",
"[2,[[4,0]]]",
"[3,[[2,0], [5,0]]]",
"[4,[[1,0], [5,1], [3,2]]]",
"[5,[]]"
};
String[] expected = {
"1\tisFree=true",
"2\tisFree=true",
"3\tisFree=true",
"4\tisFree=true",
"5\tisFree=true"
};
results = InternalVertexRunner.run(this.conf, graph);
checkResults(results, expected);
}
@Test
public void testFiveNodesAllNodesBlockedNOutOfMGraph() throws Exception {
Iterable<String> results;
String[] graph = {
"[1,[[2,0], [5,0]]]",
"[2,[[4,0]]]",
"[3,[[2,0], [5,0]]]",
"[4,[[1,0], [5,1], [3,1]]]",
"[5,[]]"
};
String[] expected = {
"1\tisFree=false",
"2\tisFree=false",
"3\tisFree=false",
"4\tisFree=false",
"5\tisFree=true"
};
results = InternalVertexRunner.run(this.conf, graph);
checkResults(results, expected);
}
/**
* Internal checker to verify the correctness of the tests.
* @param results the actual results obtaind
* @param expected expected results
*/
private void checkResults(Iterable<String> results, String[] expected) {
Iterator<String> result = results.iterator();
assert results != null;
while(result.hasNext()) {
String resultStr = result.next();
boolean found = false;
for (int j = 0; j < expected.length; ++j) {
if (expected[j].equals(resultStr)) {
found = true;
}
}
assert found;
}
}
}