178c496fe0fac4c89993109340aec80d1afa3141fIan Parkinson/**
278c496fe0fac4c89993109340aec80d1afa3141fIan Parkinson * Copyright 2006-2013 the original author or authors.
378c496fe0fac4c89993109340aec80d1afa3141fIan Parkinson *
478c496fe0fac4c89993109340aec80d1afa3141fIan Parkinson * Licensed under the Apache License, Version 2.0 (the "License");
578c496fe0fac4c89993109340aec80d1afa3141fIan Parkinson * you may not use this file except in compliance with the License.
678c496fe0fac4c89993109340aec80d1afa3141fIan Parkinson * You may obtain a copy of the License at
778c496fe0fac4c89993109340aec80d1afa3141fIan Parkinson *
878c496fe0fac4c89993109340aec80d1afa3141fIan Parkinson *     http://www.apache.org/licenses/LICENSE-2.0
978c496fe0fac4c89993109340aec80d1afa3141fIan Parkinson *
1078c496fe0fac4c89993109340aec80d1afa3141fIan Parkinson * Unless required by applicable law or agreed to in writing, software
1178c496fe0fac4c89993109340aec80d1afa3141fIan Parkinson * distributed under the License is distributed on an "AS IS" BASIS,
1278c496fe0fac4c89993109340aec80d1afa3141fIan Parkinson * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
1378c496fe0fac4c89993109340aec80d1afa3141fIan Parkinson * See the License for the specific language governing permissions and
1478c496fe0fac4c89993109340aec80d1afa3141fIan Parkinson * limitations under the License.
1578c496fe0fac4c89993109340aec80d1afa3141fIan Parkinson */
1678c496fe0fac4c89993109340aec80d1afa3141fIan Parkinsonpackage org.objenesis.tck;
1778c496fe0fac4c89993109340aec80d1afa3141fIan Parkinson
1878c496fe0fac4c89993109340aec80d1afa3141fIan Parkinsonimport java.io.ByteArrayOutputStream;
1978c496fe0fac4c89993109340aec80d1afa3141fIan Parkinsonimport java.io.PrintStream;
2078c496fe0fac4c89993109340aec80d1afa3141fIan Parkinsonimport java.io.Serializable;
2178c496fe0fac4c89993109340aec80d1afa3141fIan Parkinsonimport java.util.Collection;
2278c496fe0fac4c89993109340aec80d1afa3141fIan Parkinson
2378c496fe0fac4c89993109340aec80d1afa3141fIan Parkinsonimport junit.framework.TestCase;
2478c496fe0fac4c89993109340aec80d1afa3141fIan Parkinson
2578c496fe0fac4c89993109340aec80d1afa3141fIan Parkinsonimport org.objenesis.ObjenesisSerializer;
2678c496fe0fac4c89993109340aec80d1afa3141fIan Parkinsonimport org.objenesis.ObjenesisStd;
2778c496fe0fac4c89993109340aec80d1afa3141fIan Parkinson
2878c496fe0fac4c89993109340aec80d1afa3141fIan Parkinson/**
2978c496fe0fac4c89993109340aec80d1afa3141fIan Parkinson * Integration test for Objenesis. Should pass successfully on every supported JVM for all Objenesis
3078c496fe0fac4c89993109340aec80d1afa3141fIan Parkinson * interface implementation.
3178c496fe0fac4c89993109340aec80d1afa3141fIan Parkinson *
3278c496fe0fac4c89993109340aec80d1afa3141fIan Parkinson * @author Henri Tremblay
3378c496fe0fac4c89993109340aec80d1afa3141fIan Parkinson */
3478c496fe0fac4c89993109340aec80d1afa3141fIan Parkinsonpublic class ObjenesisTest extends TestCase {
3578c496fe0fac4c89993109340aec80d1afa3141fIan Parkinson
3678c496fe0fac4c89993109340aec80d1afa3141fIan Parkinson   public static class ErrorHandler implements CandidateLoader.ErrorHandler {
3778c496fe0fac4c89993109340aec80d1afa3141fIan Parkinson      public void classNotFound(String name) {
3878c496fe0fac4c89993109340aec80d1afa3141fIan Parkinson         fail("Class not found : " + name);
3978c496fe0fac4c89993109340aec80d1afa3141fIan Parkinson      }
4078c496fe0fac4c89993109340aec80d1afa3141fIan Parkinson   }
4178c496fe0fac4c89993109340aec80d1afa3141fIan Parkinson
4278c496fe0fac4c89993109340aec80d1afa3141fIan Parkinson   public static class JUnitReporter implements Reporter {
4378c496fe0fac4c89993109340aec80d1afa3141fIan Parkinson
4478c496fe0fac4c89993109340aec80d1afa3141fIan Parkinson      private String currentObjenesis;
4578c496fe0fac4c89993109340aec80d1afa3141fIan Parkinson
4678c496fe0fac4c89993109340aec80d1afa3141fIan Parkinson      private String currentCandidate;
4778c496fe0fac4c89993109340aec80d1afa3141fIan Parkinson
4878c496fe0fac4c89993109340aec80d1afa3141fIan Parkinson      public void startTests(String platformDescription, Collection allCandidates,
4978c496fe0fac4c89993109340aec80d1afa3141fIan Parkinson         Collection allInstantiators) {
5078c496fe0fac4c89993109340aec80d1afa3141fIan Parkinson      }
5178c496fe0fac4c89993109340aec80d1afa3141fIan Parkinson
5278c496fe0fac4c89993109340aec80d1afa3141fIan Parkinson      public void startTest(String candidateDescription, String objenesisDescription) {
5378c496fe0fac4c89993109340aec80d1afa3141fIan Parkinson         currentCandidate = candidateDescription;
5478c496fe0fac4c89993109340aec80d1afa3141fIan Parkinson         currentObjenesis = objenesisDescription;
5578c496fe0fac4c89993109340aec80d1afa3141fIan Parkinson      }
5678c496fe0fac4c89993109340aec80d1afa3141fIan Parkinson
5778c496fe0fac4c89993109340aec80d1afa3141fIan Parkinson      public void endObjenesis(String description) {
5878c496fe0fac4c89993109340aec80d1afa3141fIan Parkinson      }
5978c496fe0fac4c89993109340aec80d1afa3141fIan Parkinson
6078c496fe0fac4c89993109340aec80d1afa3141fIan Parkinson      public void endTests() {
6178c496fe0fac4c89993109340aec80d1afa3141fIan Parkinson      }
6278c496fe0fac4c89993109340aec80d1afa3141fIan Parkinson
6378c496fe0fac4c89993109340aec80d1afa3141fIan Parkinson      public void exception(Exception exception) {
6478c496fe0fac4c89993109340aec80d1afa3141fIan Parkinson         ByteArrayOutputStream buffer = new ByteArrayOutputStream();
6578c496fe0fac4c89993109340aec80d1afa3141fIan Parkinson         PrintStream out = new PrintStream(buffer);
6678c496fe0fac4c89993109340aec80d1afa3141fIan Parkinson         out.println("Exception when instantiating " + currentCandidate + " with "
6778c496fe0fac4c89993109340aec80d1afa3141fIan Parkinson            + currentObjenesis + ": ");
6878c496fe0fac4c89993109340aec80d1afa3141fIan Parkinson         exception.printStackTrace(out);
6978c496fe0fac4c89993109340aec80d1afa3141fIan Parkinson         fail(buffer.toString());
7078c496fe0fac4c89993109340aec80d1afa3141fIan Parkinson      }
7178c496fe0fac4c89993109340aec80d1afa3141fIan Parkinson
7278c496fe0fac4c89993109340aec80d1afa3141fIan Parkinson      public void result(boolean instantiatedObject) {
7378c496fe0fac4c89993109340aec80d1afa3141fIan Parkinson         assertTrue("Instantiating " + currentCandidate + " with " + currentObjenesis + " failed",
7478c496fe0fac4c89993109340aec80d1afa3141fIan Parkinson            instantiatedObject);
7578c496fe0fac4c89993109340aec80d1afa3141fIan Parkinson      }
7678c496fe0fac4c89993109340aec80d1afa3141fIan Parkinson
7778c496fe0fac4c89993109340aec80d1afa3141fIan Parkinson      public void endTest() {
7878c496fe0fac4c89993109340aec80d1afa3141fIan Parkinson      }
7978c496fe0fac4c89993109340aec80d1afa3141fIan Parkinson   }
8078c496fe0fac4c89993109340aec80d1afa3141fIan Parkinson
8178c496fe0fac4c89993109340aec80d1afa3141fIan Parkinson   static class MockSuperClass {
8278c496fe0fac4c89993109340aec80d1afa3141fIan Parkinson	   private final boolean superConstructorCalled;
8378c496fe0fac4c89993109340aec80d1afa3141fIan Parkinson	   public MockSuperClass() {
8478c496fe0fac4c89993109340aec80d1afa3141fIan Parkinson		   superConstructorCalled = true;
8578c496fe0fac4c89993109340aec80d1afa3141fIan Parkinson	   }
8678c496fe0fac4c89993109340aec80d1afa3141fIan Parkinson	   public boolean isSuperConstructorCalled() {
8778c496fe0fac4c89993109340aec80d1afa3141fIan Parkinson		   return superConstructorCalled;
8878c496fe0fac4c89993109340aec80d1afa3141fIan Parkinson	   }
8978c496fe0fac4c89993109340aec80d1afa3141fIan Parkinson   }
9078c496fe0fac4c89993109340aec80d1afa3141fIan Parkinson
9178c496fe0fac4c89993109340aec80d1afa3141fIan Parkinson   static class MockClass extends MockSuperClass implements Serializable {
9278c496fe0fac4c89993109340aec80d1afa3141fIan Parkinson      private static final long serialVersionUID = 1L;
9378c496fe0fac4c89993109340aec80d1afa3141fIan Parkinson      private final boolean constructorCalled;
9478c496fe0fac4c89993109340aec80d1afa3141fIan Parkinson	   public MockClass() {
9578c496fe0fac4c89993109340aec80d1afa3141fIan Parkinson		   super();
9678c496fe0fac4c89993109340aec80d1afa3141fIan Parkinson		   constructorCalled = true;
9778c496fe0fac4c89993109340aec80d1afa3141fIan Parkinson	   }
9878c496fe0fac4c89993109340aec80d1afa3141fIan Parkinson	   public boolean isConstructorCalled() {
9978c496fe0fac4c89993109340aec80d1afa3141fIan Parkinson		   return constructorCalled;
10078c496fe0fac4c89993109340aec80d1afa3141fIan Parkinson	   }
10178c496fe0fac4c89993109340aec80d1afa3141fIan Parkinson   }
10278c496fe0fac4c89993109340aec80d1afa3141fIan Parkinson
10378c496fe0fac4c89993109340aec80d1afa3141fIan Parkinson   private TCK tck = null;
10478c496fe0fac4c89993109340aec80d1afa3141fIan Parkinson
10578c496fe0fac4c89993109340aec80d1afa3141fIan Parkinson   private CandidateLoader candidateLoader = null;
10678c496fe0fac4c89993109340aec80d1afa3141fIan Parkinson
10778c496fe0fac4c89993109340aec80d1afa3141fIan Parkinson   protected void setUp() throws Exception {
10878c496fe0fac4c89993109340aec80d1afa3141fIan Parkinson      super.setUp();
10978c496fe0fac4c89993109340aec80d1afa3141fIan Parkinson
11078c496fe0fac4c89993109340aec80d1afa3141fIan Parkinson      tck = new TCK();
11178c496fe0fac4c89993109340aec80d1afa3141fIan Parkinson
11278c496fe0fac4c89993109340aec80d1afa3141fIan Parkinson      candidateLoader = new CandidateLoader(tck, getClass().getClassLoader(), new ErrorHandler());
11378c496fe0fac4c89993109340aec80d1afa3141fIan Parkinson   }
11478c496fe0fac4c89993109340aec80d1afa3141fIan Parkinson
11578c496fe0fac4c89993109340aec80d1afa3141fIan Parkinson   protected void tearDown() throws Exception {
11678c496fe0fac4c89993109340aec80d1afa3141fIan Parkinson      candidateLoader = null;
11778c496fe0fac4c89993109340aec80d1afa3141fIan Parkinson      tck = null;
11878c496fe0fac4c89993109340aec80d1afa3141fIan Parkinson      super.tearDown();
11978c496fe0fac4c89993109340aec80d1afa3141fIan Parkinson   }
12078c496fe0fac4c89993109340aec80d1afa3141fIan Parkinson
12178c496fe0fac4c89993109340aec80d1afa3141fIan Parkinson   public void testObjenesisStd() throws Exception {
12278c496fe0fac4c89993109340aec80d1afa3141fIan Parkinson      candidateLoader.loadFromResource(getClass(), "candidates/candidates.properties");
12378c496fe0fac4c89993109340aec80d1afa3141fIan Parkinson      tck.registerObjenesisInstance(new ObjenesisStd(), "Objenesis standard");
12478c496fe0fac4c89993109340aec80d1afa3141fIan Parkinson      tck.runTests(new JUnitReporter());
12578c496fe0fac4c89993109340aec80d1afa3141fIan Parkinson   }
12678c496fe0fac4c89993109340aec80d1afa3141fIan Parkinson
12778c496fe0fac4c89993109340aec80d1afa3141fIan Parkinson   public void testObjenesisSerializer() throws Exception {
12878c496fe0fac4c89993109340aec80d1afa3141fIan Parkinson      candidateLoader.loadFromResource(getClass(), "candidates/serializable-candidates.properties");
12978c496fe0fac4c89993109340aec80d1afa3141fIan Parkinson      tck.registerObjenesisInstance(new ObjenesisSerializer(), "Objenesis serializer");
13078c496fe0fac4c89993109340aec80d1afa3141fIan Parkinson      tck.runTests(new JUnitReporter());
13178c496fe0fac4c89993109340aec80d1afa3141fIan Parkinson   }
13278c496fe0fac4c89993109340aec80d1afa3141fIan Parkinson
13378c496fe0fac4c89993109340aec80d1afa3141fIan Parkinson   public void testObjenesisSerializerParentConstructorCalled() throws Exception {
13478c496fe0fac4c89993109340aec80d1afa3141fIan Parkinson   	  Object result = new ObjenesisSerializer().newInstance(MockClass.class);
13578c496fe0fac4c89993109340aec80d1afa3141fIan Parkinson   	  assertEquals(MockClass.class, result.getClass());
13678c496fe0fac4c89993109340aec80d1afa3141fIan Parkinson   	  MockClass mockObject = (MockClass) result;
13778c496fe0fac4c89993109340aec80d1afa3141fIan Parkinson   	  assertTrue(mockObject.isSuperConstructorCalled());
13878c496fe0fac4c89993109340aec80d1afa3141fIan Parkinson   	  assertFalse(mockObject.isConstructorCalled());
13978c496fe0fac4c89993109340aec80d1afa3141fIan Parkinson   }
14078c496fe0fac4c89993109340aec80d1afa3141fIan Parkinson}
141