#!/usr/bin/env perl

# Copyright (C) 2011 Apple Inc. All rights reserved.
#
# Redistribution and use in source and binary forms, with or without
# modification, are permitted provided that the following conditions
# are met:
# 1.  Redistributions of source code must retain the above copyright
#     notice, this list of conditions and the following disclaimer.
# 2.  Redistributions in binary form must reproduce the above copyright
#     notice, this list of conditions and the following disclaimer in the
#     documentation and/or other materials provided with the distribution.
#
# THIS SOFTWARE IS PROVIDED BY APPLE INC. AND ITS CONTRIBUTORS ``AS IS'' AND ANY
# EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
# WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
# DISCLAIMED. IN NO EVENT SHALL APPLE INC. OR ITS CONTRIBUTORS BE LIABLE FOR ANY
# DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
# (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
# LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
# ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
# SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.

# tests run-leaks using "old" leaks report version 2.0
# - The "old" 2.0 format has "leaks Report Version:  2.0" at the top of the report.

use strict;
use warnings;

use File::Spec;
use FindBin;
use lib File::Spec->catdir($FindBin::Bin, "..");
use Test::More;
use LoadAsModule qw(RunLeaks run-leaks);

my @input = split(/\n/, <<EOF);
leaks Report Version:  2.0
Process:         Safari [53606]
Path:            /Applications/Safari.app/Contents/MacOS/Safari
Load Address:    0x100000000
Identifier:      com.apple.Safari
Version:         5.0 (6533.9)
Build Info:      WebBrowser-75330900~1
Code Type:       X86-64 (Native)
Parent Process:  perl5.10.0 [53599]

Date/Time:       2010-05-27 11:42:27.356 -0700
OS Version:      Mac OS X 10.6.3 (10D571)
Report Version:  6

Process 53606: 112295 nodes malloced for 22367 KB
Process 53606: 1 leak for 32 total leaked bytes.
Leak: 0x1118c0e60  size=32  zone: DefaultMallocZone_0x105a92000	string 'com.apple.quarantine'
	Call stack: [thread 0x7fff70126be0]: | 0x100001e84 | NSApplicationMain | +[NSBundle(NSNibLoading) loadNibNamed:owner:] | +[NSBundle(NSNibLoading) _loadNibFile:nameTable:withZone:ownerBundle:] | loadNib | -[NSIBObjectData nibInstantiateWithOwner:topLevelObjects:] | -[NSSet makeObjectsPerformSelector:] | 0x100003494 | 0x1001013ff | 0x10014dbb9 | 0x10014d923 | 0x10014d7d7 | 0x10014ccd9 | 0x100149c8e | 0x100149bd8 | xar_open | xar_file_unserialize | xar_prop_unserialize | xar_prop_unserialize | strdup | malloc | malloc_zone_malloc 
EOF

my $expectedOutput =
[
  {
    'leaksOutput' => 'leaks Report Version:  2.0'
  },
  {
    'leaksOutput' => 'Process:         Safari [53606]'
  },
  {
    'leaksOutput' => 'Path:            /Applications/Safari.app/Contents/MacOS/Safari'
  },
  {
    'leaksOutput' => 'Load Address:    0x100000000'
  },
  {
    'leaksOutput' => 'Identifier:      com.apple.Safari'
  },
  {
    'leaksOutput' => 'Version:         5.0 (6533.9)'
  },
  {
    'leaksOutput' => 'Build Info:      WebBrowser-75330900~1'
  },
  {
    'leaksOutput' => 'Code Type:       X86-64 (Native)'
  },
  {
    'leaksOutput' => 'Parent Process:  perl5.10.0 [53599]'
  },
  {
    'leaksOutput' => ''
  },
  {
    'leaksOutput' => 'Date/Time:       2010-05-27 11:42:27.356 -0700'
  },
  {
    'leaksOutput' => 'OS Version:      Mac OS X 10.6.3 (10D571)'
  },
  {
    'leaksOutput' => 'Report Version:  6'
  },
  {
    'leaksOutput' => ''
  },
  {
    'leaksOutput' => 'Process 53606: 112295 nodes malloced for 22367 KB'
  },
  {
    'leaksOutput' => 'Process 53606: 1 leak for 32 total leaked bytes.'
  },
  {
    'leaksOutput' => join('', split(/\n/, <<EOF)),
Leak: 0x1118c0e60  size=32  zone: DefaultMallocZone_0x105a92000	string 'com.apple.quarantine'
	Call stack: [thread 0x7fff70126be0]: | 0x100001e84 | NSApplicationMain | +[NSBundle(NSNibLoading) loadNibNamed:owner:] | +[NSBundle(NSNibLoading) _loadNibFile:nameTable:withZone:ownerBundle:] | loadNib | -[NSIBObjectData nibInstantiateWithOwner:topLevelObjects:] | -[NSSet makeObjectsPerformSelector:] | 0x100003494 | 0x1001013ff | 0x10014dbb9 | 0x10014d923 | 0x10014d7d7 | 0x10014ccd9 | 0x100149c8e | 0x100149bd8 | xar_open | xar_file_unserialize | xar_prop_unserialize | xar_prop_unserialize | strdup | malloc | malloc_zone_malloc 
EOF
    'callStack' => 
'	Call stack: [thread 0x7fff70126be0]: | 0x100001e84 | NSApplicationMain | +[NSBundle(NSNibLoading) loadNibNamed:owner:] | +[NSBundle(NSNibLoading) _loadNibFile:nameTable:withZone:ownerBundle:] | loadNib | -[NSIBObjectData nibInstantiateWithOwner:topLevelObjects:] | -[NSSet makeObjectsPerformSelector:] | 0x100003494 | 0x1001013ff | 0x10014dbb9 | 0x10014d923 | 0x10014d7d7 | 0x10014ccd9 | 0x100149c8e | 0x100149bd8 | xar_open | xar_file_unserialize | xar_prop_unserialize | xar_prop_unserialize | strdup | malloc | malloc_zone_malloc ',
    'address' => '0x1118c0e60',
    'size' => '32',
    'type' => 'com.apple.quarantine',
  },
];

my $actualOutput = RunLeaks::parseLeaksOutput(@input);

plan(tests => 1);
is_deeply($actualOutput, $expectedOutput, "leaks Report Version 2.0 (old)");
