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.IOException;
1978c496fe0fac4c89993109340aec80d1afa3141fIan Parkinsonimport java.io.Serializable;
2078c496fe0fac4c89993109340aec80d1afa3141fIan Parkinson
2178c496fe0fac4c89993109340aec80d1afa3141fIan Parkinsonimport org.objenesis.Objenesis;
2278c496fe0fac4c89993109340aec80d1afa3141fIan Parkinsonimport org.objenesis.ObjenesisSerializer;
2378c496fe0fac4c89993109340aec80d1afa3141fIan Parkinsonimport org.objenesis.ObjenesisStd;
2478c496fe0fac4c89993109340aec80d1afa3141fIan Parkinson
2578c496fe0fac4c89993109340aec80d1afa3141fIan Parkinson/**
2678c496fe0fac4c89993109340aec80d1afa3141fIan Parkinson * Command line launcher for Technology Compatibility Kit (TCK).
2778c496fe0fac4c89993109340aec80d1afa3141fIan Parkinson *
2878c496fe0fac4c89993109340aec80d1afa3141fIan Parkinson * @author Joe Walnes
2978c496fe0fac4c89993109340aec80d1afa3141fIan Parkinson * @see TCK
3078c496fe0fac4c89993109340aec80d1afa3141fIan Parkinson */
3178c496fe0fac4c89993109340aec80d1afa3141fIan Parkinsonpublic class Main {
3278c496fe0fac4c89993109340aec80d1afa3141fIan Parkinson
3378c496fe0fac4c89993109340aec80d1afa3141fIan Parkinson   private static class MockSuperClass {
3478c496fe0fac4c89993109340aec80d1afa3141fIan Parkinson      private final boolean superConstructorCalled;
3578c496fe0fac4c89993109340aec80d1afa3141fIan Parkinson
3678c496fe0fac4c89993109340aec80d1afa3141fIan Parkinson      public MockSuperClass() {
3778c496fe0fac4c89993109340aec80d1afa3141fIan Parkinson         superConstructorCalled = true;
3878c496fe0fac4c89993109340aec80d1afa3141fIan Parkinson      }
3978c496fe0fac4c89993109340aec80d1afa3141fIan Parkinson
4078c496fe0fac4c89993109340aec80d1afa3141fIan Parkinson      public boolean isSuperConstructorCalled() {
4178c496fe0fac4c89993109340aec80d1afa3141fIan Parkinson         return superConstructorCalled;
4278c496fe0fac4c89993109340aec80d1afa3141fIan Parkinson      }
4378c496fe0fac4c89993109340aec80d1afa3141fIan Parkinson   }
4478c496fe0fac4c89993109340aec80d1afa3141fIan Parkinson
4578c496fe0fac4c89993109340aec80d1afa3141fIan Parkinson   private static class MockClass extends MockSuperClass implements Serializable {
4678c496fe0fac4c89993109340aec80d1afa3141fIan Parkinson      private static final long serialVersionUID = 1L;
4778c496fe0fac4c89993109340aec80d1afa3141fIan Parkinson
4878c496fe0fac4c89993109340aec80d1afa3141fIan Parkinson      private final boolean constructorCalled;
4978c496fe0fac4c89993109340aec80d1afa3141fIan Parkinson
5078c496fe0fac4c89993109340aec80d1afa3141fIan Parkinson      public MockClass() {
5178c496fe0fac4c89993109340aec80d1afa3141fIan Parkinson         constructorCalled = true;
5278c496fe0fac4c89993109340aec80d1afa3141fIan Parkinson      }
5378c496fe0fac4c89993109340aec80d1afa3141fIan Parkinson
5478c496fe0fac4c89993109340aec80d1afa3141fIan Parkinson      public boolean isConstructorCalled() {
5578c496fe0fac4c89993109340aec80d1afa3141fIan Parkinson         return constructorCalled;
5678c496fe0fac4c89993109340aec80d1afa3141fIan Parkinson      }
5778c496fe0fac4c89993109340aec80d1afa3141fIan Parkinson   }
5878c496fe0fac4c89993109340aec80d1afa3141fIan Parkinson
5978c496fe0fac4c89993109340aec80d1afa3141fIan Parkinson   /**
6078c496fe0fac4c89993109340aec80d1afa3141fIan Parkinson    * Main class of the TCK. Can also be called as a normal method from an application server.
6178c496fe0fac4c89993109340aec80d1afa3141fIan Parkinson    *
6278c496fe0fac4c89993109340aec80d1afa3141fIan Parkinson    * @param args No parameters are required
6378c496fe0fac4c89993109340aec80d1afa3141fIan Parkinson    * @throws IOException When the TCK fails to read properties' files.
6478c496fe0fac4c89993109340aec80d1afa3141fIan Parkinson    */
6578c496fe0fac4c89993109340aec80d1afa3141fIan Parkinson   public static void main(String[] args) throws IOException {
6678c496fe0fac4c89993109340aec80d1afa3141fIan Parkinson
6778c496fe0fac4c89993109340aec80d1afa3141fIan Parkinson      TextReporter reporter = new TextReporter(System.out, System.err);
6878c496fe0fac4c89993109340aec80d1afa3141fIan Parkinson
6978c496fe0fac4c89993109340aec80d1afa3141fIan Parkinson      runTest(new ObjenesisStd(), reporter, "Objenesis std", "candidates/candidates.properties");
7078c496fe0fac4c89993109340aec80d1afa3141fIan Parkinson      runTest(new ObjenesisSerializer(), reporter, "Objenesis serializer",
7178c496fe0fac4c89993109340aec80d1afa3141fIan Parkinson         "candidates/serializable-candidates.properties");
7278c496fe0fac4c89993109340aec80d1afa3141fIan Parkinson
7378c496fe0fac4c89993109340aec80d1afa3141fIan Parkinson      boolean result = runParentConstructorTest();
7478c496fe0fac4c89993109340aec80d1afa3141fIan Parkinson
7578c496fe0fac4c89993109340aec80d1afa3141fIan Parkinson      reporter.printResult(result);
7678c496fe0fac4c89993109340aec80d1afa3141fIan Parkinson   }
7778c496fe0fac4c89993109340aec80d1afa3141fIan Parkinson
7878c496fe0fac4c89993109340aec80d1afa3141fIan Parkinson   private static boolean runParentConstructorTest() {
7978c496fe0fac4c89993109340aec80d1afa3141fIan Parkinson      try {
8078c496fe0fac4c89993109340aec80d1afa3141fIan Parkinson         Object result = new ObjenesisSerializer().newInstance(MockClass.class);
8178c496fe0fac4c89993109340aec80d1afa3141fIan Parkinson         MockClass mockObject = (MockClass) result;
8278c496fe0fac4c89993109340aec80d1afa3141fIan Parkinson         return mockObject.isSuperConstructorCalled() && !mockObject.isConstructorCalled();
8378c496fe0fac4c89993109340aec80d1afa3141fIan Parkinson      }
8478c496fe0fac4c89993109340aec80d1afa3141fIan Parkinson      catch(Exception e) {
8578c496fe0fac4c89993109340aec80d1afa3141fIan Parkinson         System.err.println("--- Not serializable parent constructor called ---");
8678c496fe0fac4c89993109340aec80d1afa3141fIan Parkinson         e.printStackTrace(System.err);
8778c496fe0fac4c89993109340aec80d1afa3141fIan Parkinson         return false;
8878c496fe0fac4c89993109340aec80d1afa3141fIan Parkinson      }
8978c496fe0fac4c89993109340aec80d1afa3141fIan Parkinson   }
9078c496fe0fac4c89993109340aec80d1afa3141fIan Parkinson
9178c496fe0fac4c89993109340aec80d1afa3141fIan Parkinson   private static void runTest(Objenesis objenesis, Reporter reporter, String description,
9278c496fe0fac4c89993109340aec80d1afa3141fIan Parkinson      String candidates) throws IOException {
9378c496fe0fac4c89993109340aec80d1afa3141fIan Parkinson      TCK tck = new TCK();
9478c496fe0fac4c89993109340aec80d1afa3141fIan Parkinson      tck.registerObjenesisInstance(objenesis, description);
9578c496fe0fac4c89993109340aec80d1afa3141fIan Parkinson
9678c496fe0fac4c89993109340aec80d1afa3141fIan Parkinson      CandidateLoader candidateLoader = new CandidateLoader(tck, Main.class.getClassLoader(),
9778c496fe0fac4c89993109340aec80d1afa3141fIan Parkinson         new CandidateLoader.LoggingErrorHandler(System.err));
9878c496fe0fac4c89993109340aec80d1afa3141fIan Parkinson
9978c496fe0fac4c89993109340aec80d1afa3141fIan Parkinson      candidateLoader.loadFromResource(Main.class, candidates);
10078c496fe0fac4c89993109340aec80d1afa3141fIan Parkinson
10178c496fe0fac4c89993109340aec80d1afa3141fIan Parkinson      tck.runTests(reporter);
10278c496fe0fac4c89993109340aec80d1afa3141fIan Parkinson   }
10378c496fe0fac4c89993109340aec80d1afa3141fIan Parkinson
10478c496fe0fac4c89993109340aec80d1afa3141fIan Parkinson}
105