diff options
Diffstat (limited to 'apct-tests/perftests/rubidium/src/android/rubidium/js/JSScriptEnginePerfTests.java')
-rw-r--r-- | apct-tests/perftests/rubidium/src/android/rubidium/js/JSScriptEnginePerfTests.java | 213 |
1 files changed, 15 insertions, 198 deletions
diff --git a/apct-tests/perftests/rubidium/src/android/rubidium/js/JSScriptEnginePerfTests.java b/apct-tests/perftests/rubidium/src/android/rubidium/js/JSScriptEnginePerfTests.java index 0ddec236b6da..ac36ac2bcdcc 100644 --- a/apct-tests/perftests/rubidium/src/android/rubidium/js/JSScriptEnginePerfTests.java +++ b/apct-tests/perftests/rubidium/src/android/rubidium/js/JSScriptEnginePerfTests.java @@ -16,76 +16,49 @@ package android.rubidium.js; -import static com.android.adservices.service.js.JSScriptArgument.arrayArg; import static com.android.adservices.service.js.JSScriptArgument.numericArg; import static com.android.adservices.service.js.JSScriptArgument.recordArg; import static com.android.adservices.service.js.JSScriptArgument.stringArg; -import static com.android.adservices.service.js.JSScriptArgument.stringArrayArg; import static com.google.common.truth.Truth.assertThat; -import static org.junit.Assume.assumeTrue; - -import android.annotation.SuppressLint; import android.content.Context; import android.perftests.utils.BenchmarkState; import android.perftests.utils.PerfStatusReporter; -import android.util.Log; import androidx.annotation.NonNull; import androidx.test.core.app.ApplicationProvider; -import androidx.test.filters.MediumTest; +import androidx.test.filters.LargeTest; import androidx.test.runner.AndroidJUnit4; import com.android.adservices.service.js.JSScriptArgument; -import com.android.adservices.service.js.JSScriptArrayArgument; import com.android.adservices.service.js.JSScriptEngine; -import com.android.adservices.service.js.JSScriptRecordArgument; -import com.android.adservices.service.profiling.JSScriptEngineLogConstants; -import com.android.adservices.service.profiling.Profiler; import com.google.common.collect.ImmutableList; import com.google.common.util.concurrent.ListenableFuture; -import org.json.JSONArray; -import org.junit.Before; import org.junit.Rule; import org.junit.Test; import org.junit.runner.RunWith; -import java.io.IOException; import java.io.InputStream; import java.nio.charset.StandardCharsets; -import java.util.Collections; import java.util.List; import java.util.Objects; -import java.util.Random; import java.util.concurrent.CountDownLatch; import java.util.concurrent.ExecutorService; import java.util.concurrent.Executors; -import java.util.concurrent.TimeUnit; -/** To run the unit tests for this class, run "atest RubidiumPerfTests:JSScriptEnginePerfTests" */ -@MediumTest +@LargeTest @RunWith(AndroidJUnit4.class) public class JSScriptEnginePerfTests { - private static final String TAG = JSScriptEngine.TAG; - private static final Context sContext = ApplicationProvider.getApplicationContext(); - private static final ExecutorService sExecutorService = Executors.newFixedThreadPool(10); - - private static final JSScriptEngine sJSScriptEngine = - JSScriptEngine.getInstanceForTesting( - sContext, Profiler.createInstance(JSScriptEngine.TAG)); + private static final String TAG = JSScriptEnginePerfTests.class.getSimpleName(); + protected static final Context sContext = ApplicationProvider.getApplicationContext(); + private final ExecutorService mExecutorService = Executors.newFixedThreadPool(10); + private final JSScriptEngine mJSScriptEngine = new JSScriptEngine(sContext); @Rule public PerfStatusReporter mPerfStatusReporter = new PerfStatusReporter(); - @Before - public void before() throws Exception { - // Warm up the sandbox env. - callJSEngine( - "function test() { return \"hello world\";" + " }", ImmutableList.of(), "test"); - } - @Test public void evaluate_helloWorld() throws Exception { BenchmarkState state = mPerfStatusReporter.getBenchmarkState(); @@ -115,7 +88,8 @@ public class JSScriptEnginePerfTests { state.resumeTiming(); while (state.keepRunning()) { - callJSEngine(jsTestFile, ImmutableList.of(adDataArgument), "generateBid"); + callJSEngine( + jsTestFile, ImmutableList.of(adDataArgument), "generateBid"); } } @@ -125,7 +99,8 @@ public class JSScriptEnginePerfTests { state.pauseTiming(); InputStream testJsInputStream = sContext.getAssets().open("turtledove_generate_bid.js"); - String jsTestFile = new String(testJsInputStream.readAllBytes(), StandardCharsets.UTF_8); + String jsTestFile = + new String(testJsInputStream.readAllBytes(), StandardCharsets.UTF_8); // Initialize the environment with one call. callJSEngine(jsTestFile, ImmutableList.of(), "generateBid"); @@ -135,136 +110,15 @@ public class JSScriptEnginePerfTests { } } - @Test - public void evaluate_turtledoveSampleGenerateBid_parametrized_10Ads() throws Exception { - runParametrizedTurtledoveScript(10); - } - - @Test - public void evaluate_turtledoveSampleGenerateBid_parametrized_25Ads() throws Exception { - runParametrizedTurtledoveScript(25); - } - - @Test - public void evaluate_turtledoveSampleGenerateBid_parametrized_50Ads() throws Exception { - runParametrizedTurtledoveScript(50); - } - - @Test - public void evaluate_turtledoveSampleGenerateBid_parametrized_75Ads() throws Exception { - runParametrizedTurtledoveScript(75); - } - - @SuppressLint("DefaultLocale") - private void runParametrizedTurtledoveScript(int numAds) throws Exception { - BenchmarkState state = mPerfStatusReporter.getBenchmarkState(); - state.pauseTiming(); - InputStream testJsInputStream = - sContext.getAssets().open("turtledove_parametrized_generateBid.js"); - String jsTestFile = new String(testJsInputStream.readAllBytes(), StandardCharsets.UTF_8); - - state.resumeTiming(); - while (state.keepRunning()) { - int numInterestGroups = 1; - String res = - callJSEngine( - sJSScriptEngine, - jsTestFile, - ImmutableList.of( - buildSampleInterestGroupArg(numInterestGroups, numAds)), - "generateBid"); - - // I modified the Turtledove script to have the total execution time - // (across all IGs) as the last element in the response array. - JSONArray obj = new JSONArray(res); - long webviewExecTime = obj.getJSONObject(obj.length() - 1).getLong("generateBidTime"); - String webviewExecTimeLog = - String.format( - "(%s: %d)", - JSScriptEngineLogConstants.WEBVIEW_EXECUTION_TIME, webviewExecTime); - // The listener picks up logs from JSScriptEngine, so simulate logging from there. - Log.d("JSScriptEngine", webviewExecTimeLog); - } - } - - private JSScriptArrayArgument<JSScriptRecordArgument> buildSampleInterestGroupArg( - int numCustomAudiences, int numAds) { - JSScriptRecordArgument ad = - recordArg( - "foo", - ImmutableList.of( - stringArg( - "renderUrl", - "https://googleads.g.doubleclick.net/ads/simple-ad.html?adg_id=52836427830&cr_id=310927197297&cv_id=4"), - stringArrayArg( - "metadata", - ImmutableList.of( - "52836427830", "310927197297", "4", "608936333")))); - - JSScriptRecordArgument interestGroupArg = - recordArg( - "foo", - stringArg("owner", "https://googleads.g.doubleclick.net/"), - stringArg("name", "1j115753478"), - stringArg("biddingLogicUrl", "https://googleads.g.doubleclick.net/td/bjs"), - stringArg( - "dailyUpdateUrl", "https://googleads.g.doubleclick.net/td/update"), - stringArg( - "trustedBiddingSignalsUrl", - "https://googleads.g.doubleclick.net/td/sjs"), - stringArrayArg( - "trustedBiddingSignalsKeys", ImmutableList.of("1j115753478")), - stringArrayArg("userBiddingSignals", ImmutableList.of()), - new JSScriptArrayArgument("ads", Collections.nCopies(numAds, ad))); - - return arrayArg("foo", Collections.nCopies(numCustomAudiences, interestGroupArg)); - } - - @Test - public void evaluate_turtledoveWasm() throws Exception { - assumeTrue(sJSScriptEngine.isWasmSupported().get(3, TimeUnit.SECONDS)); - - BenchmarkState state = mPerfStatusReporter.getBenchmarkState(); - state.pauseTiming(); - - String jsTestFile = readAsset("generate_bid_using_wasm.js"); - byte[] wasmTestFile = readBinaryAsset("generate_bid.wasm"); - JSScriptArgument[] inputBytes = new JSScriptArgument[200]; - Random rand = new Random(); - for (int i = 0; i < inputBytes.length; i++) { - byte value = (byte) (rand.nextInt(2 * Byte.MAX_VALUE) - Byte.MIN_VALUE); - inputBytes[i] = JSScriptArgument.numericArg("_", value); - } - JSScriptArgument adDataArgument = - recordArg( - "ad", - stringArg("render_url", "http://google.com"), - recordArg("metadata", JSScriptArgument.arrayArg("input", inputBytes))); - - state.resumeTiming(); - while (state.keepRunning()) { - callJSEngine(jsTestFile, wasmTestFile, ImmutableList.of(adDataArgument), "generateBid"); - } - } - private String callJSEngine( @NonNull String jsScript, @NonNull List<JSScriptArgument> args, @NonNull String functionName) throws Exception { - return callJSEngine(sJSScriptEngine, jsScript, args, functionName); + return callJSEngine(mJSScriptEngine, jsScript, args, functionName); } private String callJSEngine( - @NonNull String jsScript, - @NonNull byte[] wasmScript, - @NonNull List<JSScriptArgument> args, - @NonNull String functionName) - throws Exception { - return callJSEngine(sJSScriptEngine, jsScript, wasmScript, args, functionName); - } - - private static String callJSEngine( @NonNull JSScriptEngine jsScriptEngine, @NonNull String jsScript, @NonNull List<JSScriptArgument> args, @@ -277,61 +131,24 @@ public class JSScriptEnginePerfTests { return futureResult.get(); } - private String callJSEngine( - @NonNull JSScriptEngine jsScriptEngine, - @NonNull String jsScript, - @NonNull byte[] wasmScript, - @NonNull List<JSScriptArgument> args, - @NonNull String functionName) - throws Exception { - CountDownLatch resultLatch = new CountDownLatch(1); - ListenableFuture<String> futureResult = - callJSEngineAsync( - jsScriptEngine, jsScript, wasmScript, args, functionName, resultLatch); - resultLatch.await(); - return futureResult.get(); - } - - private static ListenableFuture<String> callJSEngineAsync( - @NonNull String jsScript, - @NonNull List<JSScriptArgument> args, - @NonNull String functionName, - @NonNull CountDownLatch resultLatch) { - return callJSEngineAsync(sJSScriptEngine, jsScript, args, functionName, resultLatch); - } - - private static ListenableFuture<String> callJSEngineAsync( - @NonNull JSScriptEngine engine, + private ListenableFuture<String> callJSEngineAsync( @NonNull String jsScript, @NonNull List<JSScriptArgument> args, @NonNull String functionName, @NonNull CountDownLatch resultLatch) { - Objects.requireNonNull(engine); - Objects.requireNonNull(resultLatch); - ListenableFuture<String> result = engine.evaluate(jsScript, args, functionName); - result.addListener(resultLatch::countDown, sExecutorService); - return result; + return callJSEngineAsync(mJSScriptEngine, jsScript, args, functionName, resultLatch); } private ListenableFuture<String> callJSEngineAsync( @NonNull JSScriptEngine engine, @NonNull String jsScript, - @NonNull byte[] wasmScript, @NonNull List<JSScriptArgument> args, @NonNull String functionName, @NonNull CountDownLatch resultLatch) { Objects.requireNonNull(engine); Objects.requireNonNull(resultLatch); - ListenableFuture<String> result = engine.evaluate(jsScript, wasmScript, args, functionName); - result.addListener(resultLatch::countDown, sExecutorService); + ListenableFuture<String> result = engine.evaluate(jsScript, args, functionName); + result.addListener(resultLatch::countDown, mExecutorService); return result; } - - private byte[] readBinaryAsset(@NonNull String assetName) throws IOException { - return sContext.getAssets().open(assetName).readAllBytes(); - } - - private String readAsset(@NonNull String assetName) throws IOException { - return new String(readBinaryAsset(assetName), StandardCharsets.UTF_8); - } } |