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.assertNotNull; 21 import static org.junit.Assert.assertNull; 22 import static org.junit.Assert.assertSame; 23 import static org.junit.Assert.assertTrue; 24 import static org.junit.Assert.fail; 25 26 import com.google.api.client.googleapis.json.GoogleJsonError; 27 import com.google.api.gax.paging.Page; 28 import com.google.api.services.dns.model.Change; 29 import com.google.api.services.dns.model.ChangesListResponse; 30 import com.google.api.services.dns.model.ManagedZone; 31 import com.google.api.services.dns.model.ManagedZonesListResponse; 32 import com.google.api.services.dns.model.Project; 33 import com.google.api.services.dns.model.ResourceRecordSet; 34 import com.google.api.services.dns.model.ResourceRecordSetsListResponse; 35 import com.google.cloud.dns.spi.v1.DnsRpc; 36 import com.google.cloud.dns.spi.v1.RpcBatch; 37 import com.google.common.collect.ImmutableList; 38 import java.util.Iterator; 39 import java.util.List; 40 import java.util.Map; 41 import org.easymock.Capture; 42 import org.easymock.EasyMock; 43 import org.junit.After; 44 import org.junit.Before; 45 import org.junit.Test; 46 47 public class DnsBatchTest { 48 49 private static final String ZONE_NAME = "somezonename"; 50 private static final String DNS_NAME = "example.com."; 51 private static final String DESCRIPTION = "desc"; 52 private static final Integer MAX_SIZE = 20; 53 private static final String PAGE_TOKEN = "some token"; 54 55 private static final ZoneInfo ZONE_INFO = ZoneInfo.of(ZONE_NAME, DNS_NAME, DESCRIPTION); 56 private static final Dns.ZoneOption ZONE_FIELDS = 57 Dns.ZoneOption.fields(Dns.ZoneField.CREATION_TIME); 58 private static final Dns.ProjectOption PROJECT_FIELDS = 59 Dns.ProjectOption.fields(Dns.ProjectField.QUOTA); 60 private static final Dns.ZoneListOption[] ZONE_LIST_OPTIONS = { 61 Dns.ZoneListOption.pageSize(MAX_SIZE), 62 Dns.ZoneListOption.pageToken(PAGE_TOKEN), 63 Dns.ZoneListOption.fields(Dns.ZoneField.DESCRIPTION), 64 Dns.ZoneListOption.dnsName(DNS_NAME) 65 }; 66 private static final ProjectInfo PROJECT_INFO = ProjectInfo.newBuilder().build(); 67 private static final Dns.RecordSetListOption[] RECORD_SET_LIST_OPTIONS = { 68 Dns.RecordSetListOption.pageSize(MAX_SIZE), 69 Dns.RecordSetListOption.pageToken(PAGE_TOKEN), 70 Dns.RecordSetListOption.fields(Dns.RecordSetField.TTL), 71 Dns.RecordSetListOption.dnsName(DNS_NAME), 72 Dns.RecordSetListOption.type(RecordSet.Type.AAAA) 73 }; 74 private static final RecordSet RECORD_SET = 75 RecordSet.newBuilder("Something", RecordSet.Type.AAAA).build(); 76 private static final ChangeRequestInfo CHANGE_REQUEST_PARTIAL = 77 ChangeRequestInfo.newBuilder().add(RECORD_SET).build(); 78 private static final String CHANGE_ID = "some change id"; 79 private static final ChangeRequestInfo CHANGE_REQUEST_COMPLETE = 80 ChangeRequestInfo.newBuilder() 81 .add(RECORD_SET) 82 .setStartTime(123L) 83 .setStatus(ChangeRequest.Status.PENDING) 84 .setGeneratedId(CHANGE_ID) 85 .build(); 86 private static final Dns.ChangeRequestListOption[] CHANGE_LIST_OPTIONS = { 87 Dns.ChangeRequestListOption.pageSize(MAX_SIZE), 88 Dns.ChangeRequestListOption.pageToken(PAGE_TOKEN), 89 Dns.ChangeRequestListOption.fields(Dns.ChangeRequestField.STATUS), 90 Dns.ChangeRequestListOption.sortOrder(Dns.SortingOrder.ASCENDING) 91 }; 92 private static final Dns.ChangeRequestOption CHANGE_GET_FIELDS = 93 Dns.ChangeRequestOption.fields(Dns.ChangeRequestField.STATUS); 94 private static final List<ResourceRecordSet> RECORD_SET_LIST = 95 ImmutableList.of(RECORD_SET.toPb(), RECORD_SET.toPb(), RECORD_SET.toPb(), RECORD_SET.toPb()); 96 private static final List<Change> CHANGE_LIST = 97 ImmutableList.of( 98 CHANGE_REQUEST_COMPLETE.toPb(), 99 CHANGE_REQUEST_COMPLETE.toPb(), 100 CHANGE_REQUEST_COMPLETE.toPb()); 101 private static final List<ManagedZone> ZONE_LIST = 102 ImmutableList.of(ZONE_INFO.toPb(), ZONE_INFO.toPb()); 103 private static final GoogleJsonError GOOGLE_JSON_ERROR = new GoogleJsonError(); 104 105 private DnsOptions optionsMock; 106 private DnsRpc dnsRpcMock; 107 private RpcBatch batchMock; 108 private DnsBatch dnsBatch; 109 private final Dns dns = EasyMock.createStrictMock(Dns.class); 110 111 @Before setUp()112 public void setUp() { 113 optionsMock = EasyMock.createMock(DnsOptions.class); 114 dnsRpcMock = EasyMock.createMock(DnsRpc.class); 115 batchMock = EasyMock.createMock(RpcBatch.class); 116 EasyMock.expect(optionsMock.getDnsRpcV1()).andReturn(dnsRpcMock); 117 EasyMock.expect(dnsRpcMock.createBatch()).andReturn(batchMock); 118 EasyMock.replay(optionsMock, dnsRpcMock, batchMock, dns); 119 dnsBatch = new DnsBatch(optionsMock); 120 } 121 122 @After tearDown()123 public void tearDown() { 124 EasyMock.verify(batchMock, dnsRpcMock, optionsMock, dns); 125 } 126 127 @Test testConstructor()128 public void testConstructor() { 129 assertSame(batchMock, dnsBatch.getBatch()); 130 assertSame(optionsMock, dnsBatch.getOptions()); 131 assertSame(dnsRpcMock, dnsBatch.getDnsRpc()); 132 } 133 134 @Test testListZones()135 public void testListZones() { 136 EasyMock.reset(batchMock); 137 Capture<RpcBatch.Callback<ManagedZonesListResponse>> callback = Capture.newInstance(); 138 Capture<Map<DnsRpc.Option, Object>> capturedOptions = Capture.newInstance(); 139 batchMock.addListZones(EasyMock.capture(callback), EasyMock.capture(capturedOptions)); 140 EasyMock.replay(batchMock); 141 DnsBatchResult<Page<Zone>> batchResult = dnsBatch.listZones(); 142 assertEquals(0, capturedOptions.getValue().size()); 143 assertNotNull(callback.getValue()); 144 try { 145 batchResult.get(); 146 fail("No result available yet."); 147 } catch (IllegalStateException ex) { 148 // expected 149 } 150 RpcBatch.Callback<ManagedZonesListResponse> capturedCallback = callback.getValue(); 151 capturedCallback.onFailure(GOOGLE_JSON_ERROR); 152 try { 153 batchResult.get(); 154 fail("Should throw a DnsException on error."); 155 } catch (DnsException ex) { 156 // expected 157 } 158 } 159 160 @Test testListZonesWithOptions()161 public void testListZonesWithOptions() { 162 EasyMock.reset(batchMock); 163 Capture<RpcBatch.Callback<ManagedZonesListResponse>> callback = Capture.newInstance(); 164 Capture<Map<DnsRpc.Option, Object>> capturedOptions = Capture.newInstance(); 165 batchMock.addListZones(EasyMock.capture(callback), EasyMock.capture(capturedOptions)); 166 EasyMock.replay(batchMock); 167 DnsBatchResult<Page<Zone>> batchResult = dnsBatch.listZones(ZONE_LIST_OPTIONS); 168 assertNotNull(callback.getValue()); 169 Integer size = (Integer) capturedOptions.getValue().get(ZONE_LIST_OPTIONS[0].getRpcOption()); 170 assertEquals(MAX_SIZE, size); 171 String selector = (String) capturedOptions.getValue().get(ZONE_LIST_OPTIONS[1].getRpcOption()); 172 assertEquals(PAGE_TOKEN, selector); 173 selector = (String) capturedOptions.getValue().get(ZONE_LIST_OPTIONS[2].getRpcOption()); 174 assertTrue(selector.contains(Dns.ZoneField.DESCRIPTION.getSelector())); 175 assertTrue(selector.contains(Dns.ZoneField.NAME.getSelector())); 176 selector = (String) capturedOptions.getValue().get(ZONE_LIST_OPTIONS[3].getRpcOption()); 177 assertEquals(DNS_NAME, selector); 178 // check the callback 179 ManagedZonesListResponse response = 180 new ManagedZonesListResponse().setManagedZones(ZONE_LIST).setNextPageToken(PAGE_TOKEN); 181 RpcBatch.Callback<ManagedZonesListResponse> capturedCallback = callback.getValue(); 182 EasyMock.verify(optionsMock); 183 EasyMock.reset(optionsMock); 184 EasyMock.expect(optionsMock.getService()).andReturn(dns).times(ZONE_LIST.size()); 185 EasyMock.replay(optionsMock); 186 capturedCallback.onSuccess(response); 187 Page<Zone> page = batchResult.get(); 188 assertEquals(PAGE_TOKEN, page.getNextPageToken()); 189 Iterator<Zone> iterator = page.getValues().iterator(); 190 int resultSize = 0; 191 EasyMock.verify(dns); 192 EasyMock.reset(dns); 193 EasyMock.expect(dns.getOptions()).andReturn(optionsMock).times(ZONE_LIST.size() + 1); 194 EasyMock.replay(dns); 195 Zone zoneInfoFunctional = new Zone(dns, new ZoneInfo.BuilderImpl(ZONE_INFO)); 196 while (iterator.hasNext()) { 197 assertEquals(zoneInfoFunctional, iterator.next()); 198 resultSize++; 199 } 200 assertEquals(ZONE_LIST.size(), resultSize); 201 } 202 203 @Test testCreateZone()204 public void testCreateZone() { 205 EasyMock.reset(batchMock); 206 Capture<RpcBatch.Callback<ManagedZone>> callback = Capture.newInstance(); 207 Capture<Map<DnsRpc.Option, Object>> capturedOptions = Capture.newInstance(); 208 Capture<ManagedZone> capturedZone = Capture.newInstance(); 209 batchMock.addCreateZone( 210 EasyMock.capture(capturedZone), 211 EasyMock.capture(callback), 212 EasyMock.capture(capturedOptions)); 213 EasyMock.replay(batchMock); 214 DnsBatchResult<Zone> batchResult = dnsBatch.createZone(ZONE_INFO); 215 assertEquals(0, capturedOptions.getValue().size()); 216 assertEquals(ZONE_INFO.toPb(), capturedZone.getValue()); 217 assertNotNull(callback.getValue()); 218 try { 219 batchResult.get(); 220 fail("No result available yet."); 221 } catch (IllegalStateException ex) { 222 // expected 223 } 224 // testing error here, success is tested with options 225 RpcBatch.Callback<ManagedZone> capturedCallback = callback.getValue(); 226 GoogleJsonError error = new GoogleJsonError(); 227 error.setCode(404); 228 capturedCallback.onFailure(error); 229 try { 230 batchResult.get(); 231 fail("Should throw a DnsException on error."); 232 } catch (DnsException ex) { 233 // expected 234 } 235 } 236 237 @Test testCreateZoneWithOptions()238 public void testCreateZoneWithOptions() { 239 EasyMock.reset(dns, batchMock, optionsMock); 240 EasyMock.expect(dns.getOptions()).andReturn(optionsMock); 241 EasyMock.expect(optionsMock.getService()).andReturn(dns); 242 Capture<RpcBatch.Callback<ManagedZone>> callback = Capture.newInstance(); 243 Capture<Map<DnsRpc.Option, Object>> capturedOptions = Capture.newInstance(); 244 Capture<ManagedZone> capturedZone = Capture.newInstance(); 245 batchMock.addCreateZone( 246 EasyMock.capture(capturedZone), 247 EasyMock.capture(callback), 248 EasyMock.capture(capturedOptions)); 249 EasyMock.replay(dns, batchMock, optionsMock); 250 DnsBatchResult<Zone> batchResult = dnsBatch.createZone(ZONE_INFO, ZONE_FIELDS); 251 assertEquals(ZONE_INFO.toPb(), capturedZone.getValue()); 252 assertNotNull(callback.getValue()); 253 String selector = (String) capturedOptions.getValue().get(ZONE_FIELDS.getRpcOption()); 254 assertTrue(selector.contains(Dns.ZoneField.CREATION_TIME.getSelector())); 255 assertTrue(selector.contains(Dns.ZoneField.NAME.getSelector())); 256 RpcBatch.Callback<ManagedZone> capturedCallback = callback.getValue(); 257 capturedCallback.onSuccess(ZONE_INFO.toPb()); 258 assertEquals(ZONE_INFO.toPb(), batchResult.get().toPb()); 259 } 260 261 @Test testGetZone()262 public void testGetZone() { 263 EasyMock.reset(batchMock); 264 Capture<RpcBatch.Callback<ManagedZone>> callback = Capture.newInstance(); 265 Capture<Map<DnsRpc.Option, Object>> capturedOptions = Capture.newInstance(); 266 batchMock.addGetZone( 267 EasyMock.eq(ZONE_NAME), EasyMock.capture(callback), EasyMock.capture(capturedOptions)); 268 EasyMock.replay(batchMock); 269 DnsBatchResult<Zone> batchResult = dnsBatch.getZone(ZONE_NAME); 270 assertEquals(0, capturedOptions.getValue().size()); 271 assertNotNull(callback.getValue()); 272 try { 273 batchResult.get(); 274 fail("No result available yet."); 275 } catch (IllegalStateException ex) { 276 // expected 277 } 278 // testing error here, success is tested with options 279 RpcBatch.Callback<ManagedZone> capturedCallback = callback.getValue(); 280 capturedCallback.onFailure(GOOGLE_JSON_ERROR); 281 try { 282 batchResult.get(); 283 fail("Should throw a DnsException on error."); 284 } catch (DnsException ex) { 285 // expected 286 } 287 } 288 289 @Test testGetZoneNotFound()290 public void testGetZoneNotFound() { 291 EasyMock.reset(batchMock); 292 Capture<RpcBatch.Callback<ManagedZone>> callback = Capture.newInstance(); 293 Capture<Map<DnsRpc.Option, Object>> capturedOptions = Capture.newInstance(); 294 batchMock.addGetZone( 295 EasyMock.eq(ZONE_NAME), EasyMock.capture(callback), EasyMock.capture(capturedOptions)); 296 EasyMock.replay(batchMock); 297 DnsBatchResult<Zone> batchResult = dnsBatch.getZone(ZONE_NAME); 298 assertEquals(0, capturedOptions.getValue().size()); 299 GoogleJsonError error = new GoogleJsonError(); 300 error.setCode(404); 301 RpcBatch.Callback<ManagedZone> capturedCallback = callback.getValue(); 302 capturedCallback.onFailure(error); 303 assertNull(batchResult.get()); 304 } 305 306 @Test testGetZoneWithOptions()307 public void testGetZoneWithOptions() { 308 EasyMock.reset(dns, batchMock, optionsMock); 309 EasyMock.expect(dns.getOptions()).andReturn(optionsMock); 310 Capture<RpcBatch.Callback<ManagedZone>> callback = Capture.newInstance(); 311 Capture<Map<DnsRpc.Option, Object>> capturedOptions = Capture.newInstance(); 312 batchMock.addGetZone( 313 EasyMock.eq(ZONE_NAME), EasyMock.capture(callback), EasyMock.capture(capturedOptions)); 314 EasyMock.expect(optionsMock.getService()).andReturn(dns); 315 EasyMock.replay(dns, batchMock, optionsMock); 316 DnsBatchResult<Zone> batchResult = dnsBatch.getZone(ZONE_NAME, ZONE_FIELDS); 317 assertNotNull(callback.getValue()); 318 String selector = (String) capturedOptions.getValue().get(ZONE_FIELDS.getRpcOption()); 319 assertTrue(selector.contains(Dns.ZoneField.CREATION_TIME.getSelector())); 320 assertTrue(selector.contains(Dns.ZoneField.NAME.getSelector())); 321 RpcBatch.Callback<ManagedZone> capturedCallback = callback.getValue(); 322 capturedCallback.onSuccess(ZONE_INFO.toPb()); 323 assertEquals(ZONE_INFO.toPb(), batchResult.get().toPb()); 324 } 325 326 @Test testDeleteZone()327 public void testDeleteZone() { 328 EasyMock.reset(batchMock); 329 Capture<RpcBatch.Callback<Void>> callback = Capture.newInstance(); 330 batchMock.addDeleteZone(EasyMock.eq(ZONE_NAME), EasyMock.capture(callback)); 331 EasyMock.replay(batchMock); 332 DnsBatchResult<Boolean> batchResult = dnsBatch.deleteZone(ZONE_NAME); 333 assertNotNull(callback.getValue()); 334 try { 335 batchResult.get(); 336 fail("No result available yet."); 337 } catch (IllegalStateException ex) { 338 // expected 339 } 340 // testing error here, success is tested with options 341 RpcBatch.Callback<Void> capturedCallback = callback.getValue(); 342 capturedCallback.onFailure(GOOGLE_JSON_ERROR); 343 try { 344 batchResult.get(); 345 fail("Should throw a DnsException on error."); 346 } catch (DnsException ex) { 347 // expected 348 } 349 } 350 351 @Test testDeleteZoneOnSuccess()352 public void testDeleteZoneOnSuccess() { 353 EasyMock.reset(batchMock); 354 Capture<RpcBatch.Callback<Void>> callback = Capture.newInstance(); 355 batchMock.addDeleteZone(EasyMock.eq(ZONE_NAME), EasyMock.capture(callback)); 356 EasyMock.replay(batchMock); 357 DnsBatchResult<Boolean> batchResult = dnsBatch.deleteZone(ZONE_NAME); 358 assertNotNull(callback.getValue()); 359 RpcBatch.Callback<Void> capturedCallback = callback.getValue(); 360 Void result = null; 361 capturedCallback.onSuccess(result); 362 assertTrue(batchResult.get()); 363 } 364 365 @Test testGetProject()366 public void testGetProject() { 367 EasyMock.reset(batchMock); 368 Capture<RpcBatch.Callback<Project>> callback = Capture.newInstance(); 369 Capture<Map<DnsRpc.Option, Object>> capturedOptions = Capture.newInstance(); 370 batchMock.addGetProject(EasyMock.capture(callback), EasyMock.capture(capturedOptions)); 371 EasyMock.replay(batchMock); 372 DnsBatchResult<ProjectInfo> batchResult = dnsBatch.getProject(); 373 assertEquals(0, capturedOptions.getValue().size()); 374 assertNotNull(callback.getValue()); 375 try { 376 batchResult.get(); 377 fail("No result available yet."); 378 } catch (IllegalStateException ex) { 379 // expected 380 } 381 // testing error here, success is tested with options 382 RpcBatch.Callback<Project> capturedCallback = callback.getValue(); 383 capturedCallback.onFailure(GOOGLE_JSON_ERROR); 384 try { 385 batchResult.get(); 386 fail("Should throw a DnsException on error."); 387 } catch (DnsException ex) { 388 // expected 389 } 390 } 391 392 @Test testGetProjectWithOptions()393 public void testGetProjectWithOptions() { 394 EasyMock.reset(batchMock); 395 Capture<RpcBatch.Callback<Project>> callback = Capture.newInstance(); 396 Capture<Map<DnsRpc.Option, Object>> capturedOptions = Capture.newInstance(); 397 batchMock.addGetProject(EasyMock.capture(callback), EasyMock.capture(capturedOptions)); 398 EasyMock.replay(batchMock); 399 DnsBatchResult<ProjectInfo> batchResult = dnsBatch.getProject(PROJECT_FIELDS); 400 assertNotNull(callback.getValue()); 401 String selector = (String) capturedOptions.getValue().get(PROJECT_FIELDS.getRpcOption()); 402 assertTrue(selector.contains(Dns.ProjectField.QUOTA.getSelector())); 403 assertTrue(selector.contains(Dns.ProjectField.PROJECT_ID.getSelector())); 404 RpcBatch.Callback<Project> capturedCallback = callback.getValue(); 405 capturedCallback.onSuccess(PROJECT_INFO.toPb()); 406 assertEquals(PROJECT_INFO, batchResult.get()); 407 } 408 409 @Test testListRecordSets()410 public void testListRecordSets() { 411 EasyMock.reset(batchMock); 412 Capture<RpcBatch.Callback<ResourceRecordSetsListResponse>> callback = Capture.newInstance(); 413 Capture<Map<DnsRpc.Option, Object>> capturedOptions = Capture.newInstance(); 414 batchMock.addListRecordSets( 415 EasyMock.eq(ZONE_NAME), EasyMock.capture(callback), EasyMock.capture(capturedOptions)); 416 EasyMock.replay(batchMock); 417 DnsBatchResult<Page<RecordSet>> batchResult = dnsBatch.listRecordSets(ZONE_NAME); 418 assertEquals(0, capturedOptions.getValue().size()); 419 assertNotNull(callback.getValue()); 420 try { 421 batchResult.get(); 422 fail("No result available yet."); 423 } catch (IllegalStateException ex) { 424 // expected 425 } 426 RpcBatch.Callback<ResourceRecordSetsListResponse> capturedCallback = callback.getValue(); 427 capturedCallback.onFailure(GOOGLE_JSON_ERROR); 428 try { 429 batchResult.get(); 430 fail("Should throw a DnsException on error."); 431 } catch (DnsException ex) { 432 // expected 433 } 434 } 435 436 @Test testListRecordSetsWithOptions()437 public void testListRecordSetsWithOptions() { 438 EasyMock.reset(batchMock); 439 Capture<RpcBatch.Callback<ResourceRecordSetsListResponse>> callback = Capture.newInstance(); 440 Capture<Map<DnsRpc.Option, Object>> capturedOptions = Capture.newInstance(); 441 batchMock.addListRecordSets( 442 EasyMock.eq(ZONE_NAME), EasyMock.capture(callback), EasyMock.capture(capturedOptions)); 443 EasyMock.replay(batchMock); 444 DnsBatchResult<Page<RecordSet>> batchResult = 445 dnsBatch.listRecordSets(ZONE_NAME, RECORD_SET_LIST_OPTIONS); 446 assertNotNull(callback.getValue()); 447 Integer size = 448 (Integer) capturedOptions.getValue().get(RECORD_SET_LIST_OPTIONS[0].getRpcOption()); 449 assertEquals(MAX_SIZE, size); 450 String selector = 451 (String) capturedOptions.getValue().get(RECORD_SET_LIST_OPTIONS[1].getRpcOption()); 452 assertEquals(PAGE_TOKEN, selector); 453 selector = (String) capturedOptions.getValue().get(RECORD_SET_LIST_OPTIONS[2].getRpcOption()); 454 assertTrue(selector.contains(Dns.RecordSetField.NAME.getSelector())); 455 assertTrue(selector.contains(Dns.RecordSetField.TTL.getSelector())); 456 selector = (String) capturedOptions.getValue().get(RECORD_SET_LIST_OPTIONS[3].getRpcOption()); 457 assertEquals(RECORD_SET_LIST_OPTIONS[3].getValue(), selector); 458 String type = 459 (String) capturedOptions.getValue().get(RECORD_SET_LIST_OPTIONS[4].getRpcOption()); 460 assertEquals(RECORD_SET_LIST_OPTIONS[4].getValue(), type); 461 RpcBatch.Callback<ResourceRecordSetsListResponse> capturedCallback = callback.getValue(); 462 ResourceRecordSetsListResponse response = 463 new ResourceRecordSetsListResponse() 464 .setRrsets(RECORD_SET_LIST) 465 .setNextPageToken(PAGE_TOKEN); 466 capturedCallback.onSuccess(response); 467 Page<RecordSet> page = batchResult.get(); 468 assertEquals(PAGE_TOKEN, page.getNextPageToken()); 469 Iterator<RecordSet> iterator = page.getValues().iterator(); 470 int resultSize = 0; 471 while (iterator.hasNext()) { 472 assertEquals(RECORD_SET, iterator.next()); 473 resultSize++; 474 } 475 assertEquals(RECORD_SET_LIST.size(), resultSize); 476 } 477 478 @Test testListChangeRequests()479 public void testListChangeRequests() { 480 EasyMock.reset(batchMock); 481 Capture<RpcBatch.Callback<ChangesListResponse>> callback = Capture.newInstance(); 482 Capture<Map<DnsRpc.Option, Object>> capturedOptions = Capture.newInstance(); 483 batchMock.addListChangeRequests( 484 EasyMock.eq(ZONE_NAME), EasyMock.capture(callback), EasyMock.capture(capturedOptions)); 485 EasyMock.replay(batchMock); 486 DnsBatchResult<Page<ChangeRequest>> batchResult = dnsBatch.listChangeRequests(ZONE_NAME); 487 assertNotNull(callback.getValue()); 488 assertEquals(0, capturedOptions.getValue().size()); 489 try { 490 batchResult.get(); 491 fail("No result available yet."); 492 } catch (IllegalStateException ex) { 493 // expected 494 } 495 RpcBatch.Callback<ChangesListResponse> capturedCallback = callback.getValue(); 496 capturedCallback.onFailure(GOOGLE_JSON_ERROR); 497 try { 498 batchResult.get(); 499 fail("Should throw a DnsException on error."); 500 } catch (DnsException ex) { 501 // expected 502 } 503 } 504 505 @Test testListChangeRequestsWithOptions()506 public void testListChangeRequestsWithOptions() { 507 EasyMock.reset(batchMock); 508 Capture<RpcBatch.Callback<ChangesListResponse>> callback = Capture.newInstance(); 509 Capture<Map<DnsRpc.Option, Object>> capturedOptions = Capture.newInstance(); 510 batchMock.addListChangeRequests( 511 EasyMock.eq(ZONE_NAME), EasyMock.capture(callback), EasyMock.capture(capturedOptions)); 512 EasyMock.replay(batchMock); 513 DnsBatchResult<Page<ChangeRequest>> batchResult = 514 dnsBatch.listChangeRequests(ZONE_NAME, CHANGE_LIST_OPTIONS); 515 assertNotNull(callback.getValue()); 516 Integer size = (Integer) capturedOptions.getValue().get(CHANGE_LIST_OPTIONS[0].getRpcOption()); 517 assertEquals(MAX_SIZE, size); 518 String selector = 519 (String) capturedOptions.getValue().get(CHANGE_LIST_OPTIONS[1].getRpcOption()); 520 assertEquals(PAGE_TOKEN, selector); 521 selector = (String) capturedOptions.getValue().get(CHANGE_LIST_OPTIONS[2].getRpcOption()); 522 assertTrue(selector.contains(Dns.ChangeRequestField.STATUS.getSelector())); 523 assertTrue(selector.contains(Dns.ChangeRequestField.ID.getSelector())); 524 selector = (String) capturedOptions.getValue().get(CHANGE_LIST_OPTIONS[3].getRpcOption()); 525 assertTrue(selector.contains(Dns.SortingOrder.ASCENDING.selector())); 526 // check the callback 527 ChangesListResponse response = 528 new ChangesListResponse().setChanges(CHANGE_LIST).setNextPageToken(PAGE_TOKEN); 529 RpcBatch.Callback<ChangesListResponse> capturedCallback = callback.getValue(); 530 EasyMock.verify(optionsMock); 531 EasyMock.reset(optionsMock); 532 EasyMock.expect(optionsMock.getService()).andReturn(dns); 533 EasyMock.replay(optionsMock); 534 capturedCallback.onSuccess(response); 535 Page<ChangeRequest> page = batchResult.get(); 536 assertEquals(PAGE_TOKEN, page.getNextPageToken()); 537 Iterator<ChangeRequest> iterator = page.getValues().iterator(); 538 int resultSize = 0; 539 EasyMock.verify(dns); 540 EasyMock.reset(dns); 541 EasyMock.expect(dns.getOptions()).andReturn(optionsMock).times(CHANGE_LIST.size()); 542 EasyMock.replay(dns); 543 while (iterator.hasNext()) { 544 assertEquals(CHANGE_REQUEST_COMPLETE.toPb(), iterator.next().toPb()); 545 resultSize++; 546 } 547 assertEquals(CHANGE_LIST.size(), resultSize); 548 } 549 550 @Test testGetChangeRequest()551 public void testGetChangeRequest() { 552 EasyMock.reset(batchMock); 553 Capture<RpcBatch.Callback<Change>> callback = Capture.newInstance(); 554 Capture<Map<DnsRpc.Option, Object>> capturedOptions = Capture.newInstance(); 555 batchMock.addGetChangeRequest( 556 EasyMock.eq(ZONE_NAME), 557 EasyMock.eq(CHANGE_REQUEST_COMPLETE.getGeneratedId()), 558 EasyMock.capture(callback), 559 EasyMock.capture(capturedOptions)); 560 EasyMock.replay(batchMock); 561 DnsBatchResult<ChangeRequest> batchResult = 562 dnsBatch.getChangeRequest(ZONE_NAME, CHANGE_REQUEST_COMPLETE.getGeneratedId()); 563 assertEquals(0, capturedOptions.getValue().size()); 564 assertNotNull(callback.getValue()); 565 try { 566 batchResult.get(); 567 fail("No result available yet."); 568 } catch (IllegalStateException ex) { 569 // expected 570 } 571 // testing error here, success is tested with options 572 RpcBatch.Callback<Change> capturedCallback = callback.getValue(); 573 capturedCallback.onFailure(GOOGLE_JSON_ERROR); 574 try { 575 batchResult.get(); 576 fail("Should throw a DnsException on error."); 577 } catch (DnsException ex) { 578 // expected 579 } 580 } 581 582 @Test testGetChangeRequestNotFound()583 public void testGetChangeRequestNotFound() { 584 EasyMock.reset(batchMock); 585 Capture<RpcBatch.Callback<Change>> callback = Capture.newInstance(); 586 Capture<Map<DnsRpc.Option, Object>> capturedOptions = Capture.newInstance(); 587 batchMock.addGetChangeRequest( 588 EasyMock.eq(ZONE_NAME), 589 EasyMock.eq(CHANGE_REQUEST_COMPLETE.getGeneratedId()), 590 EasyMock.capture(callback), 591 EasyMock.capture(capturedOptions)); 592 EasyMock.replay(batchMock); 593 DnsBatchResult<ChangeRequest> batchResult = 594 dnsBatch.getChangeRequest(ZONE_NAME, CHANGE_REQUEST_COMPLETE.getGeneratedId()); 595 assertEquals(0, capturedOptions.getValue().size()); 596 RpcBatch.Callback<Change> capturedCallback = callback.getValue(); 597 GoogleJsonError error = new GoogleJsonError(); 598 GoogleJsonError.ErrorInfo errorInfo = new GoogleJsonError.ErrorInfo(); 599 errorInfo.setReason("reason"); 600 errorInfo.setLocation("entity.parameters.changeId"); 601 error.setCode(404); 602 error.setErrors(ImmutableList.of(errorInfo)); 603 capturedCallback.onFailure(error); 604 assertNull(batchResult.get()); 605 } 606 607 @Test testGetChangeRequestWithOptions()608 public void testGetChangeRequestWithOptions() { 609 EasyMock.reset(dns, batchMock, optionsMock); 610 EasyMock.expect(dns.getOptions()).andReturn(optionsMock); 611 EasyMock.expect(optionsMock.getService()).andReturn(dns); 612 Capture<RpcBatch.Callback<Change>> callback = Capture.newInstance(); 613 Capture<Map<DnsRpc.Option, Object>> capturedOptions = Capture.newInstance(); 614 batchMock.addGetChangeRequest( 615 EasyMock.eq(ZONE_NAME), 616 EasyMock.eq(CHANGE_REQUEST_COMPLETE.getGeneratedId()), 617 EasyMock.capture(callback), 618 EasyMock.capture(capturedOptions)); 619 EasyMock.replay(dns, batchMock, optionsMock); 620 DnsBatchResult<ChangeRequest> batchResult = 621 dnsBatch.getChangeRequest( 622 ZONE_NAME, CHANGE_REQUEST_COMPLETE.getGeneratedId(), CHANGE_GET_FIELDS); 623 assertNotNull(callback.getValue()); 624 String selector = (String) capturedOptions.getValue().get(CHANGE_GET_FIELDS.getRpcOption()); 625 assertTrue(selector.contains(Dns.ChangeRequestField.STATUS.getSelector())); 626 assertTrue(selector.contains(Dns.ChangeRequestField.ID.getSelector())); 627 RpcBatch.Callback<Change> capturedCallback = callback.getValue(); 628 capturedCallback.onSuccess(CHANGE_REQUEST_COMPLETE.toPb()); 629 assertEquals(CHANGE_REQUEST_COMPLETE.toPb(), batchResult.get().toPb()); 630 } 631 632 @Test testApplyChangeRequest()633 public void testApplyChangeRequest() { 634 EasyMock.reset(batchMock); 635 Capture<RpcBatch.Callback<Change>> callback = Capture.newInstance(); 636 Capture<Map<DnsRpc.Option, Object>> capturedOptions = Capture.newInstance(); 637 batchMock.addApplyChangeRequest( 638 EasyMock.eq(ZONE_NAME), 639 EasyMock.eq(CHANGE_REQUEST_PARTIAL.toPb()), 640 EasyMock.capture(callback), 641 EasyMock.capture(capturedOptions)); 642 EasyMock.replay(batchMock); 643 DnsBatchResult<ChangeRequest> batchResult = 644 dnsBatch.applyChangeRequest(ZONE_INFO.getName(), CHANGE_REQUEST_PARTIAL); 645 assertEquals(0, capturedOptions.getValue().size()); 646 assertNotNull(callback.getValue()); 647 try { 648 batchResult.get(); 649 fail("No result available yet."); 650 } catch (IllegalStateException ex) { 651 // expected 652 } 653 // testing error here, success is tested with options 654 RpcBatch.Callback<Change> capturedCallback = callback.getValue(); 655 GoogleJsonError error = new GoogleJsonError(); 656 error.setCode(404); 657 capturedCallback.onFailure(error); 658 try { 659 batchResult.get(); 660 fail("Should throw a DnsException on error."); 661 } catch (DnsException ex) { 662 // expected 663 } 664 } 665 666 @Test testApplyChangeRequestWithOptions()667 public void testApplyChangeRequestWithOptions() { 668 EasyMock.reset(dns, batchMock, optionsMock); 669 EasyMock.expect(dns.getOptions()).andReturn(optionsMock); 670 Capture<RpcBatch.Callback<Change>> callback = Capture.newInstance(); 671 Capture<Map<DnsRpc.Option, Object>> capturedOptions = Capture.newInstance(); 672 batchMock.addApplyChangeRequest( 673 EasyMock.eq(ZONE_NAME), 674 EasyMock.eq(CHANGE_REQUEST_PARTIAL.toPb()), 675 EasyMock.capture(callback), 676 EasyMock.capture(capturedOptions)); 677 EasyMock.expect(optionsMock.getService()).andReturn(dns); 678 EasyMock.replay(dns, batchMock, optionsMock); 679 DnsBatchResult<ChangeRequest> batchResult = 680 dnsBatch.applyChangeRequest(ZONE_INFO.getName(), CHANGE_REQUEST_PARTIAL, CHANGE_GET_FIELDS); 681 String selector = (String) capturedOptions.getValue().get(CHANGE_GET_FIELDS.getRpcOption()); 682 assertTrue(selector.contains(Dns.ChangeRequestField.STATUS.getSelector())); 683 assertTrue(selector.contains(Dns.ChangeRequestField.ID.getSelector())); 684 RpcBatch.Callback<Change> capturedCallback = callback.getValue(); 685 capturedCallback.onSuccess(CHANGE_REQUEST_COMPLETE.toPb()); 686 assertEquals(CHANGE_REQUEST_COMPLETE.toPb(), batchResult.get().toPb()); 687 } 688 } 689