/*
 * Copyright 2012-present Facebook, Inc.
 *
 * 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.
 */

package com.example;

import static org.junit.Assert.assertTrue;

import org.junit.Before;
import org.junit.Test;

public class TimeoutChangesBehaviorTest {

  @org.junit.Rule
  public org.junit.rules.Timeout timeoutForTests = new org.junit.rules.Timeout(10000);

  private Database database;

  @Before
  public void setUp() {
    database = new Database();
    database.beginTransaction();
  }

  @Test
  public void testTimeoutDictatesTheSuccessOfThisTest() throws InterruptedException {
    assertTrue("Database should have an open transaction due to setUp().",
        database.isInTransaction());
  }

  private static class Database {
    /**
     * This fake database is designed such that there is only one Transaction per thread.
     */
    private static ThreadLocal<Transaction> TX = new ThreadLocal<Transaction>() {
      @Override
      protected Transaction initialValue() {
        return new Transaction();
      }
    };

    public void beginTransaction() {
      TX.get().beginTransaction();
    }

    public boolean isInTransaction() {
      return TX.get().isInTransaction();
    }
  }

  private static class Transaction {

    private boolean isInTransaction = false;
    
    public void beginTransaction() {
      isInTransaction = true;
    }    

    public boolean isInTransaction() {
      return isInTransaction;
    }    

  }
}
