// Copyright 2015 The Chromium Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.

package org.chromium.mojo.bindings;

import android.support.test.filters.SmallTest;

import org.chromium.mojo.MojoTestCase;
import org.chromium.mojo.bindings.test.mojom.test_structs.MultiVersionStruct;
import org.chromium.mojo.bindings.test.mojom.test_structs.MultiVersionStructV0;
import org.chromium.mojo.bindings.test.mojom.test_structs.MultiVersionStructV1;
import org.chromium.mojo.bindings.test.mojom.test_structs.MultiVersionStructV3;
import org.chromium.mojo.bindings.test.mojom.test_structs.MultiVersionStructV5;
import org.chromium.mojo.bindings.test.mojom.test_structs.MultiVersionStructV7;
import org.chromium.mojo.bindings.test.mojom.test_structs.Rect;
import org.chromium.mojo.system.impl.CoreImpl;

/**
 * Testing generated classes with the [MinVersion] annotation. Struct in this test are from:
 * mojo/public/interfaces/bindings/tests/rect.mojom and
 * mojo/public/interfaces/bindings/tests/test_structs.mojom
 */
public class BindingsVersioningTest extends MojoTestCase {
    private static Rect newRect(int factor) {
        Rect rect = new Rect();
        rect.x = factor;
        rect.y = 2 * factor;
        rect.width = 10 * factor;
        rect.height = 20 * factor;
        return rect;
    }

    private static MultiVersionStruct newStruct() {
        MultiVersionStruct struct = new MultiVersionStruct();
        struct.fInt32 = 123;
        struct.fRect = newRect(5);
        struct.fString = "hello";
        struct.fArray = new byte[] {10, 9, 8};
        struct.fBool = true;
        struct.fInt16 = 256;
        return struct;
    }

    /**
     * Testing serializing old struct version to newer one.
     */
    @SmallTest
    public void testOldToNew() {
        {
            MultiVersionStructV0 v0 = new MultiVersionStructV0();
            v0.fInt32 = 123;
            MultiVersionStruct expected = new MultiVersionStruct();
            expected.fInt32 = 123;

            MultiVersionStruct output = MultiVersionStruct.deserialize(v0.serialize(null));
            assertEquals(expected, output);
            assertEquals(0, v0.getVersion());
            assertEquals(0, output.getVersion());
        }

        {
            MultiVersionStructV1 v1 = new MultiVersionStructV1();
            v1.fInt32 = 123;
            v1.fRect = newRect(5);
            MultiVersionStruct expected = new MultiVersionStruct();
            expected.fInt32 = 123;
            expected.fRect = newRect(5);

            MultiVersionStruct output = MultiVersionStruct.deserialize(v1.serialize(null));
            assertEquals(expected, output);
            assertEquals(1, v1.getVersion());
            assertEquals(1, output.getVersion());
        }

        {
            MultiVersionStructV3 v3 = new MultiVersionStructV3();
            v3.fInt32 = 123;
            v3.fRect = newRect(5);
            v3.fString = "hello";
            MultiVersionStruct expected = new MultiVersionStruct();
            expected.fInt32 = 123;
            expected.fRect = newRect(5);
            expected.fString = "hello";

            MultiVersionStruct output = MultiVersionStruct.deserialize(v3.serialize(null));
            assertEquals(expected, output);
            assertEquals(3, v3.getVersion());
            assertEquals(3, output.getVersion());
        }

        {
            MultiVersionStructV5 v5 = new MultiVersionStructV5();
            v5.fInt32 = 123;
            v5.fRect = newRect(5);
            v5.fString = "hello";
            v5.fArray = new byte[] {10, 9, 8};
            MultiVersionStruct expected = new MultiVersionStruct();
            expected.fInt32 = 123;
            expected.fRect = newRect(5);
            expected.fString = "hello";
            expected.fArray = new byte[] {10, 9, 8};

            MultiVersionStruct output = MultiVersionStruct.deserialize(v5.serialize(null));
            assertEquals(expected, output);
            assertEquals(5, v5.getVersion());
            assertEquals(5, output.getVersion());
        }

        {
            int expectedHandle = 42;
            MultiVersionStructV7 v7 = new MultiVersionStructV7();
            v7.fInt32 = 123;
            v7.fRect = newRect(5);
            v7.fString = "hello";
            v7.fArray = new byte[] {10, 9, 8};
            v7.fMessagePipe = CoreImpl.getInstance()
                                      .acquireNativeHandle(expectedHandle)
                                      .toMessagePipeHandle();
            v7.fBool = true;
            MultiVersionStruct expected = new MultiVersionStruct();
            expected.fInt32 = 123;
            expected.fRect = newRect(5);
            expected.fString = "hello";
            expected.fArray = new byte[] {10, 9, 8};
            expected.fBool = true;

            MultiVersionStruct output = MultiVersionStruct.deserialize(v7.serialize(null));

            // Handles must be tested separately.
            assertEquals(expectedHandle, output.fMessagePipe.releaseNativeHandle());
            output.fMessagePipe = expected.fMessagePipe;

            assertEquals(expected, output);
            assertEquals(7, v7.getVersion());
            assertEquals(7, output.getVersion());
        }
    }

    /**
     * Testing serializing new struct version to older one.
     */
    @SmallTest
    public void testNewToOld() {
        MultiVersionStruct struct = newStruct();
        {
            MultiVersionStructV0 expected = new MultiVersionStructV0();
            expected.fInt32 = 123;

            MultiVersionStructV0 output = MultiVersionStructV0.deserialize(struct.serialize(null));
            assertEquals(expected, output);
            assertEquals(9, output.getVersion());
        }

        {
            MultiVersionStructV1 expected = new MultiVersionStructV1();
            expected.fInt32 = 123;
            expected.fRect = newRect(5);

            MultiVersionStructV1 output = MultiVersionStructV1.deserialize(struct.serialize(null));
            assertEquals(expected, output);
            assertEquals(9, output.getVersion());
        }

        {
            MultiVersionStructV3 expected = new MultiVersionStructV3();
            expected.fInt32 = 123;
            expected.fRect = newRect(5);
            expected.fString = "hello";

            MultiVersionStructV3 output = MultiVersionStructV3.deserialize(struct.serialize(null));
            assertEquals(expected, output);
            assertEquals(9, output.getVersion());
        }

        {
            MultiVersionStructV5 expected = new MultiVersionStructV5();
            expected.fInt32 = 123;
            expected.fRect = newRect(5);
            expected.fString = "hello";
            expected.fArray = new byte[] {10, 9, 8};

            MultiVersionStructV5 output = MultiVersionStructV5.deserialize(struct.serialize(null));
            assertEquals(expected, output);
            assertEquals(9, output.getVersion());
        }

        {
            int expectedHandle = 42;
            MultiVersionStructV7 expected = new MultiVersionStructV7();
            expected.fInt32 = 123;
            expected.fRect = newRect(5);
            expected.fString = "hello";
            expected.fArray = new byte[] {10, 9, 8};
            expected.fBool = true;

            MultiVersionStruct input = struct;
            input.fMessagePipe = CoreImpl.getInstance()
                                         .acquireNativeHandle(expectedHandle)
                                         .toMessagePipeHandle();

            MultiVersionStructV7 output = MultiVersionStructV7.deserialize(input.serialize(null));

            assertEquals(expectedHandle, output.fMessagePipe.releaseNativeHandle());
            output.fMessagePipe = expected.fMessagePipe;

            assertEquals(expected, output);
            assertEquals(9, output.getVersion());
        }
    }
}
