blob: 462afeee6b9720d3500ba5bf8870a822bba3a08c [file] [log] [blame]
// Copyright 2015 The Vanadium Authors. All rights reserved.
// Use of this source code is governed by a BSD-style
// license that can be found in the LICENSE file.
package io.v.baku.toolkit.blessings;
import android.app.Activity;
import org.junit.Before;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.powermock.api.mockito.PowerMockito;
import org.powermock.core.classloader.annotations.PrepareForTest;
import org.powermock.core.classloader.annotations.SuppressStaticInitializationFor;
import org.powermock.modules.junit4.PowerMockRunner;
import io.v.v23.security.Blessings;
import rx.functions.Action1;
import static org.junit.Assert.fail;
import static org.mockito.Matchers.any;
import static org.mockito.Mockito.mock;
import static org.mockito.Mockito.never;
import static org.mockito.Mockito.verify;
import static org.powermock.api.mockito.PowerMockito.mockStatic;
@RunWith(PowerMockRunner.class)
@SuppressStaticInitializationFor("io.v.baku.toolkit.blessings.BlessingsUtils")
@PrepareForTest({Blessings.class, BlessingsUtils.class})
public class ActivityBlessingsSeekerTest {
private static class MockActivityBlessingsSeeker extends ActivityBlessingsSeeker {
public MockActivityBlessingsSeeker(final Activity activity) {
super(activity, null, false);
}
@Override
protected void seekBlessings() {
}
}
@Before
public void setUp() {
mockStatic(BlessingsUtils.class);
}
@Test
public void testColdPassive() {
// would NPE if it tries to do anytyhing
new MockActivityBlessingsSeeker(null)
.getPassiveRxBlessings()
.subscribe(b -> fail("Unexpected blessings " + b));
}
@Test
public void testBlessingsFromManager() throws Exception {
final Activity activity = mock(Activity.class);
@SuppressWarnings("unchecked")
final Action1<Blessings>
cold = mock(Action1.class),
hot = mock(Action1.class);
final Blessings
b1 = PowerMockito.mock(Blessings.class),
b2 = PowerMockito.mock(Blessings.class);
PowerMockito.when(BlessingsUtils.readSharedPrefs(any())).thenReturn(b1, b2);
final MockActivityBlessingsSeeker t = new MockActivityBlessingsSeeker(activity);
t.getPassiveRxBlessings().subscribe(cold);
t.getRxBlessings().subscribe(hot);
verify(hot).call(b1);
verify(cold).call(b1);
verify(hot, never()).call(b2);
t.refreshBlessings();
verify(hot).call(b2);
verify(cold).call(b2);
}
@Test
public void testBlessingsFromProvider() throws Exception {
final Activity activity = mock(Activity.class);
@SuppressWarnings("unchecked")
final Action1<Blessings> s = mock(Action1.class);
final Blessings
b1 = PowerMockito.mock(Blessings.class),
b2 = PowerMockito.mock(Blessings.class);
final MockActivityBlessingsSeeker t = new MockActivityBlessingsSeeker(activity);
t.getRxBlessings().subscribe(s);
verify(s, never()).call(any());
t.setBlessings(b1);
verify(s).call(b1);
t.refreshBlessings();
// The mock BlessingsManager will default to null, so it will seek blessings again.
t.setBlessings(b2);
verify(s).call(b2);
}
/**
* Verifies that if a new subscriber needs to seek blessings, the new subscriber does not
* receive blessings until the seek completes (does not receive old blessings), and that the old
* subscriber is refreshed as well.
*/
@Test
public void testDeferOnNewSubscriber() throws Exception {
final Activity activity = mock(Activity.class);
@SuppressWarnings("unchecked")
final Action1<Blessings>
s1 = mock(Action1.class),
s2 = mock(Action1.class);
final Blessings
b1 = PowerMockito.mock(Blessings.class),
b2 = PowerMockito.mock(Blessings.class);
final MockActivityBlessingsSeeker t = new MockActivityBlessingsSeeker(activity);
t.getRxBlessings().subscribe(s1);
t.setBlessings(b1);
t.getRxBlessings().subscribe(s2);
verify(s2, never()).call(any());
t.setBlessings(b2);
verify(s1).call(b2);
verify(s2).call(b2);
}
}