core: add discard method for Attributes

This commit is contained in:
Carl Mastrangelo 2019-05-23 10:34:04 -07:00 committed by GitHub
parent 4dcbe56354
commit cdeafcf6e0
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
2 changed files with 57 additions and 0 deletions

View File

@ -232,6 +232,26 @@ public final class Attributes {
return this; return this;
} }
/**
* Removes the key and associated value from the attribtues.
*
* @since 1.22.0
* @param key The key to remove
* @return this
*/
@ExperimentalApi("https://github.com/grpc/grpc-java/issues/5777")
public <T> Builder discard(Key<T> key) {
if (base.data.containsKey(key)) {
Map<Key<?>, Object> newBaseData = new IdentityHashMap<>(base.data);
newBaseData.remove(key);
base = new Attributes(newBaseData);
}
if (newdata != null) {
newdata.remove(key);
}
return this;
}
public <T> Builder setAll(Attributes other) { public <T> Builder setAll(Attributes other) {
data(other.data.size()).putAll(other.data); data(other.data.size()).putAll(other.data);
return this; return this;

View File

@ -19,6 +19,7 @@ package io.grpc;
import static com.google.common.truth.Truth.assertThat; import static com.google.common.truth.Truth.assertThat;
import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertNotSame; import static org.junit.Assert.assertNotSame;
import static org.junit.Assert.assertNull;
import static org.junit.Assert.assertSame; import static org.junit.Assert.assertSame;
import org.junit.Test; import org.junit.Test;
@ -91,4 +92,40 @@ public class AttributesTest {
assertEquals(attr1, attr2); assertEquals(attr1, attr2);
assertEquals(attr1.hashCode(), attr2.hashCode()); assertEquals(attr1.hashCode(), attr2.hashCode());
} }
@Test
public void discard_baseAttributes() {
Attributes attrs = Attributes.newBuilder().set(YOLO_KEY, "value").build();
Attributes newAttrs = attrs.toBuilder().discard(YOLO_KEY).build();
assertNull(newAttrs.get(YOLO_KEY));
assertThat(newAttrs.keysForTest()).doesNotContain(YOLO_KEY);
}
@Test
public void discard_noBase() {
Attributes.Builder attrs = Attributes.newBuilder().set(YOLO_KEY, "value");
Attributes newAttrs = attrs.discard(YOLO_KEY).build();
assertNull(newAttrs.get(YOLO_KEY));
assertThat(newAttrs.keysForTest()).doesNotContain(YOLO_KEY);
}
@Test
public void discard_baseAttributesAndBuilder() {
Attributes attrs = Attributes.newBuilder().set(YOLO_KEY, "value").build();
Attributes.Builder attrsBuilder = attrs.toBuilder().set(YOLO_KEY, "other value");
Attributes newAttrs = attrsBuilder.discard(YOLO_KEY).build();
assertNull(newAttrs.get(YOLO_KEY));
assertThat(newAttrs.keysForTest()).doesNotContain(YOLO_KEY);
}
@Test
public void discard_empty() {
Attributes newAttrs = Attributes.EMPTY.toBuilder().discard(YOLO_KEY).build();
assertNull(newAttrs.get(YOLO_KEY));
assertThat(newAttrs.keysForTest()).doesNotContain(YOLO_KEY);
}
} }