106741cbc25cd4227a9fba40dfd0273bfcc1a587aBen Murdoch// Copyright (c) 2006-2008 The Chromium Authors. All rights reserved.
206741cbc25cd4227a9fba40dfd0273bfcc1a587aBen Murdoch// Use of this source code is governed by a BSD-style license that can be
306741cbc25cd4227a9fba40dfd0273bfcc1a587aBen Murdoch// found in the LICENSE file.
406741cbc25cd4227a9fba40dfd0273bfcc1a587aBen Murdoch
506741cbc25cd4227a9fba40dfd0273bfcc1a587aBen Murdoch#if defined(USE_SYSTEM_LIBBZ2)
606741cbc25cd4227a9fba40dfd0273bfcc1a587aBen Murdoch#include <bzlib.h>
706741cbc25cd4227a9fba40dfd0273bfcc1a587aBen Murdoch#else
806741cbc25cd4227a9fba40dfd0273bfcc1a587aBen Murdoch#include "third_party/bzip2/bzlib.h"
906741cbc25cd4227a9fba40dfd0273bfcc1a587aBen Murdoch#endif
1006741cbc25cd4227a9fba40dfd0273bfcc1a587aBen Murdoch
1106741cbc25cd4227a9fba40dfd0273bfcc1a587aBen Murdoch#include "base/basictypes.h"
1206741cbc25cd4227a9fba40dfd0273bfcc1a587aBen Murdoch#include "testing/gtest/include/gtest/gtest.h"
1306741cbc25cd4227a9fba40dfd0273bfcc1a587aBen Murdoch
1406741cbc25cd4227a9fba40dfd0273bfcc1a587aBen Murdochnamespace {
1506741cbc25cd4227a9fba40dfd0273bfcc1a587aBen Murdoch  class Bzip2Test : public testing::Test {
1606741cbc25cd4227a9fba40dfd0273bfcc1a587aBen Murdoch  };
1706741cbc25cd4227a9fba40dfd0273bfcc1a587aBen Murdoch};
1806741cbc25cd4227a9fba40dfd0273bfcc1a587aBen Murdoch
1906741cbc25cd4227a9fba40dfd0273bfcc1a587aBen Murdoch// This test does a simple round trip to test that the bzip2 library is
2006741cbc25cd4227a9fba40dfd0273bfcc1a587aBen Murdoch// present and working.
2106741cbc25cd4227a9fba40dfd0273bfcc1a587aBen MurdochTEST(Bzip2Test, Roundtrip) {
2206741cbc25cd4227a9fba40dfd0273bfcc1a587aBen Murdoch  char input[] = "Test Data, More Test Data, Even More Data of Test";
2306741cbc25cd4227a9fba40dfd0273bfcc1a587aBen Murdoch  char output[256];
2406741cbc25cd4227a9fba40dfd0273bfcc1a587aBen Murdoch
2506741cbc25cd4227a9fba40dfd0273bfcc1a587aBen Murdoch  memset(output, 0, arraysize(output));
2606741cbc25cd4227a9fba40dfd0273bfcc1a587aBen Murdoch
2706741cbc25cd4227a9fba40dfd0273bfcc1a587aBen Murdoch  bz_stream stream;
2806741cbc25cd4227a9fba40dfd0273bfcc1a587aBen Murdoch  stream.bzalloc = NULL;
2906741cbc25cd4227a9fba40dfd0273bfcc1a587aBen Murdoch  stream.bzfree = NULL;
3006741cbc25cd4227a9fba40dfd0273bfcc1a587aBen Murdoch  stream.opaque = NULL;
3106741cbc25cd4227a9fba40dfd0273bfcc1a587aBen Murdoch  int result = BZ2_bzCompressInit(&stream,
3206741cbc25cd4227a9fba40dfd0273bfcc1a587aBen Murdoch                                  9,   // 900k block size
3306741cbc25cd4227a9fba40dfd0273bfcc1a587aBen Murdoch                                  0,   // quiet
3406741cbc25cd4227a9fba40dfd0273bfcc1a587aBen Murdoch                                  0);  // default work factor
3506741cbc25cd4227a9fba40dfd0273bfcc1a587aBen Murdoch  ASSERT_EQ(BZ_OK, result);
3606741cbc25cd4227a9fba40dfd0273bfcc1a587aBen Murdoch
3706741cbc25cd4227a9fba40dfd0273bfcc1a587aBen Murdoch  stream.next_in = input;
3806741cbc25cd4227a9fba40dfd0273bfcc1a587aBen Murdoch  stream.avail_in = arraysize(input) - 1;
3906741cbc25cd4227a9fba40dfd0273bfcc1a587aBen Murdoch  stream.next_out = output;
4006741cbc25cd4227a9fba40dfd0273bfcc1a587aBen Murdoch  stream.avail_out = arraysize(output);
4106741cbc25cd4227a9fba40dfd0273bfcc1a587aBen Murdoch  do {
4206741cbc25cd4227a9fba40dfd0273bfcc1a587aBen Murdoch    result = BZ2_bzCompress(&stream, BZ_FINISH);
4306741cbc25cd4227a9fba40dfd0273bfcc1a587aBen Murdoch  } while (result == BZ_FINISH_OK);
4406741cbc25cd4227a9fba40dfd0273bfcc1a587aBen Murdoch  ASSERT_EQ(BZ_STREAM_END, result);
4506741cbc25cd4227a9fba40dfd0273bfcc1a587aBen Murdoch  result = BZ2_bzCompressEnd(&stream);
4606741cbc25cd4227a9fba40dfd0273bfcc1a587aBen Murdoch  ASSERT_EQ(BZ_OK, result);
4706741cbc25cd4227a9fba40dfd0273bfcc1a587aBen Murdoch  int written = stream.total_out_lo32;
4806741cbc25cd4227a9fba40dfd0273bfcc1a587aBen Murdoch
4906741cbc25cd4227a9fba40dfd0273bfcc1a587aBen Murdoch  // Make sure we wrote something; otherwise not sure what to expect
5006741cbc25cd4227a9fba40dfd0273bfcc1a587aBen Murdoch  ASSERT_GT(written, 0);
5106741cbc25cd4227a9fba40dfd0273bfcc1a587aBen Murdoch
5206741cbc25cd4227a9fba40dfd0273bfcc1a587aBen Murdoch  // Now decompress and check that we got the same thing.
5306741cbc25cd4227a9fba40dfd0273bfcc1a587aBen Murdoch  result = BZ2_bzDecompressInit(&stream, 0, 0);
5406741cbc25cd4227a9fba40dfd0273bfcc1a587aBen Murdoch  ASSERT_EQ(BZ_OK, result);
5506741cbc25cd4227a9fba40dfd0273bfcc1a587aBen Murdoch  char output2[256];
5606741cbc25cd4227a9fba40dfd0273bfcc1a587aBen Murdoch  memset(output2, 0, arraysize(output2));
5706741cbc25cd4227a9fba40dfd0273bfcc1a587aBen Murdoch
5806741cbc25cd4227a9fba40dfd0273bfcc1a587aBen Murdoch  stream.next_in = output;
5906741cbc25cd4227a9fba40dfd0273bfcc1a587aBen Murdoch  stream.avail_in = written;
6006741cbc25cd4227a9fba40dfd0273bfcc1a587aBen Murdoch  stream.next_out = output2;
6106741cbc25cd4227a9fba40dfd0273bfcc1a587aBen Murdoch  stream.avail_out = arraysize(output2);
6206741cbc25cd4227a9fba40dfd0273bfcc1a587aBen Murdoch
6306741cbc25cd4227a9fba40dfd0273bfcc1a587aBen Murdoch  do {
6406741cbc25cd4227a9fba40dfd0273bfcc1a587aBen Murdoch    result = BZ2_bzDecompress(&stream);
6506741cbc25cd4227a9fba40dfd0273bfcc1a587aBen Murdoch  } while (result == BZ_OK);
6606741cbc25cd4227a9fba40dfd0273bfcc1a587aBen Murdoch  ASSERT_EQ(result, BZ_STREAM_END);
6706741cbc25cd4227a9fba40dfd0273bfcc1a587aBen Murdoch  result = BZ2_bzDecompressEnd(&stream);
6806741cbc25cd4227a9fba40dfd0273bfcc1a587aBen Murdoch  ASSERT_EQ(result, BZ_OK);
6906741cbc25cd4227a9fba40dfd0273bfcc1a587aBen Murdoch
7006741cbc25cd4227a9fba40dfd0273bfcc1a587aBen Murdoch  EXPECT_EQ(arraysize(input) - 1, stream.total_out_lo32);
7106741cbc25cd4227a9fba40dfd0273bfcc1a587aBen Murdoch  EXPECT_STREQ(input, output2);
7206741cbc25cd4227a9fba40dfd0273bfcc1a587aBen Murdoch}
73