Skip to content

Commit 3e5dce2

Browse files
committed
Fix bug during registration of generating targets
Fixes a bug where if the generating rule name is lexicographically after the generated rule, changes in the generating rule are not picked up by targets that depend on the generated rule. Test plan: Added unit test demonstrating buggy behavior.
1 parent 2fb7a33 commit 3e5dce2

File tree

2 files changed

+50
-3
lines changed

2 files changed

+50
-3
lines changed

src/main/java/com/bazel_diff/TargetHashingClient.java

Lines changed: 6 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -166,13 +166,16 @@ private Map<String, String> hashAllTargets(byte[] seedHash, Map<String, BazelSou
166166
if (targetName == null) {
167167
continue;
168168
}
169-
if(target.hasGeneratedFile()) {
170-
allRulesMap.put(targetName, allRulesMap.get(target.getGeneratingRuleName()));
171-
}
172169
if(target.hasRule()) {
173170
allRulesMap.put(targetName, target.getRule());
174171
}
175172
}
173+
for (BazelTarget target: allTargets) {
174+
if(target.hasGeneratedFile()) {
175+
allRulesMap.put(getNameForTarget(target), allRulesMap.get(target.getGeneratingRuleName()));
176+
}
177+
}
178+
176179
for (BazelTarget target : allTargets) {
177180
String targetName = getNameForTarget(target);
178181
if (targetName == null) {

test/java/com/bazel_diff/TargetHashingClientImplTests.java

Lines changed: 44 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -122,6 +122,40 @@ public void hashAllBazelTargets_ruleTargets_ruleInputsWithSelfInput() throws IOE
122122
}
123123
}
124124

125+
@Test
126+
public void HashAllBazelTargets_generatedTargets() throws IOException, NoSuchAlgorithmException {
127+
BazelTarget generator = createRuleTarget("rule1", new ArrayList<String>(), "rule1Digest");
128+
BazelTarget target = createGeneratedTarget("rule0", "rule1");
129+
130+
List<String> ruleInputs = new ArrayList<>();
131+
ruleInputs.add("rule0");
132+
BazelTarget rule3 = createRuleTarget("rule3", ruleInputs, "digest");
133+
134+
String oldHash = "";
135+
String newHash = "";
136+
137+
when(bazelClientMock.queryAllTargets()).thenReturn(Arrays.asList(rule3, target, generator));
138+
TargetHashingClientImpl client = new TargetHashingClientImpl(bazelClientMock, filesClientMock);
139+
try {
140+
Map<String, String> hash = client.hashAllBazelTargetsAndSourcefiles(new HashSet<>());
141+
assertEquals(3, hash.size());
142+
oldHash = hash.get("rule3");
143+
} catch (IOException | NoSuchAlgorithmException e) {
144+
fail(e.getMessage());
145+
}
146+
147+
when(generator.getRule().getDigest()).thenReturn("newDigest".getBytes());
148+
try {
149+
Map<String, String> hash = client.hashAllBazelTargetsAndSourcefiles(new HashSet<>());
150+
assertEquals(3, hash.size());
151+
newHash = hash.get("rule3");
152+
} catch (IOException | NoSuchAlgorithmException e) {
153+
fail(e.getMessage());
154+
}
155+
156+
assertNotEquals(oldHash, newHash);
157+
}
158+
125159
private BazelTarget createRuleTarget(String ruleName, List<String> ruleInputs, String ruleDigest) throws NoSuchAlgorithmException {
126160
BazelTarget target = mock(BazelTarget.class);
127161
BazelRule rule = mock(BazelRule.class);
@@ -149,4 +183,14 @@ private BazelSourceFileTarget createSourceFileTarget(String name, String digest)
149183
when(target.getDigest()).thenReturn(digest.getBytes());
150184
return target;
151185
}
186+
187+
private BazelTarget createGeneratedTarget(String name, String generatingRuleName) throws NoSuchAlgorithmException {
188+
BazelTarget target = mock(BazelTarget.class);
189+
when(target.hasRule()).thenReturn(false);
190+
when(target.hasSourceFile()).thenReturn(false);
191+
when(target.hasGeneratedFile()).thenReturn(true);
192+
when(target.getGeneratedFileName()).thenReturn(name);
193+
when(target.getGeneratingRuleName()).thenReturn(generatingRuleName);
194+
return target;
195+
}
152196
}

0 commit comments

Comments
 (0)