• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 // Copyright (c) 2012 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file.
4 
5 #include "courgette/encoded_program.h"
6 
7 #include "courgette/streams.h"
8 #include "testing/gtest/include/gtest/gtest.h"
9 
TEST(EncodedProgramTest,Test)10 TEST(EncodedProgramTest, Test) {
11   //
12   // Create a simple program with a few addresses and references and
13   // check that the bits produced are as expected.
14   //
15   courgette::EncodedProgram* program = new courgette::EncodedProgram();
16 
17   uint32 base = 0x00900000;
18   program->set_image_base(base);
19 
20   EXPECT_TRUE(program->DefineRel32Label(5, 0));  // REL32 index 5 == base + 0
21   EXPECT_TRUE(program->DefineAbs32Label(7, 4));  // ABS32 index 7 == base + 4
22   program->EndLabels();
23 
24   EXPECT_TRUE(program->AddOrigin(0));  // Start at base.
25   EXPECT_TRUE(program->AddAbs32(7));
26   EXPECT_TRUE(program->AddRel32(5));
27 
28   // Serialize and deserialize.
29 
30   courgette::SinkStreamSet sinks;
31   EXPECT_TRUE(program->WriteTo(&sinks));
32   delete program;
33 
34   courgette::SinkStream sink;
35   bool can_collect = sinks.CopyTo(&sink);
36   EXPECT_TRUE(can_collect);
37 
38   const void* buffer = sink.Buffer();
39   size_t length = sink.Length();
40 
41   courgette::SourceStreamSet sources;
42   bool can_get_source_streams = sources.Init(buffer, length);
43   EXPECT_TRUE(can_get_source_streams);
44 
45   courgette::EncodedProgram *encoded2 = new courgette::EncodedProgram();
46   bool can_read = encoded2->ReadFrom(&sources);
47   EXPECT_TRUE(can_read);
48 
49   // Finally, try to assemble.
50   courgette::SinkStream assembled;
51   bool can_assemble = encoded2->AssembleTo(&assembled);
52   EXPECT_TRUE(can_assemble);
53   delete encoded2;
54 
55   const void* assembled_buffer = assembled.Buffer();
56   size_t assembled_length = assembled.Length();
57 
58   EXPECT_EQ(8U, assembled_length);
59 
60   static const uint8 golden[] = {
61     0x04, 0x00, 0x90, 0x00,  // ABS32 to base + 4
62     0xF8, 0xFF, 0xFF, 0xFF   // REL32 from next line to base + 2
63   };
64 
65   EXPECT_EQ(0, memcmp(assembled_buffer, golden, 8));
66 }
67