Commit 0dff0157 authored by Eric Stevenson's avatar Eric Stevenson Committed by Commit Bot

JNI refactor: @NativeMethods conversion (//components/policy).

This CL was partially created by
//base/android/jni_generator/jni_refactorer.py.

The conversion also required converting unit tests to use the new JNI
mocking approach provided by JniMocker.

Bug: 929661
Change-Id: If47b5ba988f61e4b179d483fb0073e11f0d50992
Reviewed-on: https://chromium-review.googlesource.com/c/chromium/src/+/1831416Reviewed-by: default avatarOwen Min <zmin@chromium.org>
Commit-Queue: Eric Stevenson <estevenson@chromium.org>
Cr-Commit-Position: refs/heads/master@{#701307}
parent 23b352dd
...@@ -10,6 +10,7 @@ import org.chromium.base.ThreadUtils; ...@@ -10,6 +10,7 @@ import org.chromium.base.ThreadUtils;
import org.chromium.base.VisibleForTesting; import org.chromium.base.VisibleForTesting;
import org.chromium.base.annotations.CalledByNative; import org.chromium.base.annotations.CalledByNative;
import org.chromium.base.annotations.JNINamespace; import org.chromium.base.annotations.JNINamespace;
import org.chromium.base.annotations.NativeMethods;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.List; import java.util.List;
...@@ -92,7 +93,7 @@ public class CombinedPolicyProvider { ...@@ -92,7 +93,7 @@ public class CombinedPolicyProvider {
mPolicyConverter.setPolicy(key, settings.get(key)); mPolicyConverter.setPolicy(key, settings.get(key));
} }
} }
nativeFlushPolicies(mNativeCombinedPolicyProvider); CombinedPolicyProviderJni.get().flushPolicies(mNativeCombinedPolicyProvider, get());
} }
void terminateIncognitoSession() { void terminateIncognitoSession() {
...@@ -132,14 +133,12 @@ public class CombinedPolicyProvider { ...@@ -132,14 +133,12 @@ public class CombinedPolicyProvider {
void terminateIncognitoSession(); void terminateIncognitoSession();
} }
@VisibleForTesting static void setForTesting(CombinedPolicyProvider p) {
public static void set(CombinedPolicyProvider p) {
sInstance = p; sInstance = p;
} }
@VisibleForTesting @NativeMethods
CombinedPolicyProvider() {} interface Natives {
void flushPolicies(long nativeAndroidCombinedPolicyProvider, CombinedPolicyProvider caller);
@VisibleForTesting }
protected native void nativeFlushPolicies(long nativeAndroidCombinedPolicyProvider);
} }
...@@ -16,6 +16,7 @@ import org.chromium.base.Log; ...@@ -16,6 +16,7 @@ import org.chromium.base.Log;
import org.chromium.base.VisibleForTesting; import org.chromium.base.VisibleForTesting;
import org.chromium.base.annotations.CalledByNative; import org.chromium.base.annotations.CalledByNative;
import org.chromium.base.annotations.JNINamespace; import org.chromium.base.annotations.JNINamespace;
import org.chromium.base.annotations.NativeMethods;
import java.util.Arrays; import java.util.Arrays;
import java.util.Set; import java.util.Set;
...@@ -44,19 +45,23 @@ public class PolicyConverter { ...@@ -44,19 +45,23 @@ public class PolicyConverter {
assert mNativePolicyConverter != 0; assert mNativePolicyConverter != 0;
if (value instanceof Boolean) { if (value instanceof Boolean) {
nativeSetPolicyBoolean(mNativePolicyConverter, key, (Boolean) value); PolicyConverterJni.get().setPolicyBoolean(
mNativePolicyConverter, PolicyConverter.this, key, (Boolean) value);
return; return;
} }
if (value instanceof String) { if (value instanceof String) {
nativeSetPolicyString(mNativePolicyConverter, key, (String) value); PolicyConverterJni.get().setPolicyString(
mNativePolicyConverter, PolicyConverter.this, key, (String) value);
return; return;
} }
if (value instanceof Integer) { if (value instanceof Integer) {
nativeSetPolicyInteger(mNativePolicyConverter, key, (Integer) value); PolicyConverterJni.get().setPolicyInteger(
mNativePolicyConverter, PolicyConverter.this, key, (Integer) value);
return; return;
} }
if (value instanceof String[]) { if (value instanceof String[]) {
nativeSetPolicyStringArray(mNativePolicyConverter, key, (String[]) value); PolicyConverterJni.get().setPolicyStringArray(
mNativePolicyConverter, PolicyConverter.this, key, (String[]) value);
return; return;
} }
// App restrictions can only contain bundles and bundle arrays on Android M, however our // App restrictions can only contain bundles and bundle arrays on Android M, however our
...@@ -68,8 +73,8 @@ public class PolicyConverter { ...@@ -68,8 +73,8 @@ public class PolicyConverter {
// JNI can't take a Bundle argument without a lot of extra work, but the native code // JNI can't take a Bundle argument without a lot of extra work, but the native code
// already accepts arbitrary JSON strings, so convert to JSON. // already accepts arbitrary JSON strings, so convert to JSON.
try { try {
nativeSetPolicyString( PolicyConverterJni.get().setPolicyString(mNativePolicyConverter,
mNativePolicyConverter, key, convertBundleToJson(bundle).toString()); PolicyConverter.this, key, convertBundleToJson(bundle).toString());
} catch (JSONException e) { } catch (JSONException e) {
// Chrome requires all policies to be expressible as JSON, so this can't be a // Chrome requires all policies to be expressible as JSON, so this can't be a
// valid policy. // valid policy.
...@@ -83,7 +88,8 @@ public class PolicyConverter { ...@@ -83,7 +88,8 @@ public class PolicyConverter {
// JNI can't take a Bundle[] argument without a lot of extra work, but the native // JNI can't take a Bundle[] argument without a lot of extra work, but the native
// code already accepts arbitrary JSON strings, so convert to JSON. // code already accepts arbitrary JSON strings, so convert to JSON.
try { try {
nativeSetPolicyString(mNativePolicyConverter, key, PolicyConverterJni.get().setPolicyString(mNativePolicyConverter,
PolicyConverter.this, key,
convertBundleArrayToJson(bundleArray).toString()); convertBundleArrayToJson(bundleArray).toString());
} catch (JSONException e) { } catch (JSONException e) {
// Chrome requires all policies to be expressible as JSON, so this can't be a // Chrome requires all policies to be expressible as JSON, so this can't be a
...@@ -130,13 +136,15 @@ public class PolicyConverter { ...@@ -130,13 +136,15 @@ public class PolicyConverter {
mNativePolicyConverter = 0; mNativePolicyConverter = 0;
} }
@VisibleForTesting @NativeMethods
native void nativeSetPolicyBoolean(long nativePolicyConverter, String policyKey, boolean value); interface Natives {
@VisibleForTesting void setPolicyBoolean(long nativePolicyConverter, PolicyConverter caller, String policyKey,
native void nativeSetPolicyInteger(long nativePolicyConverter, String policyKey, int value); boolean value);
@VisibleForTesting void setPolicyInteger(
native void nativeSetPolicyString(long nativePolicyConverter, String policyKey, String value); long nativePolicyConverter, PolicyConverter caller, String policyKey, int value);
@VisibleForTesting void setPolicyString(
native void nativeSetPolicyStringArray( long nativePolicyConverter, PolicyConverter caller, String policyKey, String value);
long nativePolicyConverter, String policyKey, String[] value); void setPolicyStringArray(long nativePolicyConverter, PolicyConverter caller,
String policyKey, String[] value);
}
} }
...@@ -8,9 +8,7 @@ import static org.junit.Assert.assertEquals; ...@@ -8,9 +8,7 @@ import static org.junit.Assert.assertEquals;
import static org.mockito.ArgumentMatchers.any; import static org.mockito.ArgumentMatchers.any;
import static org.mockito.ArgumentMatchers.anyBoolean; import static org.mockito.ArgumentMatchers.anyBoolean;
import static org.mockito.ArgumentMatchers.anyInt; import static org.mockito.ArgumentMatchers.anyInt;
import static org.mockito.ArgumentMatchers.anyLong;
import static org.mockito.ArgumentMatchers.anyString; import static org.mockito.ArgumentMatchers.anyString;
import static org.mockito.Mockito.doNothing;
import static org.mockito.Mockito.mock; import static org.mockito.Mockito.mock;
import static org.mockito.Mockito.never; import static org.mockito.Mockito.never;
import static org.mockito.Mockito.spy; import static org.mockito.Mockito.spy;
...@@ -20,11 +18,15 @@ import static org.mockito.Mockito.verify; ...@@ -20,11 +18,15 @@ import static org.mockito.Mockito.verify;
import android.os.Bundle; import android.os.Bundle;
import org.junit.Before; import org.junit.Before;
import org.junit.Rule;
import org.junit.Test; import org.junit.Test;
import org.junit.runner.RunWith; import org.junit.runner.RunWith;
import org.mockito.Mock;
import org.mockito.MockitoAnnotations;
import org.robolectric.annotation.Config; import org.robolectric.annotation.Config;
import org.chromium.base.test.BaseRobolectricTestRunner; import org.chromium.base.test.BaseRobolectricTestRunner;
import org.chromium.base.test.util.JniMocker;
/** /**
* Robolectric tests for CombinedPolicyProvider * Robolectric tests for CombinedPolicyProvider
...@@ -32,16 +34,18 @@ import org.chromium.base.test.BaseRobolectricTestRunner; ...@@ -32,16 +34,18 @@ import org.chromium.base.test.BaseRobolectricTestRunner;
@RunWith(BaseRobolectricTestRunner.class) @RunWith(BaseRobolectricTestRunner.class)
@Config(manifest = Config.NONE) @Config(manifest = Config.NONE)
public class CombinedPolicyProviderTest { public class CombinedPolicyProviderTest {
@Rule
public JniMocker mocker = new JniMocker();
@Mock
private PolicyConverter mPolicyConverter; private PolicyConverter mPolicyConverter;
@Mock
private CombinedPolicyProvider.Natives mCombinedPolicyConverterJniMock;
@Before @Before
public void setup() { public void setup() {
// Stub out the native calls MockitoAnnotations.initMocks(this);
CombinedPolicyProvider provider = spy(new CombinedPolicyProvider()); mocker.mock(CombinedPolicyProviderJni.TEST_HOOKS, mCombinedPolicyConverterJniMock);
mPolicyConverter = mock(PolicyConverter.class); CombinedPolicyProvider.setForTesting(new CombinedPolicyProvider());
doNothing().when(mPolicyConverter).setPolicy(anyString(), any());
doNothing().when(provider).nativeFlushPolicies(anyLong());
CombinedPolicyProvider.set(provider);
} }
/** /**
...@@ -85,7 +89,7 @@ public class CombinedPolicyProviderTest { ...@@ -85,7 +89,7 @@ public class CombinedPolicyProviderTest {
b.putBoolean("BoolPolicy", true); b.putBoolean("BoolPolicy", true);
CombinedPolicyProvider.get().onSettingsAvailable(0, b); CombinedPolicyProvider.get().onSettingsAvailable(0, b);
verify(mPolicyConverter, never()).setPolicy(anyString(), any()); verify(mPolicyConverter, never()).setPolicy(anyString(), any());
verify(CombinedPolicyProvider.get(), never()).nativeFlushPolicies(anyInt()); verify(mCombinedPolicyConverterJniMock, never()).flushPolicies(anyInt(), any());
} }
@Test @Test
...@@ -104,7 +108,7 @@ public class CombinedPolicyProviderTest { ...@@ -104,7 +108,7 @@ public class CombinedPolicyProviderTest {
verify(mPolicyConverter).setPolicy("StringPolicy", "A string"); verify(mPolicyConverter).setPolicy("StringPolicy", "A string");
verify(mPolicyConverter) verify(mPolicyConverter)
.setPolicy("StringArrayPolicy", new String[] {"String1", "String2"}); .setPolicy("StringArrayPolicy", new String[] {"String1", "String2"});
verify(CombinedPolicyProvider.get()).nativeFlushPolicies(1234); verify(mCombinedPolicyConverterJniMock).flushPolicies(1234, CombinedPolicyProvider.get());
} }
@Test @Test
...@@ -114,7 +118,7 @@ public class CombinedPolicyProviderTest { ...@@ -114,7 +118,7 @@ public class CombinedPolicyProviderTest {
CombinedPolicyProvider.get().registerProvider(provider); CombinedPolicyProvider.get().registerProvider(provider);
Bundle b = new Bundle(); Bundle b = new Bundle();
CombinedPolicyProvider.get().onSettingsAvailable(0, b); CombinedPolicyProvider.get().onSettingsAvailable(0, b);
verify(CombinedPolicyProvider.get()).nativeFlushPolicies(1234); verify(mCombinedPolicyConverterJniMock).flushPolicies(1234, CombinedPolicyProvider.get());
// Second policy provider registered but no settings. // Second policy provider registered but no settings.
PolicyProvider provider2 = new DummyPolicyProvider(); PolicyProvider provider2 = new DummyPolicyProvider();
...@@ -126,14 +130,15 @@ public class CombinedPolicyProviderTest { ...@@ -126,14 +130,15 @@ public class CombinedPolicyProviderTest {
// Second call should have been ignored, so nothing should have been set // Second call should have been ignored, so nothing should have been set
verify(mPolicyConverter, never()).setPolicy(anyString(), anyBoolean()); verify(mPolicyConverter, never()).setPolicy(anyString(), anyBoolean());
// and flush should have been called precisely once. // and flush should have been called precisely once.
verify(CombinedPolicyProvider.get()).nativeFlushPolicies(1234); verify(mCombinedPolicyConverterJniMock).flushPolicies(1234, CombinedPolicyProvider.get());
// Empty but valid bundle from second policy provider should set the policy and push it // Empty but valid bundle from second policy provider should set the policy and push it
// to the native code // to the native code
b = new Bundle(); b = new Bundle();
CombinedPolicyProvider.get().onSettingsAvailable(1, b); CombinedPolicyProvider.get().onSettingsAvailable(1, b);
verify(mPolicyConverter).setPolicy("BoolPolicy", true); verify(mPolicyConverter).setPolicy("BoolPolicy", true);
verify(CombinedPolicyProvider.get(), times(2)).nativeFlushPolicies(1234); verify(mCombinedPolicyConverterJniMock, times(2))
.flushPolicies(1234, CombinedPolicyProvider.get());
} }
@Test @Test
...@@ -147,19 +152,22 @@ public class CombinedPolicyProviderTest { ...@@ -147,19 +152,22 @@ public class CombinedPolicyProviderTest {
b.putBoolean("BoolPolicy", true); b.putBoolean("BoolPolicy", true);
CombinedPolicyProvider.get().onSettingsAvailable(0, b); CombinedPolicyProvider.get().onSettingsAvailable(0, b);
CombinedPolicyProvider.get().onSettingsAvailable(1, b); CombinedPolicyProvider.get().onSettingsAvailable(1, b);
verify(CombinedPolicyProvider.get(), times(1)).nativeFlushPolicies(1234); verify(mCombinedPolicyConverterJniMock, times(1))
.flushPolicies(1234, CombinedPolicyProvider.get());
CombinedPolicyProvider.get().refreshPolicies(); CombinedPolicyProvider.get().refreshPolicies();
// This should have cleared the cached policies, so onSettingsAvailable should now do // This should have cleared the cached policies, so onSettingsAvailable should now do
// nothing until both providers have settings. // nothing until both providers have settings.
CombinedPolicyProvider.get().onSettingsAvailable(0, b); CombinedPolicyProvider.get().onSettingsAvailable(0, b);
// Still only one call. // Still only one call.
verify(CombinedPolicyProvider.get(), times(1)).nativeFlushPolicies(1234); verify(mCombinedPolicyConverterJniMock, times(1))
.flushPolicies(1234, CombinedPolicyProvider.get());
b = new Bundle(); b = new Bundle();
b.putBoolean("BoolPolicy", false); b.putBoolean("BoolPolicy", false);
CombinedPolicyProvider.get().onSettingsAvailable(1, b); CombinedPolicyProvider.get().onSettingsAvailable(1, b);
// That should have caused the second flush. // That should have caused the second flush.
verify(CombinedPolicyProvider.get(), times(2)).nativeFlushPolicies(1234); verify(mCombinedPolicyConverterJniMock, times(2))
.flushPolicies(1234, CombinedPolicyProvider.get());
// And the policy should have been set to the new value. // And the policy should have been set to the new value.
verify(mPolicyConverter).setPolicy("BoolPolicy", false); verify(mPolicyConverter).setPolicy("BoolPolicy", false);
} }
......
...@@ -4,23 +4,21 @@ ...@@ -4,23 +4,21 @@
package org.chromium.policy; package org.chromium.policy;
import static org.mockito.ArgumentMatchers.any;
import static org.mockito.ArgumentMatchers.anyBoolean;
import static org.mockito.ArgumentMatchers.anyInt;
import static org.mockito.ArgumentMatchers.anyLong;
import static org.mockito.ArgumentMatchers.anyString;
import static org.mockito.Mockito.doNothing;
import static org.mockito.Mockito.spy;
import static org.mockito.Mockito.verify; import static org.mockito.Mockito.verify;
import android.os.Build; import android.os.Build;
import android.os.Bundle; import android.os.Bundle;
import org.junit.Before;
import org.junit.Rule;
import org.junit.Test; import org.junit.Test;
import org.junit.runner.RunWith; import org.junit.runner.RunWith;
import org.mockito.Mock;
import org.mockito.MockitoAnnotations;
import org.robolectric.annotation.Config; import org.robolectric.annotation.Config;
import org.chromium.base.test.BaseRobolectricTestRunner; import org.chromium.base.test.BaseRobolectricTestRunner;
import org.chromium.base.test.util.JniMocker;
/** /**
* Robolectric test for AbstractAppRestrictionsProvider. * Robolectric test for AbstractAppRestrictionsProvider.
...@@ -28,6 +26,18 @@ import org.chromium.base.test.BaseRobolectricTestRunner; ...@@ -28,6 +26,18 @@ import org.chromium.base.test.BaseRobolectricTestRunner;
@RunWith(BaseRobolectricTestRunner.class) @RunWith(BaseRobolectricTestRunner.class)
@Config(manifest = Config.NONE, sdk = Build.VERSION_CODES.LOLLIPOP) @Config(manifest = Config.NONE, sdk = Build.VERSION_CODES.LOLLIPOP)
public class PolicyConverterTest { public class PolicyConverterTest {
@Rule
public JniMocker mocker = new JniMocker();
@Mock
private PolicyConverter.Natives mPolicyConverterJniMock;
@Before
public void setup() {
MockitoAnnotations.initMocks(this);
mocker.mock(PolicyConverterJni.TEST_HOOKS, mPolicyConverterJniMock);
}
/** /**
* Test method for * Test method for
* {@link org.chromium.policy.PolicyConverter#setPolicy(java.lang.String, java.lang.Object)}. * {@link org.chromium.policy.PolicyConverter#setPolicy(java.lang.String, java.lang.Object)}.
...@@ -35,27 +45,18 @@ public class PolicyConverterTest { ...@@ -35,27 +45,18 @@ public class PolicyConverterTest {
@Test @Test
public void testSetPolicy() { public void testSetPolicy() {
// Stub out the native methods. // Stub out the native methods.
PolicyConverter policyConverter = spy(PolicyConverter.create(1234)); PolicyConverter policyConverter = PolicyConverter.create(1234);
doNothing()
.when(policyConverter)
.nativeSetPolicyBoolean(anyLong(), anyString(), anyBoolean());
doNothing().when(policyConverter).nativeSetPolicyInteger(anyLong(), anyString(), anyInt());
doNothing()
.when(policyConverter)
.nativeSetPolicyString(anyLong(), anyString(), anyString());
doNothing()
.when(policyConverter)
.nativeSetPolicyStringArray(anyLong(), anyString(), any(String[].class));
policyConverter.setPolicy("p1", true); policyConverter.setPolicy("p1", true);
verify(policyConverter).nativeSetPolicyBoolean(1234, "p1", true); verify(mPolicyConverterJniMock).setPolicyBoolean(1234, policyConverter, "p1", true);
policyConverter.setPolicy("p1", 5678); policyConverter.setPolicy("p1", 5678);
verify(policyConverter).nativeSetPolicyInteger(1234, "p1", 5678); verify(mPolicyConverterJniMock).setPolicyInteger(1234, policyConverter, "p1", 5678);
policyConverter.setPolicy("p1", "hello"); policyConverter.setPolicy("p1", "hello");
verify(policyConverter).nativeSetPolicyString(1234, "p1", "hello"); verify(mPolicyConverterJniMock).setPolicyString(1234, policyConverter, "p1", "hello");
policyConverter.setPolicy("p1", new String[] {"hello", "goodbye"}); policyConverter.setPolicy("p1", new String[] {"hello", "goodbye"});
verify(policyConverter) verify(mPolicyConverterJniMock)
.nativeSetPolicyStringArray(1234, "p1", new String[] {"hello", "goodbye"}); .setPolicyStringArray(
1234, policyConverter, "p1", new String[] {"hello", "goodbye"});
Bundle b1 = new Bundle(); Bundle b1 = new Bundle();
b1.putInt("i1", 23); b1.putInt("i1", 23);
b1.putString("s1", "a string"); b1.putString("s1", "a string");
...@@ -65,11 +66,13 @@ public class PolicyConverterTest { ...@@ -65,11 +66,13 @@ public class PolicyConverterTest {
ba[0].putString("ba1s", "another string"); ba[0].putString("ba1s", "another string");
b1.putParcelableArray("b1b", ba); b1.putParcelableArray("b1b", ba);
policyConverter.setPolicy("p1", b1); policyConverter.setPolicy("p1", b1);
verify(policyConverter) verify(mPolicyConverterJniMock)
.nativeSetPolicyString(1234, "p1", "{\"i1\":23,\"s1\":\"a string\"," .setPolicyString(1234, policyConverter, "p1",
"{\"i1\":23,\"s1\":\"a string\","
+ "\"b1b\":[{\"ba1b\":true,\"ba1s\":\"another string\"}]}"); + "\"b1b\":[{\"ba1b\":true,\"ba1s\":\"another string\"}]}");
policyConverter.setPolicy("p1", ba); policyConverter.setPolicy("p1", ba);
verify(policyConverter) verify(mPolicyConverterJniMock)
.nativeSetPolicyString(1234, "p1", "[{\"ba1b\":true,\"ba1s\":\"another string\"}]"); .setPolicyString(1234, policyConverter, "p1",
"[{\"ba1b\":true,\"ba1s\":\"another string\"}]");
} }
} }
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment