/*
* 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 java.io.IOException;
import java.util.Arrays;
import java.util.List;
import java.util.Map;
import java.util.Optional;
/** 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 {
Map<String, ? extends Object> result = queryResults.get(Arrays.asList(query));
if (result == null) {
throw new RuntimeException(
String.format(
"Could not find results for query %s in %s",
Arrays.asList(query), queryResults.keySet()));
}
if (queryElapsedTimeNanos > timeoutNanos) {
return Optional.empty();
}
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.of(result);
}
@Override
public void close() {}
}