1515 */
1616package com .github .shyiko .mysql .binlog .event .deserialization ;
1717
18+ import com .github .shyiko .mysql .binlog .event .Event ;
19+ import com .github .shyiko .mysql .binlog .event .EventHeader ;
20+ import com .github .shyiko .mysql .binlog .event .EventHeaderV4 ;
1821import com .github .shyiko .mysql .binlog .event .EventType ;
1922import com .github .shyiko .mysql .binlog .event .TransactionPayloadEventData ;
20- import com .github .shyiko .mysql .binlog .event .XAPrepareEventData ;
23+ import com .github .shyiko .mysql .binlog .event .UpdateRowsEventData ;
2124import com .github .shyiko .mysql .binlog .io .ByteArrayInputStream ;
2225import org .testng .annotations .Test ;
2326
2427import java .io .IOException ;
28+ import java .io .Serializable ;
2529
2630import static org .testng .Assert .assertEquals ;
31+ import static org .testng .AssertJUnit .assertTrue ;
2732
2833/**
2934 * @author <a href="mailto:[email protected] ">Somesh Malviya</a> @@ -81,6 +86,7 @@ public class TransactionPayloadEventDataDeserializerTest {
8186 " after=[1, Once Upon a Time in the West, 1968, Italy, Western|Action, Claudia Cardinale|Charles Bronson|Henry Fonda|Gabriele Ferzetti|Frank Wolff|Al Mulock|Jason Robards|Woody Strode|Jack Elam|Lionel Stander|Paolo Stoppa|Keenan Wynn|Aldo Sambrell, Sergio Leone, Ennio Morricone, Sergio Leone|Sergio Donati|Dario Argento|Bernardo Bertolucci, Tonino Delli Colli, Paramount Pictures]}\n " )
8287 .append ("]}" )
8388 .toString ();
89+ private static final byte [] UNCOMPRESSED_UPDATE_EVENT_BEFORE_ROW_0_BYTE_ARRAY = new byte [] {1 , 0 , 0 , 0 };
8490
8591 @ Test
8692 public void deserialize () throws IOException {
@@ -97,4 +103,60 @@ public void deserialize() throws IOException {
97103 assertEquals (EventType .XID , transactionPayloadEventData .getUncompressedEvents ().get (3 ).getHeader ().getEventType ());
98104 assertEquals (UNCOMPRESSED_UPDATE_EVENT , transactionPayloadEventData .getUncompressedEvents ().get (2 ).getData ().toString ());
99105 }
106+
107+ @ Test
108+ public void deserializePropagatingCompatibilityModeToTransactionPayloadEventDataDeserializer () throws IOException {
109+
110+ ByteArrayInputStream dataStream = new ByteArrayInputStream (DATA );
111+
112+ // Mock create target TransactionPayloadEventData DATA event header
113+ final EventHeaderV4 eventHeader = new EventHeaderV4 ();
114+ eventHeader .setEventType (EventType .TRANSACTION_PAYLOAD );
115+ eventHeader .setEventLength (DATA .length + 19L );
116+ eventHeader .setTimestamp (1646406641000L );
117+ eventHeader .setServerId (223344 );
118+
119+
120+ EventHeaderDeserializer eventHeaderDeserializer = new EventHeaderDeserializer () {
121+
122+ private long count = 0L ;
123+
124+ private EventHeaderDeserializer defaultEventHeaderDeserializer = new EventHeaderV4Deserializer ();
125+
126+ @ Override
127+ public EventHeader deserialize (ByteArrayInputStream inputStream ) throws IOException {
128+ if (count > 0 ) {
129+ // uncompressed event header deserialize
130+ return defaultEventHeaderDeserializer .deserialize (inputStream );
131+ }
132+ count ++;
133+ // we need to return target TransactionPayloadEventData DATA event header we had mocked
134+ return eventHeader ;
135+ }
136+ };
137+
138+ EventDeserializer eventDeserializer = new EventDeserializer (eventHeaderDeserializer , new NullEventDataDeserializer ());
139+ eventDeserializer .setCompatibilityMode (EventDeserializer .CompatibilityMode .INTEGER_AS_BYTE_ARRAY );
140+
141+ Event event = eventDeserializer .nextEvent (dataStream );
142+
143+ assertTrue (event .getHeader ().getEventType () == EventType .TRANSACTION_PAYLOAD );
144+ assertTrue (event .getData () instanceof TransactionPayloadEventData );
145+
146+ TransactionPayloadEventData transactionPayloadEventData = event .getData ();
147+ assertEquals (COMPRESSION_TYPE , transactionPayloadEventData .getCompressionType ());
148+ assertEquals (PAYLOAD_SIZE , transactionPayloadEventData .getPayloadSize ());
149+ assertEquals (UNCOMPRESSED_SIZE , transactionPayloadEventData .getUncompressedSize ());
150+ assertEquals (NUMBER_OF_UNCOMPRESSED_EVENTS , transactionPayloadEventData .getUncompressedEvents ().size ());
151+ assertEquals (EventType .QUERY , transactionPayloadEventData .getUncompressedEvents ().get (0 ).getHeader ().getEventType ());
152+ assertEquals (EventType .TABLE_MAP , transactionPayloadEventData .getUncompressedEvents ().get (1 ).getHeader ().getEventType ());
153+ assertEquals (EventType .EXT_UPDATE_ROWS , transactionPayloadEventData .getUncompressedEvents ().get (2 ).getHeader ().getEventType ());
154+ assertEquals (EventType .XID , transactionPayloadEventData .getUncompressedEvents ().get (3 ).getHeader ().getEventType ());
155+ assertTrue (transactionPayloadEventData .getUncompressedEvents ().get (2 ).getData () instanceof UpdateRowsEventData );
156+
157+ UpdateRowsEventData updateRowsEventData = transactionPayloadEventData .getUncompressedEvents ().get (2 ).getData ();
158+ assertEquals (1 , updateRowsEventData .getRows ().size ());
159+ Serializable [] updateBefore = updateRowsEventData .getRows ().get (0 ).getKey ();
160+ assertEquals (UNCOMPRESSED_UPDATE_EVENT_BEFORE_ROW_0_BYTE_ARRAY , updateBefore [0 ]);
161+ }
100162}
0 commit comments