/**
* Licensed to the Apache Software Foundation (ASF) under one
* or more contributor license agreements. See the NOTICE file
* distributed with this work for additional information
* regarding copyright ownership. The ASF licenses this file
* to you 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.google.wave.api.event;
import static org.mockito.Matchers.anyString;
import static org.mockito.Mockito.mock;
import static org.mockito.Mockito.when;
import com.google.common.collect.Lists;
import com.google.common.collect.Maps;
import com.google.gson.Gson;
import com.google.gson.JsonDeserializationContext;
import com.google.gson.JsonElement;
import com.google.gson.JsonParseException;
import com.google.gson.JsonSerializationContext;
import com.google.wave.api.Blip;
import com.google.wave.api.BlipThread;
import com.google.wave.api.Wavelet;
import com.google.wave.api.impl.EventMessageBundle;
import com.google.wave.api.impl.GsonFactory;
import junit.framework.TestCase;
import java.lang.reflect.Method;
import java.lang.reflect.Type;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
/**
* Test cases for {@link EventSerializer}.
*/
public class EventSerializerRobotTest extends TestCase {
private static class Context implements JsonSerializationContext, JsonDeserializationContext {
private final Gson gson = new GsonFactory().create();
@Override
public JsonElement serialize(Object src) {
return gson.toJsonTree(src);
}
@Override
public JsonElement serialize(Object src, Type type) {
return gson.toJsonTree(src, type);
}
@Override
public <T> T deserialize(JsonElement json, Type type) throws JsonParseException {
return gson.<T>fromJson(json, type);
}
}
public void refactor_testSerializeAndDeserializeWaveletEvent() throws Exception {
List<String> participantsAdded = new ArrayList<String>();
participantsAdded.add("foo@google.com");
participantsAdded.add("bar@google.com");
List<String> participantsRemoved = new ArrayList<String>();
participantsRemoved.add("baz@google.com");
Blip blip = mock(Blip.class);
when(blip.getBlipId()).thenReturn("blip123");
Wavelet wavelet = mock(Wavelet.class);
when(wavelet.getBlip("blip123")).thenReturn(blip);
Map<String, Blip> blips = Maps.newHashMap();
blips.put("blip123", blip);
when(wavelet.getThread(anyString())).thenReturn(new BlipThread("rootThread", -1,
Lists.<String>newArrayList("blip123"), blips));
EventMessageBundle bundle = new EventMessageBundle("http://10.1.1.1",
"http://wave-active-api.example.com");
WaveletParticipantsChangedEvent expected = new WaveletParticipantsChangedEvent(wavelet,
bundle, "mprasetya@google.com", 1l, "blip123", participantsAdded, participantsRemoved);
Context context = new Context();
Event actualEvent = EventSerializer.deserialize(wavelet, bundle,
EventSerializer.serialize(expected, context),
context);
WaveletParticipantsChangedEvent actual = WaveletParticipantsChangedEvent.as(actualEvent);
assertEquals(expected, actual);
assertEquals(expected.getParticipantsAdded(), actual.getParticipantsAdded());
assertEquals(expected.getParticipantsRemoved(), actual.getParticipantsRemoved());
}
public void refactor_testSerializeAndDeserializeBlipEvent() throws Exception {
List<String> contributorsAdded = new ArrayList<String>();
contributorsAdded.add("foo@google.com");
contributorsAdded.add("bar@google.com");
List<String> contributorsRemoved = new ArrayList<String>();
contributorsRemoved.add("baz@google.com");
Blip blip = mock(Blip.class);
when(blip.getBlipId()).thenReturn("blip123");
Wavelet wavelet = mock(Wavelet.class);
when(wavelet.getBlip("blip123")).thenReturn(blip);
EventMessageBundle bundle = new EventMessageBundle("http://10.1.1.1",
"http://wave-active-api.example.com");
BlipContributorsChangedEvent expected = new BlipContributorsChangedEvent(wavelet,
bundle, "mprasetya@google.com", 1l, "blip123", contributorsAdded, contributorsRemoved);
Context context = new Context();
Event actualEvent = EventSerializer.deserialize(wavelet, bundle,
EventSerializer.serialize(expected, context),
context);
BlipContributorsChangedEvent actual = BlipContributorsChangedEvent.as(actualEvent);
assertEquals(expected, actual);
assertEquals(expected.getContributorsAdded(), actual.getContributorsAdded());
assertEquals(expected.getContributorsRemoved(), actual.getContributorsRemoved());
}
public void refactor_testSerializeAndDeserializeGadgetStateChanged() throws Exception {
Map<String, String> oldState = new HashMap<String, String>();
oldState.put("key1", "value1");
oldState.put("key2", "value2");
Blip blip = mock(Blip.class);
when(blip.getBlipId()).thenReturn("blip123");
Wavelet wavelet = mock(Wavelet.class);
when(wavelet.getBlip("blip123")).thenReturn(blip);
EventMessageBundle bundle = new EventMessageBundle("http://10.1.1.1",
"http://wave-active-api.example.com");
GadgetStateChangedEvent expected = new GadgetStateChangedEvent(wavelet, bundle,
"mprasetya@google.com", 1l, "blip123", 5, oldState);
Context context = new Context();
Event actualEvent = EventSerializer.deserialize(wavelet, bundle,
EventSerializer.serialize(expected, context),
context);
GadgetStateChangedEvent actual = GadgetStateChangedEvent.as(actualEvent);
assertEquals(expected, actual);
assertEquals(expected.getIndex(), actual.getIndex());
assertEquals(expected.getOldState(),actual.getOldState());
}
public void refactor_testSerializeAndDeserializeOperationErrorEvent() throws Exception {
Wavelet wavelet = mock(Wavelet.class);
EventMessageBundle bundle = new EventMessageBundle("http://10.1.1.1",
"http://wave-active-api.example.com");
OperationErrorEvent expected = new OperationErrorEvent(wavelet, bundle,
"foo@google.com", 123l, "op1", "Error!");
Context context = new Context();
Event actual = EventSerializer.deserialize(wavelet, bundle,
EventSerializer.serialize(expected, context),
context);
assertEquals(expected, actual);
}
public void testAllEventClassesHaveTheAppropriateConstructor() throws Exception {
for (EventType eventType : EventType.values()) {
if (eventType == EventType.UNKNOWN) {
continue;
}
try {
Class<? extends Event> clazz = eventType.getClazz();
clazz.getDeclaredConstructor();
} catch (NoSuchMethodException e) {
fail(eventType.getClazz().getName() + " should implement a no-arg constructor that will " +
"be used for deserialization.");
}
}
}
public void testAllEventClassesHaveConversionStaticMethod() throws Exception {
for (EventType eventType : EventType.values()) {
if (eventType == EventType.UNKNOWN) {
continue;
}
try {
Method method = eventType.getClazz().getDeclaredMethod("as", Event.class);
assertEquals(eventType.getClazz(), method.getReturnType());
} catch (NoSuchMethodException e) {
fail(eventType.getClazz().getName() + " should implement a no-arg constructor that will " +
"be used for deserialization.");
}
}
}
private static void assertEquals(Event expected, Event actual) {
assertEquals(expected.getType(), actual.getType());
assertEquals(expected.getWavelet(), actual.getWavelet());
assertEquals(expected.getModifiedBy(), actual.getModifiedBy());
assertEquals(expected.getTimestamp(), actual.getTimestamp());
assertEquals(expected.getBlip(), actual.getBlip());
assertEquals(expected.getBundle(), actual.getBundle());
}
}