use of com.google.appengine.api.memcache.MemcacheServicePb.MemcacheSetRequest in project appengine-java-standard by GoogleCloudPlatform.
the class MemcacheServiceImplTest method setupOnePutWithError.
private MemcacheService setupOnePutWithError(String namespace, String key, String value, Exception injected) {
MemcacheService memcache = new MemcacheServiceImpl(null);
NamespaceManager.set("");
// using deprecated method to bypass validation
memcache.setNamespace(namespace);
// Setting up the mock, so that when it sees this large value
// it will get the exception that would result from an
// RPC application error of INVALID_REQUEST
MemcacheSetRequest request = MemcacheSetRequest.newBuilder().setNameSpace(nullToEmpty(namespace)).addItem(MemcacheSetRequest.Item.newBuilder().setKey(ByteString.copyFrom(makePbKey(key))).setFlags(Flag.UTF8.ordinal()).setValue(ByteString.copyFrom(serialize(value).value)).setSetPolicy(MemcacheSetRequest.SetPolicy.SET).setExpirationTime(0)).build();
expectAsyncCall("Set", request, injected);
return memcache;
}
use of com.google.appengine.api.memcache.MemcacheServicePb.MemcacheSetRequest in project appengine-java-standard by GoogleCloudPlatform.
the class MemcacheServiceImplTest method multiPutIfUntouched.
private void multiPutIfUntouched(String ns, Expiration requestExpiration) {
CasValues one = new CasValues(new IdentifiableValueImpl(ONE, 10), "new." + ONE, Expiration.onDate(new Date(200)));
ValueAndFlags oneValueAndFlag = serialize(one.getNewValue());
CasValues two = new CasValues(new IdentifiableValueImpl(TWO, 20), null);
ValueAndFlags twoValueAndFlag = serialize(two.getNewValue());
MemcacheServiceImpl memcache = new MemcacheServiceImpl(null);
MemcacheSetRequest setRequest = MemcacheSetRequest.newBuilder().setNameSpace(ns).addItem(MemcacheSetRequest.Item.newBuilder().setKey(ByteString.copyFrom(makePbKey(null))).setValue(ByteString.copyFrom(oneValueAndFlag.value)).setFlags(oneValueAndFlag.flags.ordinal()).setExpirationTime(one.getExipration().getSecondsValue()).setSetPolicy(MemcacheSetRequest.SetPolicy.CAS).setCasId(10)).addItem(MemcacheSetRequest.Item.newBuilder().setKey(ByteString.copyFrom(makePbKey("2"))).setValue(ByteString.copyFrom(twoValueAndFlag.value)).setFlags(twoValueAndFlag.flags.ordinal()).setExpirationTime(requestExpiration == null ? 0 : requestExpiration.getSecondsValue()).setSetPolicy(MemcacheSetRequest.SetPolicy.CAS).setCasId(20)).build();
MemcacheSetResponse setResponse = MemcacheSetResponse.newBuilder().addSetStatus(MemcacheSetResponse.SetStatusCode.STORED).addSetStatus(MemcacheSetResponse.SetStatusCode.EXISTS).build();
expectAsyncCall("Set", setRequest, setResponse);
Map<String, CasValues> values = new LinkedHashMap<>();
values.put(null, one);
values.put("2", two);
Set<String> response = memcache.putIfUntouched(values, requestExpiration);
assertThat(response).hasSize(1);
assertThat(response).contains(null);
verifyAsyncCall("Set", setRequest);
}
use of com.google.appengine.api.memcache.MemcacheServicePb.MemcacheSetRequest in project appengine-java-standard by GoogleCloudPlatform.
the class MemcacheServiceImplTest method errorHandlingPermissiveTest.
private void errorHandlingPermissiveTest(boolean isConsistent, ErrorHandler errorHandler) {
byte[] oneKey = makePbKey(ONE);
byte[] oneValue = serialize(ONE).value;
MemcacheService memcache = new MemcacheServiceImpl("");
memcache.setErrorHandler(errorHandler);
// Get calls
MemcacheGetRequest getRequest = MemcacheGetRequest.newBuilder().setNameSpace("").addKey(ByteString.copyFrom(oneKey)).build();
expectAsyncCall("Get", getRequest, new ApiProxy.ApplicationException(1, "Error"));
Object value = memcache.get(ONE);
assertThat(value).isNull();
verifyAsyncCall("Get", getRequest);
expectAsyncCall("Get", getRequest, new ApiProxy.ApplicationException(1, "Error"));
assertThat(memcache.contains(ONE)).isFalse();
verifyAsyncCall("Get", getRequest);
expectAsyncCall("Get", getRequest, new byte[] { 10, 20 });
assertThat(memcache.get(ONE)).isNull();
verifyAsyncCall("Get", getRequest);
// Set calls
MemcacheSetRequest setRequest = MemcacheSetRequest.newBuilder().setNameSpace("").addItem(MemcacheSetRequest.Item.newBuilder().setKey(ByteString.copyFrom(oneKey)).setFlags(Flag.UTF8.ordinal()).setValue(ByteString.copyFrom(oneValue)).setSetPolicy(MemcacheSetRequest.SetPolicy.ADD).setExpirationTime(0)).build();
// Because of AllowPartialResults for Set method, Set should almost always succeed and return
// any error code in the response payload. Application error can occur only for early checks,
// e.g. out of quota, ShardLock check failure or missing ServingState.
expectAsyncCall("Set", setRequest, new ApiProxy.ApplicationException(1, "Error"));
assertThat(memcache.put(ONE, "one", null, SetPolicy.ADD_ONLY_IF_NOT_PRESENT)).isFalse();
verifyAsyncCall("Set", setRequest);
expectAsyncCall("Set", setRequest, new ApiProxy.ApplicationException(1, "Error"));
assertThat(memcache.putAll(ImmutableMap.of(ONE, "one"), null, SetPolicy.ADD_ONLY_IF_NOT_PRESENT)).isEmpty();
verifyAsyncCall("Set", setRequest);
// Successful set -> no error logged or exception thrown.
expectAsyncCall("Set", setRequest, MemcacheSetResponse.newBuilder().addSetStatus(SetStatusCode.STORED).build());
assertThat(memcache.put(ONE, "one", null, SetPolicy.ADD_ONLY_IF_NOT_PRESENT)).isTrue();
verifyAsyncCall("Set", setRequest);
expectAsyncCall("Set", setRequest, MemcacheSetResponse.newBuilder().addSetStatus(SetStatusCode.STORED).build());
assertThat(memcache.putAll(ImmutableMap.of(ONE, "one"), null, SetPolicy.ADD_ONLY_IF_NOT_PRESENT)).isEqualTo(ImmutableSet.of(ONE));
verifyAsyncCall("Set", setRequest);
// Item not stored because of set policy -> logs an error or throws, depending on the error
// handler used (for backwards compatibility).
expectAsyncCall("Set", setRequest, MemcacheSetResponse.newBuilder().addSetStatus(SetStatusCode.ERROR).build());
if (isConsistent) {
assertThat(memcache.put(ONE, "one", null, SetPolicy.ADD_ONLY_IF_NOT_PRESENT)).isFalse();
} else {
assertThrows(MemcacheServiceException.class, () -> memcache.put(ONE, "one", null, SetPolicy.ADD_ONLY_IF_NOT_PRESENT));
}
verifyAsyncCall("Set", setRequest);
expectAsyncCall("Set", setRequest, MemcacheSetResponse.newBuilder().addSetStatus(SetStatusCode.ERROR).build());
if (isConsistent) {
assertThat(memcache.putAll(ImmutableMap.of(ONE, "one"), null, SetPolicy.ADD_ONLY_IF_NOT_PRESENT)).isEmpty();
} else {
assertThrows(MemcacheServiceException.class, () -> memcache.putAll(ImmutableMap.of(ONE, "one"), null, SetPolicy.ADD_ONLY_IF_NOT_PRESENT));
}
verifyAsyncCall("Set", setRequest);
// Increment calls
MemcacheIncrementRequest incrementRequest = MemcacheIncrementRequest.newBuilder().setNameSpace("").setKey(ByteString.copyFrom(makePbKey(INT_123))).setDelta(17).setDirection(MemcacheIncrementRequest.Direction.DECREMENT).build();
expectAsyncCall("Increment", incrementRequest, new ApiProxy.ApplicationException(1, "Error"));
assertThat(memcache.increment(INT_123, -17)).isEqualTo(null);
verifyAsyncCall("Increment", incrementRequest);
expectAsyncCall("Increment", incrementRequest, new ApiProxy.ApplicationException(6, "Error"));
assertThrows(InvalidValueException.class, () -> memcache.increment(INT_123, -17));
verifyAsyncCall("Increment", incrementRequest);
// BatchIncrement calls
MemcacheBatchIncrementRequest batchIncrementRequest = MemcacheBatchIncrementRequest.newBuilder().setNameSpace("").addItem(MemcacheIncrementRequest.newBuilder().setKey(ByteString.copyFrom(makePbKey(INT_123))).setDelta(17).setDirection(MemcacheIncrementRequest.Direction.DECREMENT)).build();
expectAsyncCall("BatchIncrement", batchIncrementRequest, new ApiProxy.ApplicationException(1, "Error"));
assertThat(memcache.incrementAll(Arrays.asList(INT_123), -17)).isEqualTo(Collections.singletonMap(INT_123, null));
verifyAsyncCall("BatchIncrement", batchIncrementRequest);
expectAsyncCall("BatchIncrement", batchIncrementRequest, MemcacheBatchIncrementResponse.newBuilder().addItem(MemcacheIncrementResponse.newBuilder().setIncrementStatus(IncrementStatusCode.ERROR)).build());
assertThat(memcache.incrementAll(Arrays.asList(INT_123), -17)).isEqualTo(Collections.singletonMap(INT_123, null));
verifyAsyncCall("BatchIncrement", batchIncrementRequest);
// Delete calls
MemcacheDeleteRequest deleteRequest = MemcacheDeleteRequest.newBuilder().setNameSpace("").addItem(MemcacheDeleteRequest.Item.newBuilder().setKey(ByteString.copyFrom(oneKey)).setDeleteTime(0)).build();
expectAsyncCall("Delete", deleteRequest, new ApiProxy.ApplicationException(1, "Error"));
assertThat(memcache.delete(ONE)).isFalse();
verifyAsyncCall("Delete", deleteRequest);
expectAsyncCall("Delete", deleteRequest, new ApiProxy.ApplicationException(1, "Error"));
assertThat(memcache.deleteAll(Arrays.asList(ONE))).isEmpty();
verifyAsyncCall("Delete", deleteRequest);
// Flush calls
MemcacheFlushRequest flushRequest = MemcacheFlushRequest.getDefaultInstance();
expectAsyncCall("FlushAll", flushRequest, new ApiProxy.ApplicationException(1, "Error"));
memcache.clearAll();
verifyAsyncCall("FlushAll", flushRequest);
}
use of com.google.appengine.api.memcache.MemcacheServicePb.MemcacheSetRequest in project appengine-java-standard by GoogleCloudPlatform.
the class MemcacheServiceImplTest method singlePutTest.
private void singlePutTest(MemcacheService memcache, String namespace, Object key, String value) {
byte[] keyValue = makePbKey(key);
MemcacheSetRequest request = MemcacheSetRequest.newBuilder().setNameSpace(namespace).addItem(MemcacheSetRequest.Item.newBuilder().setKey(ByteString.copyFrom(keyValue)).setFlags(value == null ? Flag.OBJECT.ordinal() : Flag.UTF8.ordinal()).setValue(ByteString.copyFrom(serialize(value).value)).setSetPolicy(MemcacheSetRequest.SetPolicy.SET).setExpirationTime(0)).build();
MemcacheSetResponse response = MemcacheSetResponse.newBuilder().addSetStatus(MemcacheSetResponse.SetStatusCode.STORED).build();
expectAsyncCall("Set", request, response);
assertThat(memcache.put(key, value, null, SetPolicy.SET_ALWAYS)).isTrue();
verifyAsyncCall("Set", request);
}
use of com.google.appengine.api.memcache.MemcacheServicePb.MemcacheSetRequest in project appengine-java-standard by GoogleCloudPlatform.
the class MemcacheServiceImplTest method testErrorHandlingStrict.
@Test
public void testErrorHandlingStrict() {
byte[] oneKey = makePbKey(ONE);
byte[] oneValue = serialize(ONE).value;
MemcacheService memcache = new MemcacheServiceImpl("");
memcache.setErrorHandler(ErrorHandlers.getStrict());
MemcacheGetRequest getRequest = MemcacheGetRequest.newBuilder().setNameSpace("").addKey(ByteString.copyFrom(oneKey)).build();
expectAsyncCall("Get", getRequest, new ApiProxy.ApplicationException(1, "Error"));
assertThrows(MemcacheServiceException.class, () -> memcache.get(ONE));
verifyAsyncCall("Get", getRequest);
expectAsyncCall("Get", getRequest, new ApiProxy.ApplicationException(1, "Error"));
assertThrows(MemcacheServiceException.class, () -> memcache.contains(ONE));
verifyAsyncCall("Get", getRequest);
MemcacheSetRequest setRequest = MemcacheSetRequest.newBuilder().setNameSpace("").addItem(MemcacheSetRequest.Item.newBuilder().setKey(ByteString.copyFrom(oneKey)).setFlags(Flag.UTF8.ordinal()).setValue(ByteString.copyFrom(oneValue)).setSetPolicy(MemcacheSetRequest.SetPolicy.ADD).setExpirationTime(0)).build();
expectAsyncCall("Set", setRequest, new ApiProxy.ApplicationException(1, "Error"));
assertThrows(MemcacheServiceException.class, () -> memcache.put(ONE, "one", null, SetPolicy.ADD_ONLY_IF_NOT_PRESENT));
verifyAsyncCall("Set", setRequest);
expectAsyncCall("Set", setRequest, new ApiProxy.ApplicationException(1, "Error"));
assertThrows(MemcacheServiceException.class, () -> memcache.putAll(ImmutableMap.of(ONE, "one"), null, SetPolicy.ADD_ONLY_IF_NOT_PRESENT));
verifyAsyncCall("Set", setRequest);
// Successful set -> no error logged or exception thrown.
expectAsyncCall("Set", setRequest, MemcacheSetResponse.newBuilder().addSetStatus(SetStatusCode.STORED).build());
assertThat(memcache.put(ONE, "one", null, SetPolicy.ADD_ONLY_IF_NOT_PRESENT)).isTrue();
verifyAsyncCall("Set", setRequest);
expectAsyncCall("Set", setRequest, MemcacheSetResponse.newBuilder().addSetStatus(SetStatusCode.STORED).build());
assertThat(memcache.putAll(ImmutableMap.of(ONE, "one"), null, SetPolicy.ADD_ONLY_IF_NOT_PRESENT)).isEqualTo(ImmutableSet.of(ONE));
verifyAsyncCall("Set", setRequest);
// Item not stored because of set policy.
expectAsyncCall("Set", setRequest, MemcacheSetResponse.newBuilder().addSetStatus(SetStatusCode.ERROR).build());
assertThrows(MemcacheServiceException.class, () -> memcache.put(ONE, "one", null, SetPolicy.ADD_ONLY_IF_NOT_PRESENT));
verifyAsyncCall("Set", setRequest);
expectAsyncCall("Set", setRequest, MemcacheSetResponse.newBuilder().addSetStatus(SetStatusCode.ERROR).build());
assertThrows(MemcacheServiceException.class, () -> memcache.putAll(ImmutableMap.of(ONE, "one"), null, SetPolicy.ADD_ONLY_IF_NOT_PRESENT));
verifyAsyncCall("Set", setRequest);
MemcacheIncrementRequest incrementRequest = MemcacheIncrementRequest.newBuilder().setNameSpace("").setKey(ByteString.copyFrom(makePbKey(INT_123))).setDelta(17).setDirection(MemcacheIncrementRequest.Direction.DECREMENT).build();
expectAsyncCall("Increment", incrementRequest, new ApiProxy.ApplicationException(1, "Error"));
assertThrows(MemcacheServiceException.class, () -> memcache.increment(INT_123, -17));
verifyAsyncCall("Increment", incrementRequest);
expectAsyncCall("Increment", incrementRequest, new ApiProxy.ApplicationException(6, "Error"));
assertThrows(InvalidValueException.class, () -> memcache.increment(INT_123, -17));
verifyAsyncCall("Increment", incrementRequest);
MemcacheBatchIncrementRequest batchIncrementRequest = MemcacheBatchIncrementRequest.newBuilder().setNameSpace("").addItem(MemcacheIncrementRequest.newBuilder().setKey(ByteString.copyFrom(makePbKey(INT_123))).setDelta(17).setDirection(MemcacheIncrementRequest.Direction.DECREMENT)).build();
expectAsyncCall("BatchIncrement", batchIncrementRequest, new ApiProxy.ApplicationException(1, "Error"));
assertThrows(MemcacheServiceException.class, () -> memcache.incrementAll(Arrays.asList(INT_123), -17));
verifyAsyncCall("BatchIncrement", batchIncrementRequest);
// Partial BatchIncrement error doesn't throw, but returns null.
expectAsyncCall("BatchIncrement", batchIncrementRequest, MemcacheBatchIncrementResponse.newBuilder().addItem(MemcacheIncrementResponse.newBuilder().setIncrementStatus(IncrementStatusCode.ERROR)).build());
assertThat(memcache.incrementAll(Arrays.asList(INT_123), -17)).containsExactly(INT_123, null);
MemcacheDeleteRequest deleteRequest = MemcacheDeleteRequest.newBuilder().setNameSpace("").addItem(MemcacheDeleteRequest.Item.newBuilder().setKey(ByteString.copyFrom(oneKey)).setDeleteTime(0)).build();
expectAsyncCall("Delete", deleteRequest, new ApiProxy.ApplicationException(1, "Error"));
assertThrows(MemcacheServiceException.class, () -> memcache.delete(ONE));
verifyAsyncCall("Delete", deleteRequest);
expectAsyncCall("Delete", deleteRequest, new ApiProxy.ApplicationException(1, "Error"));
assertThrows(MemcacheServiceException.class, () -> memcache.deleteAll(Arrays.asList(ONE)));
verifyAsyncCall("Delete", deleteRequest);
MemcacheFlushRequest flushRequest = MemcacheFlushRequest.getDefaultInstance();
expectAsyncCall("FlushAll", flushRequest, new ApiProxy.ApplicationException(1, "Error"));
assertThrows(MemcacheServiceException.class, memcache::clearAll);
verifyAsyncCall("FlushAll", flushRequest);
}
Aggregations