15c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu// Copyright 2014 The Chromium Authors. All rights reserved.
25c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu// Use of this source code is governed by a BSD-style license that can be
35c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu// found in the LICENSE file.
45c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu
55c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu#include "base/basictypes.h"
65c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu#include "base/float_util.h"
75c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu#include "base/memory/scoped_ptr.h"
85c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu#include "content/common/android/gin_java_bridge_value.h"
95c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu#include "testing/gtest/include/gtest/gtest.h"
105c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu
115c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liunamespace content {
125c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu
135c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liuclass GinJavaBridgeValueTest : public testing::Test {
145c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu};
155c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu
165c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo LiuTEST_F(GinJavaBridgeValueTest, BasicValues) {
175c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  float native_float;
185c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  int32 native_object_id;
195c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu
205c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  scoped_ptr<base::BinaryValue> undefined(
215c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu      GinJavaBridgeValue::CreateUndefinedValue());
225c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  ASSERT_TRUE(undefined.get());
235c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  EXPECT_TRUE(GinJavaBridgeValue::ContainsGinJavaBridgeValue(undefined.get()));
245c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  scoped_ptr<const GinJavaBridgeValue> undefined_value(
255c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu      GinJavaBridgeValue::FromValue(undefined.get()));
265c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  ASSERT_TRUE(undefined_value.get());
275c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  EXPECT_TRUE(undefined_value->IsType(GinJavaBridgeValue::TYPE_UNDEFINED));
285c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu
295c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  EXPECT_FALSE(undefined_value->GetAsNonFinite(&native_float));
305c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  EXPECT_FALSE(undefined_value->GetAsObjectID(&native_object_id));
315c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu
325c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  scoped_ptr<base::BinaryValue> float_infinity(
335c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu      GinJavaBridgeValue::CreateNonFiniteValue(
345c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu          std::numeric_limits<float>::infinity()));
355c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  ASSERT_TRUE(float_infinity.get());
365c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  EXPECT_TRUE(
375c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu      GinJavaBridgeValue::ContainsGinJavaBridgeValue(float_infinity.get()));
385c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  scoped_ptr<const GinJavaBridgeValue> float_infinity_value(
395c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu      GinJavaBridgeValue::FromValue(float_infinity.get()));
405c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  ASSERT_TRUE(float_infinity_value.get());
415c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  EXPECT_TRUE(float_infinity_value->IsType(GinJavaBridgeValue::TYPE_NONFINITE));
425c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  EXPECT_TRUE(float_infinity_value->GetAsNonFinite(&native_float));
435c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  EXPECT_FALSE(base::IsFinite(native_float));
445c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  EXPECT_FALSE(base::IsNaN(native_float));
455c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu
465c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  EXPECT_FALSE(undefined_value->GetAsObjectID(&native_object_id));
475c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu
485c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  scoped_ptr<base::BinaryValue> double_infinity(
495c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu      GinJavaBridgeValue::CreateNonFiniteValue(
505c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu          std::numeric_limits<double>::infinity()));
515c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  ASSERT_TRUE(double_infinity.get());
525c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  EXPECT_TRUE(
535c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu      GinJavaBridgeValue::ContainsGinJavaBridgeValue(double_infinity.get()));
545c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  scoped_ptr<const GinJavaBridgeValue> double_infinity_value(
555c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu      GinJavaBridgeValue::FromValue(double_infinity.get()));
565c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  ASSERT_TRUE(double_infinity_value.get());
575c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  EXPECT_TRUE(
585c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu      double_infinity_value->IsType(GinJavaBridgeValue::TYPE_NONFINITE));
595c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  EXPECT_TRUE(double_infinity_value->GetAsNonFinite(&native_float));
605c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  EXPECT_FALSE(base::IsFinite(native_float));
615c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  EXPECT_FALSE(base::IsNaN(native_float));
625c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu
635c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  EXPECT_FALSE(undefined_value->GetAsObjectID(&native_object_id));
645c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu
655c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  scoped_ptr<base::BinaryValue> object_id(
665c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu      GinJavaBridgeValue::CreateObjectIDValue(42));
675c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  ASSERT_TRUE(object_id.get());
685c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  EXPECT_TRUE(GinJavaBridgeValue::ContainsGinJavaBridgeValue(object_id.get()));
695c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  scoped_ptr<const GinJavaBridgeValue> object_id_value(
705c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu      GinJavaBridgeValue::FromValue(object_id.get()));
715c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  ASSERT_TRUE(object_id_value.get());
725c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  EXPECT_TRUE(object_id_value->IsType(GinJavaBridgeValue::TYPE_OBJECT_ID));
735c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  EXPECT_TRUE(object_id_value->GetAsObjectID(&native_object_id));
745c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  EXPECT_EQ(42, native_object_id);
755c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu
765c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  EXPECT_FALSE(undefined_value->GetAsNonFinite(&native_float));
775c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu}
785c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu
795c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo LiuTEST_F(GinJavaBridgeValueTest, BrokenValues) {
805c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  scoped_ptr<base::Value> non_binary(new base::FundamentalValue(42));
815c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  EXPECT_FALSE(
825c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu      GinJavaBridgeValue::ContainsGinJavaBridgeValue(non_binary.get()));
835c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu
845c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  const char dummy_data[] = "\000\001\002\003\004\005\006\007\010\011\012\013";
855c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  scoped_ptr<base::BinaryValue> broken_binary(
865c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu      base::BinaryValue::CreateWithCopiedBuffer(dummy_data,
875c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu                                                sizeof(dummy_data)));
885c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  EXPECT_FALSE(
895c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu      GinJavaBridgeValue::ContainsGinJavaBridgeValue(broken_binary.get()));
905c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu}
915c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu
925c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu}  // namespace
93