/*
 * Copyright (C) 2015 The Android Open Source Project
 *
 * 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.
 */

import java.lang.reflect.Method;
import java.lang.reflect.Type;
import java.util.ArrayList;
import java.util.List;
import java.util.concurrent.Callable;
import java.util.concurrent.Executors;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Future;
import java.util.concurrent.TimeUnit;
import java.util.concurrent.CancellationException;
import java.util.concurrent.TimeoutException;

public class Main {

  // Workaround for b/18051191.
  class InnerClass {}

  private static class HashCodeQuery implements Callable<Integer> {
    public HashCodeQuery(Object obj) {
      m_obj = obj;
    }

    public Integer call() {
      Integer result;
      try {
        Class<?> c = Class.forName("Test");
        Method m = c.getMethod("synchronizedHashCode", new Class[] { Object.class });
        result = (Integer) m.invoke(null, m_obj);
      } catch (Exception e) {
        System.err.println("Hash code query exception");
        e.printStackTrace();
        result = -1;
      }
      return result;
    }

    private Object m_obj;
    private int m_index;
  }

  public static void main(String args[]) throws Exception {
    Object obj = new Object();
    int numThreads = 10;

    ExecutorService pool = Executors.newFixedThreadPool(numThreads);

    List<HashCodeQuery> queries = new ArrayList<HashCodeQuery>(numThreads);
    for (int i = 0; i < numThreads; ++i) {
      queries.add(new HashCodeQuery(obj));
    }

    try {
      List<Future<Integer>> results = pool.invokeAll(queries, 5, TimeUnit.SECONDS);

      int hash = obj.hashCode();
      for (int i = 0; i < numThreads; ++i) {
        int result = results.get(i).get();
        if (hash != result) {
          throw new Error("Query #" + i + " wrong. Expected " + hash + ", got " + result);
        }
      }
      pool.shutdown();
    } catch (CancellationException ex) {
      System.err.println("Job timeout");
      System.exit(1);
    }
  }
}
