// Copyright (c) 2020 The Chromium Embedded Framework 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 "libcef/browser/devtools/devtools_util.h"

#include "testing/gtest/include/gtest/gtest.h"

using namespace devtools_util;

TEST(DevToolsUtil, ProtocolParser_IsValidMessage) {
  // Empty dictionary is not valid.
  EXPECT_FALSE(ProtocolParser::IsValidMessage(""));
  EXPECT_FALSE(ProtocolParser::IsValidMessage("{}"));

  // Incorrectly formatted dictionary is not valid.
  EXPECT_FALSE(ProtocolParser::IsValidMessage("{ ]"));

  // Everything else is valid (we don't verify JSON structure).
  EXPECT_TRUE(ProtocolParser::IsValidMessage("{ }"));
  EXPECT_TRUE(ProtocolParser::IsValidMessage("{blah blah}"));
  EXPECT_TRUE(ProtocolParser::IsValidMessage("{method:\"foobar\"}"));
}

TEST(DevToolsUtil, ProtocolParser_Initialize_IsFailure_Unknown) {
  ProtocolParser parser;
  EXPECT_FALSE(parser.IsInitialized());

  // Empty message is invalid.
  EXPECT_TRUE(parser.Initialize(""));
  EXPECT_TRUE(parser.IsInitialized());
  EXPECT_TRUE(parser.IsFailure());

  parser.Reset();
  EXPECT_FALSE(parser.IsInitialized());

  // Empty dictionary is invalid.
  EXPECT_TRUE(parser.Initialize("{}"));
  EXPECT_TRUE(parser.IsInitialized());
  EXPECT_TRUE(parser.IsFailure());

  parser.Reset();
  EXPECT_FALSE(parser.IsInitialized());

  // Unrecognized dictionary type is invalid.
  EXPECT_TRUE(parser.Initialize("{blah blah}"));
  EXPECT_TRUE(parser.IsInitialized());
  EXPECT_TRUE(parser.IsFailure());
}

TEST(DevToolsUtil, ProtocolParser_Initialize_IsFailure_EventMalformed) {
  ProtocolParser parser;
  EXPECT_FALSE(parser.IsInitialized());

  // Empty method is invalid.
  EXPECT_TRUE(parser.Initialize("{\"method\":\"\"}"));
  EXPECT_TRUE(parser.IsInitialized());
  EXPECT_TRUE(parser.IsFailure());

  parser.Reset();
  EXPECT_FALSE(parser.IsInitialized());

  // Unrecognized value is invalid.
  EXPECT_TRUE(parser.Initialize("{\"method\":\"foo\",oops:false}"));
  EXPECT_TRUE(parser.IsInitialized());
  EXPECT_TRUE(parser.IsFailure());

  parser.Reset();
  EXPECT_FALSE(parser.IsInitialized());

  // Params must be a dictionary.
  EXPECT_TRUE(parser.Initialize("{\"method\":\",params:[]}"));
  EXPECT_TRUE(parser.IsInitialized());
  EXPECT_TRUE(parser.IsFailure());
}

TEST(DevToolsUtil, ProtocolParser_Initialize_IsEvent) {
  ProtocolParser parser;
  EXPECT_FALSE(parser.IsInitialized());

  // Method without params is valid.
  std::string message = "{\"method\":\"Test.myMethod\"}";
  EXPECT_TRUE(parser.Initialize(message));
  EXPECT_TRUE(parser.IsInitialized());
  EXPECT_TRUE(parser.IsEvent());
  EXPECT_STREQ("Test.myMethod", parser.method_.as_string().data());
  EXPECT_TRUE(parser.params_.empty());

  parser.Reset();
  EXPECT_FALSE(parser.IsInitialized());

  // Method with empty params dictionary is valid.
  message = "{\"method\":\"Test.myMethod2\",\"params\":{}}";
  EXPECT_TRUE(parser.Initialize(message));
  EXPECT_TRUE(parser.IsInitialized());
  EXPECT_TRUE(parser.IsEvent());
  EXPECT_STREQ("Test.myMethod2", parser.method_.as_string().data());
  EXPECT_STREQ("{}", parser.params_.as_string().data());

  parser.Reset();
  EXPECT_FALSE(parser.IsInitialized());

  // Method with non-empty params dictionary is valid.
  message = "{\"method\":\"Test.myMethod3\",\"params\":{\"foo\":\"bar\"}}";
  EXPECT_TRUE(parser.Initialize(message));
  EXPECT_TRUE(parser.IsInitialized());
  EXPECT_TRUE(parser.IsEvent());
  EXPECT_STREQ("Test.myMethod3", parser.method_.as_string().data());
  EXPECT_STREQ("{\"foo\":\"bar\"}", parser.params_.as_string().data());
}

TEST(DevToolsUtil, ProtocolParser_Initialize_IsFailure_ResultMalformed) {
  ProtocolParser parser;
  EXPECT_FALSE(parser.IsInitialized());

  // Empty ID is invalid.
  EXPECT_TRUE(parser.Initialize("{\"id\":,result:{}}"));
  EXPECT_TRUE(parser.IsInitialized());
  EXPECT_TRUE(parser.IsFailure());

  parser.Reset();
  EXPECT_FALSE(parser.IsInitialized());

  // Missing result or error value is invalid.
  EXPECT_TRUE(parser.Initialize("{\"id\":1}"));
  EXPECT_TRUE(parser.IsInitialized());
  EXPECT_TRUE(parser.IsFailure());

  parser.Reset();
  EXPECT_FALSE(parser.IsInitialized());

  // Unrecognized value is invalid.
  EXPECT_TRUE(parser.Initialize("{\"id\":1,oops:false}"));
  EXPECT_TRUE(parser.IsInitialized());
  EXPECT_TRUE(parser.IsFailure());

  parser.Reset();
  EXPECT_FALSE(parser.IsInitialized());

  // Result must be a dictionary.
  EXPECT_TRUE(parser.Initialize("{\"id\":1,\"result\":[]}"));
  EXPECT_TRUE(parser.IsInitialized());
  EXPECT_TRUE(parser.IsFailure());

  parser.Reset();
  EXPECT_FALSE(parser.IsInitialized());

  // Error must be a dictionary.
  EXPECT_TRUE(parser.Initialize("{\"id\":1,\"error\":[]}"));
  EXPECT_TRUE(parser.IsInitialized());
  EXPECT_TRUE(parser.IsFailure());
}

TEST(DevToolsUtil, ProtocolParser_Initialize_IsResult_Result) {
  ProtocolParser parser;
  EXPECT_FALSE(parser.IsInitialized());

  // Id with empty result dictionary is valid.
  std::string message = "{\"id\":1,\"result\":{}}";
  EXPECT_TRUE(parser.Initialize(message));
  EXPECT_TRUE(parser.IsInitialized());
  EXPECT_TRUE(parser.IsResult());
  EXPECT_EQ(1, parser.message_id_);
  EXPECT_TRUE(parser.success_);
  EXPECT_STREQ("{}", parser.params_.as_string().data());

  parser.Reset();
  EXPECT_FALSE(parser.IsInitialized());

  // Id with non-empty result dictionary is valid.
  message = "{\"id\":2,\"result\":{\"foo\":\"bar\"}}";
  EXPECT_TRUE(parser.Initialize(message));
  EXPECT_TRUE(parser.IsInitialized());
  EXPECT_TRUE(parser.IsResult());
  EXPECT_EQ(2, parser.message_id_);
  EXPECT_TRUE(parser.success_);
  EXPECT_STREQ("{\"foo\":\"bar\"}", parser.params_.as_string().data());
}

TEST(DevToolsUtil, ProtocolParser_Initialize_IsResult_Error) {
  ProtocolParser parser;
  EXPECT_FALSE(parser.IsInitialized());

  // Id with empty error dictionary is valid.
  std::string message = "{\"id\":1,\"error\":{}}";
  EXPECT_TRUE(parser.Initialize(message));
  EXPECT_TRUE(parser.IsInitialized());
  EXPECT_TRUE(parser.IsResult());
  EXPECT_EQ(1, parser.message_id_);
  EXPECT_FALSE(parser.success_);
  EXPECT_STREQ("{}", parser.params_.as_string().data());

  parser.Reset();
  EXPECT_FALSE(parser.IsInitialized());

  // Id with non-empty error dictionary is valid.
  message = "{\"id\":2,\"error\":{\"foo\":\"bar\"}}";
  EXPECT_TRUE(parser.Initialize(message));
  EXPECT_TRUE(parser.IsInitialized());
  EXPECT_TRUE(parser.IsResult());
  EXPECT_EQ(2, parser.message_id_);
  EXPECT_FALSE(parser.success_);
  EXPECT_STREQ("{\"foo\":\"bar\"}", parser.params_.as_string().data());
}
