GP-6402 Improved project name/path error checking. Added support for

Windows UNC project paths. Refactor of GhidraURL utility methods and URI
use.  Other related cleanup.
This commit is contained in:
ghidra1
2026-02-04 19:21:38 -05:00
parent 0ee235fba7
commit 13bb1e8005
59 changed files with 2260 additions and 1685 deletions

View File

@@ -4,9 +4,9 @@
* Licensed 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.
@@ -237,7 +237,7 @@ public class LaunchUrlInToolTest extends AbstractGhidraHeadedIntegrationTest {
setupDefaultTestTool(project);
URL badUrl = GhidraURL.makeURL(ServerTestUtil.LOCALHOST,
ServerTestUtil.GHIDRA_TEST_SERVER_PORT, REPO_NAME, FOLDER, null, null);
ServerTestUtil.GHIDRA_TEST_SERVER_PORT, REPO_NAME, FOLDER);
ToolServices toolServices = project.getToolServices();
PluginTool tool = toolServices.launchDefaultToolWithURL(badUrl);

View File

@@ -1,128 +0,0 @@
/* ###
* IP: GHIDRA
*
* Licensed 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 ghidra.framework.protocol.ghidra;
import static org.junit.Assert.*;
import java.net.MalformedURLException;
import java.net.URL;
import org.junit.Test;
import generic.test.AbstractGenericTest;
public class DefaultGhidraProtocolConnectorParseTest extends AbstractGenericTest {
static {
Handler.registerHandler();
}
@Test
public void testParseURL() throws Exception {
DefaultGhidraProtocolConnector pp =
new DefaultGhidraProtocolConnector(new URL("ghidra://myhost"));
try {
pp = new DefaultGhidraProtocolConnector(new URL("ghidra://myhost//"));
fail();
}
catch (MalformedURLException e) {
// expected
}
pp = new DefaultGhidraProtocolConnector(new URL("ghidra://myhost/"));
assertNull(pp.getRepositoryName());
assertNull(pp.getFolderPath());
assertNull(pp.getFolderItemName());
assertNull(getInstanceField("itemPath", pp));
pp = new DefaultGhidraProtocolConnector(new URL("ghidra://myhost/repo"));
assertEquals("repo", pp.getRepositoryName());
assertEquals("/", pp.getFolderPath());
assertNull(pp.getFolderItemName());
assertEquals("/", getInstanceField("itemPath", pp));
try {
pp = new DefaultGhidraProtocolConnector(new URL("ghidra://myhost/repo//"));
fail();
}
catch (MalformedURLException e) {
// expected
}
pp = new DefaultGhidraProtocolConnector(new URL("ghidra://myhost/repo/"));
assertEquals("repo", pp.getRepositoryName());
assertEquals("/", pp.getFolderPath());
assertNull(pp.getFolderItemName());
assertEquals("/", getInstanceField("itemPath", pp));
pp = new DefaultGhidraProtocolConnector(new URL("ghidra://myhost/repo/a"));
assertEquals("repo", pp.getRepositoryName());
assertEquals("/", pp.getFolderPath());
assertEquals("a", pp.getFolderItemName());
assertEquals("/a", getInstanceField("itemPath", pp));
try {
pp = new DefaultGhidraProtocolConnector(new URL("ghidra://myhost/repo/a//"));
fail();
}
catch (MalformedURLException e) {
// expected
}
try {
pp = new DefaultGhidraProtocolConnector(new URL("ghidra://myhost/repo/a///"));
fail();
}
catch (MalformedURLException e) {
// expected
}
pp = new DefaultGhidraProtocolConnector(new URL("ghidra://myhost/repo/a/"));
assertEquals("repo", pp.getRepositoryName());
assertEquals("/a", pp.getFolderPath());
assertNull(pp.getFolderItemName());
assertEquals("/a/", getInstanceField("itemPath", pp));
pp = new DefaultGhidraProtocolConnector(new URL("ghidra://myhost/repo/a/b"));
assertEquals("repo", pp.getRepositoryName());
assertEquals("/a", pp.getFolderPath());
assertEquals("b", pp.getFolderItemName());
assertEquals("/a/b", getInstanceField("itemPath", pp));
pp = new DefaultGhidraProtocolConnector(new URL("ghidra://myhost/repo/a/b/"));
assertEquals("repo", pp.getRepositoryName());
assertEquals("/a/b", pp.getFolderPath());
assertNull(pp.getFolderItemName());
assertEquals("/a/b/", getInstanceField("itemPath", pp));
try {
pp = new DefaultGhidraProtocolConnector(new URL("ghidra://myhost/repo/a/b//"));
fail();
}
catch (MalformedURLException e) {
// expected
}
pp = new DefaultGhidraProtocolConnector(new URL("ghidra://myhost/repo/a/b#junk"));
assertEquals("repo", pp.getRepositoryName());
assertEquals("/a", pp.getFolderPath());
assertEquals("b", pp.getFolderItemName());
assertEquals("/a/b", getInstanceField("itemPath", pp));
}
}

View File

@@ -1,76 +0,0 @@
/* ###
* IP: GHIDRA
*
* Licensed 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 ghidra.framework.protocol.ghidra;
import static org.junit.Assert.*;
import java.net.MalformedURLException;
import java.net.URL;
import org.junit.Test;
import generic.test.AbstractGenericTest;
public class DefaultLocalGhidraProtocolConnectorParseTest extends AbstractGenericTest {
static {
Handler.registerHandler();
}
@Test
public void testParseURL() throws Exception {
DefaultLocalGhidraProtocolConnector pp =
new DefaultLocalGhidraProtocolConnector(new URL("ghidra:/C:/x/y/proj"));
assertEquals("proj", pp.getRepositoryName());
assertEquals("/", pp.getFolderPath());
assertNull(pp.getFolderItemName());
assertEquals("/", getInstanceField("itemPath", pp));
pp = new DefaultLocalGhidraProtocolConnector(new URL("ghidra:/x/y/proj"));
assertEquals("proj", pp.getRepositoryName());
assertEquals("/", pp.getFolderPath());
assertNull(pp.getFolderItemName());
assertEquals("/", getInstanceField("itemPath", pp));
pp = new DefaultLocalGhidraProtocolConnector(new URL("ghidra:/x/y/proj?/"));
assertEquals("proj", pp.getRepositoryName());
assertEquals("/", pp.getFolderPath());
assertNull(pp.getFolderItemName());
assertEquals("/", getInstanceField("itemPath", pp));
pp = new DefaultLocalGhidraProtocolConnector(new URL("ghidra:/x/y/proj?/a"));
assertEquals("proj", pp.getRepositoryName());
assertEquals("/", pp.getFolderPath());
assertEquals("a", pp.getFolderItemName());
assertEquals("/a", getInstanceField("itemPath", pp));
pp = new DefaultLocalGhidraProtocolConnector(new URL("ghidra:/x/y/proj?/a/b#ref"));
assertEquals("proj", pp.getRepositoryName());
assertEquals("/a", pp.getFolderPath());
assertEquals("b", pp.getFolderItemName());
assertEquals("/a/b", getInstanceField("itemPath", pp));
try {
pp = new DefaultLocalGhidraProtocolConnector(new URL("ghidra:/x/y/proj?//"));
fail();
}
catch (MalformedURLException e) {
// expected
}
}
}

View File

@@ -1,499 +0,0 @@
/* ###
* IP: GHIDRA
*
* Licensed 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 ghidra.framework.protocol.ghidra;
import static org.junit.Assert.*;
import java.io.IOException;
import java.net.MalformedURLException;
import java.net.URL;
import org.junit.Before;
import org.junit.Test;
import generic.test.AbstractGenericTest;
import ghidra.framework.client.*;
import ghidra.framework.model.ProjectLocator;
import ghidra.framework.protocol.ghidra.GhidraURLConnection.StatusCode;
public class GhidraURLTest extends AbstractGenericTest {
@Before
public void setUp() throws Exception {
Handler.registerHandler();
}
// makeURL(ProjectLocator)
@Test
public void testMakeLocalProjectURL() throws Exception {
ProjectLocator loc = new ProjectLocator("C:\\junk", "Test");
URL ghidraUrl = GhidraURL.makeURL(loc);
URL url = new URL("ghidra:/C:/junk/Test");
assertEquals(url, ghidraUrl);
assertEquals(loc, GhidraURL.getProjectStorageLocator(ghidraUrl));
loc = new ProjectLocator("C:\\junk\\", "Test");
ghidraUrl = GhidraURL.makeURL(loc);
assertEquals(url, ghidraUrl);
assertEquals(loc, GhidraURL.getProjectStorageLocator(ghidraUrl));
loc = new ProjectLocator("/C:/junk", "Test");
ghidraUrl = GhidraURL.makeURL(loc);
assertEquals(url, ghidraUrl);
assertEquals(loc, GhidraURL.getProjectStorageLocator(ghidraUrl));
loc = new ProjectLocator("/C:/junk/", "Test");
ghidraUrl = GhidraURL.makeURL(loc);
assertEquals(url, ghidraUrl);
assertEquals(loc, GhidraURL.getProjectStorageLocator(ghidraUrl));
loc = new ProjectLocator("/a/b", "Test");
ghidraUrl = GhidraURL.makeURL(loc);
url = new URL("ghidra:/a/b/Test");
assertEquals(url, ghidraUrl);
assertEquals(loc, GhidraURL.getProjectStorageLocator(ghidraUrl));
loc = new ProjectLocator("/a/b/", "Test");
ghidraUrl = GhidraURL.makeURL(loc);
assertEquals(url, ghidraUrl);
assertEquals(loc, GhidraURL.getProjectStorageLocator(ghidraUrl));
try {
loc = new ProjectLocator("a/b", "Test");
fail("relative path shold not be permitted");
}
catch (IllegalArgumentException e) {
// expected
}
}
// makeURL(String, String)
@Test
public void testMakeLocalProjectURL2() throws Exception {
ProjectLocator loc = new ProjectLocator("C:\\junk", "Test");
URL ghidraUrl = GhidraURL.makeURL("C:\\junk", "Test");
URL url = new URL("ghidra:/C:/junk/Test");
assertEquals(url, ghidraUrl);
assertEquals(loc, GhidraURL.getProjectStorageLocator(ghidraUrl));
loc = new ProjectLocator("C:\\junk\\", "Test");
ghidraUrl = GhidraURL.makeURL("C:\\junk\\", "Test");
assertEquals(url, ghidraUrl);
assertEquals(loc, GhidraURL.getProjectStorageLocator(ghidraUrl));
loc = new ProjectLocator("/C:/junk", "Test");
ghidraUrl = GhidraURL.makeURL("/C:/junk", "Test");
assertEquals(url, ghidraUrl);
assertEquals(loc, GhidraURL.getProjectStorageLocator(ghidraUrl));
loc = new ProjectLocator("/C:/junk/", "Test");
ghidraUrl = GhidraURL.makeURL("/C:/junk/", "Test");
assertEquals(url, ghidraUrl);
assertEquals(loc, GhidraURL.getProjectStorageLocator(ghidraUrl));
loc = new ProjectLocator("/a/b", "Test");
ghidraUrl = GhidraURL.makeURL("/a/b", "Test");
url = new URL("ghidra:/a/b/Test");
assertEquals(url, ghidraUrl);
assertEquals(loc, GhidraURL.getProjectStorageLocator(ghidraUrl));
loc = new ProjectLocator("/a/b/", "Test");
ghidraUrl = GhidraURL.makeURL("/a/b/", "Test");
assertEquals(url, ghidraUrl);
assertEquals(loc, GhidraURL.getProjectStorageLocator(ghidraUrl));
try {
ghidraUrl = GhidraURL.makeURL("a/b/", "Test");
fail("relative path shold not be permitted");
}
catch (IllegalArgumentException e) {
// expected
}
}
// makeURL(ProjectLocator, String, String)
@Test
public void testMakeLocalProjectFileURL() throws Exception {
ProjectLocator loc = new ProjectLocator("C:\\junk", "Test");
URL ghidraUrl = GhidraURL.makeURL(loc, "/a", "ref");
URL url = new URL("ghidra:/C:/junk/Test?/a#ref");
assertEquals(url, ghidraUrl);
assertEquals(loc, GhidraURL.getProjectStorageLocator(ghidraUrl));
ghidraUrl = GhidraURL.makeURL(loc, "/a/", "ref");
url = new URL("ghidra:/C:/junk/Test?/a/#ref");
assertEquals(url, ghidraUrl);
try {
ghidraUrl = GhidraURL.makeURL(loc, "a/b", "ref");
fail("relative path shold not be permitted");
}
catch (IllegalArgumentException e) {
// expected
}
}
// makeURL(String, String, String, String)
@Test
public void testMakeLocalProjectFileURL2() throws Exception {
ProjectLocator loc = new ProjectLocator("C:\\junk", "Test");
URL ghidraUrl = GhidraURL.makeURL("C:\\junk", "Test", "/a", "ref");
URL url = new URL("ghidra:/C:/junk/Test?/a#ref");
assertEquals(url, ghidraUrl);
assertEquals(loc, GhidraURL.getProjectStorageLocator(ghidraUrl));
ghidraUrl = GhidraURL.makeURL("C:\\junk", "Test", "/a/", "ref");
url = new URL("ghidra:/C:/junk/Test?/a/#ref");
assertEquals(url, ghidraUrl);
try {
ghidraUrl = GhidraURL.makeURL("C:\\junk", "Test", "a/b", "ref");
fail("relative path shold not be permitted");
}
catch (IllegalArgumentException e) {
// expected
}
}
// makeURL(String, int, String)
@Test
public void testMakeServerRepoURL() throws Exception {
URL ghidraUrl = GhidraURL.makeURL("localhost", 123, "Test");
URL url = new URL("ghidra", "localhost", 123, "/Test");
assertEquals(url, ghidraUrl);
}
// makeURL(String, int, String, String)
@Test
public void testMakeServerRepoFileURL() throws Exception {
URL ghidraUrl = GhidraURL.makeURL("localhost", 123, "Test", "/foo/");
URL url = new URL("ghidra", "localhost", 123, "/Test/foo/");
assertEquals(url, ghidraUrl);
ghidraUrl = GhidraURL.makeURL("localhost", 123, "Test", "/foo");
url = new URL("ghidra", "localhost", 123, "/Test/foo");
assertEquals(url, ghidraUrl);
}
// makeURL(String, int, String, String, String, String)
@Test
public void testMakeServerRepoFileURL2() throws Exception {
URL ghidraUrl = GhidraURL.makeURL("localhost", 123, "Test", "/foo", null, null);
URL url = new URL("ghidra", "localhost", 123, "/Test/foo/");
assertEquals(url, ghidraUrl);
ghidraUrl = GhidraURL.makeURL("localhost", 123, "Test", "/foo/", null, null);
assertEquals(url, ghidraUrl);
ghidraUrl = GhidraURL.makeURL("localhost", 123, "Test", "/foo", "bar", "ref");
url = new URL("ghidra", "localhost", 123, "/Test/foo/bar#ref");
assertEquals(url, ghidraUrl);
ghidraUrl = GhidraURL.makeURL("localhost", 123, "Test", "/foo/", "bar", "ref");
assertEquals(url, ghidraUrl);
}
// makeURL(String, int, String, String)
@Test
public void testMakeServerRepoFileURL3() throws Exception {
URL ghidraUrl = GhidraURL.makeURL("localhost", 123, "Test", "/foo");
URL url = new URL("ghidra", "localhost", 123, "/Test/foo");
assertEquals(url, ghidraUrl);
ghidraUrl = GhidraURL.makeURL("localhost", 123, "Test", "/foo/");
url = new URL("ghidra", "localhost", 123, "/Test/foo/");
assertEquals(url, ghidraUrl);
ghidraUrl = GhidraURL.makeURL("localhost", 123, "Test", "/foo/bar", "ref");
url = new URL("ghidra", "localhost", 123, "/Test/foo/bar#ref");
assertEquals(url, ghidraUrl);
ghidraUrl = GhidraURL.makeURL("localhost", 123, "Test", "/foo/bar");
url = new URL("ghidra", "localhost", 123, "/Test/foo/bar");
assertEquals(url, ghidraUrl);
}
// getProjectStorageLocator(URL)
@Test
public void testGetProjectStorageLocator() throws Exception {
ProjectLocator loc = new ProjectLocator("C:\\junk", "Test");
URL ghidraUrl = GhidraURL.makeURL(loc);
assertEquals(loc, GhidraURL.getProjectStorageLocator(ghidraUrl));
loc = new ProjectLocator("C:\\junk\\", "Test");
ghidraUrl = GhidraURL.makeURL(loc);
assertEquals(loc, GhidraURL.getProjectStorageLocator(ghidraUrl));
loc = new ProjectLocator("/C:/junk", "Test");
ghidraUrl = GhidraURL.makeURL(loc);
assertEquals(loc, GhidraURL.getProjectStorageLocator(ghidraUrl));
loc = new ProjectLocator("/C:/junk/", "Test");
ghidraUrl = GhidraURL.makeURL(loc);
assertEquals(loc, GhidraURL.getProjectStorageLocator(ghidraUrl));
loc = new ProjectLocator("/a/b", "Test");
ghidraUrl = GhidraURL.makeURL(loc);
assertEquals(loc, GhidraURL.getProjectStorageLocator(ghidraUrl));
loc = new ProjectLocator("/a/b/", "Test");
ghidraUrl = GhidraURL.makeURL(loc);
assertEquals(loc, GhidraURL.getProjectStorageLocator(ghidraUrl));
}
// isLocalProjectURL(URL)
@Test
public void testIsLocalProjectURL() throws Exception {
URL ghidraUrl = GhidraURL.makeURL("C:\\junk", "Test");
assertTrue(GhidraURL.isLocalProjectURL(ghidraUrl));
ghidraUrl = GhidraURL.makeURL("C:\\junk", "Test", "/a", "ref");
assertTrue(GhidraURL.isLocalProjectURL(ghidraUrl));
ghidraUrl = GhidraURL.makeURL("/x/y", "Test", "/a", "ref");
assertTrue(GhidraURL.isLocalProjectURL(ghidraUrl));
ghidraUrl = GhidraURL.makeURL("localhost", 123, "Test");
assertFalse(GhidraURL.isLocalProjectURL(ghidraUrl));
ghidraUrl = GhidraURL.makeURL("localhost", 123, "Test", "/foo/", "bar", "ref");
assertFalse(GhidraURL.isLocalProjectURL(ghidraUrl));
}
// isServerRepositoryURL(URL)
@Test
public void testIsServerRepositoryURL() throws Exception {
URL ghidraUrl = GhidraURL.makeURL("C:\\junk", "Test");
assertNull(GhidraURL.getRepositoryName(ghidraUrl));
assertFalse(GhidraURL.isServerRepositoryURL(ghidraUrl));
ghidraUrl = GhidraURL.makeURL("C:\\junk", "Test", "/a", "ref");
assertNull(GhidraURL.getRepositoryName(ghidraUrl));
assertFalse(GhidraURL.isServerRepositoryURL(ghidraUrl));
ghidraUrl = GhidraURL.makeURL("/x/y", "Test", "/a", "ref");
assertNull(GhidraURL.getRepositoryName(ghidraUrl));
assertFalse(GhidraURL.isServerRepositoryURL(ghidraUrl));
ghidraUrl = GhidraURL.makeURL("localhost", 123, "Test");
assertEquals("Test", GhidraURL.getRepositoryName(ghidraUrl));
assertTrue(GhidraURL.isServerRepositoryURL(ghidraUrl));
ghidraUrl = GhidraURL.makeURL("localhost", 123, "Test", "/foo/", "bar", "ref");
assertEquals("Test", GhidraURL.getRepositoryName(ghidraUrl));
assertTrue(GhidraURL.isServerRepositoryURL(ghidraUrl));
ghidraUrl = new URL("ghidra", "localhost", 123, "");
assertNull(GhidraURL.getRepositoryName(ghidraUrl));
assertFalse(GhidraURL.isServerRepositoryURL(ghidraUrl));
}
// isServerURL(URL)
@Test
public void testIsServerURL() throws Exception {
URL ghidraUrl = GhidraURL.makeURL("C:\\junk", "Test");
assertFalse(GhidraURL.isServerURL(ghidraUrl));
ghidraUrl = GhidraURL.makeURL("C:\\junk", "Test", "/a", "ref");
assertFalse(GhidraURL.isServerURL(ghidraUrl));
ghidraUrl = GhidraURL.makeURL("/x/y", "Test", "/a", "ref");
assertFalse(GhidraURL.isServerURL(ghidraUrl));
ghidraUrl = GhidraURL.makeURL("localhost", 123, "Test");
assertTrue(GhidraURL.isServerURL(ghidraUrl));
ghidraUrl = GhidraURL.makeURL("localhost", 123, "Test", "/foo/", "bar", "ref");
assertTrue(GhidraURL.isServerURL(ghidraUrl));
ghidraUrl = new URL("ghidra", "localhost", 123, "");
assertTrue(GhidraURL.isServerURL(ghidraUrl));
}
// toURL(String)
@Test
public void testToURL() throws Exception {
URL ghidraUrl = GhidraURL.makeURL("C:\\junk", "Test");
assertEquals(ghidraUrl, GhidraURL.toURL("C:\\junk\\Test"));
assertEquals(ghidraUrl, GhidraURL.toURL("/C:/junk/Test"));
assertEquals(ghidraUrl, GhidraURL.toURL("C:/junk/Test"));
assertEquals(ghidraUrl, GhidraURL.toURL("ghidra:/C:/junk/Test"));
assertEquals(ghidraUrl, GhidraURL.toURL(ghidraUrl.toString()));
assertEquals(ghidraUrl, GhidraURL.toURL(GhidraURL.getDisplayString(ghidraUrl)));
ghidraUrl = GhidraURL.makeURL("C:\\junk", "Test", "/a", "ref");
assertEquals(ghidraUrl, GhidraURL.toURL("ghidra:/C:/junk/Test?/a#ref"));
assertEquals(ghidraUrl, GhidraURL.toURL(ghidraUrl.toString()));
assertEquals(ghidraUrl, GhidraURL.toURL(GhidraURL.getDisplayString(ghidraUrl)));
ghidraUrl = GhidraURL.makeURL("C:\\junk", "Test", "/a/", "ref");
assertEquals(ghidraUrl, GhidraURL.toURL("ghidra:/C:/junk/Test?/a/#ref"));
assertEquals(ghidraUrl, GhidraURL.toURL(ghidraUrl.toString()));
assertEquals(ghidraUrl, GhidraURL.toURL(GhidraURL.getDisplayString(ghidraUrl)));
ghidraUrl = GhidraURL.makeURL("/x/y", "Test", "/a/", "ref");
assertEquals(ghidraUrl, GhidraURL.toURL("ghidra:/x/y/Test?/a/#ref"));
assertEquals(ghidraUrl, GhidraURL.toURL(ghidraUrl.toString()));
assertEquals(ghidraUrl, GhidraURL.toURL(GhidraURL.getDisplayString(ghidraUrl)));
ghidraUrl = GhidraURL.makeURL("localhost", 123, "Test", "/foo", "bar", "ref");
assertEquals(ghidraUrl, GhidraURL.toURL(ghidraUrl.toString()));
assertEquals(ghidraUrl, GhidraURL.toURL(GhidraURL.getDisplayString(ghidraUrl)));
}
@Test
public void testGetProjectURL() throws Exception {
URL ghidraUrl = GhidraURL.makeURL("C:\\junk", "Test");
assertEquals(new URL("ghidra:/C:/junk/Test"), GhidraURL.getProjectURL(ghidraUrl));
ghidraUrl = GhidraURL.makeURL("C:\\junk", "Test", "/a", "ref");
assertEquals(new URL("ghidra:/C:/junk/Test"), GhidraURL.getProjectURL(ghidraUrl));
ghidraUrl = GhidraURL.makeURL("/x/y", "Test", "/a", "ref");
assertEquals(new URL("ghidra:/x/y/Test"), GhidraURL.getProjectURL(ghidraUrl));
ghidraUrl = GhidraURL.makeURL("localhost", 123, "Test");
assertEquals(new URL("ghidra://localhost:123/Test"), GhidraURL.getProjectURL(ghidraUrl));
ghidraUrl = GhidraURL.makeURL("localhost", 123, "Test", "/foo/", "bar", "ref");
assertEquals(new URL("ghidra://localhost:123/Test"), GhidraURL.getProjectURL(ghidraUrl));
ghidraUrl = new URL("ghidra", "localhost", 123, "");
try {
GhidraURL.getProjectURL(ghidraUrl);
fail("Expected IllegalArgumentException");
}
catch (IllegalArgumentException e) {
// expected
}
}
// getDisplayString(URL)
@Test
public void testGetDisplayString() throws Exception {
URL ghidraUrl = GhidraURL.makeURL("C:\\junk", "Test");
assertEquals("C:\\junk\\Test", GhidraURL.getDisplayString(ghidraUrl));
ghidraUrl = GhidraURL.makeURL("C:\\junk", "Test", "/a", "ref");
assertEquals("ghidra:/C:/junk/Test?/a#ref", GhidraURL.getDisplayString(ghidraUrl));
ghidraUrl = GhidraURL.makeURL("C:\\junk", "Test", "/a/", "ref");
assertEquals("ghidra:/C:/junk/Test?/a/#ref", GhidraURL.getDisplayString(ghidraUrl));
ghidraUrl = GhidraURL.makeURL("/x/y", "Test", "/a/", "ref");
assertEquals("ghidra:/x/y/Test?/a/#ref", GhidraURL.getDisplayString(ghidraUrl));
ghidraUrl = GhidraURL.makeURL("localhost", 123, "Test", "/foo", "bar", "ref");
assertEquals(ghidraUrl.toString(), GhidraURL.getDisplayString(ghidraUrl));
}
// getNormalizedURL(URL)
@Test
public void testNormalizedURL() throws Exception {
URL ghidraUrl = GhidraURL.makeURL("C:\\junk", "Test");
assertEquals("ghidra:/C:/junk/Test", GhidraURL.getNormalizedURL(ghidraUrl).toString());
ghidraUrl = GhidraURL.makeURL("C:\\junk", "Test", "/a", "ref");
assertEquals("ghidra:/C:/junk/Test?/a", GhidraURL.getNormalizedURL(ghidraUrl).toString());
ghidraUrl = GhidraURL.makeURL("C:\\junk", "Test", "/a/", "ref");
assertEquals("ghidra:/C:/junk/Test?/a/", GhidraURL.getNormalizedURL(ghidraUrl).toString());
ghidraUrl = GhidraURL.makeURL("/x/y", "Test", "/a/", "ref");
assertEquals("ghidra:/x/y/Test?/a/", GhidraURL.getNormalizedURL(ghidraUrl).toString());
ghidraUrl = GhidraURL.makeURL("localhost", 123, "Test", "/foo", "bar", "ref");
assertEquals("ghidra://127.0.0.1:123/Test/foo/bar",
GhidraURL.getNormalizedURL(ghidraUrl).toString());
}
@Test
public void testTransientProjectURL() throws Exception {
// Dummy class implementations (see below) are used to stub objects required to establish
// transient project for URL verification testing only
URL ghidraUrl = GhidraURL.makeURL("localhost", 123, "Test");
DummyGhidraProtocolConnector dummyRepoConnector =
new DummyGhidraProtocolConnector(ghidraUrl);
TransientProjectManager transientProjectManager =
TransientProjectManager.getTransientProjectManager();
try {
TransientProjectData transientProject =
transientProjectManager.getTransientProject(dummyRepoConnector, true);
ProjectLocator projectLocator = transientProject.getProjectLocator();
assertTrue(GhidraURL.isServerRepositoryURL(projectLocator.getURL()));
}
finally {
transientProjectManager.dispose();
}
}
private static class DummyGhidraProtocolConnector extends GhidraProtocolConnector {
private URL repositoryURL;
private DummyRepositoryAdapter repoAdapter;
DummyGhidraProtocolConnector(URL repositoryURL) throws MalformedURLException {
super(repositoryURL);
this.repositoryURL = repositoryURL;
repoAdapter = new DummyRepositoryAdapter();
}
@Override
protected URL getRepositoryRootGhidraURL() {
return repositoryURL;
}
@Override
public StatusCode connect(boolean readOnly) throws IOException {
return StatusCode.OK;
}
@Override
public boolean isReadOnly() throws NotConnectedException {
return true;
}
@Override
public RepositoryAdapter getRepositoryAdapter() {
return repoAdapter;
}
}
private static class DummyRepositoryAdapter extends RepositoryAdapter {
DummyRepositoryAdapter() {
super(new DummyRepositoryServerAdapter(), "test");
}
@Override
public boolean isConnected() {
return true;
}
}
private static class DummyRepositoryServerAdapter extends RepositoryServerAdapter {
DummyRepositoryServerAdapter() {
super(null, null);
}
}
}