/* * Copyright 2014 NAVER Corp. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ package com.navercorp.pinpoint.plugin.gson; import static com.navercorp.pinpoint.bootstrap.plugin.test.Expectations.*; import java.io.Reader; import java.io.StringReader; import java.io.StringWriter; import java.lang.reflect.Method; import java.lang.reflect.Type; import org.junit.Test; import org.junit.runner.RunWith; import com.google.gson.Gson; import com.google.gson.JsonElement; import com.google.gson.JsonParser; import com.google.gson.stream.JsonReader; import com.google.gson.stream.JsonWriter; import com.navercorp.pinpoint.bootstrap.plugin.test.ExpectedAnnotation; import com.navercorp.pinpoint.bootstrap.plugin.test.PluginTestVerifier; import com.navercorp.pinpoint.bootstrap.plugin.test.PluginTestVerifierHolder; import com.navercorp.pinpoint.test.plugin.Dependency; import com.navercorp.pinpoint.test.plugin.PinpointPluginTestSuite; /** * @author ChaYoung You */ @RunWith(PinpointPluginTestSuite.class) @Dependency({"com.google.code.gson:gson:[1.1],[1.4],[1.5],[1.6],[1.7.2],[2.0],[2.1],[2.2.4],[2.3.1,)"}) public class GsonIT { private static final boolean v1_2; private static final boolean v1_6; static { Method m = null; try { m = Gson.class.getMethod("fromJson", Reader.class, Class.class); } catch (NoSuchMethodException ignored) { } v1_2 = m != null; Class<?> c = null; try { c = Class.forName("com.google.gson.stream.JsonReader"); } catch (ClassNotFoundException ignored) { } v1_6 = c != null; } private static final String java = "Pinpoint"; private static final String json = new Gson().toJson(java); private static final String serviceType = "GSON"; private static final String annotationKeyName = "gson.json.length"; private static final ExpectedAnnotation expectedAnnotation = annotation(annotationKeyName, json.length()); @Test public void test() throws Exception { final Gson gson = new Gson(); /** * @see Gson#fromJson(String, Class) * @see Gson#fromJson(String, InterceptPoint) */ gson.fromJson(json, String.class); gson.fromJson(json, (Type) String.class); Method fromJson1 = Gson.class.getDeclaredMethod("fromJson", String.class, Class.class); Method fromJson2 = Gson.class.getDeclaredMethod("fromJson", String.class, Type.class); /** * @see Gson#toJson(Object) * @see Gson#toJson(Object, InterceptPoint) */ gson.toJson(java); gson.toJson(java, String.class); Method toJson1 = Gson.class.getDeclaredMethod("toJson", Object.class); Method toJson2 = Gson.class.getDeclaredMethod("toJson", Object.class, Type.class); PluginTestVerifier verifier = PluginTestVerifierHolder.getInstance(); verifier.printCache(); verifier.verifyTrace(event(serviceType, fromJson1, expectedAnnotation), event(serviceType, fromJson2, expectedAnnotation)); verifier.verifyTrace(event(serviceType, toJson1, expectedAnnotation), event(serviceType, toJson2, expectedAnnotation)); // No more traces verifier.verifyTraceCount(0); } @Test public void testFromV1_2() throws Exception { if (!v1_2) { return; } final Gson gson = new Gson(); final JsonElement jsonElement = getParseElements(); /** * @see Gson#fromJson(Reader, Class) * @see Gson#fromJson(Reader, InterceptPoint) * @see Gson#fromJson(JsonElement, Class) * @see Gson#fromJson(JsonElement, InterceptPoint) */ gson.fromJson(new StringReader(json), (Class<?>) String.class); gson.fromJson(new StringReader(json), (Type) String.class); gson.fromJson(jsonElement, String.class); gson.fromJson(jsonElement, (Type) String.class); Method fromJson3 = Gson.class.getDeclaredMethod("fromJson", Reader.class, Class.class); Method fromJson4 = Gson.class.getDeclaredMethod("fromJson", Reader.class, Type.class); Method fromJson6 = Gson.class.getDeclaredMethod("fromJson", JsonElement.class, Class.class); Method fromJson7 = Gson.class.getDeclaredMethod("fromJson", JsonElement.class, Type.class); /** * @see Gson#toJson(Object, Appendable) * @see Gson#toJson(Object, InterceptPoint, Appendable) * @see Gson#toJson(JsonElement) * @see Gson#toJson(JsonElement, Appendable) */ gson.toJson(java, new StringWriter()); gson.toJson(java, String.class, new StringWriter()); gson.toJson(jsonElement); gson.toJson(jsonElement, new StringWriter()); Method toJson3 = Gson.class.getDeclaredMethod("toJson", Object.class, Appendable.class); Method toJson4 = Gson.class.getDeclaredMethod("toJson", Object.class, Type.class, Appendable.class); Method toJson6 = Gson.class.getDeclaredMethod("toJson", JsonElement.class); Method toJson7 = Gson.class.getDeclaredMethod("toJson", JsonElement.class, Appendable.class); PluginTestVerifier verifier = PluginTestVerifierHolder.getInstance(); verifier.printCache(); verifier.verifyTrace(event(serviceType, fromJson3), event(serviceType, fromJson4), event(serviceType, fromJson6), event(serviceType, fromJson7)); verifier.verifyTrace(event(serviceType, toJson3), event(serviceType, toJson4), event(serviceType, toJson6, expectedAnnotation), event(serviceType, toJson7)); // No more traces verifier.verifyTraceCount(0); } @Test public void testFromV1_6() throws Exception { if (!v1_6) { return; } final Gson gson = new Gson(); final JsonElement jsonElement = getParseElements(); /** * @see Gson#fromJson(JsonReader, InterceptPoint) */ gson.fromJson(new JsonReader(new StringReader(json)), String.class); Method fromJson5 = Gson.class.getDeclaredMethod("fromJson", JsonReader.class, Type.class); /** * @see Gson#toJson(Object, InterceptPoint, JsonWriter) * @see Gson#toJson(JsonElement, JsonWriter) */ gson.toJson(java, String.class, new JsonWriter(new StringWriter())); gson.toJson(jsonElement, new JsonWriter(new StringWriter())); Method toJson5 = Gson.class.getDeclaredMethod("toJson", Object.class, Type.class, JsonWriter.class); Method toJson8 = Gson.class.getDeclaredMethod("toJson", JsonElement.class, JsonWriter.class); PluginTestVerifier verifier = PluginTestVerifierHolder.getInstance(); verifier.printCache(); verifier.verifyTrace(event(serviceType, fromJson5)); verifier.verifyTrace(event(serviceType, toJson5), event(serviceType, toJson8)); // No more traces verifier.verifyTraceCount(0); } private JsonElement getParseElements() { return new JsonParser().parse(json); } }