/** * Licensed to the Apache Software Foundation (ASF) under one * or more contributor license agreements. See the NOTICE file * distributed with this work for additional information * regarding copyright ownership. The ASF licenses this file * to you 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 org.apache.avro.specific; import org.apache.avro.test.http.*; import org.apache.avro.test.nullable.Nullable; import org.apache.avro.test.nullable.RecordWithNullables; import org.junit.Test; import java.util.ArrayList; import static org.apache.avro.test.nullable.Nullable.*; import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertFalse; import static org.junit.Assert.assertTrue; import static org.junit.Assert.fail; public class TestSpecificBuilderTree { private Request.Builder createPartialBuilder() { Request.Builder requestBuilder = Request.newBuilder(); requestBuilder.setTimestamp(1234567890); requestBuilder .getConnectionBuilder() .setNetworkType(NetworkType.IPv4); requestBuilder .getHttpRequestBuilder() .getUserAgentBuilder() .setUseragent("Chrome 123") .setId("Foo"); requestBuilder .getHttpRequestBuilder() .getURIBuilder() .setMethod(HttpMethod.GET) .setPath("/index.html"); if (!requestBuilder .getHttpRequestBuilder() .getURIBuilder() .hasParameters()) { requestBuilder .getHttpRequestBuilder() .getURIBuilder() .setParameters(new ArrayList<QueryParameter>()); } requestBuilder .getHttpRequestBuilder() .getURIBuilder() .getParameters() .add(QueryParameter.newBuilder().setName("Foo").setValue("Bar").build()); return requestBuilder; } @Test(expected = org.apache.avro.AvroRuntimeException.class) public void failOnIncompleteTree() { Request.Builder requestBuilder = createPartialBuilder(); Request request = requestBuilder.build(); fail("Should NEVER get here"); } @Test public void copyBuilder() { Request.Builder requestBuilder1 = createPartialBuilder(); Request.Builder requestBuilder2 = Request.newBuilder(requestBuilder1); requestBuilder1 .getConnectionBuilder() .setNetworkAddress("1.1.1.1"); requestBuilder2 .getConnectionBuilder() .setNetworkAddress("2.2.2.2"); requestBuilder2 .getHttpRequestBuilder() .getUserAgentBuilder() .setId("Bar"); Request request1 = requestBuilder1.build(); Request request2 = requestBuilder2.build(); assertEquals(NetworkType.IPv4, request1.getConnection().getNetworkType()); assertEquals("1.1.1.1", request1.getConnection().getNetworkAddress()); assertEquals("Chrome 123", request1.getHttpRequest().getUserAgent().getUseragent()); assertEquals("Foo", request1.getHttpRequest().getUserAgent().getId()); assertEquals(HttpMethod.GET, request1.getHttpRequest().getURI().getMethod()); assertEquals("/index.html", request1.getHttpRequest().getURI().getPath()); assertEquals(1, request1.getHttpRequest().getURI().getParameters().size()); assertEquals("Foo", request1.getHttpRequest().getURI().getParameters().get(0).getName()); assertEquals("Bar", request1.getHttpRequest().getURI().getParameters().get(0).getValue()); assertEquals(NetworkType.IPv4, request2.getConnection().getNetworkType()); assertEquals("2.2.2.2", request2.getConnection().getNetworkAddress()); assertEquals("Chrome 123", request2.getHttpRequest().getUserAgent().getUseragent()); assertEquals("Bar", request2.getHttpRequest().getUserAgent().getId()); assertEquals(HttpMethod.GET, request2.getHttpRequest().getURI().getMethod()); assertEquals("/index.html", request2.getHttpRequest().getURI().getPath()); assertEquals(1, request2.getHttpRequest().getURI().getParameters().size()); assertEquals("Foo", request2.getHttpRequest().getURI().getParameters().get(0).getName()); assertEquals("Bar", request2.getHttpRequest().getURI().getParameters().get(0).getValue()); } @Test public void createBuilderFromInstance(){ Request.Builder requestBuilder1 = createPartialBuilder(); requestBuilder1 .getConnectionBuilder() .setNetworkAddress("1.1.1.1"); Request request1 = requestBuilder1.build(); Request.Builder requestBuilder2 = Request.newBuilder(request1); requestBuilder2 .getConnectionBuilder() .setNetworkAddress("2.2.2.2"); requestBuilder2 .getHttpRequestBuilder() .getUserAgentBuilder() .setId("Bar"); requestBuilder2 .getHttpRequestBuilder() .getURIBuilder() .setMethod(HttpMethod.POST); requestBuilder2 .getHttpRequestBuilder() .getUserAgentBuilder() .setUseragent("Firefox 456"); Request request2 = requestBuilder2.build(); assertEquals(NetworkType.IPv4, request1.getConnection().getNetworkType()); assertEquals("1.1.1.1", request1.getConnection().getNetworkAddress()); assertEquals("Chrome 123", request1.getHttpRequest().getUserAgent().getUseragent()); assertEquals("Foo", request1.getHttpRequest().getUserAgent().getId()); assertEquals(HttpMethod.GET, request1.getHttpRequest().getURI().getMethod()); assertEquals("/index.html", request1.getHttpRequest().getURI().getPath()); assertEquals(1, request1.getHttpRequest().getURI().getParameters().size()); assertEquals("Foo", request1.getHttpRequest().getURI().getParameters().get(0).getName()); assertEquals("Bar", request1.getHttpRequest().getURI().getParameters().get(0).getValue()); assertEquals(NetworkType.IPv4, request2.getConnection().getNetworkType()); assertEquals("2.2.2.2", request2.getConnection().getNetworkAddress()); assertEquals("Firefox 456", request2.getHttpRequest().getUserAgent().getUseragent()); assertEquals("Bar", request2.getHttpRequest().getUserAgent().getId()); assertEquals(HttpMethod.POST, request2.getHttpRequest().getURI().getMethod()); assertEquals("/index.html", request2.getHttpRequest().getURI().getPath()); assertEquals(1, request2.getHttpRequest().getURI().getParameters().size()); assertEquals("Foo", request2.getHttpRequest().getURI().getParameters().get(0).getName()); assertEquals("Bar", request2.getHttpRequest().getURI().getParameters().get(0).getValue()); } private Request.Builder createLastOneTestsBuilder() { Request.Builder requestBuilder = Request.newBuilder(); requestBuilder.setTimestamp(1234567890); requestBuilder .getConnectionBuilder() .setNetworkType(NetworkType.IPv4) .setNetworkAddress("1.1.1.1"); return requestBuilder; } @Test public void lastOneWins_Setter() { Request.Builder requestBuilder = createLastOneTestsBuilder(); requestBuilder .getHttpRequestBuilder() .getURIBuilder() .setMethod(HttpMethod.GET) .setPath("/index.html"); requestBuilder .getHttpRequestBuilder() .getUserAgentBuilder() .setUseragent("Chrome 123") .setId("Foo"); HttpRequest httpRequest = HttpRequest.newBuilder() .setUserAgent(new UserAgent("Bar","Firefox 321")) .setURI(HttpURI.newBuilder() .setMethod(HttpMethod.POST) .setPath("/login.php") .build()) .build(); Request request = requestBuilder.setHttpRequest(httpRequest).build(); assertEquals(NetworkType.IPv4, request.getConnection().getNetworkType()); assertEquals("1.1.1.1", request.getConnection().getNetworkAddress()); assertEquals(0, request.getHttpRequest().getURI().getParameters().size()); assertEquals("Firefox 321", request.getHttpRequest().getUserAgent().getUseragent()); assertEquals("Bar", request.getHttpRequest().getUserAgent().getId()); assertEquals(HttpMethod.POST, request.getHttpRequest().getURI().getMethod()); assertEquals("/login.php", request.getHttpRequest().getURI().getPath()); } @Test public void lastOneWins_Builder() { Request.Builder requestBuilder = createLastOneTestsBuilder(); HttpRequest httpRequest = HttpRequest.newBuilder() .setUserAgent(new UserAgent("Bar", "Firefox 321")) .setURI(HttpURI.newBuilder() .setMethod(HttpMethod.POST) .setPath("/login.php") .build()) .build(); requestBuilder.setHttpRequest(httpRequest); requestBuilder .getHttpRequestBuilder() .getURIBuilder() .setMethod(HttpMethod.GET) .setPath("/index.html"); requestBuilder .getHttpRequestBuilder() .getUserAgentBuilder() .setUseragent("Chrome 123") .setId("Foo"); Request request = requestBuilder.build(); assertEquals(NetworkType.IPv4, request.getConnection().getNetworkType()); assertEquals("1.1.1.1", request.getConnection().getNetworkAddress()); assertEquals("Chrome 123", request.getHttpRequest().getUserAgent().getUseragent()); assertEquals("Foo", request.getHttpRequest().getUserAgent().getId()); assertEquals(0, request.getHttpRequest().getURI().getParameters().size()); assertEquals(HttpMethod.GET, request.getHttpRequest().getURI().getMethod()); assertEquals("/index.html", request.getHttpRequest().getURI().getPath()); } @Test public void copyBuilderWithNullables() { RecordWithNullables.Builder builder = RecordWithNullables.newBuilder(); assertFalse(builder.hasNullableRecordBuilder()); assertFalse(builder.hasNullableRecord()); assertFalse(builder.hasNullableString()); assertFalse(builder.hasNullableLong ()); assertFalse(builder.hasNullableInt ()); assertFalse(builder.hasNullableMap ()); assertFalse(builder.hasNullableArray ()); RecordWithNullables.Builder builderCopy = RecordWithNullables.newBuilder(builder); assertFalse(builderCopy.hasNullableRecordBuilder()); assertFalse(builderCopy.hasNullableRecord()); assertFalse(builderCopy.hasNullableString()); assertFalse(builderCopy.hasNullableLong ()); assertFalse(builderCopy.hasNullableInt ()); assertFalse(builderCopy.hasNullableMap ()); assertFalse(builderCopy.hasNullableArray ()); builderCopy.getNullableRecordBuilder(); } @Test public void copyBuilderWithNullablesAndSetToNull() { // Create builder with all values default to null, yet unset. RecordWithNullables.Builder builder = RecordWithNullables.newBuilder(); // Ensure all values have not been set assertFalse(builder.hasNullableRecordBuilder()); assertFalse(builder.hasNullableRecord()); assertFalse(builder.hasNullableString()); assertFalse(builder.hasNullableLong ()); assertFalse(builder.hasNullableInt ()); assertFalse(builder.hasNullableMap ()); assertFalse(builder.hasNullableArray ()); // Set all values to null builder.setNullableRecordBuilder(null); builder.setNullableRecord(null); builder.setNullableString(null); builder.setNullableLong (null); builder.setNullableInt (null); builder.setNullableMap (null); builder.setNullableArray (null); // A Builder remains False because it is null assertFalse(builder.hasNullableRecordBuilder()); // Ensure all values have been set assertTrue(builder.hasNullableRecord()); assertTrue(builder.hasNullableString()); assertTrue(builder.hasNullableLong ()); assertTrue(builder.hasNullableInt ()); assertTrue(builder.hasNullableMap ()); assertTrue(builder.hasNullableArray ()); // Implicitly create a builder instance and clear the actual value. builder.getNullableRecordBuilder(); assertTrue(builder.hasNullableRecordBuilder()); assertFalse(builder.hasNullableRecord()); // Create a copy of this builder. RecordWithNullables.Builder builderCopy = RecordWithNullables.newBuilder(builder); // Ensure all values are still the same assertTrue(builder.hasNullableRecordBuilder()); assertFalse(builder.hasNullableRecord()); assertTrue(builder.hasNullableString()); assertTrue(builder.hasNullableLong ()); assertTrue(builder.hasNullableInt ()); assertTrue(builder.hasNullableMap ()); assertTrue(builder.hasNullableArray ()); } @Test public void getBuilderForRecordWithNullRecord() { // Create a record with all nullable fields set to the default value : null RecordWithNullables recordWithNullables = RecordWithNullables.newBuilder().build(); // Now create a Builder using this record as the base RecordWithNullables.Builder builder = RecordWithNullables.newBuilder(recordWithNullables); // In the past this caused an NPE builder.getNullableRecordBuilder(); } @Test public void getBuilderForNullRecord() { // In the past this caused an NPE RecordWithNullables.newBuilder((RecordWithNullables)null); } @Test public void getBuilderForNullBuilder() { // In the past this caused an NPE RecordWithNullables.newBuilder((RecordWithNullables.Builder)null); } }