VOL-4337: Code upgrade for 3/2020 G.988 support and remaining Extended Message Set support

Change-Id: I6c5e1a167216ad9b51e9da89460e9909465ae1bc
diff --git a/mebase_test.go b/mebase_test.go
index 3c0fe0e..41e8e7c 100644
--- a/mebase_test.go
+++ b/mebase_test.go
@@ -57,3 +57,102 @@
 	mock := simpleMock(t)
 	assert.Equal(t, mock.CanDecode(), mock.MsgLayerType)
 }
+
+func TestDecodesFrameNoTrailer(t *testing.T) {
+	// No baseline trailer.  Which is okay. Earlier library release depended on at
+	// least the length field being present but we know baseline is always 40 bytes of payload
+
+	getAllAlarmsRequest := "04454b0a000200000000000000000000000000000000000000000000000000000000000000000000"
+	getAllAlarmsResponse := "04452b0a000200000003000000000000000000000000000000000000000000000000000000000000"
+
+	getAllAlarmsNextRequest := "02344c0a000200000003000000000000000000000000000000000000000000000000000000000000"
+	getAllAlarmsNextResponse := "02342c0a00020000000b010280000000000000000000000000000000000000000000000000000000"
+
+	alarmNotification := "0000100a000b01048000000000000000000000000000000000000000000000000000000000000005"
+
+	frames := []string{
+		getAllAlarmsRequest,
+		getAllAlarmsResponse,
+		getAllAlarmsNextRequest,
+		getAllAlarmsNextResponse,
+		alarmNotification,
+	}
+	for _, frame := range frames {
+		data, err := stringToPacket(frame)
+		assert.NoError(t, err)
+
+		packet := gopacket.NewPacket(data, LayerTypeOMCI, gopacket.NoCopy)
+		assert.NotNil(t, packet)
+
+		omciLayer := packet.Layer(LayerTypeOMCI)
+		assert.NotNil(t, omciLayer)
+	}
+}
+
+func TestDecodesFrameTooSmall(t *testing.T) {
+	// Less than 4 (so cannot determine message set)
+	veryShort := "04454b"
+
+	// Baseline message set checks (only 39 bytes)
+	// Extended message set checks (only 1 octet of 2 byte length field)
+	getAllAlarmsRequest := "04454b0a0002000000000000000000000000000000000000000000000000000000000000000000"
+	getAllAlarmsRequestExt := "04454b0b0002000000"
+	getAllAlarmsResponse := "04452b0a0002000000030000000000000000000000000000000000000000000000000000000000"
+	getAllAlarmsResponseExt := "04452b0b0002000000"
+
+	getAllAlarmsNextRequest := "02344c0a0002000000030000000000000000000000000000000000000000000000000000000000"
+	getAllAlarmsNextRequestExt := "02342c0b0002000000"
+	getAllAlarmsNextResponse := "02342c0a00020000000b0102800000000000000000000000000000000000000000000000000000"
+	getAllAlarmsNextResponseExt := "02342c0b0002000000"
+
+	alarmNotification := "0000100a000b010480000000000000000000000000000000000000000000000000000000000000"
+	alarmNotificationExt := "0000100b000b010400"
+
+	frames := []string{
+		veryShort,
+		getAllAlarmsRequest,
+		getAllAlarmsResponse,
+		getAllAlarmsNextRequest,
+		getAllAlarmsNextResponse,
+		alarmNotification,
+		getAllAlarmsRequestExt,
+		getAllAlarmsResponseExt,
+		getAllAlarmsNextRequestExt,
+		getAllAlarmsNextResponseExt,
+		alarmNotificationExt,
+	}
+	for _, frame := range frames {
+		data, err := stringToPacket(frame)
+		assert.NoError(t, err)
+
+		// Should get packet but with error layer
+		packet := gopacket.NewPacket(data, LayerTypeOMCI, gopacket.NoCopy)
+		assert.NotNil(t, packet)
+		errLayer := packet.ErrorLayer()
+		assert.NotNil(t, errLayer)
+		metaData := packet.Metadata()
+		assert.NotNil(t, metaData)
+		assert.True(t, metaData.Truncated)
+
+		omciLayer := packet.Layer(LayerTypeOMCI)
+		assert.Nil(t, omciLayer)
+	}
+}
+
+func TestFrameWithUnknownMessageType(t *testing.T) {
+	frame := "00010b0a000200000000000000000000000000000000000000000000000000000000000000000000"
+
+	data, err := stringToPacket(frame)
+	assert.NoError(t, err)
+
+	packet := gopacket.NewPacket(data, LayerTypeOMCI, gopacket.NoCopy)
+	assert.NotNil(t, packet)
+	errLayer := packet.ErrorLayer()
+	assert.NotNil(t, errLayer)
+	metaData := packet.Metadata()
+	assert.NotNil(t, metaData)
+	assert.False(t, metaData.Truncated)
+
+	omciLayer := packet.Layer(LayerTypeOMCI)
+	assert.NotNil(t, omciLayer)
+}