Hi Mikhail, I’m surprised using asLong works. What you need to do is 

int maxRowSize = 
    ctx.getProperty(MAX_ROW_SIZE)
        .asDataSize(DataUnit.B)
        .intValue();

You may specify other units. If the property is not set the asDataSize call 
returns null, if this possible likely check first. This method returns a Double.

> On 15 Jan 2018, at 15:04, Mikhail Sosonkin <[email protected]> wrote:
> 
> Joe,
> 
> I think there might a difference in behavior for how processor attributes
> are evaluated in test suite vs real execution. I'm not entirely sure if it
> is an expected/acceptable behavior. It has to with the DATA_SIZE_VALIDATOR.
> Mine was defined as follows:
> 
>    public static final PropertyDescriptor MAX_ROW_SIZE = new
> PropertyDescriptor
>        .Builder().name(BigQueryAttributes.MAX_ROW_SIZE_ATTR)
>        .displayName("Max row size")
>        .description(BigQueryAttributes.MAX_ROW_SIZE_DESC)
>        .required(true)
>        .defaultValue("1 MB")
>        .addValidator(StandardValidators.DATA_SIZE_VALIDATOR)
>        .build();
> 
> Then I would use it like this in the onTrigger method:
> 
>    final long max_row_size = context.getProperty(MAX_ROW_SIZE).asLong();
> 
> I used it this way based on the examples I've seen in the other processors.
> In the runtime it seems to be working great and gives me the byte values.
> However, in testing it would through an exception because it would try to
> parse "1 MB" (the default value) as an actual Long. Of course, if I just
> place a long value (like 1024) it would not pass the validation function.
> So, I did a more explicit "cast" using the asDataSize method:
> 
>    final long max_row_size =
> context.getProperty(MAX_ROW_SIZE).asDataSize(DataUnit.B).longValue();
> 
> This solved my problems and makes the code a bit more explicit which is
> nice. The annoying part is that the StandardProcessorTestRunner does not
> keep the stacktrace from the exceptions generated in onTrigger of the
> processor (StandardProcessorTestRunner:199)
> 
>   final Throwable thrown = future.get();
> 
> That is what caused confusion for me. I hadn't realized that the exception
> was being thrown via my code. So, if anything the test suite needs to do a
> better job at delivering stack traces for the exceptions to help with
> debugging.
> 
> I'll post this up on a ticket.
> 
> Thanks,
> Mike.
> 
> 
> 
>> On Sun, Jan 14, 2018 at 6:12 AM, Joe Witt <[email protected]> wrote:
>> 
>> mike
>> 
>> can you explain what was happening and the exception that came back?
>> Filing a JIRA for this might help the next person avoid the confusion.
>> 
>> Thanks
>> 
>> On Sun, Jan 14, 2018 at 12:44 AM, Mikhail Sosonkin
>> <[email protected]> wrote:
>>> Sorry for the alarm, after some debugging, I've realized that the issue
>> is
>>> on my side. Just wasn't clear from the exceptions I was receiving.
>>> 
>>> Thanks,
>>> Mike.
>>> 
>>> On Fri, Jan 12, 2018 at 7:27 PM, Mikhail Sosonkin <[email protected]>
>>> wrote:
>>> 
>>>> Hi,
>>>> 
>>>> I'm getting some strange behavior on unit tests.
>>>> 
>>>> (https://github.com/nologic/nifi/tree/NIFI-4731, https://
>>>> github.com/nologic/nifi/blob/3a4749a7b467fff0188174bc256e53
>>>> 818d43b7ba/nifi-nar-bundles/nifi-gcp-bundle/nifi-gcp-
>>>> processors/src/test/java/org/apache/nifi/processors/gcp/bigquery/
>>>> PutBigQueryStreamTest.java#L65)
>>>> 
>>>> The property looks like this:
>>>>    public static final PropertyDescriptor MAX_ROW_SIZE = new
>>>> PropertyDescriptor
>>>>        .Builder().name(BigQueryAttributes.MAX_ROW_SIZE_ATTR)
>>>>        .displayName("Max row size")
>>>>        .description(BigQueryAttributes.MAX_ROW_SIZE_DESC)
>>>>        .required(true)
>>>>        .defaultValue("1 MB")
>>>>        .addValidator(StandardValidators.DATA_SIZE_VALIDATOR)
>>>>        .build();
>>>> 
>>>> This works great in NiFi, but when I run it via a unit test. I get an
>>>> exception (even with a default value):
>>>> Tests run: 2, Failures: 1, Errors: 0, Skipped: 0, Time elapsed: 1.543
>> sec
>>>> <<< FAILURE! - in org.apache.nifi.processors.gcp.bigquery.
>>>> PutBigQueryStreamTest
>>>> testSuccessfulInsert(org.apache.nifi.processors.gcp.bigquery.
>> PutBigQueryStreamTest)
>>>> Time elapsed: 1.326 sec  <<< FAILURE!
>>>> java.lang.AssertionError: java.lang.NumberFormatException: For input
>>>> string: "2 MB"
>>>> at org.apache.nifi.processors.gcp.bigquery.PutBigQueryStreamTest.
>>>> testSuccessfulInsert(PutBigQueryStreamTest.java:79)
>>>> Caused by: java.lang.NumberFormatException: For input string: "2 MB"
>>>> 
>>>> 
>>>> So, I tried changing the value to a number, which fails the test as
>>>> expected:
>>>> Tests run: 2, Failures: 1, Errors: 0, Skipped: 0, Time elapsed: 1.665
>> sec
>>>> <<< FAILURE! - in org.apache.nifi.processors.gcp.bigquery.
>>>> PutBigQueryStreamTest
>>>> testSuccessfulInsert(org.apache.nifi.processors.gcp.bigquery.
>> PutBigQueryStreamTest)
>>>> Time elapsed: 1.437 sec  <<< FAILURE!
>>>> java.lang.AssertionError:
>>>> Processor has 1 validation failures:
>>>> 'bq.row.size' validated against '1024' is invalid because Must be of
>>>> format <Data Size> <Data Unit> where <Data Size> is a non-negative
>> integer
>>>> and <Data Unit> is a supported Data Unit, such as: B, KB, MB, GB, TB
>>>> 
>>>> 
>>>> What am I missing? Why is the default throwing an exception? Maybe the
>>>> validator is broken?
>>>> 
>>>> Thanks,
>>>> Mike.
>>>> 
>>> 
>>> --
>>> This email may contain material that is confidential for the sole use of
>>> the intended recipient(s).  Any review, reliance or distribution or
>>> disclosure by others without express permission is strictly prohibited.
>> If
>>> you are not the intended recipient, please contact the sender and delete
>>> all copies of this message.
>> 
> 
> -- 
> This email may contain material that is confidential for the sole use of 
> the intended recipient(s).  Any review, reliance or distribution or 
> disclosure by others without express permission is strictly prohibited.  If 
> you are not the intended recipient, please contact the sender and delete 
> all copies of this message.

Reply via email to