Home | History | Annotate | Download | only in courgette
      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 
     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