/*
* Copyright 2016-present Facebook, Inc.
*
* 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.facebook.buck.slb;
import com.facebook.buck.distributed.thrift.BuildJob;
import com.facebook.buck.distributed.thrift.BuildStatus;
import com.facebook.buck.distributed.thrift.StampedeId;
import com.google.common.collect.ImmutableList;
import java.io.ByteArrayInputStream;
import java.io.ByteArrayOutputStream;
import java.io.IOException;
import org.junit.Assert;
import org.junit.Test;
public class ThriftUtilTest {
@Test
public void testSerializations() throws IOException {
ImmutableList<Serializer> serializers =
ImmutableList.of(new ByteSerializer(), new StreamSerializer());
ImmutableList<Deserializer> deserializers =
ImmutableList.of(new ByteSerializer(), new StreamSerializer());
for (Serializer serializer : serializers) {
for (Deserializer deserializer : deserializers) {
for (ThriftProtocol protocol : ThriftProtocol.values()) {
BuildJob expectedJob = createBuildJob();
byte[] data = serializer.serialize(protocol, expectedJob);
BuildJob actualJob = deserializer.deserialize(protocol, data);
Assert.assertEquals(
String.format(
"Serializer=[%s] Deserializer=[%s] Protocol=[%s] Expected=[%s] Actual=[%s]",
serializer.getClass().getName(),
deserializer.getClass().getName(),
protocol.toString(),
expectedJob,
actualJob),
expectedJob,
actualJob);
}
}
}
}
private BuildJob createBuildJob() {
BuildJob job = new BuildJob();
job.setStatus(BuildStatus.FINISHED_SUCCESSFULLY);
StampedeId stampedeId = new StampedeId();
stampedeId.setId("all will be well");
job.setStampedeId(stampedeId);
return job;
}
public interface Serializer {
byte[] serialize(ThriftProtocol protocol, BuildJob job) throws IOException;
}
public interface Deserializer {
BuildJob deserialize(ThriftProtocol protocol, byte[] data) throws IOException;
}
public static class ByteSerializer implements Serializer, Deserializer {
@Override
public byte[] serialize(ThriftProtocol protocol, BuildJob job) throws ThriftException {
return ThriftUtil.serialize(protocol, job);
}
@Override
public BuildJob deserialize(ThriftProtocol protocol, byte[] data) throws IOException {
BuildJob job = new BuildJob();
ThriftUtil.deserialize(protocol, data, job);
return job;
}
}
public static class StreamSerializer implements Serializer, Deserializer {
@Override
public byte[] serialize(ThriftProtocol protocol, BuildJob job) throws IOException {
try (ByteArrayOutputStream stream = new ByteArrayOutputStream()) {
ThriftUtil.serialize(protocol, job, stream);
return stream.toByteArray();
}
}
@Override
public BuildJob deserialize(ThriftProtocol protocol, byte[] data) throws IOException {
BuildJob job = new BuildJob();
try (ByteArrayInputStream stream = new ByteArrayInputStream(data)) {
ThriftUtil.deserialize(protocol, stream, job);
}
return job;
}
}
}