1 // Copyright 2015 The Chromium Authors. All rights reserved. 2 // Use of this source code is governed by a BSD-style license that can be 3 // found in the LICENSE file. 4 5 package org.chromium.mojo.bindings; 6 7 import android.test.suitebuilder.annotation.SmallTest; 8 9 import org.chromium.mojo.MojoTestCase; 10 import org.chromium.mojo.bindings.test.mojom.test_structs.MultiVersionStruct; 11 import org.chromium.mojo.bindings.test.mojom.test_structs.MultiVersionStructV0; 12 import org.chromium.mojo.bindings.test.mojom.test_structs.MultiVersionStructV1; 13 import org.chromium.mojo.bindings.test.mojom.test_structs.MultiVersionStructV3; 14 import org.chromium.mojo.bindings.test.mojom.test_structs.MultiVersionStructV5; 15 import org.chromium.mojo.bindings.test.mojom.test_structs.MultiVersionStructV7; 16 import org.chromium.mojo.bindings.test.mojom.test_structs.Rect; 17 import org.chromium.mojo.system.impl.CoreImpl; 18 19 /** 20 * Testing generated classes with the [MinVersion] annotation. Struct in this test are from: 21 * mojo/public/interfaces/bindings/tests/rect.mojom and 22 * mojo/public/interfaces/bindings/tests/test_structs.mojom 23 */ 24 public class BindingsVersioningTest extends MojoTestCase { newRect(int factor)25 private static Rect newRect(int factor) { 26 Rect rect = new Rect(); 27 rect.x = factor; 28 rect.y = 2 * factor; 29 rect.width = 10 * factor; 30 rect.height = 20 * factor; 31 return rect; 32 } 33 newStruct()34 private static MultiVersionStruct newStruct() { 35 MultiVersionStruct struct = new MultiVersionStruct(); 36 struct.fInt32 = 123; 37 struct.fRect = newRect(5); 38 struct.fString = "hello"; 39 struct.fArray = new byte[] {10, 9, 8}; 40 struct.fBool = true; 41 struct.fInt16 = 256; 42 return struct; 43 } 44 45 /** 46 * Testing serializing old struct version to newer one. 47 */ 48 @SmallTest testOldToNew()49 public void testOldToNew() { 50 { 51 MultiVersionStructV0 v0 = new MultiVersionStructV0(); 52 v0.fInt32 = 123; 53 MultiVersionStruct expected = new MultiVersionStruct(); 54 expected.fInt32 = 123; 55 56 MultiVersionStruct output = MultiVersionStruct.deserialize(v0.serialize(null)); 57 assertEquals(expected, output); 58 assertEquals(0, v0.getVersion()); 59 assertEquals(0, output.getVersion()); 60 } 61 62 { 63 MultiVersionStructV1 v1 = new MultiVersionStructV1(); 64 v1.fInt32 = 123; 65 v1.fRect = newRect(5); 66 MultiVersionStruct expected = new MultiVersionStruct(); 67 expected.fInt32 = 123; 68 expected.fRect = newRect(5); 69 70 MultiVersionStruct output = MultiVersionStruct.deserialize(v1.serialize(null)); 71 assertEquals(expected, output); 72 assertEquals(1, v1.getVersion()); 73 assertEquals(1, output.getVersion()); 74 } 75 76 { 77 MultiVersionStructV3 v3 = new MultiVersionStructV3(); 78 v3.fInt32 = 123; 79 v3.fRect = newRect(5); 80 v3.fString = "hello"; 81 MultiVersionStruct expected = new MultiVersionStruct(); 82 expected.fInt32 = 123; 83 expected.fRect = newRect(5); 84 expected.fString = "hello"; 85 86 MultiVersionStruct output = MultiVersionStruct.deserialize(v3.serialize(null)); 87 assertEquals(expected, output); 88 assertEquals(3, v3.getVersion()); 89 assertEquals(3, output.getVersion()); 90 } 91 92 { 93 MultiVersionStructV5 v5 = new MultiVersionStructV5(); 94 v5.fInt32 = 123; 95 v5.fRect = newRect(5); 96 v5.fString = "hello"; 97 v5.fArray = new byte[] {10, 9, 8}; 98 MultiVersionStruct expected = new MultiVersionStruct(); 99 expected.fInt32 = 123; 100 expected.fRect = newRect(5); 101 expected.fString = "hello"; 102 expected.fArray = new byte[] {10, 9, 8}; 103 104 MultiVersionStruct output = MultiVersionStruct.deserialize(v5.serialize(null)); 105 assertEquals(expected, output); 106 assertEquals(5, v5.getVersion()); 107 assertEquals(5, output.getVersion()); 108 } 109 110 { 111 int expectedHandle = 42; 112 MultiVersionStructV7 v7 = new MultiVersionStructV7(); 113 v7.fInt32 = 123; 114 v7.fRect = newRect(5); 115 v7.fString = "hello"; 116 v7.fArray = new byte[] {10, 9, 8}; 117 v7.fMessagePipe = CoreImpl.getInstance() 118 .acquireNativeHandle(expectedHandle) 119 .toMessagePipeHandle(); 120 v7.fBool = true; 121 MultiVersionStruct expected = new MultiVersionStruct(); 122 expected.fInt32 = 123; 123 expected.fRect = newRect(5); 124 expected.fString = "hello"; 125 expected.fArray = new byte[] {10, 9, 8}; 126 expected.fBool = true; 127 128 MultiVersionStruct output = MultiVersionStruct.deserialize(v7.serialize(null)); 129 130 // Handles must be tested separately. 131 assertEquals(expectedHandle, output.fMessagePipe.releaseNativeHandle()); 132 output.fMessagePipe = expected.fMessagePipe; 133 134 assertEquals(expected, output); 135 assertEquals(7, v7.getVersion()); 136 assertEquals(7, output.getVersion()); 137 } 138 } 139 140 /** 141 * Testing serializing new struct version to older one. 142 */ 143 @SmallTest testNewToOld()144 public void testNewToOld() { 145 MultiVersionStruct struct = newStruct(); 146 { 147 MultiVersionStructV0 expected = new MultiVersionStructV0(); 148 expected.fInt32 = 123; 149 150 MultiVersionStructV0 output = MultiVersionStructV0.deserialize(struct.serialize(null)); 151 assertEquals(expected, output); 152 assertEquals(9, output.getVersion()); 153 } 154 155 { 156 MultiVersionStructV1 expected = new MultiVersionStructV1(); 157 expected.fInt32 = 123; 158 expected.fRect = newRect(5); 159 160 MultiVersionStructV1 output = MultiVersionStructV1.deserialize(struct.serialize(null)); 161 assertEquals(expected, output); 162 assertEquals(9, output.getVersion()); 163 } 164 165 { 166 MultiVersionStructV3 expected = new MultiVersionStructV3(); 167 expected.fInt32 = 123; 168 expected.fRect = newRect(5); 169 expected.fString = "hello"; 170 171 MultiVersionStructV3 output = MultiVersionStructV3.deserialize(struct.serialize(null)); 172 assertEquals(expected, output); 173 assertEquals(9, output.getVersion()); 174 } 175 176 { 177 MultiVersionStructV5 expected = new MultiVersionStructV5(); 178 expected.fInt32 = 123; 179 expected.fRect = newRect(5); 180 expected.fString = "hello"; 181 expected.fArray = new byte[] {10, 9, 8}; 182 183 MultiVersionStructV5 output = MultiVersionStructV5.deserialize(struct.serialize(null)); 184 assertEquals(expected, output); 185 assertEquals(9, output.getVersion()); 186 } 187 188 { 189 int expectedHandle = 42; 190 MultiVersionStructV7 expected = new MultiVersionStructV7(); 191 expected.fInt32 = 123; 192 expected.fRect = newRect(5); 193 expected.fString = "hello"; 194 expected.fArray = new byte[] {10, 9, 8}; 195 expected.fBool = true; 196 197 MultiVersionStruct input = struct; 198 input.fMessagePipe = CoreImpl.getInstance() 199 .acquireNativeHandle(expectedHandle) 200 .toMessagePipeHandle(); 201 202 MultiVersionStructV7 output = MultiVersionStructV7.deserialize(input.serialize(null)); 203 204 assertEquals(expectedHandle, output.fMessagePipe.releaseNativeHandle()); 205 output.fMessagePipe = expected.fMessagePipe; 206 207 assertEquals(expected, output); 208 assertEquals(9, output.getVersion()); 209 } 210 } 211 } 212