package org.opennaas.extensions.quantum.model; import java.io.IOException; import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; import org.codehaus.jackson.JsonGenerationException; import org.codehaus.jackson.JsonParseException; import org.codehaus.jackson.map.JsonMappingException; import org.codehaus.jackson.map.ObjectMapper; import org.codehaus.jackson.map.annotate.JsonSerialize.Inclusion; import org.codehaus.jackson.xc.JaxbAnnotationIntrospector; import org.json.JSONException; import org.junit.Test; import org.opennaas.extensions.quantum.extensions.l3.model.Router; import org.opennaas.extensions.quantum.extensions.l3.model.wrappers.IdTenantIdSubnetIdPortIdWrapper; import org.opennaas.extensions.quantum.extensions.l3.model.wrappers.SubnetIdPortIdWrapper; import org.opennaas.extensions.quantum.model.helper.QuantumModelHelper; import org.skyscreamer.jsonassert.JSONAssert; import com.google.common.base.Charsets; import com.google.common.io.Resources; public class QuantumModelSerializingTest { private static final Log log = LogFactory.getLog(QuantumModelSerializingTest.class); private final static String networkJsonSample1 = "quantum-api/sample/json/network-post-req_new-3c0e668cae863734e746dbf72e3f2f3a272a9a0d.json"; private final static String networkJsonSample2 = "quantum-api/sample/json/network-post-resp_new-b07d8f156aa4354b80a7a8160522e5e179ca363b.json"; private final static String networkJsonSample3 = "quantum-api/sample/json/network-put-update.req_new-c5924ea7732c6bd48107fa2038fa4bcd84d435d9.json"; private final static String networkJsonSample4 = "quantum-api/sample/json/network-put-update-resp_new-fefa054df4c4a7735e42c555baa86d4f01969335.json"; private final static String networkJsonSample5 = "quantum-api/sample/json/networks-get-detail-resp_new-42e71c52ad4e79759c3c7a9f691b64cb472cfcb3.json"; private final static String networksJsonSample1 = "quantum-api/sample/json/networks-get-resp_new-8aa85d6952ee8a70e16252e7e7d69e5ed187627c.json"; private final static String portJsonSample1 = "quantum-api/sample/json/port-post-create-req_new-fbcbcc7c165acb0eca1f024f6a85065938df215f.json"; private final static String portsJsonSample1 = "quantum-api/sample/json/ports-get-resp_new-afb81c390ff648144013ef83eff6f489c00cc480.json"; private final static String subnetsJsonSample1 = "quantum-api/sample/json/subnets-get-resp_new-e5637401ce7357fa8c376065aaa0a6986db32b6a.json"; private final static String l3NetworkListRouterResponseSample = "quantum-api/extensions/l3/json/example_5.10_List_Routers_JSON_Response.json"; private final static String l3NetworkShowRouterResponseSample = "quantum-api/extensions/l3/json/example_5.12_Show_Router_JSON_Response.json"; private final static String l3NetworkCreateRouterRequestSample = "quantum-api/extensions/l3/json/example_5.13_Create_Router_JSON_Request.json"; private final static String l3NetworkCreateRouterResponseSample = "quantum-api/extensions/l3/json/example_5.14_Create_Router_JSON_Response.json"; private final static String l3NetworkUpdateRouterRequestSample = "quantum-api/extensions/l3/json/example_5.15_Update_Router_JSON_Request.json"; private final static String l3NetworkUpdateRouterResponseSample = "quantum-api/extensions/l3/json/example_5.16_Update_Router_JSON_Response.json"; private final static String l3NetworkAddRouterInterfaceRequestSample = "quantum-api/extensions/l3/json/example_5.18_Add_Router_Interface_JSON_Request.json"; private final static String l3NetworkAddRouterInterfaceResponseSample = "quantum-api/extensions/l3/json/example_5.19_Add_Router_Interface_JSON_Response.json"; private final static String l3NetworkRemoveRouterInterfaceRequestSample = "quantum-api/extensions/l3/json/example_5.20_Remove_Router_Interface_JSON_Request.json"; private final static String l3NetworkRemoveRouterInterfaceResponseSample = "quantum-api/extensions/l3/json/example_5.21_Remove_Router_Interface_JSON_Response.json"; @Test public void serializeTest() throws JsonGenerationException, JsonMappingException, IOException { QuantumModel sampleQuantumModel = QuantumModelHelper.generateSampleQuantumModel(); String serializedQuantumModel = serialize(sampleQuantumModel, true); log.debug("Serialized QuantumModel:\n" + serializedQuantumModel); } @Test public void deserializeTest() throws IOException, JSONException { String originalSerializedNetwork1 = GetFileAsString(networkJsonSample1); Network deserializedNetwork1 = (Network) deserialize(Network.class, originalSerializedNetwork1, false); String serializedNetwork1 = serialize(deserializedNetwork1, false); log.debug("Original Serialized Network 1:\n" + originalSerializedNetwork1); log.debug("Serialized Network 1:\n" + serializedNetwork1); JSONAssert.assertEquals(originalSerializedNetwork1, serializedNetwork1, false); String originalSerializedNetwork2 = GetFileAsString(networkJsonSample2); Network deserializedNetwork2 = (Network) deserialize(Network.class, originalSerializedNetwork2, false); String serializedNetwork2 = serialize(deserializedNetwork2, false); log.debug("Original Serialized Network 2:\n" + originalSerializedNetwork2); log.debug("Serialized Network 2:\n" + serializedNetwork2); JSONAssert.assertEquals(originalSerializedNetwork2, serializedNetwork2, false); String originalSerializedNetwork3 = GetFileAsString(networkJsonSample3); Network deserializedNetwork3 = (Network) deserialize(Network.class, originalSerializedNetwork3, false); String serializedNetwork3 = serialize(deserializedNetwork3, false); log.debug("Original Serialized Network 3:\n" + originalSerializedNetwork3); log.debug("Serialized Network 3:\n" + serializedNetwork3); JSONAssert.assertEquals(originalSerializedNetwork3, serializedNetwork3, false); String originalSerializedNetwork4 = GetFileAsString(networkJsonSample4); Network deserializedNetwork4 = (Network) deserialize(Network.class, originalSerializedNetwork4, false); String serializedNetwork4 = serialize(deserializedNetwork4, false); log.debug("Original Serialized Network 4:\n" + originalSerializedNetwork4); log.debug("Serialized Network 4:\n" + serializedNetwork4); // FIXME lists of IDs, not elements with IDs // JSONAssert.assertEquals(originalSerializedNetwork4, serializedNetwork4, false); String originalSerializedNetwork5 = GetFileAsString(networkJsonSample5); Network deserializedNetwork5 = (Network) deserialize(Network.class, originalSerializedNetwork5, false); String serializedNetwork5 = serialize(deserializedNetwork5, false); log.debug("Original Serialized Network 5:\n" + originalSerializedNetwork5); log.debug("Serialized Network 5:\n" + serializedNetwork5); // FIXME lists of IDs, not elements with IDs // JSONAssert.assertEquals(originalSerializedNetwork5, serializedNetwork5, false); String originalSerializedNetworks1 = GetFileAsString(networksJsonSample1); QuantumModel deserializedNetworks1 = (QuantumModel) deserialize(QuantumModel.class, originalSerializedNetworks1, true); String serializedNetworks1 = serialize(deserializedNetworks1, true); log.debug("Original Serialized Networks 1:\n" + originalSerializedNetworks1); log.debug("Serialized Networks 1:\n" + serializedNetworks1); // FIXME lists of IDs, not elements with IDs // JSONAssert.assertEquals(originalSerializedNetworks1, serializedNetworks1, false); String originalSerializedPort1 = GetFileAsString(portJsonSample1); Port deserializedPort1 = (Port) deserialize(Port.class, originalSerializedPort1, false); String serializedPort1 = serialize(deserializedPort1, false); log.debug("Original Serialized Port 1:\n" + originalSerializedPort1); log.debug("Serialized Port 1:\n" + serializedPort1); JSONAssert.assertEquals(originalSerializedPort1, serializedPort1, false); String originalSerializedPorts1 = GetFileAsString(portsJsonSample1); QuantumModel deserializedPorts1 = (QuantumModel) deserialize(QuantumModel.class, originalSerializedPorts1, true); String serializedPorts1 = serialize(deserializedPorts1, true); log.debug("Original Serialized Ports 1:\n" + originalSerializedPorts1); log.debug("Serialized Ports 1:\n" + serializedPorts1); // FIXME ignore extension fields ("binding:XYZ") // JSONAssert.assertEquals(originalSerializedPorts1, serializedPorts1, false); String originalSerializedSubnets1 = GetFileAsString(subnetsJsonSample1); QuantumModel deserializedSubnets1 = (QuantumModel) deserialize(QuantumModel.class, originalSerializedSubnets1, true); String serializedSubnets1 = serialize(deserializedSubnets1, true); log.debug("Original Serialized Subnets 1:\n" + originalSerializedSubnets1); log.debug("Serialized Subnets 1:\n" + serializedSubnets1); JSONAssert.assertEquals(originalSerializedSubnets1, serializedSubnets1, false); } @Test public void l3extensionTest() throws IOException, JSONException { String originalSerializedListRouterResponse = GetFileAsString(l3NetworkListRouterResponseSample); QuantumModel deserializedListRouterResponse = (QuantumModel) deserialize(QuantumModel.class, originalSerializedListRouterResponse, true); String serializedListRouterResponse = serialize(deserializedListRouterResponse, true); log.debug("Original List Router Response:\n" + originalSerializedListRouterResponse); log.debug("Serialized List Router Response:\n" + serializedListRouterResponse); // FIXME: ignore null fields // JSONAssert.assertEquals(originalSerializedListRouterResponse, serializedListRouterResponse, false); String originalSerializedShowRouterResponse = GetFileAsString(l3NetworkShowRouterResponseSample); QuantumModel deserializedShowRouterResponse = (QuantumModel) deserialize(QuantumModel.class, originalSerializedShowRouterResponse, true); String serializedShowRouterResponse = serialize(deserializedShowRouterResponse, true); log.debug("Original Show Router Response:\n" + originalSerializedShowRouterResponse); log.debug("Serialized Show Router Response:\n" + serializedShowRouterResponse); JSONAssert.assertEquals(originalSerializedShowRouterResponse, serializedShowRouterResponse, false); String originalSerializedCreateRouterRequest = GetFileAsString(l3NetworkCreateRouterRequestSample); Router deserializedCreateRouterRequest = (Router) deserialize(Router.class, originalSerializedCreateRouterRequest, false); String serializedCreateRouterRequest = serialize(deserializedCreateRouterRequest, false); log.debug("Original Create Router Request:\n" + originalSerializedCreateRouterRequest); log.debug("Serialized Create Router Request:\n" + serializedCreateRouterRequest); JSONAssert.assertEquals(originalSerializedCreateRouterRequest, serializedCreateRouterRequest, false); String originalSerializedCreateRouterResponse = GetFileAsString(l3NetworkCreateRouterResponseSample); Router deserializedCreateRouterResponse = (Router) deserialize(Router.class, originalSerializedCreateRouterResponse, false); String serializedCreateRouterResponse = serialize(deserializedCreateRouterResponse, false); log.debug("Original Create Router Response:\n" + originalSerializedCreateRouterResponse); log.debug("Serialized Create Router Response:\n" + serializedCreateRouterResponse); // FIXME: ignore null fields // JSONAssert.assertEquals(originalSerializedCreateRouterResponse, serializedCreateRouterResponse, false); String originalSerializedUpdateRouterRequest = GetFileAsString(l3NetworkUpdateRouterRequestSample); Router deserializedUpdateRouterRequest = (Router) deserialize(Router.class, originalSerializedUpdateRouterRequest, false); String serializedUpdateRouterRequest = serialize(deserializedUpdateRouterRequest, false); log.debug("Original Update Router Request:\n" + originalSerializedUpdateRouterRequest); log.debug("Serialized Update Router Request:\n" + serializedUpdateRouterRequest); JSONAssert.assertEquals(originalSerializedUpdateRouterRequest, serializedUpdateRouterRequest, false); String originalSerializedUpdateRouterResponse = GetFileAsString(l3NetworkUpdateRouterResponseSample); Router deserializedUpdateRouterResponse = (Router) deserialize(Router.class, originalSerializedUpdateRouterResponse, false); String serializedUpdateRouterResponse = serialize(deserializedUpdateRouterResponse, false); log.debug("Original Update Router Response:\n" + originalSerializedUpdateRouterResponse); log.debug("Serialized Update Router Response:\n" + serializedUpdateRouterResponse); JSONAssert.assertEquals(originalSerializedUpdateRouterResponse, serializedUpdateRouterResponse, false); String originalSerializedAddRouterInterfaceRequest = GetFileAsString(l3NetworkAddRouterInterfaceRequestSample); SubnetIdPortIdWrapper deserializedAddRouterInterfaceRequest = (SubnetIdPortIdWrapper) deserialize(SubnetIdPortIdWrapper.class, originalSerializedAddRouterInterfaceRequest, true); String serializedAddRouterInterfaceRequest = serialize(deserializedAddRouterInterfaceRequest, true); log.debug("Original Add Router Interface Request:\n" + originalSerializedAddRouterInterfaceRequest); log.debug("Serialized Add Router Interface Request:\n" + serializedAddRouterInterfaceRequest); JSONAssert.assertEquals(originalSerializedAddRouterInterfaceRequest, serializedAddRouterInterfaceRequest, false); String originalSerializedAddRouterInterfaceResponse = GetFileAsString(l3NetworkAddRouterInterfaceResponseSample); SubnetIdPortIdWrapper deserializedAddRouterInterfaceResponse = (SubnetIdPortIdWrapper) deserialize(SubnetIdPortIdWrapper.class, originalSerializedAddRouterInterfaceResponse, true); String serializedAddRouterInterfaceResponse = serialize(deserializedAddRouterInterfaceResponse, true); log.debug("Original Add Router Interface Response:\n" + originalSerializedAddRouterInterfaceResponse); log.debug("Serialized Add Router Interface Response:\n" + serializedAddRouterInterfaceResponse); JSONAssert.assertEquals(originalSerializedAddRouterInterfaceResponse, serializedAddRouterInterfaceResponse, false); String originalSerializedRemoveRouterInterfaceRequest = GetFileAsString(l3NetworkRemoveRouterInterfaceRequestSample); SubnetIdPortIdWrapper deserializedRemoveRouterInterfaceRequest = (SubnetIdPortIdWrapper) deserialize(SubnetIdPortIdWrapper.class, originalSerializedRemoveRouterInterfaceRequest, true); String serializedRemoveRouterInterfaceRequest = serialize(deserializedRemoveRouterInterfaceRequest, true); log.debug("Original Remove Router Interface Request:\n" + originalSerializedRemoveRouterInterfaceRequest); log.debug("Serialized Remove Router Interface Request:\n" + serializedRemoveRouterInterfaceRequest); JSONAssert.assertEquals(originalSerializedRemoveRouterInterfaceRequest, serializedRemoveRouterInterfaceRequest, false); String originalSerializedRemoveRouterInterfaceResponse = GetFileAsString(l3NetworkRemoveRouterInterfaceResponseSample); IdTenantIdSubnetIdPortIdWrapper deserializedRemoveRouterInterfaceResponse = (IdTenantIdSubnetIdPortIdWrapper) deserialize( IdTenantIdSubnetIdPortIdWrapper.class, originalSerializedRemoveRouterInterfaceResponse, true); String serializedRemoveRouterInterfaceResponse = serialize(deserializedRemoveRouterInterfaceResponse, true); log.debug("Original Remove Router Interface Response:\n" + originalSerializedRemoveRouterInterfaceResponse); log.debug("Serialized Remove Router Interface Response:\n" + serializedRemoveRouterInterfaceResponse); JSONAssert.assertEquals(originalSerializedRemoveRouterInterfaceResponse, serializedRemoveRouterInterfaceResponse, false); } private static String GetFileAsString(String filePath) throws IOException { log.debug("Reading file: " + filePath); return Resources.toString(Resources.getResource(filePath), Charsets.UTF_8); } private static String serialize(Object quantumModel, boolean rootObject) throws JsonGenerationException, JsonMappingException, IOException { ObjectMapper mapper = new ObjectMapper(); mapper.setAnnotationIntrospector(new JaxbAnnotationIntrospector()); mapper.configure(org.codehaus.jackson.map.SerializationConfig.Feature.WRAP_ROOT_VALUE, !rootObject); mapper.setSerializationInclusion(Inclusion.NON_NULL); mapper.configure(org.codehaus.jackson.map.SerializationConfig.Feature.INDENT_OUTPUT, true); return mapper.writeValueAsString(quantumModel); } private static Object deserialize(Class<?> quantumObjectClass, String serializedObject, boolean rootObject) throws JsonParseException, JsonMappingException, IOException { ObjectMapper mapper = new ObjectMapper(); mapper.setAnnotationIntrospector(new JaxbAnnotationIntrospector()); mapper.configure(org.codehaus.jackson.map.DeserializationConfig.Feature.UNWRAP_ROOT_VALUE, !rootObject); mapper.configure(org.codehaus.jackson.map.DeserializationConfig.Feature.FAIL_ON_UNKNOWN_PROPERTIES, false); return mapper.readValue(serializedObject, quantumObjectClass); } }