From d4f2f6dfdfd28958a554cde11e1e2a28d0449c31 Mon Sep 17 00:00:00 2001 From: Weidong Xu Date: Wed, 16 Sep 2026 11:12:22 +0800 Subject: [PATCH 1/3] fix(http-client-java): relax generated path length Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com> Copilot-Session: 277f389f-e041-4191-8637-c3843c839b05 --- ...-relax-generated-path-length-2026-09-16.md | 7 +++++++ .../generator/core/util/ClassNameUtil.java | 12 ++++++----- .../core/util/ClassNameUtilTests.java | 21 ++++++++----------- 3 files changed, 23 insertions(+), 17 deletions(-) create mode 100644 .chronus/changes/fix-java-relax-generated-path-length-2026-09-16.md diff --git a/.chronus/changes/fix-java-relax-generated-path-length-2026-09-16.md b/.chronus/changes/fix-java-relax-generated-path-length-2026-09-16.md new file mode 100644 index 00000000000..15d4d520b49 --- /dev/null +++ b/.chronus/changes/fix-java-relax-generated-path-length-2026-09-16.md @@ -0,0 +1,7 @@ +--- +changeKind: fix +packages: + - "@typespec/http-client-java" +--- + +Allow generated test and sample filenames to use the Azure SDK for Java pipeline's relaxed path-length limit. diff --git a/packages/http-client-java/generator/http-client-generator-core/src/main/java/com/microsoft/typespec/http/client/generator/core/util/ClassNameUtil.java b/packages/http-client-java/generator/http-client-generator-core/src/main/java/com/microsoft/typespec/http/client/generator/core/util/ClassNameUtil.java index e484ee3bfdc..cbc66d9d6a1 100644 --- a/packages/http-client-java/generator/http-client-generator-core/src/main/java/com/microsoft/typespec/http/client/generator/core/util/ClassNameUtil.java +++ b/packages/http-client-java/generator/http-client-generator-core/src/main/java/com/microsoft/typespec/http/client/generator/core/util/ClassNameUtil.java @@ -8,6 +8,10 @@ public final class ClassNameUtil { + private static final int MAX_PATH_LENGTH = 260; + private static final int MAX_DIRECTORY_LENGTH = 248; + private static final int BASE_PATH_LENGTH = 30; + /** * Truncate class name to avoid path too long. * @@ -24,8 +28,6 @@ public static String truncateClassName(String namespace, String directory, Strin String classNameSuffix) { // see // https://github.com/Azure/azure-sdk-for-java/blob/main/eng/common/pipelines/templates/steps/verify-path-length.yml - final int maxPathLength = 260; - final int basePathLength = 38; // directory layout in Java SDK repository is: // sdk/////.java @@ -43,7 +45,7 @@ public static String truncateClassName(String namespace, String directory, Strin final int minRemainLength = 5; // we still need some char for class name - final int remainLength = maxPathLength - basePathLength - groupLength - artifactLength - directoryLength + final int remainLength = MAX_PATH_LENGTH - BASE_PATH_LENGTH - groupLength - artifactLength - directoryLength - packageLength - classNameSuffixLength - extraLength; if (remainLength < className.length() && remainLength >= minRemainLength) { @@ -70,8 +72,8 @@ public static String getDirectoryNameForGraalVmConfig(String groupId, String art final int parentDirectoryLength = ("sdk/" + group + "/" + artifactId + "/").length(); final int fileNameLength = "/reflect-config.json".length(); - if (parentDirectoryLength + metaInfPath.length() > (248 - 38) - || parentDirectoryLength + metaInfPath.length() + fileNameLength > (260 - 38)) { + if (parentDirectoryLength + metaInfPath.length() > (MAX_DIRECTORY_LENGTH - BASE_PATH_LENGTH) + || parentDirectoryLength + metaInfPath.length() + fileNameLength > (MAX_PATH_LENGTH - BASE_PATH_LENGTH)) { // see // https://github.com/Azure/azure-sdk-for-java/blob/main/eng/common/pipelines/templates/steps/verify-path-length.yml String shortenedArtifactId = artifactId; diff --git a/packages/http-client-java/generator/http-client-generator-core/src/test/java/com/microsoft/typespec/http/client/generator/core/util/ClassNameUtilTests.java b/packages/http-client-java/generator/http-client-generator-core/src/test/java/com/microsoft/typespec/http/client/generator/core/util/ClassNameUtilTests.java index 4bc77fcf9ab..b9578c516eb 100644 --- a/packages/http-client-java/generator/http-client-generator-core/src/test/java/com/microsoft/typespec/http/client/generator/core/util/ClassNameUtilTests.java +++ b/packages/http-client-java/generator/http-client-generator-core/src/test/java/com/microsoft/typespec/http/client/generator/core/util/ClassNameUtilTests.java @@ -13,27 +13,24 @@ public class ClassNameUtilTests { @Test public void testTruncateClassName() { - final int maxFileLength = 260 - 38; + final int maxFileLength = 260 - 30; - // truncate class name + // names that previously required truncation now fit String name = ClassNameUtil.truncateClassName("com.azure.resourcemanager.deviceprovisioningservices", "src/samples/java", "com.azure.resourcemanager.deviceprovisioningservices.generated", "IotDpsResourceCheckProvisioningServiceNameAvailability", "Samples"); - Assertions.assertEquals(maxFileLength, - ("sdk/deviceprovisioningservices/azure-resourcemanager-deviceprovisioningservices/src/samples/java/com/azure/resourcemanager/deviceprovisioningservices/generated/" - + name + ".java").length()); + Assertions.assertEquals("IotDpsResourceCheckProvisioningServiceNameAvailabilitySamples", name); name = ClassNameUtil.truncateClassName("com.azure.resourcemanager.recoveryservicessiterecovery", "src/test/java", "com.azure.resourcemanager.recoveryservicessiterecovery.generated", "InMageRcmUpdateApplianceForReplicationProtectedItemInput", "Tests"); - Assertions.assertEquals(maxFileLength, - ("sdk/recoveryservicessiterecovery/azure-resourcemanager-recoveryservicessiterecovery/src/test/java/com/azure/resourcemanager/recoveryservicessiterecovery/generated/" - + name + ".java").length()); + Assertions.assertEquals("InMageRcmUpdateApplianceForReplicationProtectedItemInputTests", name); + // truncate a name that exceeds the relaxed limit name = ClassNameUtil.truncateClassName( "com.azure.resourcemanager." + KUBERNETES_CONFIGURATION + ".extensiontypes", "src/test/java", "com.azure.resourcemanager." + KUBERNETES_CONFIGURATION + ".extensiontypes.generated", - "ExtensionTypesLocationGetWithResponse", "MockTests"); + "ExtensionTypesLocationGetWithResponseAsync", "MockTests"); Assertions.assertEquals(maxFileLength, ("sdk/" + KUBERNETES_CONFIGURATION + "/azure-resourcemanager-" + KUBERNETES_CONFIGURATION + "-extensiontypes/src/test/java/com/azure/resourcemanager/" + KUBERNETES_CONFIGURATION @@ -53,14 +50,14 @@ public void testTruncateClassName() { @Test public void testGetDirectoryNameForGraalVmConfig() { - // directory length over 210 + // directory length over 218 String directoryName = ClassNameUtil.getDirectoryNameForGraalVmConfig("com.azure.resourcemanager", "azure-resourcemanager-" + KUBERNETES_CONFIGURATION + "-extensiontypes"); Assertions.assertFalse(directoryName.contains("azure-resourcemanager-")); - // directory length not over 210, but full filename length over 222 + // directory length not over 218, but full filename length over 230 directoryName = ClassNameUtil.getDirectoryNameForGraalVmConfig("com.azure.resourcemanager", "azure-resourcemanager-" + "recovery" + "services" + "data" + "replication"); - Assertions.assertFalse(directoryName.contains("azure-resourcemanager-")); + Assertions.assertTrue(directoryName.contains("azure-resourcemanager-")); } } From 7614972a058eb509e43a9aa9f578d680ccfa4e1c Mon Sep 17 00:00:00 2001 From: Weidong Xu Date: Wed, 16 Sep 2026 11:15:47 +0800 Subject: [PATCH 2/3] test(http-client-java): reference path limits directly Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com> Copilot-Session: 277f389f-e041-4191-8637-c3843c839b05 --- .../http/client/generator/core/util/ClassNameUtil.java | 4 ++-- .../http/client/generator/core/util/ClassNameUtilTests.java | 4 ++-- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/packages/http-client-java/generator/http-client-generator-core/src/main/java/com/microsoft/typespec/http/client/generator/core/util/ClassNameUtil.java b/packages/http-client-java/generator/http-client-generator-core/src/main/java/com/microsoft/typespec/http/client/generator/core/util/ClassNameUtil.java index cbc66d9d6a1..7a5d5857c8d 100644 --- a/packages/http-client-java/generator/http-client-generator-core/src/main/java/com/microsoft/typespec/http/client/generator/core/util/ClassNameUtil.java +++ b/packages/http-client-java/generator/http-client-generator-core/src/main/java/com/microsoft/typespec/http/client/generator/core/util/ClassNameUtil.java @@ -8,9 +8,9 @@ public final class ClassNameUtil { - private static final int MAX_PATH_LENGTH = 260; + static final int MAX_PATH_LENGTH = 260; private static final int MAX_DIRECTORY_LENGTH = 248; - private static final int BASE_PATH_LENGTH = 30; + static final int BASE_PATH_LENGTH = 30; /** * Truncate class name to avoid path too long. diff --git a/packages/http-client-java/generator/http-client-generator-core/src/test/java/com/microsoft/typespec/http/client/generator/core/util/ClassNameUtilTests.java b/packages/http-client-java/generator/http-client-generator-core/src/test/java/com/microsoft/typespec/http/client/generator/core/util/ClassNameUtilTests.java index b9578c516eb..5e509cdb7a2 100644 --- a/packages/http-client-java/generator/http-client-generator-core/src/test/java/com/microsoft/typespec/http/client/generator/core/util/ClassNameUtilTests.java +++ b/packages/http-client-java/generator/http-client-generator-core/src/test/java/com/microsoft/typespec/http/client/generator/core/util/ClassNameUtilTests.java @@ -13,7 +13,7 @@ public class ClassNameUtilTests { @Test public void testTruncateClassName() { - final int maxFileLength = 260 - 30; + final int maxFileLength = ClassNameUtil.MAX_PATH_LENGTH - ClassNameUtil.BASE_PATH_LENGTH; // names that previously required truncation now fit String name = ClassNameUtil.truncateClassName("com.azure.resourcemanager.deviceprovisioningservices", @@ -55,7 +55,7 @@ public void testGetDirectoryNameForGraalVmConfig() { "azure-resourcemanager-" + KUBERNETES_CONFIGURATION + "-extensiontypes"); Assertions.assertFalse(directoryName.contains("azure-resourcemanager-")); - // directory length not over 218, but full filename length over 230 + // directory and full filename fit the relaxed limits directoryName = ClassNameUtil.getDirectoryNameForGraalVmConfig("com.azure.resourcemanager", "azure-resourcemanager-" + "recovery" + "services" + "data" + "replication"); Assertions.assertTrue(directoryName.contains("azure-resourcemanager-")); From 7e5c1ea78f590c59370788dddfd1d18025e2568e Mon Sep 17 00:00:00 2001 From: Weidong Xu Date: Wed, 16 Sep 2026 11:34:57 +0800 Subject: [PATCH 3/3] fix(http-client-java): budget longest GraalVM filename Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com> Copilot-Session: 277f389f-e041-4191-8637-c3843c839b05 --- .../http/client/generator/core/util/ClassNameUtil.java | 2 +- .../http/client/generator/core/util/ClassNameUtilTests.java | 6 +++--- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/packages/http-client-java/generator/http-client-generator-core/src/main/java/com/microsoft/typespec/http/client/generator/core/util/ClassNameUtil.java b/packages/http-client-java/generator/http-client-generator-core/src/main/java/com/microsoft/typespec/http/client/generator/core/util/ClassNameUtil.java index 7a5d5857c8d..8840b787298 100644 --- a/packages/http-client-java/generator/http-client-generator-core/src/main/java/com/microsoft/typespec/http/client/generator/core/util/ClassNameUtil.java +++ b/packages/http-client-java/generator/http-client-generator-core/src/main/java/com/microsoft/typespec/http/client/generator/core/util/ClassNameUtil.java @@ -70,7 +70,7 @@ public static String getDirectoryNameForGraalVmConfig(String groupId, String art ? artifactIdSegments[2] : artifactIdSegments[artifactIdSegments.length - 1]); final int parentDirectoryLength = ("sdk/" + group + "/" + artifactId + "/").length(); - final int fileNameLength = "/reflect-config.json".length(); + final int fileNameLength = "/resource-config.json".length(); if (parentDirectoryLength + metaInfPath.length() > (MAX_DIRECTORY_LENGTH - BASE_PATH_LENGTH) || parentDirectoryLength + metaInfPath.length() + fileNameLength > (MAX_PATH_LENGTH - BASE_PATH_LENGTH)) { diff --git a/packages/http-client-java/generator/http-client-generator-core/src/test/java/com/microsoft/typespec/http/client/generator/core/util/ClassNameUtilTests.java b/packages/http-client-java/generator/http-client-generator-core/src/test/java/com/microsoft/typespec/http/client/generator/core/util/ClassNameUtilTests.java index 5e509cdb7a2..2e2a8f714b8 100644 --- a/packages/http-client-java/generator/http-client-generator-core/src/test/java/com/microsoft/typespec/http/client/generator/core/util/ClassNameUtilTests.java +++ b/packages/http-client-java/generator/http-client-generator-core/src/test/java/com/microsoft/typespec/http/client/generator/core/util/ClassNameUtilTests.java @@ -52,12 +52,12 @@ public void testTruncateClassName() { public void testGetDirectoryNameForGraalVmConfig() { // directory length over 218 String directoryName = ClassNameUtil.getDirectoryNameForGraalVmConfig("com.azure.resourcemanager", - "azure-resourcemanager-" + KUBERNETES_CONFIGURATION + "-extensiontypes"); + "azure-resourcemanager-" + KUBERNETES_CONFIGURATION + "-extensiontypesabc"); Assertions.assertFalse(directoryName.contains("azure-resourcemanager-")); - // directory and full filename fit the relaxed limits + // reflect-config.json fits exactly at 230, but resource-config.json exceeds the limit by one directoryName = ClassNameUtil.getDirectoryNameForGraalVmConfig("com.azure.resourcemanager", "azure-resourcemanager-" + "recovery" + "services" + "data" + "replication"); - Assertions.assertTrue(directoryName.contains("azure-resourcemanager-")); + Assertions.assertFalse(directoryName.contains("azure-resourcemanager-")); } }