/*
 * Copyright 2015-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.facebook.buck.io;

import com.google.common.base.Optional;
import com.google.common.collect.ImmutableList;

import java.io.IOException;

import java.util.List;
import java.util.Map;

/**
 * Fake implementation of {@link WatchmanClient} for tests.
 */
public class FakeWatchmanClient implements WatchmanClient {
  private final long queryElapsedTimeNanos;
  private final Map<? extends List<? extends Object>, ? extends Map<String, ? extends Object>>
    queryResults;
  private final Exception exceptionToThrow;

  public FakeWatchmanClient(
      long queryElapsedTimeNanos,
      Map<? extends List<? extends Object>, ? extends Map<String, ? extends Object>> queryResults) {
    this(queryElapsedTimeNanos, queryResults, null);
  }

  public FakeWatchmanClient(
      long queryElapsedTimeNanos,
      Map<? extends List<? extends Object>, ? extends Map<String, ? extends Object>> queryResults,
      Exception exceptionToThrow) {
    this.queryElapsedTimeNanos = queryElapsedTimeNanos;
    this.queryResults = queryResults;
    this.exceptionToThrow = exceptionToThrow;
  }

  @Override
  public Optional<? extends Map<String, ? extends Object>> queryWithTimeout(
      long timeoutNanos,
      Object... query) throws InterruptedException, IOException {
    if (queryElapsedTimeNanos > timeoutNanos) {
      return Optional.absent();
    }
    if (exceptionToThrow != null) {
      if (exceptionToThrow instanceof IOException) {
        throw (IOException) exceptionToThrow;
      } else if (exceptionToThrow instanceof InterruptedException) {
        throw (InterruptedException) exceptionToThrow;
      } else {
        throw new RuntimeException("Invalid exception");
      }
    }
    return Optional.fromNullable(queryResults.get(ImmutableList.copyOf(query)));
  }

  @Override
  public void close() {
  }
}

@@ -675,85 +675,62 @@
 al;%0A
+%0A
 import 
-com.google.common.collect.ImmutableList;%0A%0Aimport java.io.IOException;%0A
+java.io.IOException;%0A%0Aimport java.util.Arrays;
 %0Aimp
@@ -1847,16 +1847,226 @@
 ption %7B%0A
+    Map%3CString, ? extends Object%3E result = queryResults.get(Arrays.asList(query));%0A    if (result == null) %7B%0A      throw new RuntimeException(String.format(%22Could not find results for query %25s%22, query));%0A    %7D%0A
     if (
@@ -2512,66 +2512,17 @@
 nal.
-fromNullable(queryResults.get(ImmutableList.copyOf(query))
+of(result
 );%0A 

Make FakeWatchmanClient more resistant to misconfiguration