/*
* Copyright (C) 2010 Google 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.google.api.explorer.client.base;
import com.google.api.explorer.client.base.ApiDirectory.ServiceDefinition;
import com.google.api.explorer.client.base.ApiService.CallStyle;
import com.google.api.explorer.client.base.rest.RestApiService;
import com.google.common.collect.ImmutableSet;
import com.google.common.collect.Sets;
import com.google.gwt.core.client.Callback;
import com.google.gwt.user.client.rpc.AsyncCallback;
import junit.framework.TestCase;
import org.easymock.Capture;
import org.easymock.EasyMock;
import org.easymock.IAnswer;
import java.util.Set;
/**
* Tests for {@link ServiceLoader}.
*
* @author jasonhall@google.com (Jason Hall)
*/
public class ServiceLoaderTest extends TestCase {
private MockGoogleApi googleApi;
private ServiceLoader loader;
@Override
public void setUp() throws Exception {
super.setUp();
googleApi = new MockGoogleApi();
loader = new ServiceLoader(googleApi);
}
/**
* Test that the callback gets invoked properly when a service is requested.
*/
public void testVersionSelected() {
googleApi.service = EasyMock.createControl().createMock(RestApiService.class);
@SuppressWarnings("unchecked")
Callback<ApiService, String> mockCallback = EasyMock.createMock(Callback.class);
mockCallback.onSuccess(googleApi.service);
EasyMock.replay(mockCallback);
loader.loadService("service", "version", mockCallback);
EasyMock.verify(mockCallback);
assertEquals(1, googleApi.invocations);
}
/**
* Test that we don't call our dependency when we should have a cached version.
*/
public void testVersionSelected_cached() {
RestApiService service = EasyMock.createControl().createMock(RestApiService.class);
// Populate the cache with the service we'll request later.
loader.cache.put(ServiceLoader.generateCacheKey("service", "version", CallStyle.REST), service);
@SuppressWarnings("unchecked")
Callback<ApiService, String> mockCallback = EasyMock.createMock(Callback.class);
mockCallback.onSuccess(service);
EasyMock.expectLastCall();
EasyMock.replay(mockCallback);
loader.loadService("service", "version", mockCallback);
EasyMock.verify(mockCallback);
assertEquals(0, googleApi.invocations);
}
/**
* Test that a blacklisted API doesn't show up in the directory list.
*/
public void testDirectoryBlacklist() {
ServiceDefinition toFilter = EasyMock.createMock(ServiceDefinition.class);
EasyMock.expect(toFilter.getName()).andReturn("drive").atLeastOnce();
EasyMock.expect(toFilter.getId()).andReturn("drive:v1").atLeastOnce();
ServiceDefinition toLeave = EasyMock.createMock(ServiceDefinition.class);
EasyMock.expect(toLeave.getName()).andReturn("drive").atLeastOnce();
EasyMock.expect(toLeave.getId()).andReturn("drive:v2").atLeastOnce();
final Set<ServiceDefinition> directory = ImmutableSet.of(toFilter, toLeave);
ApiServiceFactory mockDirectory = EasyMock.createMock(ApiServiceFactory.class);
final Capture<AsyncCallback<Set<ServiceDefinition>>> cbCapture =
new Capture<AsyncCallback<Set<ServiceDefinition>>>();
mockDirectory.loadApiDirectory(EasyMock.capture(cbCapture));
EasyMock.expectLastCall().andAnswer(new IAnswer<Void>() {
@Override
public Void answer() throws Throwable {
cbCapture.getValue().onSuccess(directory);
return null;
}
});
EasyMock.replay(toFilter, toLeave, mockDirectory);
loader = new ServiceLoader(mockDirectory);
final Set<ServiceDefinition> filtered = Sets.newHashSet();
loader.loadServiceDefinitions(new Callback<Set<ServiceDefinition>, String>() {
@Override
public void onFailure(String reason) {
fail();
}
@Override
public void onSuccess(Set<ServiceDefinition> result) {
filtered.addAll(result);
}
});
assertEquals(1, filtered.size());
assertEquals("drive:v2", filtered.iterator().next().getId());
EasyMock.verify(toFilter, toLeave, mockDirectory);
}
/**
* Mock implementation of {@link ApiServiceFactory} which allows its returned service
* to be set.
*/
private static class MockGoogleApi extends ApiServiceFactory {
private RestApiService service;
int invocations = 0;
public MockGoogleApi() {
super();
}
/**
* Mocks out real API requests by immediately calling the callback with the
* pre-defined service.
*/
@Override
public void createService(final String serviceName, final String version,
final CallStyle callStyle, final AsyncCallback<ApiService> callback) {
invocations++;
callback.onSuccess(service);
}
}
}