Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
49 commits
Select commit Hold shift + click to select a range
252df22
Add domain name fuzzing to many tests
labkey-tchad Aug 12, 2025
7aa58af
Merge remote-tracking branch 'origin/develop' into fb_moreDomainNameF…
labkey-tchad Aug 13, 2025
17b993e
Merge remote-tracking branch 'origin/develop' into fb_moreDomainNameF…
labkey-tchad Aug 13, 2025
27fd866
Merge remote-tracking branch 'origin/develop' into fb_moreDomainNameF…
labkey-tchad Aug 14, 2025
40d5d44
Merge remote-tracking branch 'origin/develop' into fb_moreDomainNameF…
labkey-tchad Aug 15, 2025
8e8b93b
Fuzzing fixes
labkey-tchad Aug 15, 2025
5dbd168
Merge remote-tracking branch 'origin/develop' into fb_moreDomainNameF…
labkey-tchad Aug 16, 2025
740149e
More fuzzing fixes
labkey-tchad Aug 16, 2025
1ff3afd
Merge origin/develop into fb_moreDomainNameFuzzing
labkey-tchad Aug 18, 2025
b85fffc
Merge remote-tracking branch 'origin/develop' into fb_moreDomainNameF…
labkey-tchad Aug 18, 2025
b4867b0
Merge remote-tracking branch 'origin/develop' into fb_moreDomainNameF…
labkey-tchad Aug 18, 2025
6286411
Fix URL encoding of pipeline job notifications
labkey-tchad Aug 19, 2025
57991b1
Merge remote-tracking branch 'origin/develop' into fb_moreDomainNameF…
labkey-tchad Aug 19, 2025
b36375e
More test fixes
labkey-tchad Aug 19, 2025
28b5c62
Fix build
labkey-tchad Aug 20, 2025
3b6dd5a
Minor fix
labkey-tchad Aug 20, 2025
debaf2a
Pager fix
labkey-tchad Aug 20, 2025
7b87a42
Merge remote-tracking branch 'origin/develop' into fb_moreDomainNameF…
labkey-tchad Aug 20, 2025
a355ea7
Better fix for encoding
labkey-tchad Aug 20, 2025
7e4e8c6
Remove selenium.By usages
labkey-tchad Aug 20, 2025
805f62e
Adjust wait
labkey-tchad Aug 20, 2025
430b04c
Comment
labkey-tchad Aug 20, 2025
f037db3
Fix EOF
labkey-tchad Aug 20, 2025
df7b873
Fix comments
labkey-tchad Aug 20, 2025
98be47f
Merge remote-tracking branch 'origin/develop' into fb_lkbDomainFuzzing
labkey-tchad Aug 21, 2025
e3e1e89
TestDataUtils enhancements
labkey-tchad Aug 21, 2025
df70250
More LKB fuzzing
labkey-tchad Aug 22, 2025
c6b9630
More fuzzing fixes
labkey-tchad Aug 22, 2025
dd15f8a
Merge origin/develop into fb_lkbDomainFuzzing
labkey-tchad Aug 25, 2025
0b8bbcb
Share app resource path encoder
labkey-tchad Aug 25, 2025
0473518
Fix expected file names
labkey-tchad Aug 25, 2025
5c834b7
Merge remote-tracking branch 'origin/develop' into fb_lkbDomainFuzzing
labkey-tchad Aug 26, 2025
0848b8e
fuzzing fixes
labkey-tchad Aug 26, 2025
964d3f0
More fixes
labkey-tchad Aug 27, 2025
f0f4996
Merge remote-tracking branch 'origin/develop' into fb_lkbDomainFuzzing
labkey-tchad Aug 28, 2025
5725963
Merge remote-tracking branch 'origin/develop' into fb_lkbDomainFuzzing
labkey-tchad Aug 28, 2025
f156c5b
More fuzzing fixes and SchemaKey helper
labkey-tchad Aug 28, 2025
449c028
Fix fieldkey empty parent
labkey-tchad Aug 29, 2025
ef6d97f
Merge remote-tracking branch 'origin/develop' into fb_lkbDomainFuzzing
labkey-tchad Aug 29, 2025
5d7bebe
Merge origin/develop into fb_lkbDomainFuzzing
labkey-tchad Sep 2, 2025
e24a995
Merge origin/develop into fb_lkbDomainFuzzing
labkey-tchad Sep 3, 2025
c3442b2
Fix some file references
labkey-tchad Sep 4, 2025
ddeddab
Merge origin/develop into fb_lkbDomainFuzzing
labkey-tchad Sep 5, 2025
80f5c8f
Small fixes
labkey-tchad Sep 5, 2025
d24aac9
Don't capitalize
labkey-tchad Sep 5, 2025
81f5f36
Merge remote-tracking branch 'origin/develop' into fb_lkbDomainFuzzing
labkey-tchad Sep 8, 2025
7facef1
Log temp files found
labkey-tchad Sep 8, 2025
d85bcf8
Merge origin/develop into fb_lkbDomainFuzzing
labkey-tchad Sep 9, 2025
e4603e3
Merge origin/develop into fb_lkbDomainFuzzing
labkey-tchad Sep 10, 2025
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
52 changes: 32 additions & 20 deletions src/org/labkey/test/BaseWebDriverTest.java
Original file line number Diff line number Diff line change
Expand Up @@ -67,6 +67,7 @@
import org.labkey.test.params.ContainerInfo;
import org.labkey.test.params.FieldDefinition;
import org.labkey.test.params.FieldKey;
import org.labkey.test.params.SchemaKey;
import org.labkey.test.teamcity.TeamCityUtils;
import org.labkey.test.util.APIAssayHelper;
import org.labkey.test.util.APIContainerHelper;
Expand Down Expand Up @@ -140,6 +141,7 @@
import java.util.Date;
import java.util.HashMap;
import java.util.HashSet;
import java.util.Iterator;
import java.util.List;
import java.util.Map;
import java.util.Objects;
Expand Down Expand Up @@ -2187,32 +2189,38 @@ public void searchFor(final String projectName, String searchFor, final Integer
assertTextPresent(searchFor);
}
}
public void selectSchema(String schemaName)

/**
* @param schemaKey encoded schema key
*/
public void selectSchema(String schemaKey)
{
String[] schemaParts = schemaName.split("\\.");
selectSchema(schemaParts);
selectSchema(SchemaKey.parse(schemaKey));
}
// Helper methods for interacting with the query schema browser

public void selectSchema(String[] schemaParts)
{
StringBuilder schemaWithParents = new StringBuilder();
String separator = "";
for (String schemaPart : schemaParts)
selectSchema(SchemaKey.fromParts(schemaParts));
}

public void selectSchema(SchemaKey schemaKey)
{
Iterator<SchemaKey> iterator = schemaKey.getIterator();
while (iterator.hasNext())
{
schemaWithParents.append(separator).append(schemaPart);
separator = ".";
schemaKey = iterator.next();

Locator.XPathLocator loc = Locator.tag("tr").withClass("x4-grid-row").append("/td/div/span").withText(schemaPart).precedingSibling("img").withClass("x4-tree-icon");
Locator.XPathLocator loc = Locator.tag("tr").withClass("x4-grid-row").append("/td/div/span").withText(schemaKey.getName()).precedingSibling("img").withClass("x4-tree-icon");

//first load of schemas might a few seconds
shortWait().until(ExpectedConditions.elementToBeClickable(loc));
Locator.XPathLocator selectedSchema = Locator.xpath("//tr").withClass("x4-grid-row-selected").append("/td/div/span").withText(schemaPart);
Locator.XPathLocator selectedSchema = Locator.xpath("//tr").withClass("x4-grid-row-selected").append("/td/div/span").withText(schemaKey.getName());

if (getDriver().getCurrentUrl().endsWith("schemaName=" + schemaPart))
if (getDriver().getCurrentUrl().endsWith("schemaName=" + EscapeUtil.encode(schemaKey.toString())))
waitForElement(selectedSchema);
if (isElementPresent(selectedSchema))
continue; // already selected
log("Selecting schema " + schemaWithParents + " in the schema browser...");
log("Selecting schema " + schemaKey.getFullName() + " in the schema browser...");
waitForElementToDisappear(Locator.xpath("//tbody[starts-with(@id, 'treeview')]/tr[not(starts-with(@id, 'treeview'))]"));
// select/expand tree node
try
Expand Down Expand Up @@ -2243,19 +2251,23 @@ public void selectSchema(String[] schemaParts)

public void selectQuery(String schemaName, String queryName)
{
selectQuery(schemaName.split("\\."), queryName);
selectQuery(SchemaKey.parse(schemaName), queryName);
}

public void selectQuery(String[] schemaParts, String queryName)
{
selectQuery(SchemaKey.fromParts(schemaParts), queryName);
}

public void selectQuery(String[] schemaPart, String queryName)
public void selectQuery(SchemaKey schemaKey, String queryName)
{
String schemaName = StringUtils.join(schemaPart, ".");
log("Selecting query " + schemaName + "." + queryName + " in the schema browser...");
selectSchema(schemaPart);
log("Selecting query " + schemaKey.getFullName() + "." + queryName + " in the schema browser...");
selectSchema(schemaKey);
mouseOver(Locator.byClass(".x4-tab-button")); // Move away from schema tree to dismiss tooltip
waitAndClick(Ext4Helper.Locators.tab(schemaName)); // Click schema tab to make sure query list is visible
waitAndClick(Ext4Helper.Locators.tab(schemaKey.getFullName())); // Click schema tab to make sure query list is visible
WebElement queryLink = Locator.tagWithClass("table", "lk-qd-coltable").append(Locator.tagWithClass("span", "labkey-link")).withText(queryName).notHidden().waitForElement(getDriver(), WAIT_FOR_JAVASCRIPT);
queryLink.click();
waitForElement(Locator.tagWithClass("div", "lk-qd-name").startsWith(schemaName + "." + queryName), 30000);
waitForElement(Locator.tagWithClass("div", "lk-qd-name").startsWith(schemaKey.getFullName() + "." + queryName), 30000);
}

public DataRegionTable viewQueryData(String schemaName, String queryName)
Expand Down
8 changes: 7 additions & 1 deletion src/org/labkey/test/WebDriverWrapper.java
Original file line number Diff line number Diff line change
Expand Up @@ -2462,11 +2462,17 @@ public static File[] getNewFiles(int minFileCount, File downloadDir, @Nullable F
},
"File(s) did not appear in download dir: " + downloadDir.toString(), WAIT_FOR_PAGE);

List<File> tempFiles = new ArrayList<>();
waitFor(() -> {
final File[] files = downloadDir.listFiles(tempFilesFilter);
tempFiles.clear();
if (files != null)
{
tempFiles.addAll(Arrays.asList(files));
}
return files != null && files.length == 0;
},
"Temp files remain in download dir: " + downloadDir, WAIT_FOR_PAGE);
() -> "Temp files remain in download dir: " + downloadDir + ": " + tempFiles.stream().map(File::getName).collect(Collectors.joining(", ")), WAIT_FOR_PAGE);

MutableInt downloadSize = new MutableInt(-1);
MutableInt stabilityDuration = new MutableInt(0);
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -83,6 +83,7 @@ public EntityBulkUpdateDialog setEditableState(CharSequence fieldIdentifier, boo
toggle.set(enable);
if (enable) _changeCounter++;
else _changeCounter--;
getWrapper().mouseOut(); // Toggle is dangerously close to field info tooltip
}
return this;
}
Expand Down Expand Up @@ -335,7 +336,7 @@ public List<String> getFieldNames()
List<WebElement> labels = Locator.tagWithClass("label", "control-label").withAttribute("for")
.waitForElements(elementCache(), 2_000);

return labels.stream().map(a -> FieldKey.fromFieldKey(a.getDomAttribute("for")).getName()).toList();
return labels.stream().map(a -> FieldKey.fromFieldKey(a.getDomAttribute("for")).getFullName()).toList();
}

public EntityBulkUpdateDialog waitForFieldsToBe(List<String> expectedFieldNames, int waitMilliseconds)
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -170,7 +170,7 @@ public String getLabel()

public String getName()
{
return getFieldKey().getName();
return getFieldKey().getFullName();
}

public int getDomIndex()
Expand All @@ -192,14 +192,7 @@ protected FieldKey fieldKeySupplier()
path = getElement().getDomAttribute("id");
}

if (path != null)
{
return FieldKey.fromFieldKey(path);
}
else
{
return FieldKey.EMPTY;
}
return FieldKey.fromFieldKey(path);
}
}
}
38 changes: 19 additions & 19 deletions src/org/labkey/test/components/ui/grids/FieldSelectionDialog.java
Original file line number Diff line number Diff line change
Expand Up @@ -22,6 +22,7 @@
import java.util.List;
import java.util.stream.Collectors;

import static org.labkey.test.util.TextUtils.normalizeSpace;
import static org.labkey.test.util.selenium.WebElementUtils.getTextContent;

/**
Expand Down Expand Up @@ -180,13 +181,13 @@ public WebElement getAvailableFieldElement(FieldKey fieldKey)
if(iterator.hasNext())
{
// If the field is already expanded don't try to expand it.
if(!isFieldKeyExpanded(elementCache().findAvailableField(fieldKey.toString())))
expandOrCollapseByFieldKey(fieldKey.toString(), true);
if(!isFieldKeyExpanded(elementCache().findAvailableField(fieldKey)))
expandOrCollapseByFieldKey(fieldKey, true);
}

}

return elementCache().findAvailableField(fieldKey.toString());
return elementCache().findAvailableField(fieldKey);
}

/**
Expand All @@ -195,7 +196,7 @@ public WebElement getAvailableFieldElement(FieldKey fieldKey)
* @param fieldKey The data-fieldkey value of the field to expand.
* @param expand True to expand false to collapse.
*/
private void expandOrCollapseByFieldKey(String fieldKey, boolean expand)
private void expandOrCollapseByFieldKey(FieldKey fieldKey, boolean expand)
{

WebElement listItem = elementCache().findAvailableField(fieldKey);
Expand Down Expand Up @@ -433,7 +434,7 @@ public FieldSelectionDialog setFieldLabel(String fieldName, String newFieldLabel
*/
public FieldSelectionDialog setFieldLabel(FieldKey fieldKey, String newFieldLabel)
{
WebElement listItem = elementCache().findSelectedField(fieldKey.toString());
WebElement listItem = elementCache().findSelectedField(fieldKey);
WebElement updateIcon = Locator.tagWithClass("span", "edit-inline-field__toggle").findWhenNeeded(listItem);
updateIcon.click();

Expand All @@ -453,9 +454,9 @@ public FieldSelectionDialog setFieldLabel(FieldKey fieldKey, String newFieldLabe

getWrapper().mouseOver(elementCache().title); // Dismiss tooltip

WebDriverWrapper.waitFor(()->!elementCache().fieldLabelEdit.isDisplayed() &&
elementCache().getListItemElement(elementCache().selectedFieldsPanel, newFieldLabel).isDisplayed(),
WebDriverWrapper.waitFor(()->!elementCache().fieldLabelEdit.isDisplayed(),
String.format("New field label '%s' is not in the list.", newFieldLabel), 500);
Assert.assertEquals("Label after update", normalizeSpace(newFieldLabel), elementCache().getFieldLabel(fieldKey));

return this;
}
Expand Down Expand Up @@ -503,10 +504,10 @@ private List<WebElement> getSelectedListItems(String fieldLabel)
* @param beforeTarget Will the field being moved go before (above) or after (below) the target field.
* @return This dialog.
*/
public FieldSelectionDialog repositionField(String fieldToMove, String targetField, boolean beforeTarget)
public FieldSelectionDialog repositionField(FieldKey fieldToMove, FieldKey targetField, boolean beforeTarget)
{
WebElement elementToMove = elementCache().getListItemElement(elementCache().selectedFieldsPanel, fieldToMove);
WebElement elementTarget = elementCache().getListItemElement(elementCache().selectedFieldsPanel, targetField);
WebElement elementToMove = elementCache().findSelectedField(fieldToMove);
WebElement elementTarget = elementCache().findSelectedField(targetField);

int yBefore = elementToMove.getRect().getY();

Expand Down Expand Up @@ -633,28 +634,27 @@ protected List<WebElement> getListItemElements(WebElement panel, String fieldLab
.findElements(panel);
}

// Will get the first list item that matches the fieldLabel.
protected WebElement getListItemElement(WebElement panel, String fieldLabel)
protected String getFieldLabel(FieldKey fieldKey)
{
return Locator.tagWithClass("div", "list-group-item")
.withDescendant(Locator.tagWithClass("div", "field-caption").withText(fieldLabel))
.findElement(panel);
return Locator.tagWithClass("div", "field-caption")
.findElement(findFieldRow(fieldKey, selectedFieldsPanel))
.getText();
}

protected WebElement findSelectedField(String fieldKey)
protected WebElement findSelectedField(FieldKey fieldKey)
{
return findFieldRow(fieldKey, selectedFieldsPanel);
}

protected WebElement findAvailableField(String fieldKey)
protected WebElement findAvailableField(FieldKey fieldKey)
{
return findFieldRow(fieldKey, availableFieldsPanel);
}

protected WebElement findFieldRow(String fieldKey, WebElement panel)
protected WebElement findFieldRow(FieldKey fieldKey, WebElement panel)
{
return Locator.tagWithClass("div", "list-group-item")
.withAttributeIgnoreCase("data-fieldkey", fieldKey)
.withAttributeIgnoreCase("data-fieldkey", fieldKey.toString())
.findElement(panel);
}

Expand Down
Loading