blob: ef9df088250dbee43063fde97e22f6af9bf1d572 [file] [log] [blame]
// Copyright 2022 Google LLC
//
// 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.crypto.tink.monitoring;
import static com.google.common.truth.Truth.assertThat;
import static org.junit.Assert.assertThrows;
import com.google.crypto.tink.KeyStatus;
import com.google.crypto.tink.Parameters;
import com.google.crypto.tink.internal.LegacyProtoParameters;
import com.google.crypto.tink.internal.ProtoParametersSerialization;
import com.google.crypto.tink.proto.KeyTemplate;
import com.google.crypto.tink.proto.OutputPrefixType;
import com.google.protobuf.ByteString;
import java.security.GeneralSecurityException;
import java.util.HashMap;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.junit.runners.JUnit4;
/** Tests MonitoringKeysetInfo */
@RunWith(JUnit4.class)
public final class MonitoringKeysetInfoTest {
Parameters makeLegacyProtoParameters(String typeUrl) {
KeyTemplate template =
KeyTemplate.newBuilder()
.setTypeUrl(typeUrl)
.setOutputPrefixType(OutputPrefixType.TINK)
.setValue(ByteString.EMPTY)
.build();
ProtoParametersSerialization serialization = ProtoParametersSerialization.create(template);
return new LegacyProtoParameters(serialization);
}
@Test
public void addAndGetEntry() throws Exception {
Parameters parameters = makeLegacyProtoParameters("typeUrl123");
MonitoringKeysetInfo info =
MonitoringKeysetInfo.newBuilder()
.addEntry(KeyStatus.ENABLED, 123, makeLegacyProtoParameters("typeUrl123"))
.setPrimaryKeyId(123)
.build();
assertThat(info.getEntries()).hasSize(1);
MonitoringKeysetInfo.Entry entry = info.getEntries().get(0);
assertThat(entry.getStatus()).isEqualTo(KeyStatus.ENABLED);
assertThat(entry.getKeyId()).isEqualTo(123);
assertThat(entry.getParameters()).isEqualTo(parameters);
}
@Test
public void addEntries() throws Exception {
MonitoringKeysetInfo info =
MonitoringKeysetInfo.newBuilder()
.addEntry(KeyStatus.ENABLED, 123, makeLegacyProtoParameters("typeUrl123"))
.addEntry(KeyStatus.ENABLED, 234, makeLegacyProtoParameters("typeUrl234"))
.setPrimaryKeyId(123)
.build();
assertThat(info.getEntries()).hasSize(2);
}
@Test
public void addSameEntryTwice() throws Exception {
MonitoringKeysetInfo info =
MonitoringKeysetInfo.newBuilder()
.addEntry(KeyStatus.ENABLED, 123, makeLegacyProtoParameters("typeUrl123"))
.addEntry(KeyStatus.ENABLED, 123, makeLegacyProtoParameters("typeUrl123"))
.setPrimaryKeyId(123)
.build();
// entries are a list, so we can add the same entry twice.
assertThat(info.getEntries()).hasSize(2);
}
@Test
public void setAndGetAnnotations() throws Exception {
HashMap<String, String> annotations = new HashMap<>();
annotations.put("annotation_name1", "annotation_value1");
annotations.put("annotation_name2", "annotation_value2");
MonitoringAnnotations monitoringAnnotations =
MonitoringAnnotations.newBuilder()
.addAll(annotations)
.add("annotation_name3", "annotation_value3")
.add("annotation_name4", "annotation_value4")
.build();
MonitoringKeysetInfo info =
MonitoringKeysetInfo.newBuilder()
.setAnnotations(monitoringAnnotations)
.addEntry(KeyStatus.ENABLED, 123, makeLegacyProtoParameters("typeUrl123"))
.setPrimaryKeyId(123)
.build();
HashMap<String, String> expected = new HashMap<>();
expected.put("annotation_name1", "annotation_value1");
expected.put("annotation_name2", "annotation_value2");
expected.put("annotation_name3", "annotation_value3");
expected.put("annotation_name4", "annotation_value4");
assertThat(info.getAnnotations().toMap()).containsExactlyEntriesIn(expected);
}
@Test
public void primaryIsNullIfItIsNotSet() throws Exception {
MonitoringKeysetInfo info =
MonitoringKeysetInfo.newBuilder()
.addEntry(KeyStatus.ENABLED, 123, makeLegacyProtoParameters("typeUrl123"))
.build();
assertThat(info.getPrimaryKeyId()).isNull();
}
@Test
public void primaryKeyMustBePresentInEntries() throws Exception {
assertThrows(
GeneralSecurityException.class,
() ->
MonitoringKeysetInfo.newBuilder()
.addEntry(KeyStatus.ENABLED, 123, makeLegacyProtoParameters("typeUrl123"))
.setPrimaryKeyId(124)
.build());
assertThrows(
GeneralSecurityException.class,
() ->
MonitoringKeysetInfo.newBuilder()
.setPrimaryKeyId(124)
.build());
}
@Test
public void entriesAreNotModifiable() throws Exception {
MonitoringKeysetInfo info =
MonitoringKeysetInfo.newBuilder()
.addEntry(KeyStatus.ENABLED, 123, makeLegacyProtoParameters("typeUrl123"))
.setPrimaryKeyId(123)
.setAnnotations(
MonitoringAnnotations.newBuilder()
.add("annotation_name", "annotation_value")
.build())
.build();
MonitoringKeysetInfo info2 =
MonitoringKeysetInfo.newBuilder()
.addEntry(KeyStatus.ENABLED, 234, makeLegacyProtoParameters("typeUrl234"))
.setPrimaryKeyId(234)
.build();
assertThrows(
UnsupportedOperationException.class,
() -> info.getAnnotations().toMap().put("name", "value"));
assertThrows(
UnsupportedOperationException.class,
() -> info.getEntries().add(info2.getEntries().get(0)));
}
@Test
public void builderIsInvalidAfterBuild() throws Exception {
MonitoringAnnotations annotations =
MonitoringAnnotations.newBuilder().add("annotation_name2", "annotation_value2").build();
MonitoringKeysetInfo.Builder builder =
MonitoringKeysetInfo.newBuilder()
.addEntry(KeyStatus.ENABLED, 123, makeLegacyProtoParameters("typeUrl123"))
.setPrimaryKeyId(123)
.setAnnotations(annotations);
builder.build();
assertThrows(IllegalStateException.class, () -> builder.setAnnotations(annotations));
assertThrows(
IllegalStateException.class,
() -> builder.addEntry(KeyStatus.ENABLED, 234, makeLegacyProtoParameters("typeUrl234")));
assertThrows(IllegalStateException.class, () -> builder.setPrimaryKeyId(123));
}
@Test
public void toStringConversion() throws Exception {
MonitoringKeysetInfo info =
MonitoringKeysetInfo.newBuilder()
.setAnnotations(
MonitoringAnnotations.newBuilder()
.add("annotation_name1", "annotation_value1")
.build())
.addEntry(KeyStatus.ENABLED, 123, makeLegacyProtoParameters("typeUrl123"))
.addEntry(KeyStatus.DISABLED, 234, makeLegacyProtoParameters("typeUrl234"))
.setPrimaryKeyId(123)
.build();
assertThat(info.toString())
.isEqualTo(
"(annotations={annotation_name1=annotation_value1}, entries=[(status=ENABLED,"
+ " keyId=123, parameters='(typeUrl=typeUrl123, outputPrefixType=TINK)'),"
+ " (status=DISABLED, keyId=234, parameters='(typeUrl=typeUrl234,"
+ " outputPrefixType=TINK)')], primaryKeyId=123)");
}
@Test
public void equalityTest() throws Exception {
MonitoringKeysetInfo info1 =
MonitoringKeysetInfo.newBuilder()
.setAnnotations(
MonitoringAnnotations.newBuilder()
.add("annotation_name1", "annotation_value1")
.add("annotation_name2", "annotation_value2")
.build())
.addEntry(KeyStatus.ENABLED, 123, makeLegacyProtoParameters("typeUrl123"))
.addEntry(KeyStatus.ENABLED, 234, makeLegacyProtoParameters("typeUrl234"))
.setPrimaryKeyId(123)
.build();
MonitoringKeysetInfo infoWithAnnotationsInOtherOrder =
MonitoringKeysetInfo.newBuilder()
.setAnnotations(
MonitoringAnnotations.newBuilder()
.add("annotation_name2", "annotation_value2")
.add("annotation_name1", "annotation_value1")
.build())
.addEntry(KeyStatus.ENABLED, 123, makeLegacyProtoParameters("typeUrl123"))
.addEntry(KeyStatus.ENABLED, 234, makeLegacyProtoParameters("typeUrl234"))
.setPrimaryKeyId(123)
.build();
MonitoringKeysetInfo infoWithEntriesInOtherOrder =
MonitoringKeysetInfo.newBuilder()
.setAnnotations(
MonitoringAnnotations.newBuilder()
.add("annotation_name1", "annotation_value1")
.add("annotation_name2", "annotation_value2")
.build())
.addEntry(KeyStatus.ENABLED, 234, makeLegacyProtoParameters("typeUrl234"))
.addEntry(KeyStatus.ENABLED, 123, makeLegacyProtoParameters("typeUrl123"))
.setPrimaryKeyId(123)
.build();
MonitoringKeysetInfo infoWithOtherAnnotations =
MonitoringKeysetInfo.newBuilder()
.setAnnotations(
MonitoringAnnotations.newBuilder()
.add("annotation_name1", "annotation_value1")
.add("annotation_name3", "annotation_value3")
.build())
.addEntry(KeyStatus.ENABLED, 123, makeLegacyProtoParameters("typeUrl123"))
.addEntry(KeyStatus.ENABLED, 234, makeLegacyProtoParameters("typeUrl234"))
.setPrimaryKeyId(123)
.build();
MonitoringKeysetInfo infoWithOtherPrimaryKeyId =
MonitoringKeysetInfo.newBuilder()
.setAnnotations(
MonitoringAnnotations.newBuilder()
.add("annotation_name1", "annotation_value1")
.add("annotation_name2", "annotation_value2")
.build())
.addEntry(KeyStatus.ENABLED, 123, makeLegacyProtoParameters("typeUrl123"))
.addEntry(KeyStatus.ENABLED, 234, makeLegacyProtoParameters("typeUrl234"))
.setPrimaryKeyId(234)
.build();
// annotations are a map. They can be added in any order.
assertThat(info1.equals(infoWithAnnotationsInOtherOrder)).isTrue();
// Entries are a list. They must be added in the same order for objects to be equal.
assertThat(info1.equals(infoWithEntriesInOtherOrder)).isFalse();
assertThat(info1.equals(infoWithOtherAnnotations)).isFalse();
assertThat(info1.equals(infoWithOtherPrimaryKeyId)).isFalse();
}
}