/*
 * 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
<<<<<<< Updated upstream
 *
 *     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
=======
 * 
 *     https://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 
>>>>>>> Stashed changes
 * limitations under the License.
 */
package org.apache.jdo.tck.api.persistencemanagerfactory.config;

import java.util.HashMap;
import java.util.Map;
import javax.jdo.JDOHelper;
import javax.jdo.PersistenceManager;
import javax.jdo.PersistenceManagerFactory;
import javax.jdo.Transaction;
import org.apache.jdo.tck.JDO_Test;
import org.apache.jdo.tck.pc.mylib.PCPoint;
import org.apache.jdo.tck.util.BatchTestRunner;

/**
 * <B>Title:</B>Close of PersistenceManagerFactory <br>
 * <B>Keywords:</B> persistencemanagerfactory, jdoconfig.xml <br>
 * <B>Assertion IDs:</B> A11.1.2-1 <br>
 * <B>Assertion Description: </B> Users can access a PersistenceManagerFactory by creating a
 * jdoconfig.xml file and making it available on the class path as META-INF/jdoconfig.xml.
 */
public class Jdoconfig extends JDO_Test {

  /** Creates a new instance of Jdoconfig */
  public Jdoconfig() {}
  /** */
  private static final String ASSERTION_FAILED = "Assertion A11.1.2-1 failed: ";

  private static final String ANONYMOUS_PMF_NAME = "";
  // Do not use superclass pmf, pm
  private PersistenceManagerFactory privatePmf = null;
  private PersistenceManager privatePm = null;
  private final Map<String, String> overrides = new HashMap<>();

  /**
   * The <code>main</code> is called when the class is directly executed from the command line.
   *
   * @param args The arguments passed to the program.
   */
  public static void main(String[] args) {
    BatchTestRunner.run(Jdoconfig.class);
  }

  /**
   * @see org.apache.jdo.tck.JDO_Test#localSetUp()
   */
  @Override
  protected void localSetUp() {
    /* Instance can be persisted ONLY if javax.jdo.mapping.Schema
     *   is overriden with
     *   JDOHelper.getPersistenceManagerFactory(Map overrides, ...).
     *   The value depends on identity type so can only be known at runtime.
     */
    if (isTestToBePerformed()) {
      overrides.put("javax.jdo.mapping.Schema", SCHEMANAME);
    }
  }

  /** */
  public void testGetPMFNoArgs() {
    privatePmf = JDOHelper.getPersistenceManagerFactory();
    checkIsOpen(ANONYMOUS_PMF_NAME);
  }

  /** */
  public void testGetPMFEmptyString() {
    String name = "";
    privatePmf = JDOHelper.getPersistenceManagerFactory(name);
    checkIsOpen(ANONYMOUS_PMF_NAME);
  }

  /** */
  public void testGetPMFNull() {
    String name = null;
    privatePmf = JDOHelper.getPersistenceManagerFactory(name);
    checkIsOpen(ANONYMOUS_PMF_NAME);
  }

  /** */
  public void testGetPMFStringSpace() {
    String name = " ";
    privatePmf = JDOHelper.getPersistenceManagerFactory(name);
    checkIsOpen(ANONYMOUS_PMF_NAME);
  }

  /** */
  public void testGetPMFNamed() {
    String name = "namedPMF0";
    privatePmf = JDOHelper.getPersistenceManagerFactory(name);
    assertEquals("Incorrect value for RestoreValues", privatePmf.getRestoreValues(), false);
    checkIsOpen(name);
  }

  /** */
  public void testGetPMFEmptyStringOverrides() {
    String name = "";
    privatePmf = JDOHelper.getPersistenceManagerFactory(overrides, name);
    checkPersistent(ANONYMOUS_PMF_NAME);
  }

  /** */
  public void testGetPMFNullOverrides() {
    String name = null;
    privatePmf = JDOHelper.getPersistenceManagerFactory(overrides, name);
    checkPersistent(ANONYMOUS_PMF_NAME);
  }

  /** */
  public void testGetPMFStringSpaceOverrides() {
    String name = " ";
    privatePmf = JDOHelper.getPersistenceManagerFactory(overrides, name);
    checkPersistent(ANONYMOUS_PMF_NAME);
  }

  /** */
  public void testGetPMFNamedOverrides() {
    String name = "namedPMF0";
    privatePmf = JDOHelper.getPersistenceManagerFactory(overrides, name);
    assertEquals("Incorrect value for RestoreValues", privatePmf.getRestoreValues(), false);
    checkPersistent(name);
  }

  /** */
  public void testGetPMFNamedSpacesOverrides() {
    String name = "namedPMF1";
    privatePmf = JDOHelper.getPersistenceManagerFactory(overrides, " \t" + name + " \n");
    assertEquals("Incorrect value for RestoreValues", privatePmf.getRestoreValues(), true);
    checkPersistent(name);
  }

  /**
   * @param name the name
   */
  public void checkIsOpen(String name) {
    assertEquals("Incorrect PMF name", name, privatePmf.getName());
    if (privatePmf.isClosed()) {
      fail(ASSERTION_FAILED, "PMF.isClosed() returned true on an open pmf");
    }
    closePMF(privatePmf);
    // have next invocation of getPMF() get a new pmf
    privatePmf = null;
  }

  /**
   * Checks if instance can be persisted. Can be used if javax.jdo.mapping.Schema is overriden with
   * the correct value with JDOHelper.getPersistenceManagerFactory(Map overrides, ...).
   *
   * @param name the name
   */
  public void checkPersistent(String name) {
    assertEquals("Incorrect PMF name", name, privatePmf.getName());

    makePersistent();

    closePMF(privatePmf);
    if (!privatePmf.isClosed()) {
      fail(ASSERTION_FAILED, "PMF.isClosed() returned false on a closed pmf");
    }
    // have next invocation of getPMF() get a new pmf
    privatePmf = null;
  }

  protected void makePersistent() {
    addTearDownClass(PCPoint.class);
    privatePm = privatePmf.getPersistenceManager();
    Transaction tx = privatePm.currentTransaction();
    tx.begin();
    PCPoint comp = new PCPoint(1, 2);
    privatePm.makePersistent(comp);
    tx.commit();
  }
}
