b/161811574 Refactor OpenApi3 and Info Traversal to check state of getters

Change-Id: I984666c5902217e4c1f0028cb17d8753ae03c91b
diff --git a/oas-core/src/main/java/com/apigee/security/oas/extendedvalidator/InfoTraversal.java b/oas-core/src/main/java/com/apigee/security/oas/extendedvalidator/InfoTraversal.java
index 046b274..18d3974 100644
--- a/oas-core/src/main/java/com/apigee/security/oas/extendedvalidator/InfoTraversal.java
+++ b/oas-core/src/main/java/com/apigee/security/oas/extendedvalidator/InfoTraversal.java
@@ -1,6 +1,7 @@
 package com.apigee.security.oas.extendedvalidator;
 
 import com.google.inject.assistedinject.Assisted;
+import java.util.Optional;
 import javax.inject.Inject;
 import org.openapi4j.parser.model.v3.Info;
 
@@ -24,10 +25,23 @@
   public void traverse() {
     // TODO(b/161441872): Process extensions.
 
-    // TODO(b/161811574): Add checks for field unpacking.
-    traversalCoordinator.handleTraversalCommand(
-        traversalCommandFactory.create(openApiSchemaObj.getContact()));
-    traversalCoordinator.handleTraversalCommand(
-        traversalCommandFactory.create(openApiSchemaObj.getLicense()));
+    traverseContact();
+    traverseLicense();
+  }
+
+  private void traverseContact() {
+    Optional.ofNullable(openApiSchemaObj.getContact())
+        .ifPresent(
+            contact ->
+                traversalCoordinator.handleTraversalCommand(
+                    traversalCommandFactory.create(contact)));
+  }
+
+  private void traverseLicense() {
+    Optional.ofNullable(openApiSchemaObj.getLicense())
+        .ifPresent(
+            license ->
+                traversalCoordinator.handleTraversalCommand(
+                    traversalCommandFactory.create(license)));
   }
 }
diff --git a/oas-core/src/main/java/com/apigee/security/oas/extendedvalidator/OpenApiSpecificationTraversal.java b/oas-core/src/main/java/com/apigee/security/oas/extendedvalidator/OpenApiSpecificationTraversal.java
index 109132d..0c64fd7 100644
--- a/oas-core/src/main/java/com/apigee/security/oas/extendedvalidator/OpenApiSpecificationTraversal.java
+++ b/oas-core/src/main/java/com/apigee/security/oas/extendedvalidator/OpenApiSpecificationTraversal.java
@@ -32,10 +32,10 @@
   }
 
   private void traverseInfo() {
-    // TODO(b/161811574): Safely unpack Info.
-
-    traversalCoordinator.handleTraversalCommand(
-        traversalCommandFactory.create(openApiSchemaObj.getInfo()));
+    Optional.ofNullable(openApiSchemaObj.getInfo())
+        .ifPresent(
+            info ->
+                traversalCoordinator.handleTraversalCommand(traversalCommandFactory.create(info)));
   }
 
   private void traverseServers() {
diff --git a/oas-core/src/test/java/com/apigee/security/oas/extendedvalidator/InfoTraversalTest.java b/oas-core/src/test/java/com/apigee/security/oas/extendedvalidator/InfoTraversalTest.java
index bafcd85..ffc56cd 100644
--- a/oas-core/src/test/java/com/apigee/security/oas/extendedvalidator/InfoTraversalTest.java
+++ b/oas-core/src/test/java/com/apigee/security/oas/extendedvalidator/InfoTraversalTest.java
@@ -52,12 +52,23 @@
   }
 
   @Test
+  public void traverse_nullContactChild_doesNotThrowException() {
+    when(info.getContact()).thenReturn(null);
+
+    infoTraversal.traverse();
+  }
+
+  @Test
   public void traverse_sendsTraversalCoordinatorLicenseTraversalCommand() {
     infoTraversal.traverse();
 
     verify(traversalCoordinator).handleTraversalCommand(any(LicenseTraversal.class));
   }
 
-  // TODO(b/161811574): Add tests for additional nullable children.
+  @Test
+  public void traverse_nullLicenseChild_doesNotThrowException() {
+    when(info.getLicense()).thenReturn(null);
 
+    infoTraversal.traverse();
+  }
 }
diff --git a/oas-core/src/test/java/com/apigee/security/oas/extendedvalidator/OpenApiSpecificationTraversalTest.java b/oas-core/src/test/java/com/apigee/security/oas/extendedvalidator/OpenApiSpecificationTraversalTest.java
index 0887e9d..9791f58 100644
--- a/oas-core/src/test/java/com/apigee/security/oas/extendedvalidator/OpenApiSpecificationTraversalTest.java
+++ b/oas-core/src/test/java/com/apigee/security/oas/extendedvalidator/OpenApiSpecificationTraversalTest.java
@@ -64,7 +64,12 @@
     verify(traversalCoordinator).handleTraversalCommand(any(InfoTraversal.class));
   }
 
-  // TODO(b/161811574): Add tests to check other nullable children.
+  @Test
+  public void traverse_nullInfoChild_doesNotThrowException() {
+    when(openApiSpec.getInfo()).thenReturn(null);
+
+    openApiSpecificationTraversal.traverse();
+  }
 
   @Test
   public void traverse_sendsServerChildrenTraversalsToTraversalCommander() {