1cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath/*
2cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath * Licensed to the Apache Software Foundation (ASF) under one or more
3cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath * contributor license agreements.  See the NOTICE file distributed with
4cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath * this work for additional information regarding copyright ownership.
5cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath * The ASF licenses this file to You under the Apache License, Version 2.0
6cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath * (the "License"); you may not use this file except in compliance with
7cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath * the License.  You may obtain a copy of the License at
8cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath *
9cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath *     http://www.apache.org/licenses/LICENSE-2.0
10cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath *
11cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath * Unless required by applicable law or agreed to in writing, software
12cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath * distributed under the License is distributed on an "AS IS" BASIS,
13cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath * See the License for the specific language governing permissions and
15cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath * limitations under the License.
16cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath */
17cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath
18cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamathpackage tests.util;
19cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath
20cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamathimport java.io.ByteArrayInputStream;
21cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamathimport java.io.ByteArrayOutputStream;
22cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamathimport java.io.File;
23cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamathimport java.io.FileOutputStream;
24cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamathimport java.io.IOException;
25cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamathimport java.io.InputStream;
26cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamathimport java.io.ObjectInputStream;
27cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamathimport java.io.ObjectOutputStream;
28cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamathimport java.io.OutputStream;
29cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamathimport java.net.URL;
30cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath
31cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath/**
32cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath * This class simplifies the serialization test.
33cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath */
34cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamathpublic class SerializationTester {
35cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath    private SerializationTester() {
36cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath
37cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath    }
38cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath
39cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath    /**
40cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath     * Serialize an object and then deserialize it.
41cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath     *
42cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath     * @param inputObject the input object
43cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath     * @return the deserialized object
44cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath     */
45cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath    public static Object getDeserilizedObject(Object inputObject)
46cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath            throws IOException, ClassNotFoundException {
47cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath        ByteArrayOutputStream bos = new ByteArrayOutputStream();
48cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath        ObjectOutputStream oos = new ObjectOutputStream(bos);
49cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath        oos.writeObject(inputObject);
50cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath        oos.close();
51cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath
52cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath        ByteArrayInputStream bis = new ByteArrayInputStream(bos.toByteArray());
53cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath        ObjectInputStream ois = new ObjectInputStream(bis);
54cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath        Object outputObject = ois.readObject();
55cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath        ois.close();
56cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath        return outputObject;
57cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath    }
58cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath
59cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath    /**
60cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath     * Tests the serialization and deserialization of const objects.
61cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath     *
62cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath     * @param inputObject A const object
63cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath     * @return true if the deserialized object is the same as the input object,
64cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath     *         otherwise false
65cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath     * @throws Exception If any occurs.
66cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath     */
67cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath    public static boolean assertSame(Object inputObject) throws Exception {
68cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath        return inputObject == getDeserilizedObject(inputObject);
69cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath    }
70cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath
71cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath    /**
72cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath     * Tests the serialization and deserialization of instance objects.
73cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath     *
74cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath     * @param inputObject An object
75cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath     * @return true if the deserialized object is equal to the input object,
76cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath     *         otherwise false
77cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath     * @throws Exception If any occurs.
78cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath     */
79cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath    public static boolean assertEquals(Object inputObject) throws Exception {
80cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath        return inputObject.equals(getDeserilizedObject(inputObject));
81cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath    }
82cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath
83cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath    /**
84cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath     * Tests the serialization compatibility with reference const objects.
85cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath     *
86cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath     * @param obj      the object to be checked
87cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath     * @param fileName the serialization output file generated by reference
88cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath     * @return true if compatible, otherwise false
89cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath     * @throws Exception If any occurs.
90cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath     */
91cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath    public static boolean assertCompabilitySame(Object obj, String fileName)
92cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath            throws Exception {
93cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath        return obj == readObject(obj, fileName);
94cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath    }
95cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath
96cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath    /**
97cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath     * Tests the serialization compatibility with reference for instance
98cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath     * objects.
99cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath     *
100cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath     * @param obj      the object to be checked
101cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath     * @param fileName the serialization output file generated by reference
102cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath     * @return true if compatible, otherwise false
103cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath     * @throws Exception If any occurs.
104cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath     */
105cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath    public static boolean assertCompabilityEquals(Object obj, String fileName)
106cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath            throws Exception {
107cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath        return obj.equals(readObject(obj, fileName));
108cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath    }
109cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath
110cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath    /**
111cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath     * Deserialize an object from a file.
112cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath     *
113cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath     * @param obj      the object to be serialized if no serialization file is found
114cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath     * @param fileName the serialization file
115cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath     * @return the deserialized object
116cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath     * @throws Exception If any occurs.
117cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath     */
118cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath    public static Object readObject(Object obj, String fileName)
119cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath            throws Exception {
120cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath        InputStream input = null;
121cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath        ObjectInputStream oinput = null;
1229aab36ec35b4591cb9ba9ae0e4586cb642c39587Narayan Kamath        URL url = SerializationTester.class.getClassLoader().getResource(fileName);
123cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath        if (null == url) {
124cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath            // serialization file does not exist, create one in the current dir
125cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath            writeObject(obj, new File(fileName).getName());
126cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath            throw new Error(
127cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath                    "Serialization file does not exist, created in the current dir.");
128cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath        }
129cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath        input = url.openStream();
130cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath        try {
131cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath            oinput = new ObjectInputStream(input);
132cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath            Object newObj = oinput.readObject();
133cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath            return newObj;
134cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath        } finally {
135cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath            try {
136cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath                if (null != oinput) {
137cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath                    oinput.close();
138cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath                }
139cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath            } catch (Exception e) {
140cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath                // ignore
141cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath            }
142cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath            try {
143cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath                if (null != input) {
144cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath                    input.close();
145cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath                }
146cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath            } catch (Exception e) {
147cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath                // ignore
148cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath            }
149cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath        }
150cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath    }
151cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath
152cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath    /*
153cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath      * Creates a serialization output.
154cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath      *
155cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath      * @param obj the object to be serialized @param fileName the output file
156cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath      * @throws Exception If any occurs.
157cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath      */
158cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath    public static void writeObject(Object obj, String fileName)
159cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath            throws Exception {
160cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath        // String path = SerializationTester.class.getResource(".").getPath();
161cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath        // if (path.endsWith(".")) {
162cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath        // path = path.substring(0, path.length() - 1);
163cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath        // }
164cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath        // if (!path.endsWith("/")) {
165cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath        // path += "/";
166cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath        // }
167cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath        // path += fileName;
168cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath        // System.out.println(path);
169cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath        OutputStream output = null;
170cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath        ObjectOutputStream ooutput = null;
171cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath        try {
172cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath            output = new FileOutputStream(fileName);
173cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath            ooutput = new ObjectOutputStream(output);
174cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath            ooutput.writeObject(obj);
175cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath        } finally {
176cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath            try {
177cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath                if (null != ooutput) {
178cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath                    ooutput.close();
179cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath                }
180cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath            } catch (Exception e) {
181cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath                // ignore
182cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath            }
183cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath            try {
184cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath                if (null != output) {
185cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath                    output.close();
186cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath                }
187cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath            } catch (Exception e) {
188cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath                // ignore
189cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath            }
190cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath        }
191cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath    }
192cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath}
193