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.assertFalse; 21 import static org.junit.Assert.assertNotEquals; 22 import static org.junit.Assert.assertNotNull; 23 import static org.junit.Assert.assertTrue; 24 import static org.junit.Assert.fail; 25 26 import com.google.api.services.dns.model.Change; 27 import com.google.common.collect.ImmutableList; 28 import java.util.List; 29 import org.junit.Test; 30 31 public class ChangeRequestInfoTest { 32 33 private static final String GENERATED_ID = "cr-id-1"; 34 private static final Long START_TIME_MILLIS = 12334567890L; 35 private static final ChangeRequest.Status STATUS = ChangeRequest.Status.PENDING; 36 private static final String NAME1 = "dns1"; 37 private static final RecordSet.Type TYPE1 = RecordSet.Type.A; 38 private static final String NAME2 = "dns2"; 39 private static final RecordSet.Type TYPE2 = RecordSet.Type.AAAA; 40 private static final String NAME3 = "dns3"; 41 private static final RecordSet.Type TYPE3 = RecordSet.Type.MX; 42 private static final RecordSet RECORD1 = RecordSet.newBuilder(NAME1, TYPE1).build(); 43 private static final RecordSet RECORD2 = RecordSet.newBuilder(NAME2, TYPE2).build(); 44 private static final RecordSet RECORD3 = RecordSet.newBuilder(NAME3, TYPE3).build(); 45 private static final List<RecordSet> ADDITIONS = ImmutableList.of(RECORD1, RECORD2); 46 private static final List<RecordSet> DELETIONS = ImmutableList.of(RECORD3); 47 private static final ChangeRequestInfo CHANGE = 48 ChangeRequest.newBuilder() 49 .add(RECORD1) 50 .add(RECORD2) 51 .delete(RECORD3) 52 .setStartTime(START_TIME_MILLIS) 53 .setStatus(STATUS) 54 .setGeneratedId(GENERATED_ID) 55 .build(); 56 57 @Test testEmptyBuilder()58 public void testEmptyBuilder() { 59 ChangeRequestInfo cr = ChangeRequest.newBuilder().build(); 60 assertNotNull(cr.getDeletions()); 61 assertTrue(cr.getDeletions().isEmpty()); 62 assertNotNull(cr.getAdditions()); 63 assertTrue(cr.getAdditions().isEmpty()); 64 } 65 66 @Test testBuilder()67 public void testBuilder() { 68 assertEquals(GENERATED_ID, CHANGE.getGeneratedId()); 69 assertEquals(STATUS, CHANGE.status()); 70 assertEquals(START_TIME_MILLIS, CHANGE.getStartTimeMillis()); 71 assertEquals(ADDITIONS, CHANGE.getAdditions()); 72 assertEquals(DELETIONS, CHANGE.getDeletions()); 73 List<RecordSet> recordList = ImmutableList.of(RECORD1); 74 ChangeRequestInfo another = CHANGE.toBuilder().setAdditions(recordList).build(); 75 assertEquals(recordList, another.getAdditions()); 76 assertEquals(CHANGE.getDeletions(), another.getDeletions()); 77 another = CHANGE.toBuilder().setDeletions(recordList).build(); 78 assertEquals(recordList, another.getDeletions()); 79 assertEquals(CHANGE.getAdditions(), another.getAdditions()); 80 } 81 82 @Test testEqualsAndNotEquals()83 public void testEqualsAndNotEquals() { 84 ChangeRequestInfo clone = CHANGE.toBuilder().build(); 85 assertEquals(CHANGE, clone); 86 clone = ChangeRequest.fromPb(CHANGE.toPb()); 87 assertEquals(CHANGE, clone); 88 clone = CHANGE.toBuilder().setGeneratedId("some-other-id").build(); 89 assertNotEquals(CHANGE, clone); 90 clone = CHANGE.toBuilder().setStartTime(CHANGE.getStartTimeMillis() + 1).build(); 91 assertNotEquals(CHANGE, clone); 92 clone = CHANGE.toBuilder().add(RECORD3).build(); 93 assertNotEquals(CHANGE, clone); 94 clone = CHANGE.toBuilder().delete(RECORD1).build(); 95 assertNotEquals(CHANGE, clone); 96 ChangeRequestInfo empty = ChangeRequest.newBuilder().build(); 97 assertNotEquals(CHANGE, empty); 98 assertEquals(empty, ChangeRequest.newBuilder().build()); 99 } 100 101 @Test testSameHashCodeOnEquals()102 public void testSameHashCodeOnEquals() { 103 ChangeRequestInfo clone = CHANGE.toBuilder().build(); 104 assertEquals(CHANGE, clone); 105 assertEquals(CHANGE.hashCode(), clone.hashCode()); 106 ChangeRequestInfo empty = ChangeRequest.newBuilder().build(); 107 assertEquals(empty.hashCode(), ChangeRequest.newBuilder().build().hashCode()); 108 } 109 110 @Test testToAndFromPb()111 public void testToAndFromPb() { 112 assertEquals(CHANGE, ChangeRequest.fromPb(CHANGE.toPb())); 113 ChangeRequestInfo partial = ChangeRequest.newBuilder().build(); 114 assertEquals(partial, ChangeRequest.fromPb(partial.toPb())); 115 partial = ChangeRequest.newBuilder().setGeneratedId(GENERATED_ID).build(); 116 assertEquals(partial, ChangeRequest.fromPb(partial.toPb())); 117 partial = ChangeRequest.newBuilder().add(RECORD1).build(); 118 assertEquals(partial, ChangeRequest.fromPb(partial.toPb())); 119 partial = ChangeRequest.newBuilder().delete(RECORD1).build(); 120 assertEquals(partial, ChangeRequest.fromPb(partial.toPb())); 121 partial = ChangeRequest.newBuilder().setAdditions(ADDITIONS).build(); 122 assertEquals(partial, ChangeRequest.fromPb(partial.toPb())); 123 partial = ChangeRequest.newBuilder().setDeletions(DELETIONS).build(); 124 assertEquals(partial, ChangeRequest.fromPb(partial.toPb())); 125 partial = ChangeRequest.newBuilder().setStartTime(START_TIME_MILLIS).build(); 126 assertEquals(partial, ChangeRequest.fromPb(partial.toPb())); 127 partial = ChangeRequest.newBuilder().setStatus(STATUS).build(); 128 assertEquals(partial, ChangeRequest.fromPb(partial.toPb())); 129 } 130 131 @Test testToBuilder()132 public void testToBuilder() { 133 assertEquals(CHANGE, CHANGE.toBuilder().build()); 134 ChangeRequestInfo partial = ChangeRequest.newBuilder().build(); 135 assertEquals(partial, partial.toBuilder().build()); 136 partial = ChangeRequest.newBuilder().setGeneratedId(GENERATED_ID).build(); 137 assertEquals(partial, partial.toBuilder().build()); 138 partial = ChangeRequest.newBuilder().add(RECORD1).build(); 139 assertEquals(partial, partial.toBuilder().build()); 140 partial = ChangeRequest.newBuilder().delete(RECORD1).build(); 141 assertEquals(partial, partial.toBuilder().build()); 142 partial = ChangeRequest.newBuilder().setAdditions(ADDITIONS).build(); 143 assertEquals(partial, partial.toBuilder().build()); 144 partial = ChangeRequest.newBuilder().setDeletions(DELETIONS).build(); 145 assertEquals(partial, partial.toBuilder().build()); 146 partial = ChangeRequest.newBuilder().setStartTime(START_TIME_MILLIS).build(); 147 assertEquals(partial, partial.toBuilder().build()); 148 partial = ChangeRequest.newBuilder().setStatus(STATUS).build(); 149 assertEquals(partial, partial.toBuilder().build()); 150 } 151 152 @Test testClearAdditions()153 public void testClearAdditions() { 154 ChangeRequestInfo clone = CHANGE.toBuilder().clearAdditions().build(); 155 assertTrue(clone.getAdditions().isEmpty()); 156 assertFalse(clone.getDeletions().isEmpty()); 157 } 158 159 @Test testAddAddition()160 public void testAddAddition() { 161 try { 162 CHANGE.toBuilder().add(null); 163 fail("Should not be able to add null RecordSet."); 164 } catch (NullPointerException e) { 165 // expected 166 } 167 ChangeRequestInfo clone = CHANGE.toBuilder().add(RECORD1).build(); 168 assertEquals(CHANGE.getAdditions().size() + 1, clone.getAdditions().size()); 169 } 170 171 @Test testAddDeletion()172 public void testAddDeletion() { 173 try { 174 CHANGE.toBuilder().delete(null); 175 fail("Should not be able to delete null RecordSet."); 176 } catch (NullPointerException e) { 177 // expected 178 } 179 ChangeRequestInfo clone = CHANGE.toBuilder().delete(RECORD1).build(); 180 assertEquals(CHANGE.getDeletions().size() + 1, clone.getDeletions().size()); 181 } 182 183 @Test testClearDeletions()184 public void testClearDeletions() { 185 ChangeRequestInfo clone = CHANGE.toBuilder().clearDeletions().build(); 186 assertTrue(clone.getDeletions().isEmpty()); 187 assertFalse(clone.getAdditions().isEmpty()); 188 } 189 190 @Test testRemoveAddition()191 public void testRemoveAddition() { 192 ChangeRequestInfo clone = CHANGE.toBuilder().removeAddition(RECORD1).build(); 193 assertTrue(clone.getAdditions().contains(RECORD2)); 194 assertFalse(clone.getAdditions().contains(RECORD1)); 195 assertTrue(clone.getDeletions().contains(RECORD3)); 196 clone = CHANGE.toBuilder().removeAddition(RECORD2).removeAddition(RECORD1).build(); 197 assertFalse(clone.getAdditions().contains(RECORD2)); 198 assertFalse(clone.getAdditions().contains(RECORD1)); 199 assertTrue(clone.getAdditions().isEmpty()); 200 assertTrue(clone.getDeletions().contains(RECORD3)); 201 } 202 203 @Test testRemoveDeletion()204 public void testRemoveDeletion() { 205 ChangeRequestInfo clone = CHANGE.toBuilder().removeDeletion(RECORD3).build(); 206 assertTrue(clone.getDeletions().isEmpty()); 207 } 208 209 @Test testDateParsing()210 public void testDateParsing() { 211 String startTime = "2016-01-26T18:33:43.512Z"; // obtained from service 212 Change change = CHANGE.toPb().setStartTime(startTime); 213 ChangeRequestInfo converted = ChangeRequest.fromPb(change); 214 assertNotNull(converted.getStartTimeMillis()); 215 assertEquals(change, converted.toPb()); 216 assertEquals(change.getStartTime(), converted.toPb().getStartTime()); 217 } 218 } 219