143b2e0f9105848da6470458e7c04bf1fd7fcb25cIan Rogers/*
243b2e0f9105848da6470458e7c04bf1fd7fcb25cIan Rogers * Copyright (C) 2014 The Android Open Source Project
343b2e0f9105848da6470458e7c04bf1fd7fcb25cIan Rogers *
443b2e0f9105848da6470458e7c04bf1fd7fcb25cIan Rogers * Licensed under the Apache License, Version 2.0 (the "License");
543b2e0f9105848da6470458e7c04bf1fd7fcb25cIan Rogers * you may not use this file except in compliance with the License.
643b2e0f9105848da6470458e7c04bf1fd7fcb25cIan Rogers * You may obtain a copy of the License at
743b2e0f9105848da6470458e7c04bf1fd7fcb25cIan Rogers *
843b2e0f9105848da6470458e7c04bf1fd7fcb25cIan Rogers *      http://www.apache.org/licenses/LICENSE-2.0
943b2e0f9105848da6470458e7c04bf1fd7fcb25cIan Rogers *
1043b2e0f9105848da6470458e7c04bf1fd7fcb25cIan Rogers * Unless required by applicable law or agreed to in writing, software
1143b2e0f9105848da6470458e7c04bf1fd7fcb25cIan Rogers * distributed under the License is distributed on an "AS IS" BASIS,
1243b2e0f9105848da6470458e7c04bf1fd7fcb25cIan Rogers * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
1343b2e0f9105848da6470458e7c04bf1fd7fcb25cIan Rogers * See the License for the specific language governing permissions and
1443b2e0f9105848da6470458e7c04bf1fd7fcb25cIan Rogers * limitations under the License.
1543b2e0f9105848da6470458e7c04bf1fd7fcb25cIan Rogers */
1643b2e0f9105848da6470458e7c04bf1fd7fcb25cIan Rogers
1743b2e0f9105848da6470458e7c04bf1fd7fcb25cIan Rogers#include "hex_dump.h"
1843b2e0f9105848da6470458e7c04bf1fd7fcb25cIan Rogers
1943b2e0f9105848da6470458e7c04bf1fd7fcb25cIan Rogers#include "globals.h"
2043b2e0f9105848da6470458e7c04bf1fd7fcb25cIan Rogers
2143b2e0f9105848da6470458e7c04bf1fd7fcb25cIan Rogers#include "gtest/gtest.h"
2243b2e0f9105848da6470458e7c04bf1fd7fcb25cIan Rogers
2343b2e0f9105848da6470458e7c04bf1fd7fcb25cIan Rogers#include <stdint.h>
2443b2e0f9105848da6470458e7c04bf1fd7fcb25cIan Rogers
2543b2e0f9105848da6470458e7c04bf1fd7fcb25cIan Rogersnamespace art {
2643b2e0f9105848da6470458e7c04bf1fd7fcb25cIan Rogers
27cfa5c4805b9e756aaa142047306bad2b13107834Andreas Gampe#if defined(__LP64__)
28cfa5c4805b9e756aaa142047306bad2b13107834Andreas Gampe#define ZEROPREFIX "00000000"
29cfa5c4805b9e756aaa142047306bad2b13107834Andreas Gampe#else
30cfa5c4805b9e756aaa142047306bad2b13107834Andreas Gampe#define ZEROPREFIX
31cfa5c4805b9e756aaa142047306bad2b13107834Andreas Gampe#endif
32cfa5c4805b9e756aaa142047306bad2b13107834Andreas Gampe
3343b2e0f9105848da6470458e7c04bf1fd7fcb25cIan RogersTEST(HexDump, OneLine) {
3443b2e0f9105848da6470458e7c04bf1fd7fcb25cIan Rogers  const char* test_text = "0123456789abcdef";
3543b2e0f9105848da6470458e7c04bf1fd7fcb25cIan Rogers  std::ostringstream oss;
3643b2e0f9105848da6470458e7c04bf1fd7fcb25cIan Rogers  oss << HexDump(test_text, strlen(test_text), false, "");
3743b2e0f9105848da6470458e7c04bf1fd7fcb25cIan Rogers  EXPECT_STREQ(oss.str().c_str(),
38cfa5c4805b9e756aaa142047306bad2b13107834Andreas Gampe               ZEROPREFIX
3943b2e0f9105848da6470458e7c04bf1fd7fcb25cIan Rogers               "00000000: 30 31 32 33 34 35 36 37 38 39 61 62 63 64 65 66  0123456789abcdef");
4043b2e0f9105848da6470458e7c04bf1fd7fcb25cIan Rogers}
4143b2e0f9105848da6470458e7c04bf1fd7fcb25cIan Rogers
4243b2e0f9105848da6470458e7c04bf1fd7fcb25cIan RogersTEST(HexDump, MultiLine) {
4343b2e0f9105848da6470458e7c04bf1fd7fcb25cIan Rogers  const char* test_text = "0123456789abcdef0123456789ABCDEF";
4443b2e0f9105848da6470458e7c04bf1fd7fcb25cIan Rogers  std::ostringstream oss;
4543b2e0f9105848da6470458e7c04bf1fd7fcb25cIan Rogers  oss << HexDump(test_text, strlen(test_text), false, "");
4643b2e0f9105848da6470458e7c04bf1fd7fcb25cIan Rogers  EXPECT_STREQ(oss.str().c_str(),
47cfa5c4805b9e756aaa142047306bad2b13107834Andreas Gampe               ZEROPREFIX
4843b2e0f9105848da6470458e7c04bf1fd7fcb25cIan Rogers               "00000000: 30 31 32 33 34 35 36 37 38 39 61 62 63 64 65 66  0123456789abcdef\n"
49cfa5c4805b9e756aaa142047306bad2b13107834Andreas Gampe               ZEROPREFIX
5043b2e0f9105848da6470458e7c04bf1fd7fcb25cIan Rogers               "00000010: 30 31 32 33 34 35 36 37 38 39 41 42 43 44 45 46  0123456789ABCDEF");
5143b2e0f9105848da6470458e7c04bf1fd7fcb25cIan Rogers}
5243b2e0f9105848da6470458e7c04bf1fd7fcb25cIan Rogers
5343b2e0f9105848da6470458e7c04bf1fd7fcb25cIan Rogersuint64_t g16byte_aligned_number __attribute__ ((aligned(16)));  // NOLINT(whitespace/parens)
5443b2e0f9105848da6470458e7c04bf1fd7fcb25cIan RogersTEST(HexDump, ShowActualAddresses) {
5543b2e0f9105848da6470458e7c04bf1fd7fcb25cIan Rogers  g16byte_aligned_number = 0x6162636465666768;
5643b2e0f9105848da6470458e7c04bf1fd7fcb25cIan Rogers  std::ostringstream oss;
5743b2e0f9105848da6470458e7c04bf1fd7fcb25cIan Rogers  oss << HexDump(&g16byte_aligned_number, 8, true, "");
5843b2e0f9105848da6470458e7c04bf1fd7fcb25cIan Rogers  // Compare ignoring pointer.
5943b2e0f9105848da6470458e7c04bf1fd7fcb25cIan Rogers  EXPECT_STREQ(oss.str().c_str() + (kBitsPerWord / 4),
6043b2e0f9105848da6470458e7c04bf1fd7fcb25cIan Rogers               ": 68 67 66 65 64 63 62 61                          hgfedcba        ");
6143b2e0f9105848da6470458e7c04bf1fd7fcb25cIan Rogers}
6243b2e0f9105848da6470458e7c04bf1fd7fcb25cIan Rogers
6343b2e0f9105848da6470458e7c04bf1fd7fcb25cIan RogersTEST(HexDump, Prefix) {
6443b2e0f9105848da6470458e7c04bf1fd7fcb25cIan Rogers  const char* test_text = "0123456789abcdef";
6543b2e0f9105848da6470458e7c04bf1fd7fcb25cIan Rogers  std::ostringstream oss;
6643b2e0f9105848da6470458e7c04bf1fd7fcb25cIan Rogers  oss << HexDump(test_text, strlen(test_text), false, "test prefix: ");
6743b2e0f9105848da6470458e7c04bf1fd7fcb25cIan Rogers  EXPECT_STREQ(oss.str().c_str(),
68cfa5c4805b9e756aaa142047306bad2b13107834Andreas Gampe               "test prefix: " ZEROPREFIX "00000000: 30 31 32 33 34 35 36 37 38 39 61 62 63 64 65 66  "
6943b2e0f9105848da6470458e7c04bf1fd7fcb25cIan Rogers               "0123456789abcdef");
7043b2e0f9105848da6470458e7c04bf1fd7fcb25cIan Rogers}
7143b2e0f9105848da6470458e7c04bf1fd7fcb25cIan Rogers
7243b2e0f9105848da6470458e7c04bf1fd7fcb25cIan Rogers}  // namespace art
73