/*
 * Licensed to the University of California, Berkeley 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
 *
 * 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 tachyon.client.file;

import java.util.List;

import org.junit.Test;

import com.google.common.collect.Lists;

import tachyon.Constants;
import tachyon.client.ClientContext;

/**
 * Tests {@link FileSystemContext}.
 */
public final class FileSystemContextTest {

  @Test
  public void concurrencyTest() throws Exception {
    final List<FileSystemMasterClient> clients = Lists.newArrayList();

    // acquire all the clients
    for (int i = 0; i < ClientContext.getConf()
        .getInt(Constants.USER_FILE_MASTER_CLIENT_THREADS); i ++) {
      clients.add(FileSystemContext.INSTANCE.acquireMasterClient());
    }
    Thread acquireThread = new Thread(new AcquireClient());
    acquireThread.start();

    // wait for thread to run
    Thread.sleep(5L);

    // release all the clients
    for (FileSystemMasterClient client : clients) {
      FileSystemContext.INSTANCE.releaseMasterClient(client);
    }
    acquireThread.join();
  }

  class AcquireClient implements Runnable {
    @Override
    public void run() {
      FileSystemMasterClient client = FileSystemContext.INSTANCE.acquireMasterClient();
      FileSystemContext.INSTANCE.releaseMasterClient(client);
    }
  }
}

@@ -836,24 +836,49 @@
 util.List;%0A%0A
+import org.junit.Assert;%0A
 import org.j
@@ -1081,17 +1081,16 @@
 tTest %7B%0A
-%0A
   @Test%0A
@@ -1730,33 +1730,279 @@
   %7D%0A
-    acquireThread.join();
+%0A    final long timeoutMs = 500L;%0A    long start = System.currentTimeMillis();%0A    acquireThread.join(timeoutMs);%0A    if (System.currentTimeMillis() - start %3E timeoutMs) %7B%0A      Assert.fail(%22Failed to acquire a master client within %22 + timeoutMs + %22ms. Deadlock?%22);%0A    %7D
 %0A  %7D

Add a timeout in case a deadlock occurs.