From b9b201351dff32e4dc7f3b73d5240c6b33372a5f Mon Sep 17 00:00:00 2001 From: Vova Sharaienko Date: Tue, 21 Mar 2023 19:42:53 +0000 Subject: [TeX] Added telemetry express utility static lib - to be used by AdServices Bug: 271127104 Test: atest ExpressLogApisTests Change-Id: I914d6ac88e5b4445c51c09109a79ff828ada3e9b Merged-In: I914d6ac88e5b4445c51c09109a79ff828ada3e9b --- .../com/android/modules/expresslog/Android.bp | 76 +++++++++ .../android/modules/expresslog/AndroidManifest.xml | 29 ++++ javatests/com/android/modules/expresslog/OWNERS | 3 + .../modules/expresslog/ScaledRangeOptionsTest.java | 171 +++++++++++++++++++++ .../com/android/modules/expresslog/TEST_MAPPING | 12 ++ .../modules/expresslog/UniformOptionsTest.java | 129 ++++++++++++++++ .../android/modules/expresslog/jni/.clang-format | 17 ++ .../com/android/modules/expresslog/jni/onload.cpp | 40 +++++ 8 files changed, 477 insertions(+) create mode 100644 javatests/com/android/modules/expresslog/Android.bp create mode 100644 javatests/com/android/modules/expresslog/AndroidManifest.xml create mode 100644 javatests/com/android/modules/expresslog/OWNERS create mode 100644 javatests/com/android/modules/expresslog/ScaledRangeOptionsTest.java create mode 100644 javatests/com/android/modules/expresslog/TEST_MAPPING create mode 100644 javatests/com/android/modules/expresslog/UniformOptionsTest.java create mode 100644 javatests/com/android/modules/expresslog/jni/.clang-format create mode 100644 javatests/com/android/modules/expresslog/jni/onload.cpp (limited to 'javatests/com') diff --git a/javatests/com/android/modules/expresslog/Android.bp b/javatests/com/android/modules/expresslog/Android.bp new file mode 100644 index 0000000..dd52750 --- /dev/null +++ b/javatests/com/android/modules/expresslog/Android.bp @@ -0,0 +1,76 @@ +// Copyright (C) 2023 The Android Open Source Project +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +package { + default_applicable_licenses: ["Android-Apache-2.0"], +} + +android_test { + name: "ExpressLogApisTests", + + sdk_version: "module_current", + min_sdk_version: "30", + + srcs: [ + "*.java", + ], + + static_libs: [ + "androidx.test.rules", + "androidx.test.runner", + "modules-utils-expresslog", + ], + + libs: [ + "android.test.base", + "android.test.runner", + ], + + jni_libs: [ + "libexpresslog_test_jni", + ], + + test_suites: [ + "general-tests", + ], +} + +cc_library_shared { + name: "libexpresslog_test_jni", + + sdk_version: "current", + min_sdk_version: "30", + + cflags: [ + "-Wall", + "-Werror", + "-Wextra", + + "-DNAMESPACE_FOR_HASH_FUNCTIONS=farmhash", + ], + srcs: [ + "jni/onload.cpp", + ], + header_libs: [ + "liblog_headers", + "libnativehelper_header_only", + ], + shared_libs: [ + "liblog", + ], + static_libs: [ + "libexpresslog_jni", + "libtextclassifier_hash_static", + ], +} diff --git a/javatests/com/android/modules/expresslog/AndroidManifest.xml b/javatests/com/android/modules/expresslog/AndroidManifest.xml new file mode 100644 index 0000000..9128796 --- /dev/null +++ b/javatests/com/android/modules/expresslog/AndroidManifest.xml @@ -0,0 +1,29 @@ + + + + + + + + + + + + diff --git a/javatests/com/android/modules/expresslog/OWNERS b/javatests/com/android/modules/expresslog/OWNERS new file mode 100644 index 0000000..fe9652e --- /dev/null +++ b/javatests/com/android/modules/expresslog/OWNERS @@ -0,0 +1,3 @@ +# Bug component: 719316 +# Stats/expresslog +file:/java/com/android/modules/expresslog/OWNERS diff --git a/javatests/com/android/modules/expresslog/ScaledRangeOptionsTest.java b/javatests/com/android/modules/expresslog/ScaledRangeOptionsTest.java new file mode 100644 index 0000000..8defce7 --- /dev/null +++ b/javatests/com/android/modules/expresslog/ScaledRangeOptionsTest.java @@ -0,0 +1,171 @@ +/* + * Copyright (C) 2023 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package com.android.modules.expresslog; + +import static org.junit.Assert.assertEquals; +import static org.junit.Assert.assertTrue; + +import androidx.test.filters.SmallTest; + +import org.junit.Test; +import org.junit.runner.RunWith; +import org.junit.runners.JUnit4; + +@RunWith(JUnit4.class) +@SmallTest +public class ScaledRangeOptionsTest { + static { + System.loadLibrary("expresslog_test_jni"); + } + + private static final String TAG = ScaledRangeOptionsTest.class.getSimpleName(); + + @Test + public void testGetBinsCount() { + Histogram.ScaledRangeOptions options1 = new Histogram.ScaledRangeOptions(1, 100, 100, 2); + assertEquals(3, options1.getBinsCount()); + + Histogram.ScaledRangeOptions options10 = new Histogram.ScaledRangeOptions(10, 100, 100, 2); + assertEquals(12, options10.getBinsCount()); + } + + @Test(expected = IllegalArgumentException.class) + public void testConstructZeroBinsCount() { + new Histogram.ScaledRangeOptions(0, 100, 100, 2); + } + + @Test(expected = IllegalArgumentException.class) + public void testConstructNegativeBinsCount() { + new Histogram.ScaledRangeOptions(-1, 100, 100, 2); + } + + @Test(expected = IllegalArgumentException.class) + public void testConstructNegativeFirstBinWidth() { + new Histogram.ScaledRangeOptions(10, 100, -100, 2); + } + + @Test(expected = IllegalArgumentException.class) + public void testConstructTooSmallFirstBinWidth() { + new Histogram.ScaledRangeOptions(10, 100, 0.5f, 2); + } + + @Test(expected = IllegalArgumentException.class) + public void testConstructNegativeScaleFactor() { + new Histogram.ScaledRangeOptions(10, 100, 100, -2); + } + + @Test(expected = IllegalArgumentException.class) + public void testConstructTooSmallScaleFactor() { + new Histogram.ScaledRangeOptions(10, 100, 100, 0.5f); + } + + @Test(expected = IllegalArgumentException.class) + public void testConstructTooBigScaleFactor() { + new Histogram.ScaledRangeOptions(10, 100, 100, 500.f); + } + + @Test(expected = IllegalArgumentException.class) + public void testConstructTooBigBinRange() { + new Histogram.ScaledRangeOptions(100, 100, 100, 10.f); + } + + @Test + public void testBinIndexForRangeEqual1() { + Histogram.ScaledRangeOptions options = new Histogram.ScaledRangeOptions(10, 1, 1, 1); + assertEquals(12, options.getBinsCount()); + + assertEquals(11, options.getBinForSample(11)); + + for (int i = 0, bins = options.getBinsCount(); i < bins; i++) { + assertEquals(i, options.getBinForSample(i)); + } + } + + @Test + public void testBinIndexForRangeEqual2() { + // this should produce bin otpions similar to linear histogram with bin width 2 + Histogram.ScaledRangeOptions options = new Histogram.ScaledRangeOptions(10, 1, 2, 1); + assertEquals(12, options.getBinsCount()); + + for (int i = 0, bins = options.getBinsCount(); i < bins; i++) { + assertEquals(i, options.getBinForSample(i * 2)); + assertEquals(i, options.getBinForSample(i * 2 - 1)); + } + } + + @Test + public void testBinIndexForRangeEqual5() { + Histogram.ScaledRangeOptions options = new Histogram.ScaledRangeOptions(2, 0, 5, 1); + assertEquals(4, options.getBinsCount()); + for (int i = 0; i < 2; i++) { + for (int sample = 0; sample < 5; sample++) { + assertEquals(i + 1, options.getBinForSample(i * 5 + sample)); + } + } + } + + @Test + public void testBinIndexForRangeEqual10() { + Histogram.ScaledRangeOptions options = new Histogram.ScaledRangeOptions(10, 1, 10, 1); + assertEquals(0, options.getBinForSample(0)); + assertEquals(options.getBinsCount() - 2, options.getBinForSample(100)); + assertEquals(options.getBinsCount() - 1, options.getBinForSample(101)); + + final float binSize = (101 - 1) / 10f; + for (int i = 1, bins = options.getBinsCount() - 1; i < bins; i++) { + assertEquals(i, options.getBinForSample(i * binSize)); + } + } + + @Test + public void testBinIndexForScaleFactor2() { + final int binsCount = 10; + final int minValue = 10; + final int firstBinWidth = 5; + final int scaledFactor = 2; + + Histogram.ScaledRangeOptions options = new Histogram.ScaledRangeOptions( + binsCount, minValue, firstBinWidth, scaledFactor); + assertEquals(binsCount + 2, options.getBinsCount()); + long[] binCounts = new long[10]; + + // precalculate max valid value - start value for the overflow bin + int lastBinStartValue = minValue; //firstBinMin value + int lastBinWidth = firstBinWidth; + for (int binIdx = 2; binIdx <= binsCount + 1; binIdx++) { + lastBinStartValue = lastBinStartValue + lastBinWidth; + lastBinWidth *= scaledFactor; + } + + // underflow bin + for (int i = 1; i < minValue; i++) { + assertEquals(0, options.getBinForSample(i)); + } + + for (int i = 10; i < lastBinStartValue; i++) { + assertTrue(options.getBinForSample(i) > 0); + assertTrue(options.getBinForSample(i) <= binsCount); + binCounts[options.getBinForSample(i) - 1]++; + } + + // overflow bin + assertEquals(binsCount + 1, options.getBinForSample(lastBinStartValue)); + + for (int i = 1; i < binsCount; i++) { + assertEquals(binCounts[i], binCounts[i - 1] * 2L); + } + } +} diff --git a/javatests/com/android/modules/expresslog/TEST_MAPPING b/javatests/com/android/modules/expresslog/TEST_MAPPING new file mode 100644 index 0000000..e658d7a --- /dev/null +++ b/javatests/com/android/modules/expresslog/TEST_MAPPING @@ -0,0 +1,12 @@ +{ + "presubmit": [ + { + "name": "ExpressLogApisTests", + "options": [ + { + "exclude-annotation": "org.junit.Ignore" + } + ] + } + ] +} diff --git a/javatests/com/android/modules/expresslog/UniformOptionsTest.java b/javatests/com/android/modules/expresslog/UniformOptionsTest.java new file mode 100644 index 0000000..3cc03ec --- /dev/null +++ b/javatests/com/android/modules/expresslog/UniformOptionsTest.java @@ -0,0 +1,129 @@ +/* + * Copyright (C) 2023 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package com.android.modules.expresslog; + +import androidx.test.filters.SmallTest; + +import static org.junit.Assert.assertEquals; + +import org.junit.Test; +import org.junit.runner.RunWith; +import org.junit.runners.JUnit4; + +@RunWith(JUnit4.class) +@SmallTest +public class UniformOptionsTest { + static { + System.loadLibrary("expresslog_test_jni"); + } + + private static final String TAG = UniformOptionsTest.class.getSimpleName(); + + @Test + public void testGetBinsCount() { + Histogram.UniformOptions options1 = new Histogram.UniformOptions(1, 100, 1000); + assertEquals(3, options1.getBinsCount()); + + Histogram.UniformOptions options10 = new Histogram.UniformOptions(10, 100, 1000); + assertEquals(12, options10.getBinsCount()); + } + + @Test(expected = IllegalArgumentException.class) + public void testConstructZeroBinsCount() { + new Histogram.UniformOptions(0, 100, 1000); + } + + @Test(expected = IllegalArgumentException.class) + public void testConstructNegativeBinsCount() { + new Histogram.UniformOptions(-1, 100, 1000); + } + + @Test(expected = IllegalArgumentException.class) + public void testConstructMaxValueLessThanMinValue() { + new Histogram.UniformOptions(10, 1000, 100); + } + + @Test + public void testBinIndexForRangeEqual1() { + Histogram.UniformOptions options = new Histogram.UniformOptions(10, 1, 11); + for (int i = 0, bins = options.getBinsCount(); i < bins; i++) { + assertEquals(i, options.getBinForSample(i)); + } + } + + @Test + public void testBinIndexForRangeEqual2() { + Histogram.UniformOptions options = new Histogram.UniformOptions(10, 1, 21); + for (int i = 0, bins = options.getBinsCount(); i < bins; i++) { + assertEquals(i, options.getBinForSample(i * 2)); + assertEquals(i, options.getBinForSample(i * 2 - 1)); + } + } + + @Test + public void testBinIndexForRangeEqual5() { + Histogram.UniformOptions options = new Histogram.UniformOptions(2, 0, 10); + assertEquals(4, options.getBinsCount()); + for (int i = 0; i < 2; i++) { + for (int sample = 0; sample < 5; sample++) { + assertEquals(i + 1, options.getBinForSample(i * 5 + sample)); + } + } + } + + @Test + public void testBinIndexForRangeEqual10() { + Histogram.UniformOptions options = new Histogram.UniformOptions(10, 1, 101); + assertEquals(0, options.getBinForSample(0)); + assertEquals(options.getBinsCount() - 2, options.getBinForSample(100)); + assertEquals(options.getBinsCount() - 1, options.getBinForSample(101)); + + final float binSize = (101 - 1) / 10f; + for (int i = 1, bins = options.getBinsCount() - 1; i < bins; i++) { + assertEquals(i, options.getBinForSample(i * binSize)); + } + } + + @Test + public void testBinIndexForRangeEqual90() { + final int binCount = 10; + final int minValue = 100; + final int maxValue = 100000; + + Histogram.UniformOptions options = new Histogram.UniformOptions(binCount, minValue, + maxValue); + + // logging underflow sample + assertEquals(0, options.getBinForSample(minValue - 1)); + + // logging overflow sample + assertEquals(binCount + 1, options.getBinForSample(maxValue)); + assertEquals(binCount + 1, options.getBinForSample(maxValue + 1)); + + // logging min edge sample + assertEquals(1, options.getBinForSample(minValue)); + + // logging max edge sample + assertEquals(binCount, options.getBinForSample(maxValue - 1)); + + // logging single valid sample per bin + final int binSize = (maxValue - minValue) / binCount; + + for (int i = 0; i < binCount; i++) { + assertEquals(i + 1, options.getBinForSample(minValue + binSize * i)); + } + } +} diff --git a/javatests/com/android/modules/expresslog/jni/.clang-format b/javatests/com/android/modules/expresslog/jni/.clang-format new file mode 100644 index 0000000..cead3a0 --- /dev/null +++ b/javatests/com/android/modules/expresslog/jni/.clang-format @@ -0,0 +1,17 @@ +BasedOnStyle: Google +AllowShortIfStatementsOnASingleLine: true +AllowShortFunctionsOnASingleLine: false +AllowShortLoopsOnASingleLine: true +BinPackArguments: true +BinPackParameters: true +ColumnLimit: 100 +CommentPragmas: NOLINT:.* +ContinuationIndentWidth: 8 +DerivePointerAlignment: false +IndentWidth: 4 +PointerAlignment: Left +TabWidth: 4 +AccessModifierOffset: -4 +IncludeCategories: + - Regex: '^"Log\.h"' + Priority: -1 diff --git a/javatests/com/android/modules/expresslog/jni/onload.cpp b/javatests/com/android/modules/expresslog/jni/onload.cpp new file mode 100644 index 0000000..a112467 --- /dev/null +++ b/javatests/com/android/modules/expresslog/jni/onload.cpp @@ -0,0 +1,40 @@ +/* + * Copyright (C) 2023 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#define LOG_TAG "TeX" + +#include +#include + +namespace android { +extern int register_com_android_modules_expresslog_Utils(JNIEnv* env); +} // namespace android + +using namespace android; + +extern "C" jint JNI_OnLoad(JavaVM* vm, void* /* reserved */) { + JNIEnv* env = NULL; + jint result = -1; + + if (vm->GetEnv((void**)&env, JNI_VERSION_1_4) != JNI_OK) { + ALOGE("GetEnv failed!"); + return result; + } + ALOG_ASSERT(env, "Could not retrieve the env!"); + + register_com_android_modules_expresslog_Utils(env); + return JNI_VERSION_1_4; +} -- cgit v1.2.3