blob: b030195e8a5b9e0c02a97d2c8cd2be4aaa482f8a [file] [log] [blame]
// Copyright 2017 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.
#include "chrome/browser/android/physical_web/eddystone_encoder_bridge.h"
#include "base/android/jni_android.h"
#include "base/android/jni_array.h"
#include "base/android/jni_string.h"
#include "testing/gtest/include/gtest/gtest.h"
using base::android::JavaParamRef;
using base::android::ScopedJavaLocalRef;
using base::android::ToJavaByteArray;
class EddystoneEncoderBridgeTest : public testing::Test {
public:
EddystoneEncoderBridgeTest() {}
~EddystoneEncoderBridgeTest() override {}
void SetUp() override { env_ = base::android::AttachCurrentThread(); }
void TearDown() override {}
JNIEnv* Env();
jstring JavaString(const std::string& value);
bool ScopedJavaLocalRefJByteArrayEquals(JNIEnv* env,
ScopedJavaLocalRef<jbyteArray> a,
ScopedJavaLocalRef<jbyteArray> b);
private:
JNIEnv* env_;
};
JNIEnv* EddystoneEncoderBridgeTest::Env() {
return env_;
}
jstring EddystoneEncoderBridgeTest::JavaString(const std::string& value) {
return base::android::ConvertUTF8ToJavaString(Env(), value).Release();
}
bool EddystoneEncoderBridgeTest::ScopedJavaLocalRefJByteArrayEquals(
JNIEnv* env,
ScopedJavaLocalRef<jbyteArray> a,
ScopedJavaLocalRef<jbyteArray> b) {
jbyteArray a_byte_array = a.obj();
jbyteArray b_byte_array = b.obj();
int a_len = env->GetArrayLength(a_byte_array);
if (a_len != env->GetArrayLength(b_byte_array)) {
return false;
}
jbyte* a_elems = env->GetByteArrayElements(a_byte_array, NULL);
jbyte* b_elems = env->GetByteArrayElements(b_byte_array, NULL);
bool cmp = memcmp(a_elems, b_elems, a_len) == 0;
env->ReleaseByteArrayElements(a_byte_array, a_elems, JNI_ABORT);
env->ReleaseByteArrayElements(b_byte_array, b_elems, JNI_ABORT);
return cmp;
}
TEST_F(EddystoneEncoderBridgeTest, TestNullUrl) {
ScopedJavaLocalRef<jbyteArray> actual =
EncodeUrlForTesting(Env(), JavaParamRef<jobject>(nullptr),
JavaParamRef<jstring>(Env(), nullptr));
EXPECT_TRUE(Env()->ExceptionCheck());
}
TEST_F(EddystoneEncoderBridgeTest, TestInvalidUrl) {
std::string url = "Wrong!";
ScopedJavaLocalRef<jbyteArray> actual =
EncodeUrlForTesting(Env(), JavaParamRef<jobject>(nullptr),
JavaParamRef<jstring>(Env(), JavaString(url)));
EXPECT_TRUE(Env()->ExceptionCheck());
}
TEST_F(EddystoneEncoderBridgeTest, TestValidUrl) {
std::string url = "https://www.example.com/";
uint8_t expected_array[] = {0x01, // "https://www."
0x65, 0x78, 0x61, 0x6d,
0x70, 0x6c, 0x65, // "example"
0x00};
size_t expected_array_length = sizeof(expected_array) / sizeof(uint8_t);
ScopedJavaLocalRef<jbyteArray> expected =
ToJavaByteArray(Env(), &expected_array[0], expected_array_length);
ScopedJavaLocalRef<jbyteArray> actual =
EncodeUrlForTesting(Env(), JavaParamRef<jobject>(nullptr),
JavaParamRef<jstring>(Env(), JavaString(url)));
EXPECT_TRUE(ScopedJavaLocalRefJByteArrayEquals(Env(), expected, actual));
EXPECT_FALSE(Env()->ExceptionCheck());
}