use of com.google.devtools.build.skyframe.GraphTester.StringValue in project bazel by bazelbuild.
the class MemoizingEvaluatorTest method removedNodeComesBack.
private void removedNodeComesBack() throws Exception {
SkyKey top = GraphTester.skyKey("top");
SkyKey mid = GraphTester.skyKey("mid");
SkyKey leaf = GraphTester.skyKey("leaf");
// When top depends on mid, which depends on leaf,
tester.getOrCreate(top).addDependency(mid).setComputedValue(CONCATENATE);
tester.getOrCreate(mid).addDependency(leaf).setComputedValue(CONCATENATE);
StringValue leafValue = new StringValue("leaf");
tester.set(leaf, leafValue);
// Then when top is evaluated, its value is as expected.
assertThat(tester.evalAndGet(/*keepGoing=*/
true, top)).isEqualTo(leafValue);
// When top is changed to no longer depend on mid,
StringValue topValue = new StringValue("top");
tester.getOrCreate(top, /*markAsModified=*/
true).removeDependency(mid).setComputedValue(null).setConstantValue(topValue);
// And leaf is invalidated,
tester.getOrCreate(leaf, /*markAsModified=*/
true);
// Then when top is evaluated, its value is as expected,
tester.invalidate();
assertThat(tester.evalAndGet(/*keepGoing=*/
true, top)).isEqualTo(topValue);
// And there is no value for mid in the graph,
assertThat(tester.driver.getExistingValueForTesting(mid)).isNull();
assertThat(tester.driver.getExistingErrorForTesting(mid)).isNull();
// Or for leaf.
assertThat(tester.driver.getExistingValueForTesting(leaf)).isNull();
assertThat(tester.driver.getExistingErrorForTesting(leaf)).isNull();
// When top is changed to depend directly on leaf,
tester.getOrCreate(top, /*markAsModified=*/
true).addDependency(leaf).setConstantValue(null).setComputedValue(CONCATENATE);
// Then when top is evaluated, its value is as expected,
tester.invalidate();
assertThat(tester.evalAndGet(/*keepGoing=*/
true, top)).isEqualTo(leafValue);
// and there is no value for mid in the graph,
assertThat(tester.driver.getExistingValueForTesting(mid)).isNull();
assertThat(tester.driver.getExistingErrorForTesting(mid)).isNull();
}
use of com.google.devtools.build.skyframe.GraphTester.StringValue in project bazel by bazelbuild.
the class MemoizingEvaluatorTest method errorOnlyBubblesToRequestingParents.
/**
* Make sure that when an error is thrown, it is given for handling only to parents that have
* already registered a dependence on the value that threw the error.
*
* <pre>
* topBubbleKey topErrorFirstKey
* | \ /
* midKey errorKey
* |
* slowKey
* </pre>
*
* On the second build, errorKey throws, and the threadpool aborts before midKey finishes.
* topBubbleKey therefore has not yet requested errorKey this build. If errorKey bubbles up to it,
* topBubbleKey must be able to handle that. (The evaluator can deal with this either by not
* allowing errorKey to bubble up to topBubbleKey, or by dealing with that case.)
*/
@Test
public void errorOnlyBubblesToRequestingParents() throws Exception {
// We need control over the order of reverse deps, so use a deterministic graph.
makeGraphDeterministic();
SkyKey errorKey = GraphTester.toSkyKey("error");
tester.set(errorKey, new StringValue("biding time"));
SkyKey slowKey = GraphTester.toSkyKey("slow");
tester.set(slowKey, new StringValue("slow"));
SkyKey midKey = GraphTester.toSkyKey("mid");
tester.getOrCreate(midKey).addDependency(slowKey).setComputedValue(COPY);
SkyKey topErrorFirstKey = GraphTester.toSkyKey("2nd top alphabetically");
tester.getOrCreate(topErrorFirstKey).addDependency(errorKey).setComputedValue(CONCATENATE);
SkyKey topBubbleKey = GraphTester.toSkyKey("1st top alphabetically");
tester.getOrCreate(topBubbleKey).addDependency(midKey).addDependency(errorKey).setComputedValue(CONCATENATE);
// First error-free evaluation, to put all values in graph.
EvaluationResult<StringValue> result = tester.eval(/*keepGoing=*/
false, topErrorFirstKey, topBubbleKey);
assertEquals("biding time", result.get(topErrorFirstKey).getValue());
assertEquals("slowbiding time", result.get(topBubbleKey).getValue());
// Set up timing of child values: slowKey waits to finish until errorKey has thrown an
// exception that has been caught by the threadpool.
tester.set(slowKey, null);
CountDownLatch errorFinish = new CountDownLatch(1);
tester.set(errorKey, null);
tester.getOrCreate(errorKey).setBuilder(new ChainedFunction(/*notifyStart=*/
null, /*waitToFinish=*/
null, /*notifyFinish=*/
errorFinish, /*waitForException=*/
false, /*value=*/
null, /*deps=*/
ImmutableList.<SkyKey>of()));
tester.getOrCreate(slowKey).setBuilder(new ChainedFunction(/*notifyStart=*/
null, /*waitToFinish=*/
errorFinish, /*notifyFinish=*/
null, /*waitForException=*/
true, new StringValue("leaf2"), /*deps=*/
ImmutableList.<SkyKey>of()));
tester.invalidate();
// errorKey finishes, written to graph -> slowKey maybe starts+finishes & (Visitor aborts)
// -> some top key builds.
result = tester.eval(/*keepGoing=*/
false, topErrorFirstKey, topBubbleKey);
assertTrue(result.hasError());
assertWithMessage(result.toString()).that(result.getError(topErrorFirstKey)).isNotNull();
}
use of com.google.devtools.build.skyframe.GraphTester.StringValue in project bazel by bazelbuild.
the class ParallelEvaluatorTest method unexpectedErrorDepOneLevelDown.
private void unexpectedErrorDepOneLevelDown(final boolean keepGoing) throws Exception {
graph = new InMemoryGraphImpl();
SkyKey errorKey = GraphTester.toSkyKey("my_error_value");
final SomeErrorException exception = new SomeErrorException("error exception");
final SomeErrorException topException = new SomeErrorException("top exception");
final StringValue topValue = new StringValue("top");
tester.getOrCreate(errorKey).setBuilder(new SkyFunction() {
@Override
public SkyValue compute(SkyKey skyKey, Environment env) throws GenericFunctionException {
throw new GenericFunctionException(exception, Transience.PERSISTENT);
}
@Override
public String extractTag(SkyKey skyKey) {
throw new UnsupportedOperationException();
}
});
SkyKey topKey = GraphTester.toSkyKey("top");
final SkyKey parentKey = GraphTester.toSkyKey("parent");
tester.getOrCreate(parentKey).addDependency(errorKey).setComputedValue(CONCATENATE);
tester.getOrCreate(topKey).setBuilder(new SkyFunction() {
@Override
public SkyValue compute(SkyKey skyKey, Environment env) throws GenericFunctionException, InterruptedException {
try {
if (env.getValueOrThrow(parentKey, SomeErrorException.class) == null) {
return null;
}
} catch (SomeErrorException e) {
assertEquals(e.toString(), exception, e);
}
if (keepGoing) {
return topValue;
} else {
throw new GenericFunctionException(topException, Transience.PERSISTENT);
}
}
@Override
public String extractTag(SkyKey skyKey) {
throw new UnsupportedOperationException();
}
});
tester.getOrCreate(topKey).addErrorDependency(errorKey, new StringValue("recovered")).setComputedValue(CONCATENATE);
EvaluationResult<StringValue> result = eval(keepGoing, ImmutableList.of(topKey));
if (!keepGoing) {
assertThat(result.keyNames()).isEmpty();
assertEquals(topException, result.getError(topKey).getException());
assertThat(result.getError(topKey).getRootCauses()).containsExactly(topKey);
assertThatEvaluationResult(result).hasError();
} else {
assertThatEvaluationResult(result).hasNoError();
assertSame(topValue, result.get(topKey));
}
}
use of com.google.devtools.build.skyframe.GraphTester.StringValue in project bazel by bazelbuild.
the class ParallelEvaluatorTest method cycleWithTail.
@Test
public void cycleWithTail() throws Exception {
graph = new InMemoryGraphImpl();
SkyKey aKey = GraphTester.toSkyKey("a");
SkyKey bKey = GraphTester.toSkyKey("b");
SkyKey cKey = GraphTester.toSkyKey("c");
SkyKey topKey = GraphTester.toSkyKey("top");
tester.getOrCreate(topKey).addDependency(aKey).addDependency(cKey);
tester.getOrCreate(aKey).addDependency(bKey);
tester.getOrCreate(bKey).addDependency(aKey).addDependency(cKey);
tester.getOrCreate(cKey);
tester.set(cKey, new StringValue("cValue"));
EvaluationResult<StringValue> result = eval(false, ImmutableList.of(topKey));
assertEquals(null, result.get(topKey));
ErrorInfo errorInfo = result.getError(topKey);
CycleInfo cycleInfo = Iterables.getOnlyElement(errorInfo.getCycleInfo());
assertThat(cycleInfo.getCycle()).containsExactly(aKey, bKey).inOrder();
assertThat(cycleInfo.getPathToCycle()).containsExactly(topKey).inOrder();
}
use of com.google.devtools.build.skyframe.GraphTester.StringValue in project bazel by bazelbuild.
the class ParallelEvaluatorTest method errorBubblesToParentsOfTopLevelValue.
@Test
public void errorBubblesToParentsOfTopLevelValue() throws Exception {
graph = new InMemoryGraphImpl();
SkyKey parentKey = GraphTester.toSkyKey("parent");
final SkyKey errorKey = GraphTester.toSkyKey("error");
final CountDownLatch latch = new CountDownLatch(1);
tester.getOrCreate(errorKey).setBuilder(new ChainedFunction(null, /*waitToFinish=*/
latch, null, false, /*value=*/
null, ImmutableList.<SkyKey>of()));
tester.getOrCreate(parentKey).setBuilder(new ChainedFunction(/*notifyStart=*/
latch, null, null, false, new StringValue("unused"), ImmutableList.of(errorKey)));
EvaluationResult<StringValue> result = eval(/*keepGoing=*/
false, ImmutableList.of(parentKey, errorKey));
assertEquals(result.toString(), 2, result.errorMap().size());
}
Aggregations