b/163024265 Define Security Requirement Traversal
Change-Id: I8c0127c9d946310d4350c3e6b25308d7bd3df13e
diff --git a/oas-core/src/main/java/com/apigee/security/oas/extendedvalidator/BaseTraversalHelper.java b/oas-core/src/main/java/com/apigee/security/oas/extendedvalidator/BaseTraversalHelper.java
index 71e3a01..701ba8a 100644
--- a/oas-core/src/main/java/com/apigee/security/oas/extendedvalidator/BaseTraversalHelper.java
+++ b/oas-core/src/main/java/com/apigee/security/oas/extendedvalidator/BaseTraversalHelper.java
@@ -16,6 +16,7 @@
import org.openapi4j.parser.model.v3.Operation;
import org.openapi4j.parser.model.v3.Parameter;
import org.openapi4j.parser.model.v3.Response;
+import org.openapi4j.parser.model.v3.SecurityRequirement;
import org.openapi4j.parser.model.v3.Server;
import org.openapi4j.parser.model.v3.ServerVariable;
import org.openapi4j.parser.model.v3.Tag;
@@ -126,6 +127,18 @@
}
@Override
+ public void sendSecurityRequirementTraversals(
+ ImmutableList<SecurityRequirement> securityRequirementList) {
+ Optional.ofNullable(securityRequirementList)
+ .ifPresent(
+ securityRequirements ->
+ securityRequirements.forEach(
+ securityRequirement ->
+ coordinator.handleTraversalCommand(
+ factory.create(securityRequirement, traversalPath))));
+ }
+
+ @Override
public void sendServerTraversals(ImmutableList<Server> serversList) {
Optional.ofNullable(serversList)
.ifPresent(
diff --git a/oas-core/src/main/java/com/apigee/security/oas/extendedvalidator/OperationTraversal.java b/oas-core/src/main/java/com/apigee/security/oas/extendedvalidator/OperationTraversal.java
index 6fd6f9f..22ed41d 100644
--- a/oas-core/src/main/java/com/apigee/security/oas/extendedvalidator/OperationTraversal.java
+++ b/oas-core/src/main/java/com/apigee/security/oas/extendedvalidator/OperationTraversal.java
@@ -41,6 +41,7 @@
Immutables.toImmutableList(openApiSchemaObj.getParameters()));
traversalHelper.sendResponseTraversals(
Immutables.toImmutableMap(openApiSchemaObj.getResponses()));
- // TODO(b/163024265): Send Security Requirement Traversals.
+ traversalHelper.sendSecurityRequirementTraversals(
+ Immutables.toImmutableList(openApiSchemaObj.getSecurityRequirements()));
}
}
diff --git a/oas-core/src/main/java/com/apigee/security/oas/extendedvalidator/SecurityRequirementTraversal.java b/oas-core/src/main/java/com/apigee/security/oas/extendedvalidator/SecurityRequirementTraversal.java
new file mode 100644
index 0000000..78f614e
--- /dev/null
+++ b/oas-core/src/main/java/com/apigee/security/oas/extendedvalidator/SecurityRequirementTraversal.java
@@ -0,0 +1,28 @@
+package com.apigee.security.oas.extendedvalidator;
+
+import com.google.common.collect.ImmutableList;
+import com.google.inject.assistedinject.Assisted;
+import java.util.Map;
+import java.util.Optional;
+import javax.inject.Inject;
+import org.openapi4j.parser.model.OpenApiSchema;
+import org.openapi4j.parser.model.v3.SecurityRequirement;
+
+/** A {@link Traversal} that traverses a {@link SecurityRequirement} object. */
+final class SecurityRequirementTraversal extends Traversal<SecurityRequirement>
+ implements SecurityRequirementTraversalCommand {
+ @Inject
+ SecurityRequirementTraversal(
+ TraversalHelperFactory traversalHelperFactory,
+ ExtensionValidationIntegrator extensionValidationIntegrator,
+ @Assisted
+ ImmutableList<Map.Entry<Class<? extends OpenApiSchema>, Optional<String>>> traversalPath,
+ @Assisted SecurityRequirement openApiSchemaObj) {
+ super(traversalHelperFactory, extensionValidationIntegrator, traversalPath, openApiSchemaObj);
+ }
+
+ @Override
+ public void traverse() {
+ // TODO(b/161441872): Process extensions.
+ }
+}
diff --git a/oas-core/src/main/java/com/apigee/security/oas/extendedvalidator/SecurityRequirementTraversalCommand.java b/oas-core/src/main/java/com/apigee/security/oas/extendedvalidator/SecurityRequirementTraversalCommand.java
new file mode 100644
index 0000000..508850b
--- /dev/null
+++ b/oas-core/src/main/java/com/apigee/security/oas/extendedvalidator/SecurityRequirementTraversalCommand.java
@@ -0,0 +1,4 @@
+package com.apigee.security.oas.extendedvalidator;
+
+/** A {@link TraversalCommand} interface for {@link SecurityRequirementTraversal}. */
+public interface SecurityRequirementTraversalCommand extends TraversalCommand {}
diff --git a/oas-core/src/main/java/com/apigee/security/oas/extendedvalidator/TraversalCommandFactory.java b/oas-core/src/main/java/com/apigee/security/oas/extendedvalidator/TraversalCommandFactory.java
index 5d7f241..2167c17 100644
--- a/oas-core/src/main/java/com/apigee/security/oas/extendedvalidator/TraversalCommandFactory.java
+++ b/oas-core/src/main/java/com/apigee/security/oas/extendedvalidator/TraversalCommandFactory.java
@@ -13,6 +13,7 @@
import org.openapi4j.parser.model.v3.Operation;
import org.openapi4j.parser.model.v3.Parameter;
import org.openapi4j.parser.model.v3.Response;
+import org.openapi4j.parser.model.v3.SecurityRequirement;
import org.openapi4j.parser.model.v3.Server;
import org.openapi4j.parser.model.v3.ServerVariable;
import org.openapi4j.parser.model.v3.Tag;
@@ -60,6 +61,10 @@
ImmutableList<Map.Entry<Class<? extends OpenApiSchema>, Optional<String>>> traversalPath,
String name);
+ SecurityRequirementTraversalCommand create(
+ SecurityRequirement securityRequirement,
+ ImmutableList<Map.Entry<Class<? extends OpenApiSchema>, Optional<String>>> traversalPath);
+
ServerTraversalCommand create(
Server server,
ImmutableList<Map.Entry<Class<? extends OpenApiSchema>, Optional<String>>> traversalPath);
diff --git a/oas-core/src/main/java/com/apigee/security/oas/extendedvalidator/TraversalCommandFactoryModule.java b/oas-core/src/main/java/com/apigee/security/oas/extendedvalidator/TraversalCommandFactoryModule.java
index dfc7cb9..fb3d8a7 100644
--- a/oas-core/src/main/java/com/apigee/security/oas/extendedvalidator/TraversalCommandFactoryModule.java
+++ b/oas-core/src/main/java/com/apigee/security/oas/extendedvalidator/TraversalCommandFactoryModule.java
@@ -19,6 +19,8 @@
.implement(OperationTraversalCommand.class, OperationTraversal.class)
.implement(ParameterTraversalCommand.class, ParameterTraversal.class)
.implement(ResponseTraversalCommand.class, ResponseTraversal.class)
+ .implement(
+ SecurityRequirementTraversalCommand.class, SecurityRequirementTraversal.class)
.implement(ServerTraversalCommand.class, ServerTraversal.class)
.implement(ServerVariableTraversalCommand.class, ServerVariableTraversal.class)
.implement(TagTraversalCommand.class, TagTraversal.class)
diff --git a/oas-core/src/main/java/com/apigee/security/oas/extendedvalidator/TraversalHelper.java b/oas-core/src/main/java/com/apigee/security/oas/extendedvalidator/TraversalHelper.java
index 776c07d..c2c6c94 100644
--- a/oas-core/src/main/java/com/apigee/security/oas/extendedvalidator/TraversalHelper.java
+++ b/oas-core/src/main/java/com/apigee/security/oas/extendedvalidator/TraversalHelper.java
@@ -11,6 +11,7 @@
import org.openapi4j.parser.model.v3.Operation;
import org.openapi4j.parser.model.v3.Parameter;
import org.openapi4j.parser.model.v3.Response;
+import org.openapi4j.parser.model.v3.SecurityRequirement;
import org.openapi4j.parser.model.v3.Server;
import org.openapi4j.parser.model.v3.ServerVariable;
import org.openapi4j.parser.model.v3.Tag;
@@ -36,6 +37,8 @@
void sendResponseTraversals(ImmutableMap<String, Response> responses);
+ void sendSecurityRequirementTraversals(ImmutableList<SecurityRequirement> securityRequirements);
+
void sendServerTraversals(ImmutableList<Server> serversList);
void sendServerVariableTraversals(ImmutableMap<String, ServerVariable> serverVariables);
diff --git a/oas-core/src/test/java/com/apigee/security/oas/extendedvalidator/BaseTraversalHelperTest.java b/oas-core/src/test/java/com/apigee/security/oas/extendedvalidator/BaseTraversalHelperTest.java
index 4a5e6c5..397f545 100644
--- a/oas-core/src/test/java/com/apigee/security/oas/extendedvalidator/BaseTraversalHelperTest.java
+++ b/oas-core/src/test/java/com/apigee/security/oas/extendedvalidator/BaseTraversalHelperTest.java
@@ -24,6 +24,7 @@
import org.openapi4j.parser.model.v3.OpenApi3;
import org.openapi4j.parser.model.v3.Operation;
import org.openapi4j.parser.model.v3.Parameter;
+import org.openapi4j.parser.model.v3.SecurityRequirement;
import org.openapi4j.parser.model.v3.Server;
import org.openapi4j.parser.model.v3.ServerVariable;
import org.openapi4j.parser.model.v3.Tag;
@@ -39,6 +40,9 @@
private final ImmutableList<Parameter> parameters =
ImmutableList.of(new Parameter(), new Parameter(), new Parameter(), new Parameter());
+ private final ImmutableList<SecurityRequirement> securityRequirements =
+ ImmutableList.of(
+ new SecurityRequirement(), new SecurityRequirement(), new SecurityRequirement());
private final ImmutableList<Server> servers =
ImmutableList.of(new Server(), new Server(), new Server());
private final ImmutableList<Tag> tags =
@@ -89,7 +93,7 @@
}
@Test
- public void sendContactTraversals_nullParameter_doesNotFail() {
+ public void sendContactTraversal_nullParameter_doesNotFail() {
traversalHelper.sendContactTraversal(null);
}
@@ -169,6 +173,20 @@
}
@Test
+ public void
+ sendSecurityRequirementTraversals_sendsSecurityRequirementTraversalCommandsToCoordinator() {
+ traversalHelper.sendSecurityRequirementTraversals(securityRequirements);
+
+ verify(traversalCoordinator, times(securityRequirements.size()))
+ .handleTraversalCommand(any(SecurityRequirementTraversalCommand.class));
+ }
+
+ @Test
+ public void sendSecurityRequirementTraversals_nullParameter_doesNotFail() {
+ traversalHelper.sendSecurityRequirementTraversals(null);
+ }
+
+ @Test
public void sendServerTraversals_sendsServerTraversalCommandsToCoordinator() {
traversalHelper.sendServerTraversals(servers);
diff --git a/oas-core/src/test/java/com/apigee/security/oas/extendedvalidator/OperationTraversalTest.java b/oas-core/src/test/java/com/apigee/security/oas/extendedvalidator/OperationTraversalTest.java
index 6a5c9af..5e4436e 100644
--- a/oas-core/src/test/java/com/apigee/security/oas/extendedvalidator/OperationTraversalTest.java
+++ b/oas-core/src/test/java/com/apigee/security/oas/extendedvalidator/OperationTraversalTest.java
@@ -21,6 +21,7 @@
import org.openapi4j.parser.model.v3.Operation;
import org.openapi4j.parser.model.v3.Parameter;
import org.openapi4j.parser.model.v3.Response;
+import org.openapi4j.parser.model.v3.SecurityRequirement;
import org.openapi4j.parser.model.v3.Server;
@RunWith(JUnit4.class)
@@ -35,6 +36,9 @@
private final ExternalDocs externalDocs = new ExternalDocs();
+ private final ImmutableList securityRequirements =
+ ImmutableList.of(
+ new SecurityRequirement(), new SecurityRequirement(), new SecurityRequirement());
private final ImmutableList servers = ImmutableList.of(new Server(), new Server(), new Server());
private final ImmutableList parameters =
@@ -55,6 +59,7 @@
when(operation.getParameters()).thenReturn(parameters);
when(operation.getResponses()).thenReturn(responses);
when(operation.getCallbacks()).thenReturn(callbacks);
+ when(operation.getSecurityRequirements()).thenReturn(securityRequirements);
operationTraversal =
new OperationTraversal(
@@ -68,6 +73,22 @@
}
@Test
+ public void traverse_sendsCallbacksToTraversalHelper() {
+ operationTraversal.traverse();
+
+ verify(traversalHelper).sendCallbackTraversals(callbacks);
+ }
+
+ @Test
+ public void traverse_nullCallbacksMember_doesNotFail() {
+ when(operation.getCallbacks()).thenReturn(null);
+
+ operationTraversal.traverse();
+
+ verify(traversalHelper, atLeastOnce()).sendCallbackTraversals(any());
+ }
+
+ @Test
public void traverse_sendsExternalDocsToTraversalHelper() {
operationTraversal.traverse();
@@ -107,6 +128,22 @@
}
@Test
+ public void traverse_sendsSecurityRequirementsToTraversalHelper() {
+ operationTraversal.traverse();
+
+ verify(traversalHelper).sendSecurityRequirementTraversals(securityRequirements);
+ }
+
+ @Test
+ public void traverse_nullSecurityRequirementsMember_doesNotFail() {
+ when(operation.getSecurityRequirements()).thenReturn(null);
+
+ operationTraversal.traverse();
+
+ verify(traversalHelper, atLeastOnce()).sendSecurityRequirementTraversals(any());
+ }
+
+ @Test
public void traverse_sendsServersToTraversalHelper() {
operationTraversal.traverse();
@@ -121,20 +158,4 @@
verify(traversalHelper, atLeastOnce()).sendServerTraversals(any());
}
-
- @Test
- public void traverse_sendsCallbacksToTraversalHelper() {
- operationTraversal.traverse();
-
- verify(traversalHelper).sendCallbackTraversals(callbacks);
- }
-
- @Test
- public void traverse_nullCallbacksMember_doesNotFail() {
- when(operation.getCallbacks()).thenReturn(null);
-
- operationTraversal.traverse();
-
- verify(traversalHelper, atLeastOnce()).sendCallbackTraversals(any());
- }
}
diff --git a/oas-core/src/test/java/com/apigee/security/oas/extendedvalidator/TraversalCommandFactoryTest.java b/oas-core/src/test/java/com/apigee/security/oas/extendedvalidator/TraversalCommandFactoryTest.java
index 3a31349..9f8e177 100644
--- a/oas-core/src/test/java/com/apigee/security/oas/extendedvalidator/TraversalCommandFactoryTest.java
+++ b/oas-core/src/test/java/com/apigee/security/oas/extendedvalidator/TraversalCommandFactoryTest.java
@@ -20,6 +20,7 @@
import org.openapi4j.parser.model.v3.Operation;
import org.openapi4j.parser.model.v3.Parameter;
import org.openapi4j.parser.model.v3.Response;
+import org.openapi4j.parser.model.v3.SecurityRequirement;
import org.openapi4j.parser.model.v3.Server;
import org.openapi4j.parser.model.v3.ServerVariable;
import org.openapi4j.parser.model.v3.Tag;
@@ -79,6 +80,12 @@
}
@Test
+ public void create_securityRequirementPassed_returnsNonNullObject() {
+ assertThat(traversalCommandFactory.create(new SecurityRequirement(), traversalPath))
+ .isNotNull();
+ }
+
+ @Test
public void create_serverPassed_returnsNonNullObject() {
assertThat(traversalCommandFactory.create(new Server(), traversalPath)).isNotNull();
}