Skip to content
Closed
Show file tree
Hide file tree
Changes from 24 commits
Commits
Show all changes
75 commits
Select commit Hold shift + click to select a range
1eed578
Add pure kotlin runtime implementation
Mar 5, 2020
5fd8e94
Add kotlin native protoc gen
Mar 5, 2020
734280b
Add conformance-native
Mar 5, 2020
2f13e3d
Move Util to new folder tree
Apr 1, 2020
b03b1e4
Add iOS target
Apr 1, 2020
c87db29
Add use experimental to ByteArr deserialize function
Apr 1, 2020
7cd01e4
Fix rebase errors
Apr 2, 2020
fa05b3e
Update Kotlin and serialization version to latest
Apr 3, 2020
53d5022
Refactor sourcetsets and create native
Apr 4, 2020
567cf35
Move iOSMain to nativeMain
Apr 4, 2020
cf81d7f
Merge branch 'streem/master' into kotlin-native
Apr 4, 2020
ef0a1e8
Fix strict mode being spread into multiple values
Apr 4, 2020
08de644
Change StringDescription to Primitive of kind String
Apr 4, 2020
ae5a691
Temp fix for Kotlin DCE
Apr 6, 2020
4f7ee52
Refactor build.gradle.kts to use by getting
Apr 6, 2020
ed55104
Remove un-necessary import
Apr 6, 2020
7a50d6c
Add ios and macos source sets witn dependance on native
Apr 6, 2020
80b1567
Move conformance native under macosX64
Apr 6, 2020
c3c7fa3
Add native conformance exe with list of failing tests from JVM
Apr 6, 2020
68fae4f
Add native conformance tests to script
Apr 7, 2020
814a092
Add protoc-gen-kotlin macos implementation and gradle file update
Apr 8, 2020
2a94125
Add protoc-gen-kotlin macos (not fully working)
Apr 8, 2020
ac0ca1a
Change CI config to execute conformance tests
Apr 8, 2020
c51c011
Try to fix circleci config
Apr 8, 2020
5992dec
Update README file with native support
Apr 8, 2020
d061e1b
Create native executor
Apr 28, 2020
610c490
Disable gradle daemon for all builds (faster build time)
Apr 28, 2020
6befbec
Fix alignment in config.yml
Apr 28, 2020
36564b5
Use simple ubuntu base image for native tests
Apr 29, 2020
684dd2f
Remove protoc-gen-kotlin macos
Apr 29, 2020
fa70c5e
Create both arm and x64 ios source sets
Apr 29, 2020
e70a5ea
Use by creating in build.gradle
Apr 29, 2020
26997c1
Enable linux sourceset on runtime
May 4, 2020
104ae1b
Enable native conformance tests
May 4, 2020
0a295d4
Build native to generate executables
May 5, 2020
57b8337
Execute linux conformance and keep the right executable
May 5, 2020
bd32a42
Merge branch 'streem/master' into kotlin-native
Jun 10, 2020
e1cbee4
Fix post-merge changes
Jun 10, 2020
adbd2ee
Fix README
Jun 10, 2020
f94dde5
Use variable to make sure both targets outputs have the same name
Jun 10, 2020
ebf362b
Point Linux conformance test to right executable
Jun 10, 2020
b89c049
Fix pbandk version
Jun 10, 2020
6cf47db
Move dependency to common
Jun 10, 2020
7fd6b4d
Remove macos target in protoc-gen-kotlin
Jun 10, 2020
430cb25
Add space
Jun 10, 2020
2bb582e
Remove this with dependencies
Jun 10, 2020
79e107c
Fix readme with right task to execute
Jun 10, 2020
1d02a71
Move zigzagencode functions to extension file
Jun 10, 2020
ee5223f
Use rawBits for float and double values as per protobuf-java implemen…
Jun 10, 2020
348ff2e
Make Wireformat internal
Jun 10, 2020
8e77bb5
Move comment
Jun 10, 2020
07c6f10
Rename Util to UtilImpl
Jun 10, 2020
e12d0b0
Rename UtilInteface to Util
Jun 10, 2020
c069df6
Rename Sizer to SizerImpl
Jun 10, 2020
4afa11e
Rename SizerInterface to Sizer
Jun 10, 2020
540837b
Refactor fun getTotalBytesRead to property totalBytesRead
Jun 10, 2020
3f2e4b6
Remove try/catch because we rethrow the exception
Jun 11, 2020
353a164
Revert code
Jun 11, 2020
b854389
Use high/low surrogate functions on chars
Jun 11, 2020
9f3aaeb
Throw NoSuchElementException when element doesn't exists
Jun 11, 2020
3b7e94c
Remove interface used only in impl code
Jun 11, 2020
70eabd4
Remove full implementation of string to bytearray conversion with stdlib
Jun 12, 2020
5b1e446
Remove unnecessary function
Jun 12, 2020
a8e7979
Correctly handle errors while not reading/writing bytes
Jun 15, 2020
bfe2f8a
Correctly encode/decode strings in base64
Jun 15, 2020
089b660
More PR feedback
garyp Jul 26, 2020
0505ba9
Update well-known types and other protos
garyp Jul 27, 2020
c2aaa81
Rename UtilImpl and SizerImpl back to Util and Sizer
garyp Jul 27, 2020
7eab015
Add native dependencies to CI cache
garyp Jul 27, 2020
384fb87
Get native conformance binaries building correctly
garyp Jul 27, 2020
c5ad010
update examples
garyp Jul 27, 2020
e092ec8
Fix K/N compiler error in CI
garyp Jul 27, 2020
148a1ba
Timestamp formatting/parsing on native
garyp Jul 31, 2020
74c0a3a
More PR feedback
garyp Aug 2, 2020
945347b
Merge pull request #3 from streem/garyp/kotlin-native
Aug 5, 2020
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
26 changes: 25 additions & 1 deletion .circleci/config.yml
Original file line number Diff line number Diff line change
Expand Up @@ -93,7 +93,7 @@ jobs:

- run:
name: Build conformance test suite
command: ./gradlew :conformance:lib:assemble :conformance:jvm:installDist
command: ./gradlew :conformance:lib:assemble :conformance:jvm:installDist :conformance:native:installDist

# persist files necessary to run conformance tests
- persist_to_workspace:
Expand All @@ -107,6 +107,9 @@ jobs:
- build/js
- conformance/js/failing_tests.txt
- conformance/js/run.sh
# native
- conformance/native/build/install/conformance
- conformance/native/failing_tests.txt

- save_cache:
name: Save dependencies cache
Expand Down Expand Up @@ -155,6 +158,24 @@ jobs:
export CONF_TEST_PATH=~/protobuf/conformance/conformance-test-runner
./conformance/test-conformance.sh js

conformance_native:
executor:
name: native

steps:
- attach_workspace:
at: ~/project

- restore_cache:
name: Restore protobuf cache
keys:
- v3-protobuf-3.10.1

- run:
name: Run Native conformance tests
command: |
export CONF_TEST_PATH=~/protobuf/conformance/conformance-test-runner
./conformance/test-conformance.sh native

workflows:
version: 2.1
Expand All @@ -167,3 +188,6 @@ workflows:
- conformance_js:
requires:
- build
- conformance_native:
requires:
- build
4 changes: 2 additions & 2 deletions buildSrc/src/main/kotlin/Versions.kt
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
object Versions {
const val kotlin = "1.3.61"
const val kotlin = "1.3.71"
const val kotlinCoroutines = "1.3.5"
const val kotlinSerialization = "0.14.0"
const val kotlinSerialization = "0.20.0"
const val protobufJava = "3.11.1"
const val protobufJs = "6.8.8"
const val springBootGradlePlugin = "2.2.6.RELEASE"
Expand Down
94 changes: 61 additions & 33 deletions conformance/lib/build.gradle.kts
Original file line number Diff line number Diff line change
Expand Up @@ -22,44 +22,64 @@ kotlin {
// For Linux, should be changed to e.g. linuxX64
// For MacOS, should be changed to e.g. macosX64
// For Windows, should be changed to e.g. mingwX64
// macosX64("macos")
macosX64()

sourceSets["commonMain"].dependencies {
implementation(kotlin("stdlib-common"))
implementation(project(":runtime"))
implementation("org.jetbrains.kotlinx:kotlinx-serialization-runtime-common:${Versions.kotlinSerialization}")
implementation("org.jetbrains.kotlinx:kotlinx-coroutines-core-common:${Versions.kotlinCoroutines}")
}
sourceSets["commonTest"].dependencies {
implementation(kotlin("test-common"))
implementation(kotlin("test-annotations-common"))
}
sourceSets.create("nativeMain")

sourceSets["jvmMain"].dependencies {
implementation(kotlin("stdlib-jdk8"))
implementation("org.jetbrains.kotlinx:kotlinx-serialization-runtime:${Versions.kotlinSerialization}")
implementation("org.jetbrains.kotlinx:kotlinx-coroutines-core:${Versions.kotlinCoroutines}")
}
sourceSets {
val commonMain by getting {
dependencies {
implementation(kotlin("stdlib-common"))
implementation(project(":runtime"))
implementation("org.jetbrains.kotlinx:kotlinx-serialization-runtime-common:${Versions.kotlinSerialization}")
implementation("org.jetbrains.kotlinx:kotlinx-coroutines-core-common:${Versions.kotlinCoroutines}")
}
}

sourceSets["jvmTest"].dependencies {
implementation(kotlin("test"))
implementation(kotlin("test-junit"))
implementation("junit:junit:4.12")
}
val commonTest by getting {
dependencies {
implementation(kotlin("test-common"))
implementation(kotlin("test-annotations-common"))
}
}

sourceSets["jsMain"].dependencies {
implementation(kotlin("stdlib-js"))
implementation("org.jetbrains.kotlinx:kotlinx-serialization-runtime-js:${Versions.kotlinSerialization}")
implementation("org.jetbrains.kotlinx:kotlinx-coroutines-core-js:${Versions.kotlinCoroutines}")
}
sourceSets["jsTest"].dependencies {
implementation(kotlin("test-js"))
}
val jvmMain by getting {
dependencies {
implementation(kotlin("stdlib-jdk8"))
implementation("org.jetbrains.kotlinx:kotlinx-serialization-runtime:${Versions.kotlinSerialization}")
implementation("org.jetbrains.kotlinx:kotlinx-coroutines-core:${Versions.kotlinCoroutines}")
}
}

val jvmTest by getting {
dependencies {
implementation(kotlin("test"))
implementation(kotlin("test-junit"))
implementation("junit:junit:4.12")
}
}

// sourceSets["macosMain"].dependencies {
// }
// sourceSets["macosTest"].dependencies {
// }
val jsMain by getting {
dependencies {
implementation(kotlin("stdlib-js"))
implementation("org.jetbrains.kotlinx:kotlinx-serialization-runtime-js:${Versions.kotlinSerialization}")
implementation("org.jetbrains.kotlinx:kotlinx-coroutines-core-js:${Versions.kotlinCoroutines}")
}
}

val jsTest by getting {
dependencies {
implementation(kotlin("test-js"))
}
}

val macosX64Main by getting {
dependencies {
implementation("org.jetbrains.kotlinx:kotlinx-serialization-runtime-native:${Versions.kotlinSerialization}")
implementation("org.jetbrains.kotlinx:kotlinx-coroutines-core-native:${Versions.kotlinCoroutines}")
}
}
}
}

tasks {
Expand All @@ -69,4 +89,12 @@ tasks {
kotlinPackage.set("pbandk.conformance.pb")
logLevel.set("debug")
}

// DCE is now enable by default in Kotlin 1.3.70/71
// and it doesn't work well with commonJS modules
// Use of commonJs could be removed since default module is now UMD
// but would require some code change
val processDceJsKotlinJs by getting {
enabled = false
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,78 @@
// Copyright 2019 Google Inc. All rights reserved.
// https://developers.google.com/protocol-buffers/
//
// Redistribution and use in source and binary forms, with or without
// modification, are permitted provided that the following conditions are
// met:
//
// * Redistributions of source code must retain the above copyright
// notice, this list of conditions and the following disclaimer.
// * Redistributions in binary form must reproduce the above
// copyright notice, this list of conditions and the following disclaimer
// in the documentation and/or other materials provided with the
// distribution.
// * Neither the name of Google Inc. nor the names of its
// contributors may be used to endorse or promote products derived from
// this software without specific prior written permission.
//
// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.

package pbandk.conformance

import platform.posix.*
import kotlinx.cinterop.cstr
import kotlinx.cinterop.usePinned
import kotlinx.cinterop.addressOf
import kotlinx.coroutines.Dispatchers
import kotlinx.coroutines.withContext

actual object Platform {
actual fun stderrPrintln(str: String) {
val strn = str + "\n"
val cstr = strn.cstr
write(2, cstr, cstr.size.toULong())
}

actual suspend fun stdinReadIntLE() = withContext(Dispatchers.Main) {
ByteArray(4).let {
if (readBytes(0, it) != 4) null else {
it.foldRight(0) { byte, acc ->
(acc shl 8) or (byte.toInt() and 0xff)
}
}
}
}

private fun readBytes(fd: Int, arr: ByteArray): Int {
arr.usePinned {
return read(fd, it.addressOf(0), arr.size.toULong()).toInt()
}
}

actual suspend fun stdinReadFull(size: Int) = withContext(Dispatchers.Main) {
ByteArray(size).also {
require(readBytes(0, it) == it.size) { "Unable to read full byte array"}
}
}

actual fun stdoutWriteIntLE(v: Int) =
stdoutWriteFull (ByteArray(4) { (v shr (8 * it)).toByte() })

actual fun stdoutWriteFull(arr: ByteArray) {
arr.usePinned {
write(1, it.addressOf(0), arr.size.toULong())
}
}

actual inline fun <T> doTry(fn: () -> T, errFn: (Any) -> T) = try { fn() } catch (e: Exception) { errFn(e) }
}
15 changes: 15 additions & 0 deletions conformance/native/build.gradle.kts
Original file line number Diff line number Diff line change
@@ -0,0 +1,15 @@
import org.jetbrains.kotlin.gradle.tasks.KotlinCompile

plugins {
kotlin("multiplatform")
application
}

application {
mainClassName = "pbandk.conformance.MainKt"
applicationName = "conformance"
}

dependencies {
implementation(project(":conformance:lib"))
}
128 changes: 128 additions & 0 deletions conformance/native/failing_tests.txt
Original file line number Diff line number Diff line change
@@ -0,0 +1,128 @@
##
## We don't fully support JSON yet
##
Required.Proto3.JsonInput.Any.ProtobufOutput
Required.Proto3.JsonInput.AnyNested.ProtobufOutput
Required.Proto3.JsonInput.AnyUnorderedTypeTag.ProtobufOutput
Required.Proto3.JsonInput.AnyWithDuration.ProtobufOutput
Required.Proto3.JsonInput.AnyWithFieldMask.ProtobufOutput
Required.Proto3.JsonInput.AnyWithInt32ValueWrapper.ProtobufOutput
Required.Proto3.JsonInput.AnyWithStruct.ProtobufOutput
Required.Proto3.JsonInput.AnyWithTimestamp.ProtobufOutput
Required.Proto3.JsonInput.AnyWithValueForInteger.ProtobufOutput
Required.Proto3.JsonInput.AnyWithValueForJsonObject.ProtobufOutput
Required.Proto3.JsonInput.BoolFieldTrue.ProtobufOutput
Required.Proto3.JsonInput.BoolMapEscapedKey.ProtobufOutput
Required.Proto3.JsonInput.BoolMapField.ProtobufOutput
Required.Proto3.JsonInput.BytesField.ProtobufOutput
Required.Proto3.JsonInput.BytesRepeatedField.ProtobufOutput
Required.Proto3.JsonInput.DoubleFieldInfinity.ProtobufOutput
Required.Proto3.JsonInput.DoubleFieldMaxNegativeValue.ProtobufOutput
Required.Proto3.JsonInput.DoubleFieldMaxPositiveValue.ProtobufOutput
Required.Proto3.JsonInput.DoubleFieldMinNegativeValue.ProtobufOutput
Required.Proto3.JsonInput.DoubleFieldMinPositiveValue.ProtobufOutput
Required.Proto3.JsonInput.DoubleFieldNan.ProtobufOutput
Required.Proto3.JsonInput.DoubleFieldNegativeInfinity.ProtobufOutput
Required.Proto3.JsonInput.DoubleFieldQuotedValue.ProtobufOutput
Required.Proto3.JsonInput.DurationMaxValue.ProtobufOutput
Required.Proto3.JsonInput.DurationMinValue.ProtobufOutput
Required.Proto3.JsonInput.DurationRepeatedValue.ProtobufOutput
Required.Proto3.JsonInput.EmptyFieldMask.ProtobufOutput
Required.Proto3.JsonInput.EnumFieldNumericValueNonZero.ProtobufOutput
Required.Proto3.JsonInput.EnumFieldWithAlias.ProtobufOutput
Required.Proto3.JsonInput.EnumFieldWithAliasDifferentCase.ProtobufOutput
Required.Proto3.JsonInput.EnumFieldWithAliasLowerCase.ProtobufOutput
Required.Proto3.JsonInput.EnumFieldWithAliasUseAlias.ProtobufOutput
Required.Proto3.JsonInput.EnumRepeatedField.ProtobufOutput
Required.Proto3.JsonInput.FieldMask.ProtobufOutput
Required.Proto3.JsonInput.FieldNameInSnakeCase.ProtobufOutput
Required.Proto3.JsonInput.FieldNameWithMixedCases.ProtobufOutput
Required.Proto3.JsonInput.FieldNameWithNumbers.ProtobufOutput
Required.Proto3.JsonInput.FloatFieldInfinity.ProtobufOutput
Required.Proto3.JsonInput.FloatFieldMaxNegativeValue.ProtobufOutput
Required.Proto3.JsonInput.FloatFieldMaxPositiveValue.ProtobufOutput
Required.Proto3.JsonInput.FloatFieldMinNegativeValue.ProtobufOutput
Required.Proto3.JsonInput.FloatFieldMinPositiveValue.ProtobufOutput
Required.Proto3.JsonInput.FloatFieldNan.ProtobufOutput
Required.Proto3.JsonInput.FloatFieldNegativeInfinity.ProtobufOutput
Required.Proto3.JsonInput.FloatFieldQuotedValue.ProtobufOutput
Required.Proto3.JsonInput.HelloWorld.ProtobufOutput
Required.Proto3.JsonInput.Int32FieldExponentialFormat.ProtobufOutput
Required.Proto3.JsonInput.Int32FieldFloatTrailingZero.ProtobufOutput
Required.Proto3.JsonInput.Int32FieldMaxFloatValue.ProtobufOutput
Required.Proto3.JsonInput.Int32FieldMaxValue.ProtobufOutput
Required.Proto3.JsonInput.Int32FieldMinFloatValue.ProtobufOutput
Required.Proto3.JsonInput.Int32FieldMinValue.ProtobufOutput
Required.Proto3.JsonInput.Int32FieldStringValue.ProtobufOutput
Required.Proto3.JsonInput.Int32FieldStringValueEscaped.ProtobufOutput
Required.Proto3.JsonInput.Int32MapEscapedKey.ProtobufOutput
Required.Proto3.JsonInput.Int32MapField.ProtobufOutput
Required.Proto3.JsonInput.Int64FieldMaxValue.ProtobufOutput
Required.Proto3.JsonInput.Int64FieldMaxValueNotQuoted.ProtobufOutput
Required.Proto3.JsonInput.Int64FieldMinValue.ProtobufOutput
Required.Proto3.JsonInput.Int64FieldMinValueNotQuoted.ProtobufOutput
Required.Proto3.JsonInput.Int64MapEscapedKey.ProtobufOutput
Required.Proto3.JsonInput.Int64MapField.ProtobufOutput
Required.Proto3.JsonInput.MessageField.ProtobufOutput
Required.Proto3.JsonInput.MessageMapField.ProtobufOutput
Required.Proto3.JsonInput.MessageRepeatedField.ProtobufOutput
Required.Proto3.JsonInput.OptionalBoolWrapper.ProtobufOutput
Required.Proto3.JsonInput.OptionalBytesWrapper.ProtobufOutput
Required.Proto3.JsonInput.OptionalDoubleWrapper.ProtobufOutput
Required.Proto3.JsonInput.OptionalFloatWrapper.ProtobufOutput
Required.Proto3.JsonInput.OptionalInt32Wrapper.ProtobufOutput
Required.Proto3.JsonInput.OptionalInt64Wrapper.ProtobufOutput
Required.Proto3.JsonInput.OptionalStringWrapper.ProtobufOutput
Required.Proto3.JsonInput.OptionalUint32Wrapper.ProtobufOutput
Required.Proto3.JsonInput.OptionalUint64Wrapper.ProtobufOutput
Required.Proto3.JsonInput.OptionalWrapperTypesWithNonDefaultValue.ProtobufOutput
Required.Proto3.JsonInput.PrimitiveRepeatedField.ProtobufOutput
Required.Proto3.JsonInput.RepeatedBoolWrapper.ProtobufOutput
Required.Proto3.JsonInput.RepeatedBytesWrapper.ProtobufOutput
Required.Proto3.JsonInput.RepeatedDoubleWrapper.ProtobufOutput
Required.Proto3.JsonInput.RepeatedFloatWrapper.ProtobufOutput
Required.Proto3.JsonInput.RepeatedInt32Wrapper.ProtobufOutput
Required.Proto3.JsonInput.RepeatedInt64Wrapper.ProtobufOutput
Required.Proto3.JsonInput.RepeatedListValue.ProtobufOutput
Required.Proto3.JsonInput.RepeatedStringWrapper.ProtobufOutput
Required.Proto3.JsonInput.RepeatedUint32Wrapper.ProtobufOutput
Required.Proto3.JsonInput.RepeatedUint64Wrapper.ProtobufOutput
Required.Proto3.JsonInput.RepeatedValue.ProtobufOutput
Required.Proto3.JsonInput.StringField.ProtobufOutput
Required.Proto3.JsonInput.StringFieldEscape.ProtobufOutput
Required.Proto3.JsonInput.StringFieldSurrogatePair.ProtobufOutput
Required.Proto3.JsonInput.StringFieldUnicode.ProtobufOutput
Required.Proto3.JsonInput.StringFieldUnicodeEscape.ProtobufOutput
Required.Proto3.JsonInput.StringFieldUnicodeEscapeWithLowercaseHexLetters.ProtobufOutput
Required.Proto3.JsonInput.StringRepeatedField.ProtobufOutput
Required.Proto3.JsonInput.Struct.ProtobufOutput
Required.Proto3.JsonInput.StructWithEmptyListValue.ProtobufOutput
Required.Proto3.JsonInput.TimestampLeap.ProtobufOutput
Required.Proto3.JsonInput.TimestampMaxValue.ProtobufOutput
Required.Proto3.JsonInput.TimestampMinValue.ProtobufOutput
Required.Proto3.JsonInput.TimestampRepeatedValue.ProtobufOutput
Required.Proto3.JsonInput.TimestampWithNegativeOffset.ProtobufOutput
Required.Proto3.JsonInput.TimestampWithPositiveOffset.ProtobufOutput
Required.Proto3.JsonInput.Uint32FieldMaxFloatValue.ProtobufOutput
Required.Proto3.JsonInput.Uint32FieldMaxValue.ProtobufOutput
Required.Proto3.JsonInput.Uint32MapField.ProtobufOutput
Required.Proto3.JsonInput.Uint64FieldMaxValue.ProtobufOutput
Required.Proto3.JsonInput.Uint64FieldMaxValueNotQuoted.ProtobufOutput
Required.Proto3.JsonInput.Uint64MapField.ProtobufOutput
Required.Proto3.JsonInput.ValueAcceptBool.ProtobufOutput
Required.Proto3.JsonInput.ValueAcceptFloat.ProtobufOutput
Required.Proto3.JsonInput.ValueAcceptInteger.ProtobufOutput
Required.Proto3.JsonInput.ValueAcceptList.ProtobufOutput
Required.Proto3.JsonInput.ValueAcceptNull.ProtobufOutput
Required.Proto3.JsonInput.ValueAcceptObject.ProtobufOutput
Required.Proto3.JsonInput.ValueAcceptString.ProtobufOutput
##
## These failures need to be investigated
##
## See https://github.com/streem/pbandk/issues/22
Required.Proto2.ProtobufInput.RepeatedScalarMessageMerge.ProtobufOutput
Required.Proto3.ProtobufInput.RepeatedScalarMessageMerge.ProtobufOutput
## and https://github.com/streem/pbandk/issues/23
Required.Proto3.ProtobufInput.ValidDataRepeated.BOOL.PackedInput.ProtobufOutput
Required.Proto3.ProtobufInput.ValidDataRepeated.INT32.PackedInput.ProtobufOutput
Required.Proto3.ProtobufInput.ValidDataRepeated.UINT32.PackedInput.ProtobufOutput
Loading