BUG-5138: NPE in PcRptMessageCodec 62/33762/1
authorMilos Fabian <milfabia@cisco.com>
Fri, 29 Jan 2016 11:13:05 +0000 (12:13 +0100)
committerMilos Fabian <milfabia@cisco.com>
Fri, 29 Jan 2016 11:34:16 +0000 (12:34 +0100)
To avoid NPE, process Bandwidth object first, then
all other objects in the list.

Change-Id: I2a09c7d9be1c2ee83bcd3563c854faaefe35ccd4
Signed-off-by: Milos Fabian <milfabia@cisco.com>
pcep/auto-bandwidth-extension/src/main/java/org/opendaylight/protocol/pcep/auto/bandwidth/extension/PcRptMessageCodec.java
pcep/auto-bandwidth-extension/src/test/java/org/opendaylight/protocol/pcep/auto/bandwidth/extension/PcRptMessageCodecTest.java

index d6f20442c96b2f1f5fc3b89437f13cfbf3d07bb2..11de0761deaad4b394eeacab9567f093c7abdaef 100644 (file)
@@ -36,14 +36,21 @@ public class PcRptMessageCodec extends Stateful07PCReportMessageParser {
 
     @Override
     protected Reports getValidReports(final List<Object> objects, final List<Message> errors) {
-        final Reports validReports = super.getValidReports(objects, errors);
         final Optional<Object> find = Iterables.tryFind(objects, Predicates.instanceOf(BandwidthUsage.class));
-        final Path path = validReports.getPath();
-        if (find.isPresent() && path != null) {
-            final Object object = find.get();
+        final Object object;
+        if (find.isPresent()) {
+            object = find.get();
             objects.remove(object);
-            return new ReportsBuilder(validReports).setPath(new PathBuilder(path).setBandwidth(
-                    setBandwidthUsage(path.getBandwidth(), (BandwidthUsage) object)).build()).build();
+        } else {
+            object = null;
+        }
+        final Reports validReports = super.getValidReports(objects, errors);
+        if (object != null && validReports != null) {
+            final Path path = validReports.getPath();
+            if (path != null) {
+                return new ReportsBuilder(validReports).setPath(new PathBuilder(path).setBandwidth(
+                        setBandwidthUsage(path.getBandwidth(), (BandwidthUsage) object)).build()).build();
+            }
         }
         return validReports;
     }
index 157dd91ea4165da8531c4fd13d23828d414b6e07..35cd57bc274cc75e9d6b734814c7b3676a0d1dc3 100644 (file)
@@ -16,18 +16,21 @@ import io.netty.buffer.ByteBuf;
 import io.netty.buffer.Unpooled;
 import java.util.Collections;
 import java.util.List;
+import javax.xml.bind.DatatypeConverter;
 import org.junit.After;
 import org.junit.Assert;
 import org.junit.Before;
 import org.junit.Test;
 import org.opendaylight.protocol.pcep.ietf.stateful07.StatefulActivator;
 import org.opendaylight.protocol.pcep.impl.Activator;
+import org.opendaylight.protocol.pcep.spi.PCEPDeserializerException;
 import org.opendaylight.protocol.pcep.spi.pojo.SimplePCEPExtensionProviderContext;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.controller.pcep.auto.bandwidth.rev160109.Bandwidth1;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.controller.pcep.auto.bandwidth.rev160109.Bandwidth1Builder;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.controller.pcep.auto.bandwidth.rev160109.bandwidth.usage.object.BandwidthUsage;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.controller.pcep.auto.bandwidth.rev160109.bandwidth.usage.object.BandwidthUsageBuilder;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.network.concepts.rev131125.Bandwidth;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.pcep.ietf.stateful.rev131222.Pcrpt;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.pcep.ietf.stateful.rev131222.lsp.object.Lsp;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.pcep.ietf.stateful.rev131222.lsp.object.LspBuilder;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.pcep.ietf.stateful.rev131222.pcrpt.message.pcrpt.message.Reports;
@@ -42,6 +45,7 @@ public class PcRptMessageCodecTest {
     private SimplePCEPExtensionProviderContext ctx;
     private Activator act;
     private StatefulActivator statefulAct;
+    private org.opendaylight.protocol.pcep.auto.bandwidth.extension.Activator autoBwActivator;
 
     @Before
     public void setUp() {
@@ -50,12 +54,15 @@ public class PcRptMessageCodecTest {
         this.act.start(this.ctx);
         this.statefulAct = new StatefulActivator();
         this.statefulAct.start(this.ctx);
+        this.autoBwActivator = new org.opendaylight.protocol.pcep.auto.bandwidth.extension.Activator(5);
+        this.autoBwActivator.start(this.ctx);
     }
 
     @After
     public void tearDown() {
         this.act.stop();
         this.statefulAct.stop();
+        this.autoBwActivator.stop();
     }
 
     @Test
@@ -81,4 +88,11 @@ public class PcRptMessageCodecTest {
         Assert.assertTrue(buffer.readableBytes() > 0);
     }
 
+    @Test
+    public void testReportMsgWithRro() throws PCEPDeserializerException {
+        final byte[] parseHexBinary = DatatypeConverter.parseHexBinary("2010003c0084a019001100106e79636e7932316372735f7432313231001200100a0000d2004008490a0000d40a0000d4001f0006000005dd700000000710001401080a000706200001080a0000d420000910001400000000000000000000000005050100051000084998968005500008513a43b70810002401080a0000d42020030801010000000001080a00070620000308010100000000");
+        final Pcrpt msg = (Pcrpt) this.ctx.getMessageHandlerRegistry().parseMessage(10, Unpooled.wrappedBuffer(parseHexBinary), Collections.<Message>emptyList());
+        Assert.assertNotNull(msg.getPcrptMessage().getReports().get(0).getPath().getBandwidth().getAugmentation(Bandwidth1.class));
+    }
+
 }