blob: 719fc311e98d75089ca14010a6f4a673f2d10935 [file] [log] [blame]
/*
* Copyright (C) 2018 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.textclassifier.common.statsd;
import static com.google.common.truth.Truth.assertThat;
import android.stats.textclassifier.EventType;
import android.stats.textclassifier.WidgetType;
import android.view.textclassifier.TextClassifier;
import androidx.test.core.app.ApplicationProvider;
import androidx.test.ext.junit.runners.AndroidJUnit4;
import androidx.test.filters.LargeTest;
import com.android.internal.os.StatsdConfigProto.StatsdConfig;
import com.android.os.AtomsProto;
import com.android.os.AtomsProto.Atom;
import com.android.textclassifier.common.logging.TextClassificationContext;
import com.android.textclassifier.common.logging.TextClassificationSessionId;
import com.android.textclassifier.common.logging.TextClassifierEvent;
import com.google.common.collect.ImmutableList;
import org.junit.After;
import org.junit.Before;
import org.junit.Test;
import org.junit.runner.RunWith;
@RunWith(AndroidJUnit4.class)
@LargeTest
public class TextClassifierEventLoggerTest {
private static final String PKG_NAME = "pkg.name";
private static final String WIDGET_TYPE = TextClassifier.WIDGET_TYPE_WEBVIEW;
private static final String MODEL_NAME = "model_name";
/** A statsd config ID, which is arbitrary. */
private static final long CONFIG_ID = 689777;
private TextClassifierEventLogger textClassifierEventLogger;
@Before
public void setup() throws Exception {
StatsdTestUtils.cleanup(CONFIG_ID);
StatsdConfig.Builder builder =
StatsdConfig.newBuilder()
.setId(CONFIG_ID)
.addAllowedLogSource(ApplicationProvider.getApplicationContext().getPackageName());
StatsdTestUtils.addAtomMatcher(builder, Atom.TEXT_SELECTION_EVENT_FIELD_NUMBER);
StatsdTestUtils.addAtomMatcher(builder, Atom.TEXT_LINKIFY_EVENT_FIELD_NUMBER);
StatsdTestUtils.addAtomMatcher(builder, Atom.CONVERSATION_ACTIONS_EVENT_FIELD_NUMBER);
StatsdTestUtils.addAtomMatcher(builder, Atom.LANGUAGE_DETECTION_EVENT_FIELD_NUMBER);
StatsdTestUtils.pushConfig(builder.build());
textClassifierEventLogger = new TextClassifierEventLogger();
}
@After
public void tearDown() throws Exception {
StatsdTestUtils.cleanup(CONFIG_ID);
}
@Test
public void writeEvent_textSelectionEvent() throws Exception {
TextClassificationSessionId sessionId = new TextClassificationSessionId();
TextClassifierEvent.TextSelectionEvent textSelectionEvent =
new TextClassifierEvent.TextSelectionEvent.Builder(
TextClassifierEvent.TYPE_SELECTION_STARTED)
.setEventContext(createTextClassificationContext())
.setResultId("androidtc|en_v705;und_v1|12345")
.setEventIndex(1)
.setEntityTypes(TextClassifier.TYPE_ADDRESS)
.setRelativeWordStartIndex(2)
.setRelativeWordEndIndex(3)
.setRelativeSuggestedWordStartIndex(1)
.setRelativeSuggestedWordEndIndex(4)
.build();
textClassifierEventLogger.writeEvent(sessionId, textSelectionEvent);
AtomsProto.TextSelectionEvent event =
AtomsProto.TextSelectionEvent.newBuilder()
.setSessionId(sessionId.getValue())
.setEventType(EventType.SELECTION_STARTED)
.setModelName("en_v705")
.setWidgetType(WidgetType.WIDGET_TYPE_WEBVIEW)
.setEventIndex(1)
.setEntityType(TextClassifier.TYPE_ADDRESS)
.setRelativeWordStartIndex(2)
.setRelativeWordEndIndex(3)
.setRelativeSuggestedWordStartIndex(1)
.setRelativeSuggestedWordEndIndex(4)
.setPackageName(PKG_NAME)
.setLangidModelName("und_v1")
.build();
ImmutableList<Atom> atoms = StatsdTestUtils.getLoggedAtoms(CONFIG_ID);
assertThat(atoms).hasSize(1);
assertThat(atoms.get(0).getTextSelectionEvent()).isEqualTo(event);
}
@Test
public void writeEvent_textSelectionEvent_autoToSingle() throws Exception {
TextClassificationSessionId sessionId = new TextClassificationSessionId();
TextClassifierEvent.TextSelectionEvent textSelectionEvent =
new TextClassifierEvent.TextSelectionEvent.Builder(TextClassifierEvent.TYPE_AUTO_SELECTION)
.setResultId("androidtc|en_v705;und_v1|12345")
.setRelativeWordStartIndex(2)
.setRelativeWordEndIndex(3)
.build();
textClassifierEventLogger.writeEvent(sessionId, textSelectionEvent);
ImmutableList<Atom> atoms = StatsdTestUtils.getLoggedAtoms(CONFIG_ID);
assertThat(atoms).hasSize(1);
assertThat(atoms.get(0).getTextSelectionEvent().getEventType())
.isEqualTo(EventType.SMART_SELECTION_SINGLE);
}
@Test
public void writeEvent_textSelectionEvent_autoToMulti() throws Exception {
TextClassificationSessionId sessionId = new TextClassificationSessionId();
TextClassifierEvent.TextSelectionEvent textSelectionEvent =
new TextClassifierEvent.TextSelectionEvent.Builder(TextClassifierEvent.TYPE_AUTO_SELECTION)
.setResultId("androidtc|en_v705;und_v1|12345")
.setRelativeWordStartIndex(2)
.setRelativeWordEndIndex(4)
.build();
textClassifierEventLogger.writeEvent(sessionId, textSelectionEvent);
ImmutableList<Atom> atoms = StatsdTestUtils.getLoggedAtoms(CONFIG_ID);
assertThat(atoms).hasSize(1);
assertThat(atoms.get(0).getTextSelectionEvent().getEventType())
.isEqualTo(EventType.SMART_SELECTION_MULTI);
}
@Test
public void writeEvent_textSelectionEvent_keepAuto() throws Exception {
TextClassificationSessionId sessionId = new TextClassificationSessionId();
TextClassifierEvent.TextSelectionEvent textSelectionEvent =
new TextClassifierEvent.TextSelectionEvent.Builder(TextClassifierEvent.TYPE_AUTO_SELECTION)
.setResultId("aiai|en_v705;und_v1|12345")
.setRelativeWordStartIndex(2)
.setRelativeWordEndIndex(4)
.build();
textClassifierEventLogger.writeEvent(sessionId, textSelectionEvent);
ImmutableList<Atom> atoms = StatsdTestUtils.getLoggedAtoms(CONFIG_ID);
assertThat(atoms).hasSize(1);
assertThat(atoms.get(0).getTextSelectionEvent().getEventType())
.isEqualTo(EventType.AUTO_SELECTION);
}
@Test
public void writeEvent_textLinkifyEvent() throws Exception {
TextClassificationSessionId sessionId = new TextClassificationSessionId();
TextClassifierEvent.TextLinkifyEvent textLinkifyEvent =
new TextClassifierEvent.TextLinkifyEvent.Builder(TextClassifierEvent.TYPE_SELECTION_STARTED)
.setEventContext(createTextClassificationContext())
.setResultId("androidtc|en_v705;und_v1|12345")
.setEventIndex(1)
.setEntityTypes(TextClassifier.TYPE_ADDRESS)
.build();
textClassifierEventLogger.writeEvent(sessionId, textLinkifyEvent);
AtomsProto.TextLinkifyEvent event =
AtomsProto.TextLinkifyEvent.newBuilder()
.setSessionId(sessionId.getValue())
.setEventType(EventType.SELECTION_STARTED)
.setModelName("en_v705")
.setWidgetType(WidgetType.WIDGET_TYPE_WEBVIEW)
.setEventIndex(1)
.setEntityType(TextClassifier.TYPE_ADDRESS)
.setNumLinks(0)
.setLinkedTextLength(0)
.setTextLength(0)
.setLatencyMillis(0)
.setPackageName(PKG_NAME)
.setLangidModelName("und_v1")
.build();
ImmutableList<Atom> atoms = StatsdTestUtils.getLoggedAtoms(CONFIG_ID);
assertThat(atoms).hasSize(1);
assertThat(atoms.get(0).getTextLinkifyEvent()).isEqualTo(event);
}
@Test
public void writeEvent_textConversationActionEvent() throws Exception {
TextClassificationSessionId sessionId = new TextClassificationSessionId();
TextClassifierEvent.ConversationActionsEvent conversationActionsEvent =
new TextClassifierEvent.ConversationActionsEvent.Builder(
TextClassifierEvent.TYPE_SELECTION_STARTED)
.setEventContext(createTextClassificationContext())
.setResultId("android_tc|en_v1;zh_v2;und_v3|12345")
.setEventIndex(1)
.setEntityTypes("first", "second", "third", "fourth")
.setScores(0.5f)
.build();
textClassifierEventLogger.writeEvent(sessionId, conversationActionsEvent);
AtomsProto.ConversationActionsEvent event =
AtomsProto.ConversationActionsEvent.newBuilder()
.setSessionId(sessionId.getValue())
.setEventType(EventType.SELECTION_STARTED)
.setModelName("en_v1")
.setWidgetType(WidgetType.WIDGET_TYPE_WEBVIEW)
.setFirstEntityType("first")
.setSecondEntityType("second")
.setThirdEntityType("third")
.setScore(0.5f)
.setPackageName(PKG_NAME)
.setAnnotatorModelName("zh_v2")
.setLangidModelName("und_v3")
.build();
ImmutableList<Atom> atoms = StatsdTestUtils.getLoggedAtoms(CONFIG_ID);
assertThat(atoms).hasSize(1);
assertThat(atoms.get(0).getConversationActionsEvent()).isEqualTo(event);
}
@Test
public void writeEvent_languageDetectionEvent() throws Exception {
TextClassificationSessionId sessionId = new TextClassificationSessionId();
TextClassifierEvent.LanguageDetectionEvent languageDetectionEvent =
new TextClassifierEvent.LanguageDetectionEvent.Builder(
TextClassifierEvent.TYPE_SELECTION_STARTED)
.setEventContext(createTextClassificationContext())
.setModelName(MODEL_NAME)
.setEventIndex(1)
.setEntityTypes("en")
.setScores(0.5f)
.setActionIndices(1)
.build();
textClassifierEventLogger.writeEvent(sessionId, languageDetectionEvent);
AtomsProto.LanguageDetectionEvent event =
AtomsProto.LanguageDetectionEvent.newBuilder()
.setSessionId(sessionId.getValue())
.setEventType(EventType.SELECTION_STARTED)
.setModelName(MODEL_NAME)
.setWidgetType(WidgetType.WIDGET_TYPE_WEBVIEW)
.setLanguageTag("en")
.setScore(0.5f)
.setActionIndex(1)
.setPackageName(PKG_NAME)
.build();
ImmutableList<Atom> atoms = StatsdTestUtils.getLoggedAtoms(CONFIG_ID);
assertThat(atoms).hasSize(1);
assertThat(atoms.get(0).getLanguageDetectionEvent()).isEqualTo(event);
}
private static TextClassificationContext createTextClassificationContext() {
return new TextClassificationContext.Builder(PKG_NAME, WIDGET_TYPE).build();
}
}