Do not force endDocument for domain verify settings
Removes the endDocument call so the serializer can be used as a child of a larger group. Instead calls flush and assumes all usages will close tags appropriately. This usage is incorrect regardless, but endDocument itself is broken and does not behave the same depending on which XmlSerialier implementation is being used. Which is why this bug never appeared during testing/development. Bug: 180838875 Bug: 181813200 Test: manual, debug linked Bug Test: atest DomainVerificationPersistenceTest Change-Id: I50e27817e526d2cbcc0efbcc3ffdfffa53886f0f
This commit is contained in:
@@ -83,7 +83,7 @@ public class SettingsXml {
|
||||
@Override
|
||||
public void close() throws IOException {
|
||||
mWriteSection.closeCompletely();
|
||||
mXmlSerializer.endDocument();
|
||||
mXmlSerializer.flush();
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -32,7 +32,6 @@ import com.android.server.pm.SettingsXml;
|
||||
import org.xmlpull.v1.XmlPullParserException;
|
||||
|
||||
import java.io.IOException;
|
||||
import java.util.Map;
|
||||
|
||||
/**
|
||||
* Reads and writes the old {@link android.content.pm.IntentFilterVerificationInfo} so that it can
|
||||
|
||||
@@ -30,6 +30,7 @@ import com.google.common.truth.Truth.assertWithMessage
|
||||
import org.junit.Rule
|
||||
import org.junit.Test
|
||||
import org.junit.rules.TemporaryFolder
|
||||
import org.xmlpull.v1.XmlPullParser
|
||||
import java.io.File
|
||||
import java.nio.charset.StandardCharsets
|
||||
import java.util.UUID
|
||||
@@ -41,21 +42,41 @@ class DomainVerificationPersistenceTest {
|
||||
|
||||
internal fun File.writeXml(block: (serializer: TypedXmlSerializer) -> Unit) = apply {
|
||||
outputStream().use {
|
||||
// Explicitly use string based XML so it can printed in the test failure output
|
||||
Xml.newFastSerializer()
|
||||
// This must use the binary serializer the mirror the production behavior, as
|
||||
// there are slight differences with the string based one.
|
||||
Xml.newBinarySerializer()
|
||||
.apply {
|
||||
setOutput(it, StandardCharsets.UTF_8.name())
|
||||
startDocument(null, true)
|
||||
setFeature("http://xmlpull.org/v1/doc/features.html#indent-output", true)
|
||||
// Write a wrapping tag to ensure the domain verification settings didn't
|
||||
// close out the document, allowing other settings to be written
|
||||
startTag(null, "wrapper-tag")
|
||||
}
|
||||
.apply(block)
|
||||
.apply {
|
||||
startTag(null, "trailing-tag")
|
||||
endTag(null, "trailing-tag")
|
||||
endTag(null, "wrapper-tag")
|
||||
}
|
||||
.endDocument()
|
||||
}
|
||||
}
|
||||
|
||||
internal fun <T> File.readXml(block: (parser: TypedXmlPullParser) -> T) =
|
||||
inputStream().use {
|
||||
block(Xml.resolvePullParser(it))
|
||||
val parser = Xml.resolvePullParser(it)
|
||||
assertThat(parser.nextTag()).isEqualTo(XmlPullParser.START_TAG)
|
||||
assertThat(parser.name).isEqualTo("wrapper-tag")
|
||||
assertThat(parser.nextTag()).isEqualTo(XmlPullParser.START_TAG)
|
||||
block(parser).also {
|
||||
assertThat(parser.nextTag()).isEqualTo(XmlPullParser.START_TAG)
|
||||
assertThat(parser.name).isEqualTo("trailing-tag")
|
||||
assertThat(parser.nextTag()).isEqualTo(XmlPullParser.END_TAG)
|
||||
assertThat(parser.name).isEqualTo("trailing-tag")
|
||||
assertThat(parser.nextTag()).isEqualTo(XmlPullParser.END_TAG)
|
||||
assertThat(parser.name).isEqualTo("wrapper-tag")
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user