/**
* Copyright Microsoft Corporation
*
* 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.microsoft.azure.storage;
import com.microsoft.azure.storage.TestRunners.CloudTests;
import com.microsoft.azure.storage.TestRunners.DevFabricTests;
import com.microsoft.azure.storage.TestRunners.DevStoreTests;
import com.microsoft.azure.storage.blob.BlobRequestOptions;
import com.microsoft.azure.storage.blob.CloudBlobClient;
import com.microsoft.azure.storage.blob.CloudBlobContainer;
import com.microsoft.azure.storage.core.SR;
import org.junit.Test;
import org.junit.experimental.categories.Category;
import java.net.HttpURLConnection;
import java.net.URISyntaxException;
import java.util.ArrayList;
import static org.junit.Assert.*;
@Category({ DevFabricTests.class, DevStoreTests.class, CloudTests.class })
public class EventFiringTests {
@Test
public void testSendingRequestEvents() throws URISyntaxException, StorageException {
final ArrayList<Boolean> callList = new ArrayList<Boolean>();
final ArrayList<Boolean> globalCallList = new ArrayList<Boolean>();
OperationContext eventContext = new OperationContext();
eventContext.getSendingRequestEventHandler().addListener(new StorageEvent<SendingRequestEvent>() {
@Override
public void eventOccurred(SendingRequestEvent eventArg) {
assertEquals(eventArg.getRequestResult(), eventArg.getOpContext().getLastResult());
callList.add(true);
}
});
OperationContext.getGlobalSendingRequestEventHandler().addListener(new StorageEvent<SendingRequestEvent>() {
@Override
public void eventOccurred(SendingRequestEvent eventArg) {
assertEquals(eventArg.getRequestResult(), eventArg.getOpContext().getLastResult());
globalCallList.add(true);
}
});
assertEquals(0, callList.size());
assertEquals(0, globalCallList.size());
CloudBlobClient blobClient = TestHelper.createCloudBlobClient();
CloudBlobContainer container = blobClient.getContainerReference("container1");
// make sure both update
container.exists(null, null, eventContext);
assertEquals(1, callList.size());
assertEquals(1, globalCallList.size());
// make sure only global updates
container.exists();
assertEquals(1, callList.size());
assertEquals(2, globalCallList.size());
OperationContext
.setGlobalSendingRequestEventHandler(new StorageEventMultiCaster<SendingRequestEvent, StorageEvent<SendingRequestEvent>>());
eventContext
.setSendingRequestEventHandler(new StorageEventMultiCaster<SendingRequestEvent, StorageEvent<SendingRequestEvent>>());
// make sure neither update
container.exists(null, null, eventContext);
assertEquals(1, callList.size());
assertEquals(2, globalCallList.size());
}
@Test
public void testResponseReceivedEvents() throws URISyntaxException, StorageException {
final ArrayList<Boolean> callList = new ArrayList<Boolean>();
final ArrayList<Boolean> globalCallList = new ArrayList<Boolean>();
OperationContext eventContext = new OperationContext();
eventContext.getResponseReceivedEventHandler().addListener(new StorageEvent<ResponseReceivedEvent>() {
@Override
public void eventOccurred(ResponseReceivedEvent eventArg) {
assertEquals(eventArg.getRequestResult(), eventArg.getOpContext().getLastResult());
callList.add(true);
}
});
OperationContext.getGlobalResponseReceivedEventHandler().addListener(new StorageEvent<ResponseReceivedEvent>() {
@Override
public void eventOccurred(ResponseReceivedEvent eventArg) {
assertEquals(eventArg.getRequestResult(), eventArg.getOpContext().getLastResult());
globalCallList.add(true);
}
});
assertEquals(0, callList.size());
assertEquals(0, globalCallList.size());
CloudBlobClient blobClient = TestHelper.createCloudBlobClient();
CloudBlobContainer container = blobClient.getContainerReference("container1");
// make sure both update
container.exists(null, null, eventContext);
assertEquals(1, callList.size());
assertEquals(1, globalCallList.size());
// make sure only global updates
container.exists();
assertEquals(1, callList.size());
assertEquals(2, globalCallList.size());
OperationContext
.setGlobalResponseReceivedEventHandler(new StorageEventMultiCaster<ResponseReceivedEvent, StorageEvent<ResponseReceivedEvent>>());
eventContext
.setResponseReceivedEventHandler(new StorageEventMultiCaster<ResponseReceivedEvent, StorageEvent<ResponseReceivedEvent>>());
// make sure neither update
container.exists(null, null, eventContext);
assertEquals(1, callList.size());
assertEquals(2, globalCallList.size());
}
@Test
public void testRequestCompletedEvents() throws URISyntaxException, StorageException {
final ArrayList<Boolean> callList = new ArrayList<Boolean>();
final ArrayList<Boolean> globalCallList = new ArrayList<Boolean>();
OperationContext eventContext = new OperationContext();
eventContext.getRequestCompletedEventHandler().addListener(new StorageEvent<RequestCompletedEvent>() {
@Override
public void eventOccurred(RequestCompletedEvent eventArg) {
assertEquals(eventArg.getRequestResult(), eventArg.getOpContext().getLastResult());
callList.add(true);
}
});
OperationContext.getGlobalRequestCompletedEventHandler().addListener(new StorageEvent<RequestCompletedEvent>() {
@Override
public void eventOccurred(RequestCompletedEvent eventArg) {
assertEquals(eventArg.getRequestResult(), eventArg.getOpContext().getLastResult());
globalCallList.add(true);
}
});
assertEquals(0, callList.size());
assertEquals(0, globalCallList.size());
CloudBlobClient blobClient = TestHelper.createCloudBlobClient();
CloudBlobContainer container = blobClient.getContainerReference("container1");
// make sure both update
container.exists(null, null, eventContext);
assertEquals(1, callList.size());
assertEquals(1, globalCallList.size());
// make sure only global updates
container.exists();
assertEquals(1, callList.size());
assertEquals(2, globalCallList.size());
OperationContext
.setGlobalRequestCompletedEventHandler(new StorageEventMultiCaster<RequestCompletedEvent, StorageEvent<RequestCompletedEvent>>());
eventContext
.setRequestCompletedEventHandler(new StorageEventMultiCaster<RequestCompletedEvent, StorageEvent<RequestCompletedEvent>>());
// make sure neither update
container.exists(null, null, eventContext);
assertEquals(1, callList.size());
assertEquals(2, globalCallList.size());
}
@Test
@Category({ SecondaryTests.class })
public void testRetryingEvents() throws URISyntaxException, StorageException {
final ArrayList<Boolean> callList = new ArrayList<Boolean>();
final ArrayList<Boolean> globalCallList = new ArrayList<Boolean>();
OperationContext eventContext = new OperationContext();
eventContext.getRetryingEventHandler().addListener(new StorageEvent<RetryingEvent>() {
@Override
public void eventOccurred(RetryingEvent eventArg) {
assertEquals(eventArg.getRequestResult(), eventArg.getOpContext().getLastResult());
callList.add(true);
}
});
OperationContext.getGlobalRetryingEventHandler().addListener(new StorageEvent<RetryingEvent>() {
@Override
public void eventOccurred(RetryingEvent eventArg) {
assertEquals(eventArg.getRequestResult(), eventArg.getOpContext().getLastResult());
globalCallList.add(true);
}
});
assertEquals(0, callList.size());
assertEquals(0, globalCallList.size());
// This will cause a retry to occur when a 404 is returned
BlobRequestOptions eventOptions = new BlobRequestOptions();
eventOptions.setLocationMode(LocationMode.SECONDARY_THEN_PRIMARY);
RetryLinearRetry retry = new RetryLinearRetry();
retry.maximumAttempts = 1;
eventOptions.setRetryPolicyFactory(retry);
CloudBlobClient blobClient = TestHelper.createCloudBlobClient();
CloudBlobContainer container = blobClient.getContainerReference("container1");
// make sure both update
try {
container.downloadAttributes(null, eventOptions, eventContext);
fail();
}
catch (StorageException e) {
assertEquals(HttpURLConnection.HTTP_NOT_FOUND, e.getHttpStatusCode());
assertEquals("The specified container does not exist.", e.getMessage());
assertEquals(StorageErrorCode.RESOURCE_NOT_FOUND.toString(), e.getErrorCode());
}
assertEquals(1, callList.size());
assertEquals(1, globalCallList.size());
// make sure only global updates
try {
container.downloadAttributes(null, eventOptions, null);
fail();
}
catch (StorageException e) {
assertEquals(HttpURLConnection.HTTP_NOT_FOUND, e.getHttpStatusCode());
assertEquals("The specified container does not exist.", e.getMessage());
assertEquals(StorageErrorCode.RESOURCE_NOT_FOUND.toString(), e.getErrorCode());
}
assertEquals(1, callList.size());
assertEquals(2, globalCallList.size());
OperationContext
.setGlobalRetryingEventHandler(new StorageEventMultiCaster<RetryingEvent, StorageEvent<RetryingEvent>>());
eventContext.setRetryingEventHandler(new StorageEventMultiCaster<RetryingEvent, StorageEvent<RetryingEvent>>());
// make sure neither update
try {
container.downloadAttributes(null, eventOptions, eventContext);
fail();
}
catch (StorageException e) {
assertEquals(HttpURLConnection.HTTP_NOT_FOUND, e.getHttpStatusCode());
assertEquals("The specified container does not exist.", e.getMessage());
assertEquals(StorageErrorCode.RESOURCE_NOT_FOUND.toString(), e.getErrorCode());
}
assertEquals(1, callList.size());
assertEquals(2, globalCallList.size());
}
@Test
@Category({ SecondaryTests.class })
public void testSendingRequestRequestCompletedPairs() throws URISyntaxException, StorageException {
final ArrayList<Boolean> sendingCallList = new ArrayList<Boolean>();
final ArrayList<Boolean> completedCallList = new ArrayList<Boolean>();
OperationContext eventContext = new OperationContext();
eventContext.getSendingRequestEventHandler().addListener(new StorageEvent<SendingRequestEvent>() {
@Override
public void eventOccurred(SendingRequestEvent eventArg) {
assertEquals(eventArg.getRequestResult(), eventArg.getOpContext().getLastResult());
sendingCallList.add(true);
}
});
eventContext.getRequestCompletedEventHandler().addListener(new StorageEvent<RequestCompletedEvent>() {
@Override
public void eventOccurred(RequestCompletedEvent eventArg) {
assertEquals(eventArg.getRequestResult(), eventArg.getOpContext().getLastResult());
completedCallList.add(true);
}
});
assertEquals(0, sendingCallList.size());
assertEquals(0, completedCallList.size());
// This will cause a retry to occur when a 404 is returned
BlobRequestOptions eventOptions = new BlobRequestOptions();
eventOptions.setLocationMode(LocationMode.SECONDARY_THEN_PRIMARY);
RetryLinearRetry retry = new RetryLinearRetry();
retry.maximumAttempts = 1;
eventOptions.setRetryPolicyFactory(retry);
CloudBlobClient blobClient = TestHelper.createCloudBlobClient();
CloudBlobContainer container = blobClient.getContainerReference("container1");
// make sure both update even if an exception is thrown and a retry occurs
try {
container.downloadAttributes(null, eventOptions, eventContext);
fail();
}
catch (StorageException e) {
assertEquals(HttpURLConnection.HTTP_NOT_FOUND, e.getHttpStatusCode());
assertEquals("The specified container does not exist.", e.getMessage());
assertEquals(StorageErrorCode.RESOURCE_NOT_FOUND.toString(), e.getErrorCode());
}
assertEquals(2, sendingCallList.size());
assertEquals(2, completedCallList.size());
// make sure neither update if an exception is thrown before sending occurs
try {
eventOptions.setLocationMode(LocationMode.SECONDARY_ONLY);
container.createIfNotExists(eventOptions, eventContext);
fail();
}
catch (StorageException e) {
assertTrue(e.getCause() instanceof IllegalArgumentException);
assertEquals(SR.PRIMARY_ONLY_COMMAND, e.getCause().getMessage());
}
assertEquals(2, sendingCallList.size());
assertEquals(2, completedCallList.size());
}
}