// Copyright (c) 2013 The Chromium OS 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 <gtest/gtest.h>

#include "debugd/src/anonymizer_tool.h"

using std::map;
using std::string;

namespace debugd {

class AnonymizerToolTest : public testing::Test {
 protected:
  string AnonymizeMACAddresses(const string& input) {
    return anonymizer_.AnonymizeMACAddresses(input);
  }

  string AnonymizeCustomPatterns(const string& input) {
    return anonymizer_.AnonymizeCustomPatterns(input);
  }

  static string AnonymizeCustomPattern(
      const string& input, const string& pattern, map<string, string>* space) {
    return AnonymizerTool::AnonymizeCustomPattern(input, pattern, space);
  }

  AnonymizerTool anonymizer_;
};


TEST_F(AnonymizerToolTest, Anonymize) {
  EXPECT_EQ("", anonymizer_.Anonymize(""));
  EXPECT_EQ("foo\nbar\n", anonymizer_.Anonymize("foo\nbar\n"));

  // Make sure MAC address anonymization is invoked.
  EXPECT_EQ("02:46:8a:00:00:01", anonymizer_.Anonymize("02:46:8a:ce:13:57"));

  // Make sure custom pattern anonymization is invoked.
  EXPECT_EQ("Cell ID: '1'", AnonymizeCustomPatterns("Cell ID: 'A1B2'"));
}

TEST_F(AnonymizerToolTest, AnonymizeMACAddresses) {
  EXPECT_EQ("", AnonymizeMACAddresses(""));
  EXPECT_EQ("foo\nbar\n", AnonymizeMACAddresses("foo\nbar\n"));
  EXPECT_EQ("11:22:33:44:55", AnonymizeMACAddresses("11:22:33:44:55"));
  EXPECT_EQ("aa:bb:cc:00:00:01", AnonymizeMACAddresses("aa:bb:cc:dd:ee:ff"));
  EXPECT_EQ("00:00:00:00:00:00", AnonymizeMACAddresses("00:00:00:00:00:00"));
  EXPECT_EQ("ff:ff:ff:ff:ff:ff", AnonymizeMACAddresses("ff:ff:ff:ff:ff:ff"));
  EXPECT_EQ("BSSID: aa:bb:cc:00:00:01 in the middle\n"
            "bb:cc:dd:00:00:02 start of line\n"
            "end of line aa:bb:cc:00:00:01\n"
            "no match across lines aa:bb:cc:\n"
            "dd:ee:ff two on the same line:\n"
            "x bb:cc:dd:00:00:02 cc:dd:ee:00:00:03 x\n",
            AnonymizeMACAddresses("BSSID: aa:bb:cc:dd:ee:ff in the middle\n"
                                  "bb:cc:dd:ee:ff:00 start of line\n"
                                  "end of line aa:bb:cc:dd:ee:ff\n"
                                  "no match across lines aa:bb:cc:\n"
                                  "dd:ee:ff two on the same line:\n"
                                  "x bb:cc:dd:ee:ff:00 cc:dd:ee:ff:00:11 x\n"));
  EXPECT_EQ("Remember bb:cc:dd:00:00:02?",
            AnonymizeMACAddresses("Remember bB:Cc:DD:ee:ff:00?"));
}

TEST_F(AnonymizerToolTest, AnonymizeCustomPatterns) {
  EXPECT_EQ("", AnonymizeCustomPatterns(""));

  EXPECT_EQ("Cell ID: '1'", AnonymizeCustomPatterns("Cell ID: 'A1B2'"));
  EXPECT_EQ("Cell ID: '2'", AnonymizeCustomPatterns("Cell ID: 'C1D2'"));
  EXPECT_EQ("foo Cell ID: '1' bar",
            AnonymizeCustomPatterns("foo Cell ID: 'A1B2' bar"));

  EXPECT_EQ("foo Location area code: '1' bar",
            AnonymizeCustomPatterns("foo Location area code: 'A1B2' bar"));

  EXPECT_EQ("foo\na SSID='1' b\n'",
            AnonymizeCustomPatterns("foo\na SSID='Joe's' b\n'"));
  EXPECT_EQ("ssid '2'", AnonymizeCustomPatterns("ssid 'My AP'"));
  EXPECT_EQ("bssid 'aa:bb'", AnonymizeCustomPatterns("bssid 'aa:bb'"));

  EXPECT_EQ("Scan SSID - hexdump(len=6): 1\nfoo",
            AnonymizeCustomPatterns(
                "Scan SSID - hexdump(len=6): 47 6f 6f 67 6c 65\nfoo"));

  EXPECT_EQ("a\nb [SSID=1] [SSID=2] [SSID=foo\nbar] b",
            AnonymizeCustomPatterns(
                "a\nb [SSID=foo] [SSID=bar] [SSID=foo\nbar] b"));
}

TEST_F(AnonymizerToolTest, AnonymizeCustomPattern) {
  static const char kPattern[] = "(\\b(?i)id:? ')(\\d+)(')";
  map<string, string> space;
  EXPECT_EQ("", AnonymizeCustomPattern("", kPattern, &space));
  EXPECT_EQ("foo\nbar\n",
            AnonymizeCustomPattern("foo\nbar\n", kPattern, &space));
  EXPECT_EQ("id '1'", AnonymizeCustomPattern("id '2345'", kPattern, &space));
  EXPECT_EQ("id '2'", AnonymizeCustomPattern("id '1234'", kPattern, &space));
  EXPECT_EQ("id: '2'", AnonymizeCustomPattern("id: '1234'", kPattern, &space));
  EXPECT_EQ("ID: '1'", AnonymizeCustomPattern("ID: '2345'", kPattern, &space));
  EXPECT_EQ("x1 id '1' 1x id '2'\nid '1'\n",
            AnonymizeCustomPattern("x1 id '2345' 1x id '1234'\nid '2345'\n",
                                   kPattern, &space));
  space.clear();
  EXPECT_EQ("id '1'", AnonymizeCustomPattern("id '1234'", kPattern, &space));

  space.clear();
  EXPECT_EQ("x1z", AnonymizeCustomPattern("xyz", "()(y+)()", &space));
}

}  // namespace debugd
