1 /* 2 * Copyright 2016 Google LLC 3 * 4 * Licensed under the Apache License, Version 2.0 (the "License"); 5 * you may not use this file except in compliance with the License. 6 * You may obtain a copy of the License at 7 * 8 * http://www.apache.org/licenses/LICENSE-2.0 9 * 10 * Unless required by applicable law or agreed to in writing, software 11 * distributed under the License is distributed on an "AS IS" BASIS, 12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13 * See the License for the specific language governing permissions and 14 * limitations under the License. 15 */ 16 17 package com.google.cloud.dns; 18 19 import static org.junit.Assert.assertEquals; 20 import static org.junit.Assert.assertNotEquals; 21 import static org.junit.Assert.assertNull; 22 import static org.junit.Assert.assertTrue; 23 24 import com.google.api.services.dns.model.ManagedZone; 25 import com.google.common.collect.ImmutableList; 26 import com.google.common.collect.ImmutableMap; 27 import com.google.common.collect.Lists; 28 import java.util.LinkedList; 29 import java.util.List; 30 import java.util.Map; 31 import org.junit.Test; 32 33 public class ZoneInfoTest { 34 35 private static final String NAME = "mz-example.com"; 36 private static final String GENERATED_ID = "123456"; 37 private static final Long CREATION_TIME_MILLIS = 1123468321321L; 38 private static final String DNS_NAME = "example.com."; 39 private static final String DESCRIPTION = "description for the zone"; 40 private static final String NAME_SERVER_SET = "some set"; 41 private static final String NS1 = "name server 1"; 42 private static final String NS2 = "name server 2"; 43 private static final String NS3 = "name server 3"; 44 private static final List<String> NAME_SERVERS = ImmutableList.of(NS1, NS2, NS3); 45 private static final Map<String, String> LABELS = 46 ImmutableMap.of("label1", "value1", "label2", "value2"); 47 private static final String ALGORITHM = "rsasha256"; 48 private static final String KEY_TYPE1 = "zoneSigning"; 49 private static final String KEY_TYPE2 = "keySigning"; 50 private static final String STATE = "off"; 51 private static final String NON_EXISTENCE = "nsec"; 52 private static final Long ZSK_KEY_LENGTH = 1024L; 53 private static final Long KSK_KEY_LENGTH = 2048L; 54 private static final ZoneInfo.KeySpec ZONE_SIGNING_KEY_SPEC = 55 ZoneInfo.KeySpec.newBuilder() 56 .setAlgorithm(ALGORITHM) 57 .setKeyLength(ZSK_KEY_LENGTH) 58 .setKeyType(KEY_TYPE1) 59 .build(); 60 private static final ZoneInfo.KeySpec KEY_SIGNING_KEY_SPEC = 61 ZoneInfo.KeySpec.newBuilder() 62 .setAlgorithm(ALGORITHM) 63 .setKeyLength(KSK_KEY_LENGTH) 64 .setKeyType(KEY_TYPE2) 65 .build(); 66 private static final List<ZoneInfo.KeySpec> DEFAULT_KEY_SPECS = 67 ImmutableList.of(ZONE_SIGNING_KEY_SPEC, KEY_SIGNING_KEY_SPEC); 68 private static final ZoneInfo.DnsSecConfig DNS_SEC_CONFIG = 69 ZoneInfo.DnsSecConfig.newBuilder() 70 .setDefaultKeySpecs(DEFAULT_KEY_SPECS) 71 .setState(STATE) 72 .setNonExistence(NON_EXISTENCE) 73 .build(); 74 private static final ZoneInfo INFO = 75 ZoneInfo.of(NAME, DNS_NAME, DESCRIPTION) 76 .toBuilder() 77 .setCreationTimeMillis(CREATION_TIME_MILLIS) 78 .setGeneratedId(GENERATED_ID) 79 .setNameServerSet(NAME_SERVER_SET) 80 .setNameServers(NAME_SERVERS) 81 .setDnsSecConfig(DNS_SEC_CONFIG) 82 .setLabels(LABELS) 83 .build(); 84 85 @Test testOf()86 public void testOf() { 87 ZoneInfo partial = ZoneInfo.of(NAME, DNS_NAME, DESCRIPTION); 88 assertTrue(partial.getNameServers().isEmpty()); 89 assertEquals(NAME, partial.getName()); 90 assertNull(partial.getGeneratedId()); 91 assertNull(partial.getCreationTimeMillis()); 92 assertNull(partial.getNameServerSet()); 93 assertEquals(DESCRIPTION, partial.getDescription()); 94 assertEquals(DNS_NAME, partial.getDnsName()); 95 } 96 97 @Test testBuilder()98 public void testBuilder() { 99 assertEquals(3, INFO.getNameServers().size()); 100 assertEquals(NS1, INFO.getNameServers().get(0)); 101 assertEquals(NS2, INFO.getNameServers().get(1)); 102 assertEquals(NS3, INFO.getNameServers().get(2)); 103 assertEquals(NAME, INFO.getName()); 104 assertEquals(GENERATED_ID, INFO.getGeneratedId()); 105 assertEquals(CREATION_TIME_MILLIS, INFO.getCreationTimeMillis()); 106 assertEquals(NAME_SERVER_SET, INFO.getNameServerSet()); 107 assertEquals(DESCRIPTION, INFO.getDescription()); 108 assertEquals(DNS_NAME, INFO.getDnsName()); 109 assertEquals(DNS_SEC_CONFIG, INFO.getDnsSecConfig()); 110 assertEquals(LABELS, INFO.getLabels()); 111 112 ZoneInfo.DnsSecConfig config = INFO.getDnsSecConfig(); 113 assertEquals(DEFAULT_KEY_SPECS, config.getDefaultKeySpecs()); 114 assertEquals(STATE, config.getState()); 115 assertEquals(NON_EXISTENCE, config.getNonExistence()); 116 117 List<ZoneInfo.KeySpec> keySpecs = config.getDefaultKeySpecs(); 118 ZoneInfo.KeySpec zoneSigningKeySpec = keySpecs.get(0); 119 assertEquals(ALGORITHM, zoneSigningKeySpec.getAlgorithm()); 120 assertEquals(KEY_TYPE1, zoneSigningKeySpec.getKeyType()); 121 assertEquals(ZSK_KEY_LENGTH, zoneSigningKeySpec.getKeyLength()); 122 123 ZoneInfo.KeySpec keySigningKeySpec = keySpecs.get(1); 124 assertEquals(ALGORITHM, keySigningKeySpec.getAlgorithm()); 125 assertEquals(KEY_TYPE2, keySigningKeySpec.getKeyType()); 126 assertEquals(KSK_KEY_LENGTH, keySigningKeySpec.getKeyLength()); 127 } 128 129 @Test testEqualsAndNotEquals()130 public void testEqualsAndNotEquals() { 131 ZoneInfo clone = INFO.toBuilder().build(); 132 assertEquals(INFO, clone); 133 List<String> moreServers = Lists.newLinkedList(NAME_SERVERS); 134 moreServers.add(NS1); 135 clone = INFO.toBuilder().setNameServers(moreServers).build(); 136 assertNotEquals(INFO, clone); 137 String differentName = "totally different name"; 138 clone = INFO.toBuilder().setName(differentName).build(); 139 assertNotEquals(INFO, clone); 140 clone = INFO.toBuilder().setCreationTimeMillis(INFO.getCreationTimeMillis() + 1).build(); 141 assertNotEquals(INFO, clone); 142 clone = INFO.toBuilder().setDescription(INFO.getDescription() + "aaaa").build(); 143 assertNotEquals(INFO, clone); 144 clone = INFO.toBuilder().setDnsName(differentName).build(); 145 assertNotEquals(INFO, clone); 146 clone = INFO.toBuilder().setGeneratedId(INFO.getGeneratedId() + "1111").build(); 147 assertNotEquals(INFO, clone); 148 clone = INFO.toBuilder().setNameServerSet(INFO.getNameServerSet() + "salt").build(); 149 assertNotEquals(INFO, clone); 150 clone = 151 INFO.toBuilder() 152 .setDnsSecConfig(DNS_SEC_CONFIG.toBuilder().setNonExistence("nsec3").build()) 153 .build(); 154 assertNotEquals(INFO, clone); 155 } 156 157 @Test testSameHashCodeOnEquals()158 public void testSameHashCodeOnEquals() { 159 int hash = INFO.hashCode(); 160 ZoneInfo clone = INFO.toBuilder().build(); 161 assertEquals(clone.hashCode(), hash); 162 163 int dnsSecConfigHas = DNS_SEC_CONFIG.hashCode(); 164 ZoneInfo.DnsSecConfig dnsSecConfig = DNS_SEC_CONFIG.toBuilder().build(); 165 assertEquals(dnsSecConfig.hashCode(), dnsSecConfigHas); 166 } 167 168 @Test testToBuilder()169 public void testToBuilder() { 170 assertEquals(INFO, INFO.toBuilder().build()); 171 ZoneInfo partial = ZoneInfo.of(NAME, DNS_NAME, DESCRIPTION); 172 assertEquals(partial, partial.toBuilder().build()); 173 partial = 174 ZoneInfo.of(NAME, DNS_NAME, DESCRIPTION).toBuilder().setGeneratedId(GENERATED_ID).build(); 175 assertEquals(partial, partial.toBuilder().build()); 176 partial = 177 ZoneInfo.of(NAME, DNS_NAME, DESCRIPTION) 178 .toBuilder() 179 .setCreationTimeMillis(CREATION_TIME_MILLIS) 180 .build(); 181 assertEquals(partial, partial.toBuilder().build()); 182 List<String> nameServers = new LinkedList<>(); 183 nameServers.add(NS1); 184 partial = 185 ZoneInfo.of(NAME, DNS_NAME, DESCRIPTION).toBuilder().setNameServers(nameServers).build(); 186 assertEquals(partial, partial.toBuilder().build()); 187 partial = 188 ZoneInfo.of(NAME, DNS_NAME, DESCRIPTION) 189 .toBuilder() 190 .setNameServerSet(NAME_SERVER_SET) 191 .build(); 192 assertEquals(partial, partial.toBuilder().build()); 193 194 assertEquals(DNS_SEC_CONFIG, DNS_SEC_CONFIG.toBuilder().build()); 195 ZoneInfo.DnsSecConfig partialDnsSecConfig = ZoneInfo.DnsSecConfig.newBuilder().build(); 196 assertEquals(partialDnsSecConfig, partialDnsSecConfig.toBuilder().build()); 197 } 198 199 @Test testToAndFromPb()200 public void testToAndFromPb() { 201 assertEquals(INFO, ZoneInfo.fromPb(INFO.toPb())); 202 ZoneInfo partial = ZoneInfo.of(NAME, DNS_NAME, DESCRIPTION); 203 assertEquals(partial, ZoneInfo.fromPb(partial.toPb())); 204 partial = 205 ZoneInfo.of(NAME, DNS_NAME, DESCRIPTION).toBuilder().setGeneratedId(GENERATED_ID).build(); 206 assertEquals(partial, ZoneInfo.fromPb(partial.toPb())); 207 partial = 208 ZoneInfo.of(NAME, DNS_NAME, DESCRIPTION) 209 .toBuilder() 210 .setCreationTimeMillis(CREATION_TIME_MILLIS) 211 .build(); 212 assertEquals(partial, ZoneInfo.fromPb(partial.toPb())); 213 List<String> nameServers = new LinkedList<>(); 214 nameServers.add(NS1); 215 partial = 216 ZoneInfo.of(NAME, DNS_NAME, DESCRIPTION).toBuilder().setNameServers(nameServers).build(); 217 assertEquals(partial, ZoneInfo.fromPb(partial.toPb())); 218 partial = 219 ZoneInfo.of(NAME, DNS_NAME, DESCRIPTION) 220 .toBuilder() 221 .setNameServerSet(NAME_SERVER_SET) 222 .build(); 223 assertEquals(partial, ZoneInfo.fromPb(partial.toPb())); 224 assertEquals(DNS_SEC_CONFIG, ZoneInfo.DnsSecConfig.fromPb(DNS_SEC_CONFIG.toPb())); 225 ZoneInfo.DnsSecConfig partialDnsSecConfig = 226 ZoneInfo.DnsSecConfig.newBuilder().setState(STATE).setNonExistence(NON_EXISTENCE).build(); 227 assertEquals(partialDnsSecConfig, ZoneInfo.DnsSecConfig.fromPb(partialDnsSecConfig.toPb())); 228 } 229 230 @Test testEmptyNameServers()231 public void testEmptyNameServers() { 232 ZoneInfo clone = INFO.toBuilder().setNameServers(new LinkedList<String>()).build(); 233 assertTrue(clone.getNameServers().isEmpty()); 234 clone.toPb(); // test that this is allowed 235 } 236 237 @Test testDateParsing()238 public void testDateParsing() { 239 ManagedZone pb = INFO.toPb(); 240 pb.setCreationTime("2016-01-19T18:00:12.854Z"); // a real value obtained from Google Cloud DNS 241 ZoneInfo mz = ZoneInfo.fromPb(pb); // parses the string timestamp to millis 242 ManagedZone pbClone = mz.toPb(); // converts it back to string 243 assertEquals(pb, pbClone); 244 assertEquals(pb.getCreationTime(), pbClone.getCreationTime()); 245 } 246 } 247