Skip to content

Commit 8fd00fe

Browse files
committed
Update for latest test suite
1 parent 681b0aa commit 8fd00fe

3 files changed

Lines changed: 462 additions & 73 deletions

File tree

src/main/java/com/github/packageurl/PackageURL.java

Lines changed: 53 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -22,8 +22,10 @@
2222
package com.github.packageurl;
2323

2424
import java.io.Serializable;
25+
import java.net.MalformedURLException;
2526
import java.net.URI;
2627
import java.net.URISyntaxException;
28+
import java.net.URL;
2729
import java.nio.charset.Charset;
2830
import java.nio.charset.StandardCharsets;
2931
import java.util.Arrays;
@@ -716,10 +718,57 @@ private void parse(final String purl) throws MalformedPackageURLException {
716718
* @throws MalformedPackageURLException if constraints are not met
717719
*/
718720
private void verifyTypeConstraints(String type, String namespace, String name) throws MalformedPackageURLException {
719-
if (StandardTypes.MAVEN.equals(type)) {
720-
if (namespace == null || namespace.isEmpty() || name == null || name.isEmpty()) {
721-
throw new MalformedPackageURLException("The PackageURL specified is invalid. Maven requires both a namespace and name.");
722-
}
721+
switch (type) {
722+
case StandardTypes.CONAN:
723+
if ((namespace != null || qualifiers != null) && (namespace == null || (qualifiers == null || !qualifiers.containsKey("channel")))) {
724+
throw new MalformedPackageURLException("The PackageURL specified is invalid. Conan requires a namespace to have a 'channel' qualifier");
725+
}
726+
break;
727+
case StandardTypes.CPAN:
728+
if (name == null || name.indexOf('-') != -1) {
729+
throw new MalformedPackageURLException("The PackageURL specified is invalid. CPAN requires a name");
730+
}
731+
if (namespace != null && (name.contains("::") || name.indexOf('-') != -1)) {
732+
throw new MalformedPackageURLException("The PackageURL specified is invalid. CPAN name may not contain '::' or '-'");
733+
}
734+
break;
735+
case StandardTypes.CRAN:
736+
if (version == null) {
737+
throw new MalformedPackageURLException("The PackageURL specified is invalid. CRAN requires a version");
738+
}
739+
break;
740+
case StandardTypes.HACKAGE:
741+
if (name == null || version == null) {
742+
throw new MalformedPackageURLException("The PackageURL specified is invalid. Hackage requires a name and version");
743+
}
744+
break;
745+
case StandardTypes.MAVEN:
746+
if (namespace == null || name == null) {
747+
throw new MalformedPackageURLException("The PackageURL specified is invalid. Maven requires both a namespace and name");
748+
}
749+
break;
750+
case StandardTypes.MLFLOW:
751+
if (qualifiers != null) {
752+
String repositoryUrl = qualifiers.get("repository_url");
753+
if (repositoryUrl != null) {
754+
String host = null;
755+
try {
756+
URL url = new URL(repositoryUrl);
757+
host = url.getHost();
758+
if (host.matches(".*[.]?azuredatabricks.net$")) {
759+
this.name = name.toLowerCase();
760+
}
761+
} catch (MalformedURLException e) {
762+
throw new MalformedPackageURLException("The PackageURL specified is invalid. MLFlow repository_url is not a valid URL for host " + host);
763+
}
764+
}
765+
}
766+
break;
767+
case StandardTypes.SWIFT:
768+
if (namespace == null || name == null || version == null) {
769+
throw new MalformedPackageURLException("The PackageURL specified is invalid. Swift requires a namespace, name, and version");
770+
}
771+
break;
723772
}
724773
}
725774

@@ -891,10 +940,5 @@ public static final class StandardTypes {
891940
public static final String DEBIAN = "deb";
892941
@Deprecated
893942
public static final String NIXPKGS = "nix";
894-
895-
private StandardTypes() {
896-
897-
}
898943
}
899-
900944
}

src/test/java/com/github/packageurl/PackageURLTest.java

Lines changed: 40 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -158,33 +158,41 @@ public void testConstructorParameters() throws MalformedPackageURLException {
158158
if (invalid) {
159159
try {
160160
PackageURL purl = new PackageURL(type, namespace, name, version, map, subpath);
161-
Assert.fail("Invalid package url components should have caused an exception: " + purl);
161+
// If we get here, then only the scheme can be invalid
162+
verifyComponentsEquals(purl, type, namespace, name, version, subpath, qualifiers);
163+
164+
if (!cpurlString.equals(purl.toString())) {
165+
throw new MalformedPackageURLException("The PackageURL scheme is invalid for purl: " + purl);
166+
}
167+
168+
Assert.fail("Invalid package url components should have caused an exception: " + purl.toString());
162169
} catch (MalformedPackageURLException e) {
163170
Assert.assertNotNull(e.getMessage());
164171
}
165172
continue;
166173
}
167174

168175
PackageURL purl = new PackageURL(type, namespace, name, version, map, subpath);
169-
176+
verifyComponentsEquals(purl, type, namespace, name, version, subpath, qualifiers);
170177
Assert.assertEquals(cpurlString, purl.canonicalize());
171-
Assert.assertEquals("pkg", purl.getScheme());
172-
Assert.assertEquals(type, purl.getType());
173-
Assert.assertEquals(namespace, purl.getNamespace());
174-
Assert.assertEquals(name, purl.getName());
175-
Assert.assertEquals(version, purl.getVersion());
176-
Assert.assertEquals(subpath, purl.getSubpath());
177-
if (qualifiers != null) {
178-
Assert.assertNotNull(purl.getQualifiers());
179-
Assert.assertEquals(qualifiers.length(), purl.getQualifiers().size());
180-
qualifiers.keySet().forEach(key -> {
181-
String value = qualifiers.getString(key);
182-
Assert.assertTrue(purl.getQualifiers().containsKey(key));
183-
Assert.assertEquals(value, purl.getQualifiers().get(key));
184-
});
185-
PackageURL purl2 = new PackageURL(type, namespace, name, version, hashMap, subpath);
186-
Assert.assertEquals(purl.getQualifiers(), purl2.getQualifiers());
187-
}
178+
}
179+
}
180+
181+
private static void verifyComponentsEquals(PackageURL purl, String type, String namespace, String name, String version, String subpath, JSONObject qualifiers) {
182+
Assert.assertEquals("pkg", purl.getScheme());
183+
Assert.assertEquals(type, purl.getType());
184+
Assert.assertEquals(namespace, purl.getNamespace());
185+
Assert.assertEquals(name, purl.getName());
186+
Assert.assertEquals(version, purl.getVersion());
187+
Assert.assertEquals(subpath, purl.getSubpath());
188+
if (qualifiers != null) {
189+
Assert.assertNotNull(purl.getQualifiers());
190+
Assert.assertEquals(qualifiers.length(), purl.getQualifiers().size());
191+
qualifiers.keySet().forEach((key) -> {
192+
String value = qualifiers.getString(key);
193+
Assert.assertTrue(purl.getQualifiers().containsKey(key));
194+
Assert.assertEquals(value, purl.getQualifiers().get(key));
195+
});
188196
}
189197
}
190198

@@ -352,6 +360,19 @@ public void testStandardTypes() {
352360
Assert.assertEquals("pub", PackageURL.StandardTypes.PUB);
353361
Assert.assertEquals("pypi", PackageURL.StandardTypes.PYPI);
354362
Assert.assertEquals("rpm", PackageURL.StandardTypes.RPM);
363+
Assert.assertEquals("hackage", PackageURL.StandardTypes.HACKAGE);
364+
Assert.assertEquals("hex", PackageURL.StandardTypes.HEX);
365+
Assert.assertEquals("huggingface", PackageURL.StandardTypes.HUGGINGFACE);
366+
Assert.assertEquals("luarocks", PackageURL.StandardTypes.LUAROCKS);
367+
Assert.assertEquals("maven", PackageURL.StandardTypes.MAVEN);
368+
Assert.assertEquals("mlflow", PackageURL.StandardTypes.MLFLOW);
369+
Assert.assertEquals("npm", PackageURL.StandardTypes.NPM);
370+
Assert.assertEquals("nuget", PackageURL.StandardTypes.NUGET);
371+
Assert.assertEquals("qpkg", PackageURL.StandardTypes.QPKG);
372+
Assert.assertEquals("oci", PackageURL.StandardTypes.OCI);
373+
Assert.assertEquals("pub", PackageURL.StandardTypes.PUB);
374+
Assert.assertEquals("pypi", PackageURL.StandardTypes.PYPI);
375+
Assert.assertEquals("rpm", PackageURL.StandardTypes.RPM);
355376
Assert.assertEquals("swid", PackageURL.StandardTypes.SWID);
356377
Assert.assertEquals("swift", PackageURL.StandardTypes.SWIFT);
357378
}

0 commit comments

Comments
 (0)