package org.apache.cassandra.io;
/*
*
* 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.
*
*/
import org.apache.cassandra.CleanupHelper;
import org.junit.BeforeClass;
import org.junit.Test;
import java.io.File;
import java.lang.reflect.ParameterizedType;
import java.lang.reflect.Type;
import java.util.ArrayList;
import java.util.HashSet;
import java.util.List;
import java.util.Set;
public class CompactSerializerTest extends CleanupHelper
{
private static Set<String> expectedClassNames;
private static List<String> discoveredClassNames;
@BeforeClass
public static void scanClasspath()
{
expectedClassNames = new HashSet<String>();
expectedClassNames.add("RangeSliceCommandSerializer");
expectedClassNames.add("ReadCommandSerializer");
expectedClassNames.add("ReadResponseSerializer");
expectedClassNames.add("RowSerializer");
expectedClassNames.add("RowMutationSerializer");
expectedClassNames.add("SliceByNamesReadCommandSerializer");
expectedClassNames.add("SliceFromReadCommandSerializer");
expectedClassNames.add("TruncateResponseSerializer");
expectedClassNames.add("TruncationSerializer");
expectedClassNames.add("WriteResponseSerializer");
expectedClassNames.add("EndpointStateSerializer");
expectedClassNames.add("GossipDigestSerializer");
expectedClassNames.add("GossipDigestAck2MessageSerializer");
expectedClassNames.add("GossipDigestAckMessageSerializer");
expectedClassNames.add("GossipDigestSynMessageSerializer");
expectedClassNames.add("HeartBeatStateSerializer");
expectedClassNames.add("VersionedValueSerializer");
expectedClassNames.add("HeaderSerializer");
expectedClassNames.add("MessageSerializer");
expectedClassNames.add("TreeRequestVerbHandler");
expectedClassNames.add("TreeResponseVerbHandler");
expectedClassNames.add("PendingFileSerializer");
expectedClassNames.add("StreamHeaderSerializer");
expectedClassNames.add("FileStatusSerializer");
expectedClassNames.add("StreamRequestMessageSerializer");
expectedClassNames.add("BloomFilterSerializer");
expectedClassNames.add("LegacyBloomFilterSerializer");
discoveredClassNames = new ArrayList<String>();
String cp = System.getProperty("java.class.path");
assert cp != null;
String[] parts = cp.split(File.pathSeparator, -1);
class DirScanner
{
void scan(File f, String ctx)
{
String newCtx = ctx == null ? f.getName().equals("org") ? f.getName() : null : ctx + "." + f.getName();
if (f.isDirectory())
{
for (File child : f.listFiles())
{
scan(child, newCtx);
}
}
else if (f.getName().endsWith(".class"))
{
String fName = f.getName();
String className = ctx + "." + fName.substring(0, fName.lastIndexOf('.'));
try
{
Class cls = Class.forName(className);
String simpleName = cls.getSimpleName();
classTraversal: while (cls != null)
{
Type[] interfaces = cls.getGenericInterfaces();
for (Type t : interfaces)
{
if(t instanceof ParameterizedType)
{
ParameterizedType pt = (ParameterizedType)t;
if (((Class)pt.getRawType()).getSimpleName().equals("ICompactSerializer"))
{
discoveredClassNames.add(simpleName);
break classTraversal;
}
}
}
cls = cls.getSuperclass();
}
}
catch (ClassNotFoundException ex)
{
throw new RuntimeException(ex);
}
}
}
}
DirScanner dirScanner = new DirScanner();
for (String cpItem : parts)
{
File f = new File(cpItem);
if (f.exists() && f.isDirectory())
dirScanner.scan(f, null);
}
}
/** look for classes I expect to find. */
@Test
public void verifyAllSimpleNamesTest()
{
for (String clsName : expectedClassNames)
assert discoveredClassNames.contains(clsName) : clsName + " was not discovered";
}
/** look for classes I do not expect to find. */
@Test
public void noOthersTest()
{
for (String clsName : discoveredClassNames)
assert expectedClassNames.contains(clsName) : clsName + " was discovered";
assert true;
}
}