diff mbox

[U-Boot,v3,18/26] test: dm: eth: Handle failed test env cleanup

Message ID 1430683982-9832-19-git-send-email-joe.hershberger@ni.com
State Superseded
Headers show

Commit Message

Joe Hershberger May 3, 2015, 8:12 p.m. UTC
Make sure that the env gets cleaned up after a test fails so that other
tests aren't affected.

Signed-off-by: Joe Hershberger <joe.hershberger@ni.com>
---

Changes in v3:
-New for version 3

Changes in v2: None

 test/dm/eth.c | 79 +++++++++++++++++++++++++++++++++++++++++------------------
 1 file changed, 55 insertions(+), 24 deletions(-)

Comments

Simon Glass May 5, 2015, 8:56 p.m. UTC | #1
Hi Joe,

On 3 May 2015 at 14:12, Joe Hershberger <joe.hershberger@ni.com> wrote:
> Make sure that the env gets cleaned up after a test fails so that other
> tests aren't affected.
>
> Signed-off-by: Joe Hershberger <joe.hershberger@ni.com>
> ---
>
> Changes in v3:
> -New for version 3
>
> Changes in v2: None
>
>  test/dm/eth.c | 79 +++++++++++++++++++++++++++++++++++++++++------------------
>  1 file changed, 55 insertions(+), 24 deletions(-)

With this commit I get quite a few errors, like:

19: test: dm: eth: Handle failed test env cleanup
   sandbox:  +   sandbox
+  int retval;
+      ^
+test/dm/built-in.o: In function `dm_test_bus_children':
+build/../test/dm/bus.c:121: undefined reference to `ut_failf'
+build/../test/dm/bus.c:123: undefined reference to `ut_fail'
+test/dm/built-in.o: In function `dm_test_bus_children_funcs':
+build/../test/dm/bus.c:143: undefined reference to `ut_failf'
+build/../test/dm/bus.c:168: undefined reference to `ut_failf'
+build/../test/dm/bus.c:169: undefined reference to `ut_fail'

Regards,
Simon
Joe Hershberger May 5, 2015, 11:39 p.m. UTC | #2
Hi Simon,

On Tue, May 5, 2015 at 3:56 PM, Simon Glass <sjg@chromium.org> wrote:
> Hi Joe,
>
> On 3 May 2015 at 14:12, Joe Hershberger <joe.hershberger@ni.com> wrote:
>> Make sure that the env gets cleaned up after a test fails so that other
>> tests aren't affected.
>>
>> Signed-off-by: Joe Hershberger <joe.hershberger@ni.com>
>> ---
>>
>> Changes in v3:
>> -New for version 3
>>
>> Changes in v2: None
>>
>>  test/dm/eth.c | 79 +++++++++++++++++++++++++++++++++++++++++------------------
>>  1 file changed, 55 insertions(+), 24 deletions(-)
>
> With this commit I get quite a few errors, like:
>
> 19: test: dm: eth: Handle failed test env cleanup
>    sandbox:  +   sandbox
> +  int retval;
> +      ^
> +test/dm/built-in.o: In function `dm_test_bus_children':
> +build/../test/dm/bus.c:121: undefined reference to `ut_failf'
> +build/../test/dm/bus.c:123: undefined reference to `ut_fail'
> +test/dm/built-in.o: In function `dm_test_bus_children_funcs':
> +build/../test/dm/bus.c:143: undefined reference to `ut_failf'
> +build/../test/dm/bus.c:168: undefined reference to `ut_failf'
> +build/../test/dm/bus.c:169: undefined reference to `ut_fail'

Are you sure it's this commit? This touches nothing it test/dm/bus.c
and nothing in test/ut.c (where those functions are defined). Is is
maybe a dirty build error?

Thanks,
-Joe
Simon Glass May 6, 2015, 3:11 p.m. UTC | #3
Hi Joe,

On 5 May 2015 at 17:39, Joe Hershberger <joe.hershberger@gmail.com> wrote:
> Hi Simon,
>
> On Tue, May 5, 2015 at 3:56 PM, Simon Glass <sjg@chromium.org> wrote:
>> Hi Joe,
>>
>> On 3 May 2015 at 14:12, Joe Hershberger <joe.hershberger@ni.com> wrote:
>>> Make sure that the env gets cleaned up after a test fails so that other
>>> tests aren't affected.
>>>
>>> Signed-off-by: Joe Hershberger <joe.hershberger@ni.com>
>>> ---
>>>
>>> Changes in v3:
>>> -New for version 3
>>>
>>> Changes in v2: None
>>>
>>>  test/dm/eth.c | 79 +++++++++++++++++++++++++++++++++++++++++------------------
>>>  1 file changed, 55 insertions(+), 24 deletions(-)
>>
>> With this commit I get quite a few errors, like:
>>
>> 19: test: dm: eth: Handle failed test env cleanup
>>    sandbox:  +   sandbox
>> +  int retval;
>> +      ^
>> +test/dm/built-in.o: In function `dm_test_bus_children':
>> +build/../test/dm/bus.c:121: undefined reference to `ut_failf'
>> +build/../test/dm/bus.c:123: undefined reference to `ut_fail'
>> +test/dm/built-in.o: In function `dm_test_bus_children_funcs':
>> +build/../test/dm/bus.c:143: undefined reference to `ut_failf'
>> +build/../test/dm/bus.c:168: undefined reference to `ut_failf'
>> +build/../test/dm/bus.c:169: undefined reference to `ut_fail'
>
> Are you sure it's this commit? This touches nothing it test/dm/bus.c
> and nothing in test/ut.c (where those functions are defined). Is is
> maybe a dirty build error?

buildman does not lie :-) Well, so far as I know...it retries if it
sees any errors and warnings, after doing a full mrproper.

Just to be sure I tried a separate sandbox build and got the same errors.

I pushed the tree to u-boot-dm branch 'env-working' - perhaps I've
applied something incorrectly?

Regards,
Simon
Joe Hershberger May 6, 2015, 3:39 p.m. UTC | #4
Hi Simon,

On Wed, May 6, 2015 at 10:11 AM, Simon Glass <sjg@chromium.org> wrote:
> Hi Joe,
>
> On 5 May 2015 at 17:39, Joe Hershberger <joe.hershberger@gmail.com> wrote:
>> Hi Simon,
>>
>> On Tue, May 5, 2015 at 3:56 PM, Simon Glass <sjg@chromium.org> wrote:
>>> Hi Joe,
>>>
>>> On 3 May 2015 at 14:12, Joe Hershberger <joe.hershberger@ni.com> wrote:
>>>> Make sure that the env gets cleaned up after a test fails so that other
>>>> tests aren't affected.
>>>>
>>>> Signed-off-by: Joe Hershberger <joe.hershberger@ni.com>
>>>> ---
>>>>
>>>> Changes in v3:
>>>> -New for version 3
>>>>
>>>> Changes in v2: None
>>>>
>>>>  test/dm/eth.c | 79 +++++++++++++++++++++++++++++++++++++++++------------------
>>>>  1 file changed, 55 insertions(+), 24 deletions(-)
>>>
>>> With this commit I get quite a few errors, like:
>>>
>>> 19: test: dm: eth: Handle failed test env cleanup
>>>    sandbox:  +   sandbox
>>> +  int retval;
>>> +      ^
>>> +test/dm/built-in.o: In function `dm_test_bus_children':
>>> +build/../test/dm/bus.c:121: undefined reference to `ut_failf'
>>> +build/../test/dm/bus.c:123: undefined reference to `ut_fail'
>>> +test/dm/built-in.o: In function `dm_test_bus_children_funcs':
>>> +build/../test/dm/bus.c:143: undefined reference to `ut_failf'
>>> +build/../test/dm/bus.c:168: undefined reference to `ut_failf'
>>> +build/../test/dm/bus.c:169: undefined reference to `ut_fail'
>>
>> Are you sure it's this commit? This touches nothing it test/dm/bus.c
>> and nothing in test/ut.c (where those functions are defined). Is is
>> maybe a dirty build error?
>
> buildman does not lie :-) Well, so far as I know...it retries if it
> sees any errors and warnings, after doing a full mrproper.
>
> Just to be sure I tried a separate sandbox build and got the same errors.
>
> I pushed the tree to u-boot-dm branch 'env-working' - perhaps I've
> applied something incorrectly?

I fetched down your branch and it builds fine for me. Can you paste
the entire error log from your attempted build?

Thanks,
-Joe
Simon Glass May 6, 2015, 3:59 p.m. UTC | #5
Hi Joe,

On 6 May 2015 at 09:39, Joe Hershberger <joe.hershberger@gmail.com> wrote:
>
> Hi Simon,
>
> On Wed, May 6, 2015 at 10:11 AM, Simon Glass <sjg@chromium.org> wrote:
> > Hi Joe,
> >
> > On 5 May 2015 at 17:39, Joe Hershberger <joe.hershberger@gmail.com> wrote:
> >> Hi Simon,
> >>
> >> On Tue, May 5, 2015 at 3:56 PM, Simon Glass <sjg@chromium.org> wrote:
> >>> Hi Joe,
> >>>
> >>> On 3 May 2015 at 14:12, Joe Hershberger <joe.hershberger@ni.com> wrote:
> >>>> Make sure that the env gets cleaned up after a test fails so that other
> >>>> tests aren't affected.
> >>>>
> >>>> Signed-off-by: Joe Hershberger <joe.hershberger@ni.com>
> >>>> ---
> >>>>
> >>>> Changes in v3:
> >>>> -New for version 3
> >>>>
> >>>> Changes in v2: None
> >>>>
> >>>>  test/dm/eth.c | 79 +++++++++++++++++++++++++++++++++++++++++------------------
> >>>>  1 file changed, 55 insertions(+), 24 deletions(-)
> >>>
> >>> With this commit I get quite a few errors, like:
> >>>
> >>> 19: test: dm: eth: Handle failed test env cleanup
> >>>    sandbox:  +   sandbox
> >>> +  int retval;
> >>> +      ^
> >>> +test/dm/built-in.o: In function `dm_test_bus_children':
> >>> +build/../test/dm/bus.c:121: undefined reference to `ut_failf'
> >>> +build/../test/dm/bus.c:123: undefined reference to `ut_fail'
> >>> +test/dm/built-in.o: In function `dm_test_bus_children_funcs':
> >>> +build/../test/dm/bus.c:143: undefined reference to `ut_failf'
> >>> +build/../test/dm/bus.c:168: undefined reference to `ut_failf'
> >>> +build/../test/dm/bus.c:169: undefined reference to `ut_fail'
> >>
> >> Are you sure it's this commit? This touches nothing it test/dm/bus.c
> >> and nothing in test/ut.c (where those functions are defined). Is is
> >> maybe a dirty build error?
> >
> > buildman does not lie :-) Well, so far as I know...it retries if it
> > sees any errors and warnings, after doing a full mrproper.
> >
> > Just to be sure I tried a separate sandbox build and got the same errors.
> >
> > I pushed the tree to u-boot-dm branch 'env-working' - perhaps I've
> > applied something incorrectly?
>
> I fetched down your branch and it builds fine for me. Can you paste
> the entire error log from your attempted build?

Did you build this commit?


19: test: dm: eth: Handle failed test env cleanup
   sandbox:  +   sandbox
+  int retval;
+      ^
+test/dm/built-in.o: In function `dm_test_bus_children':
+build/../test/dm/bus.c:121: undefined reference to `ut_failf'
+build/../test/dm/bus.c:123: undefined reference to `ut_fail'
+test/dm/built-in.o: In function `dm_test_bus_children_funcs':
+build/../test/dm/bus.c:143: undefined reference to `ut_failf'
+build/../test/dm/bus.c:168: undefined reference to `ut_failf'
+build/../test/dm/bus.c:169: undefined reference to `ut_fail'
+test/dm/built-in.o: In function `dm_test_bus_children_iterators':
+build/../test/dm/bus.c:198: undefined reference to `ut_failf'
+build/../test/dm/bus.c:199: undefined reference to `ut_failf'
+test/dm/built-in.o: In function `dm_test_bus_child_post_bind':
+build/../test/dm/bus.c:454: undefined reference to `ut_fail'
+build/../test/dm/bus.c:458: undefined reference to `ut_failf'
+test/dm/built-in.o: In function `dm_test_bus_child_post_bind_uclass':
+build/../test/dm/bus.c:477: undefined reference to `ut_fail'
+build/../test/dm/bus.c:481: undefined reference to `ut_failf'
+test/dm/built-in.o: In function `test_bus_parent_data':
+build/../test/dm/bus.c:217: undefined reference to `ut_failf'
+build/../test/dm/bus.c:232: undefined reference to `ut_fail'
+build/../test/dm/bus.c:242: undefined reference to `ut_failf'
+test/dm/built-in.o: In function `dm_test_bus_parent_ops':
+build/../test/dm/bus.c:308: undefined reference to `ut_failf'
+build/../test/dm/bus.c:329: undefined reference to `ut_failf'
+test/dm/built-in.o: In function `dm_test_bus_child_pre_probe_uclass':
+build/../test/dm/bus.c:508: undefined reference to `ut_failf'
+build/../test/dm/bus.c:512: undefined reference to `ut_fail'
+build/../test/dm/bus.c:517: undefined reference to `ut_failf'
+test/dm/built-in.o: In function `dm_test_bus_parent_data_uclass':
+build/../test/dm/bus.c:282: undefined reference to `ut_failf'
+test/dm/built-in.o: In function `test_bus_parent_platdata':
+build/../test/dm/bus.c:366: undefined reference to `ut_failf'
+build/../test/dm/bus.c:400: undefined reference to `ut_fail'
+build/../test/dm/bus.c:404: undefined reference to `ut_failf'
+test/dm/built-in.o: In function `dm_test_bus_parent_platdata_uclass':
+build/../test/dm/bus.c:425: undefined reference to `ut_failf'
+test/dm/built-in.o: In function `test_unbind':
+build/../test/dm/test-driver.c:69: undefined reference to `ut_fail'
+test/dm/built-in.o: In function `test_remove':
+build/../test/dm/test-driver.c:60: undefined reference to `ut_fail'
+test/dm/built-in.o: In function `test_probe':
+build/../test/dm/test-driver.c:50: undefined reference to `ut_fail'
+test/dm/built-in.o: In function `test_bind':
+build/../test/dm/test-driver.c:39: undefined reference to `ut_fail'
+test/dm/built-in.o: In function `dm_test_fdt_uclass_seq':
+build/../test/dm/test-fdt.c:234: undefined reference to `ut_failf'
+build/../test/dm/test-fdt.c:235: undefined reference to `ut_failf'
+test/dm/built-in.o: In function `dm_test_fdt_offset':
+build/../test/dm/test-fdt.c:252: undefined reference to `ut_failf'
+build/../test/dm/test-fdt.c:262: undefined reference to `ut_fail'
+build/../test/dm/test-fdt.c:263: undefined reference to `ut_failf'
+test/dm/built-in.o: In function `dm_test_fdt_pre_reloc':
+build/../test/dm/test-fdt.c:177: undefined reference to `ut_fail'
+build/../test/dm/test-fdt.c:180: undefined reference to `ut_failf'
+test/dm/built-in.o: In function `dm_check_devices':
+build/../test/dm/test-fdt.c:129: undefined reference to `ut_fail'
+test/dm/built-in.o: In function `dm_test_fdt':
+build/../test/dm/test-fdt.c:159: undefined reference to `ut_fail'
+build/../test/dm/test-fdt.c:162: undefined reference to `ut_failf'
+test/dm/built-in.o: In function `dm_test_main':
+build/../test/dm/test-main.c:87: undefined reference to `ut_fail'
+test/dm/built-in.o: In function `dm_test_init':
+build/../test/dm/test-main.c:30: undefined reference to `ut_failf'
+build/../test/dm/test-main.c:97: undefined reference to `ut_failf'
+test/dm/built-in.o: In function `dm_test_destroy':
+build/../test/dm/test-main.c:65: undefined reference to `ut_failf'
+test/dm/built-in.o: In function `test_post_probe':
+build/../test/dm/test-uclass.c:87: undefined reference to `ut_fail'
+test/dm/built-in.o: In function `test_init':
+build/../test/dm/test-uclass.c:104: undefined reference to `ut_fail'
+test/dm/built-in.o: In function `test_pre_probe':
+build/../test/dm/test-uclass.c:61: undefined reference to `ut_fail'
+test/dm/built-in.o: In function `test_post_bind':
+build/../test/dm/test-uclass.c:39: undefined reference to `ut_fail'
+test/dm/built-in.o: In function `dm_test_autobind':
+build/../test/dm/core.c:120: undefined reference to `ut_failf'
+build/../test/dm/core.c:127: undefined reference to `ut_fail'
+test/dm/built-in.o: In function `dm_test_uclass':
+build/../test/dm/core.c:505: undefined reference to `ut_fail'
+build/../test/dm/core.c:509: undefined reference to `ut_failf'
+test/dm/built-in.o: In function `dm_test_autobind_uclass_pdata_alloc':
+build/../test/dm/core.c:140: undefined reference to `ut_failf'
+build/../test/dm/core.c:155: undefined reference to `ut_fail'
+test/dm/built-in.o: In function `dm_test_autobind_uclass_pdata_valid':
+build/../test/dm/core.c:181: undefined reference to `ut_fail'
+test/dm/built-in.o: In function `dm_test_autoprobe':
+build/../test/dm/core.c:198: undefined reference to `ut_fail'
+build/../test/dm/core.c:215: undefined reference to `ut_failf'
+build/../test/dm/core.c:246: undefined reference to `ut_failf'
+test/dm/built-in.o: In function `dm_test_pre_reloc':
+build/../test/dm/core.c:643: undefined reference to `ut_failf'
+build/../test/dm/core.c:647: undefined reference to `ut_failf'
+test/dm/built-in.o: In function `dm_test_remove':
+build/../test/dm/core.c:452: undefined reference to `ut_fail'
+build/../test/dm/core.c:455: undefined reference to `ut_failf'
+build/../test/dm/core.c:456: undefined reference to `ut_failf'
+test/dm/built-in.o: In function `dm_test_lifecycle':
+build/../test/dm/core.c:313: undefined reference to `ut_fail'
+build/../test/dm/core.c:324: undefined reference to `ut_failf'
+test/dm/built-in.o: In function `dm_test_ordering':
+build/../test/dm/core.c:376: undefined reference to `ut_fail'
+build/../test/dm/core.c:380: undefined reference to `ut_failf'
+test/dm/built-in.o: In function `dm_test_uclass_before_ready':
+build/../test/dm/core.c:658: undefined reference to `ut_failf'
+build/../test/dm/core.c:664: undefined reference to `ut_failf'
+test/dm/built-in.o: In function `dm_test_uclass_devices_find_by_name':
+build/../test/dm/core.c:713: undefined reference to `ut_failf'
+build/../test/dm/core.c:714: undefined reference to `ut_fail'
+build/../test/dm/core.c:716: undefined reference to `ut_failf'
+test/dm/built-in.o: In function `dm_test_uclass_devices_get_by_name':
+build/../test/dm/core.c:773: undefined reference to `ut_failf'
+build/../test/dm/core.c:775: undefined reference to `ut_fail'
+build/../test/dm/core.c:777: undefined reference to `ut_failf'
+test/dm/built-in.o: In function `dm_test_device_get_uclass_id':
+build/../test/dm/core.c:789: undefined reference to `ut_failf'
+test/dm/built-in.o: In function `dm_test_uclass_devices_find':
+build/../test/dm/core.c:678: undefined reference to `ut_fail'
+test/dm/built-in.o: In function `dm_test_platdata':
+build/../test/dm/core.c:264: undefined reference to `ut_failf'
+build/../test/dm/core.c:265: undefined reference to `ut_fail'
+test/dm/built-in.o: In function `dm_test_uclass_devices_get':
+build/../test/dm/core.c:733: undefined reference to `ut_fail'
+test/dm/built-in.o: In function `create_children':
+build/../test/dm/core.c:536: undefined reference to `ut_failf'
+test/dm/built-in.o: In function `dm_test_children':
+build/../test/dm/core.c:627: undefined reference to `ut_failf'
+build/../test/dm/core.c:629: undefined reference to `ut_failf'
+test/dm/built-in.o: In function `dm_leak_check_end':
+build/../test/dm/core.c:93: undefined reference to `ut_failf'
+test/dm/built-in.o: In function `dm_test_leak':
+build/../test/dm/core.c:490: undefined reference to `ut_failf'
+test/dm/built-in.o: In function `dm_check_operations':
+build/../test/dm/core.c:396: undefined reference to `ut_fail'
+build/../test/dm/core.c:408: undefined reference to `ut_failf'
+test/dm/built-in.o: In function `dm_test_operations':
+build/../test/dm/core.c:427: undefined reference to `ut_failf'
+build/../test/dm/core.c:437: undefined reference to `ut_fail'
+test/dm/built-in.o: In function `dm_test_eth':
+build/../test/dm/eth.c:34: undefined reference to `ut_failf'
+build/../test/dm/eth.c:35: undefined reference to `ut_failf'
+test/dm/built-in.o: In function `dm_test_eth_alias':
+build/../test/dm/eth.c:58: undefined reference to `ut_failf'
+build/../test/dm/eth.c:59: undefined reference to `ut_failf'
+test/dm/built-in.o: In function `dm_test_eth_prime':
+build/../test/dm/eth.c:78: undefined reference to `ut_failf'
+test/dm/built-in.o:build/../test/dm/eth.c:79: more undefined
references to `ut_failf' follow
+test/dm/built-in.o: In function `dm_test_gpio':
+build/../test/dm/gpio.c:45: undefined reference to `ut_fail'
+build/../test/dm/gpio.c:98: undefined reference to `ut_failf'
+build/../test/dm/gpio.c:99: undefined reference to `ut_failf'
+test/dm/built-in.o: In function `dm_test_gpio_requestf':
+build/../test/dm/gpio.c:138: undefined reference to `ut_failf'
+build/../test/dm/gpio.c:139: undefined reference to `ut_failf'
+test/dm/built-in.o: In function `dm_test_gpio_copy':
+build/../test/dm/gpio.c:160: undefined reference to `ut_failf'
+test/dm/built-in.o:build/../test/dm/gpio.c:161: more undefined
references to `ut_failf' follow
+test/dm/built-in.o: In function `dm_test_rtc_reset':
+build/../test/dm/rtc.c:130: undefined reference to `ut_fail'
+build/../test/dm/rtc.c:139: undefined reference to `ut_failf'
+test/dm/built-in.o: In function `dm_test_rtc_set_get':
+build/../test/dm/rtc.c:62: undefined reference to `ut_failf'
+build/../test/dm/rtc.c:65: undefined reference to `ut_fail'
+test/dm/built-in.o: In function `dm_test_rtc_dual':
+build/../test/dm/rtc.c:161: undefined reference to `ut_fail'
+build/../test/dm/rtc.c:171: undefined reference to `ut_failf'
+test/dm/built-in.o: In function `dm_test_spi_flash':
+build/../test/dm/sf.c:31: undefined reference to `ut_failf'
+test/dm/built-in.o: In function `dm_test_spi_find':
+build/../test/dm/spi.c:36: undefined reference to `ut_failf'
+build/../test/dm/spi.c:84: undefined reference to `ut_failf'
+test/dm/built-in.o: In function `dm_test_spi_xfer':
+build/../test/dm/spi.c:108: undefined reference to `ut_failf'
+test/dm/built-in.o:build/../test/dm/usb.c:21: more undefined
references to `ut_failf' follow
+collect2: error: ld returned 1 exit status
+make[1]: *** [u-boot] Error 1
+make: *** [sub-make] Error 2
w+../test/dm/eth.c: In function ‘dm_test_net_retry’:
w+../test/dm/eth.c:180:6: warning: variable ‘retval’ set but not used
[-Wunused-but-set-variable]
20: test: Return values from the asserts compatible with cmds



Regards,
Simon
diff mbox

Patch

diff --git a/test/dm/eth.c b/test/dm/eth.c
index 248a14f..1f9ddd7 100644
--- a/test/dm/eth.c
+++ b/test/dm/eth.c
@@ -82,17 +82,9 @@  static int dm_test_eth_prime(struct unit_test_state *uts)
 }
 DM_TEST(dm_test_eth_prime, DM_TESTF_SCAN_FDT);
 
-static int dm_test_eth_rotate(struct unit_test_state *uts)
+/* The asserts include a return on fail; cleanup in the caller */
+static int _dm_test_eth_rotate1(struct unit_test_state *uts)
 {
-	char ethaddr[18];
-
-	/* Invalidate eth1's MAC address */
-	net_ping_ip = string_to_ip("1.1.2.2");
-	strcpy(ethaddr, getenv("eth1addr"));
-	/* Must disable access protection for eth1addr before clearing */
-	setenv(".flags", "eth1addr");
-	setenv("eth1addr", NULL);
-
 	/* Make sure that the default is to rotate to the next interface */
 	setenv("ethact", "eth@10004000");
 	ut_assertok(net_loop(PING));
@@ -104,33 +96,61 @@  static int dm_test_eth_rotate(struct unit_test_state *uts)
 	ut_asserteq(-EINVAL, net_loop(PING));
 	ut_asserteq_str("eth@10004000", getenv("ethact"));
 
-	/* Restore the env */
-	setenv("eth1addr", ethaddr);
-	setenv("ethrotate", NULL);
-
-	/* Invalidate eth0's MAC address */
-	strcpy(ethaddr, getenv("ethaddr"));
-	/* Must disable access protection for ethaddr before clearing */
-	setenv(".flags", "ethaddr");
-	setenv("ethaddr", NULL);
+	return 0;
+}
 
+static int _dm_test_eth_rotate2(struct unit_test_state *uts)
+{
 	/* Make sure we can skip invalid devices */
 	setenv("ethact", "eth@10004000");
 	ut_assertok(net_loop(PING));
 	ut_asserteq_str("eth@10004000", getenv("ethact"));
 
+	return 0;
+}
+
+static int dm_test_eth_rotate(struct unit_test_state *uts)
+{
+	char ethaddr[18];
+	int retval;
+
+	/* Set target IP to mock ping */
+	net_ping_ip = string_to_ip("1.1.2.2");
+
+	/* Invalidate eth1's MAC address */
+	strcpy(ethaddr, getenv("eth1addr"));
+	/* Must disable access protection for eth1addr before clearing */
+	setenv(".flags", "eth1addr");
+	setenv("eth1addr", NULL);
+
+	retval = _dm_test_eth_rotate1(uts);
+
+	/* Restore the env */
+	setenv("eth1addr", ethaddr);
+	setenv("ethrotate", NULL);
+
+	if (!retval) {
+		/* Invalidate eth0's MAC address */
+		strcpy(ethaddr, getenv("ethaddr"));
+		/* Must disable access protection for ethaddr before clearing */
+		setenv(".flags", "ethaddr");
+		setenv("ethaddr", NULL);
+
+		retval = _dm_test_eth_rotate2(uts);
+
+		/* Restore the env */
+		setenv("ethaddr", ethaddr);
+	}
 	/* Restore the env */
-	setenv("ethaddr", ethaddr);
 	setenv(".flags", NULL);
 
-	return 0;
+	return retval;
 }
 DM_TEST(dm_test_eth_rotate, DM_TESTF_SCAN_FDT);
 
-static int dm_test_net_retry(struct unit_test_state *uts)
+/* The asserts include a return on fail; cleanup in the caller */
+static int _dm_test_net_retry(struct unit_test_state *uts)
 {
-	net_ping_ip = string_to_ip("1.1.2.2");
-
 	/*
 	 * eth1 is disabled and netretry is yes, so the ping should succeed and
 	 * the active device should be eth0
@@ -150,6 +170,17 @@  static int dm_test_net_retry(struct unit_test_state *uts)
 	ut_asserteq(-ETIMEDOUT, net_loop(PING));
 	ut_asserteq_str("eth@10004000", getenv("ethact"));
 
+	return 0;
+}
+
+static int dm_test_net_retry(struct unit_test_state *uts)
+{
+	int retval;
+
+	net_ping_ip = string_to_ip("1.1.2.2");
+
+	retval = _dm_test_net_retry(uts);
+
 	/* Restore the env */
 	setenv("netretry", NULL);
 	sandbox_eth_disable_response(1, false);