root/trunk/0023_TypeList/TypeListTest.cpp

User picture

Author: Setsu

Revision: 348 («Previous)


File Size: 7.21 KB

(August 30, 2011 02:21 UTC) 9 months ago

Poco::MD2Engine removed from Poco-1.4.2.

 
Show/hide line numbers
//
//  TypeListTest.cpp
//
//  Created by Setsu on 5/30/2010.
//  Copyright 2010 RoundSquare Inc. All rights reserved.
//
// Permission is hereby granted, free of charge, to any person or organization
// obtaining a copy of the software and accompanying documentation covered by
// this license (the "Software") to use, reproduce, display, distribute,
// execute, and transmit the Software, and to prepare derivative works of the
// Software, and to permit third-parties to whom the Software is furnished to
// do so, all subject to the following:
// 
// The copyright notices in the Software and this entire statement, including
// the above license grant, this restriction and the following disclaimer,
// must be included in all copies of the Software, in whole or in part, and
// all derivative works of the Software, unless such copies or derivative
// works are solely in the form of machine-executable object code generated by
// a source language processor.
// 
// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
// FITNESS FOR A PARTICULAR PURPOSE, TITLE AND NON-INFRINGEMENT. IN NO EVENT
// SHALL THE COPYRIGHT HOLDERS OR ANYONE DISTRIBUTING THE SOFTWARE BE LIABLE
// FOR ANY DAMAGES OR OTHER LIABILITY, WHETHER IN CONTRACT, TORT OR OTHERWISE,
// ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
// DEALINGS IN THE SOFTWARE.
//

//----------------------------------------
//	include
//----------------------------------------
#include <Poco/Logger.h>
#include <Poco/PatternFormatter.h>
#include <Poco/FormattingChannel.h>
#include <Poco/ConsoleChannel.h>
#include <Poco/URI.h>
#include <Poco/TypeList.h>
#include <Poco/DigestEngine.h>
#ifndef POCO_VERSION
#include <Poco/Version.h>
#endif
#if (POCO_VERSION < 0x01040200)
#include <Poco/MD2Engine.h>
#endif
#include <Poco/MD4Engine.h>
#include <Poco/MD5Engine.h>
#include <Poco/SHA1Engine.h>
#include <Poco/HMACEngine.h>
#include <Poco/DigestStream.h>
#include <Poco/Format.h>
#include <Poco/String.h>
#include <Poco/URIStreamOpener.h>
#include <Poco/Net/HTTPStreamFactory.h>
#include <Poco/StreamCopier.h>

#include <string>
#include <sstream>
#include <iostream>
#include <memory>
#include <algorithm>

#include "ScopedLogMessage.h"

//----------------------------------------
//	const
//----------------------------------------
enum DigestType {
#if (POCO_VERSION < 0x01040200)
					eDigestTypeMD2 = 0
				,	eDigestTypeMD4
#else
					eDigestTypeMD4 = 0
#endif
				,	eDigestTypeMD5
				,	eDigestTypeSHA1
				,	eDigestTypeHMAC	};

const std::string digestName[] = {
#if (POCO_VERSION < 0x01040200)
					"md2"
				,	"md4"
#else
					"md4"
#endif
				,	"md5"
				,	"sha1"
				,	"hmac"	};

const int kNumDigestType = sizeof(digestName)/sizeof(digestName[0]);

const char* kPassphrase = "Poco";

//----------------------------------------
//	typedef
//----------------------------------------
typedef Poco::TypeListType<
#if (POCO_VERSION < 0x01040200)
					Poco::MD2Engine
				,	Poco::MD4Engine
#else
					Poco::MD4Engine
#endif
				,	Poco::MD5Engine
				,	Poco::SHA1Engine
				,	Poco::HMACEngine<Poco::MD5Engine>
					>::HeadType DigestEngineTypeList;

//----------------------------------------
//	TestDigestEngineBase
//----------------------------------------
class TestDigestEngineBase
{
public:
	TestDigestEngineBase()
	{
	}
};

//----------------------------------------
//	TestDigestEngine
//----------------------------------------
template<DigestType N>
class TestDigestEngine : public TestDigestEngineBase
{
	typedef typename Poco::TypeGetter<N, DigestEngineTypeList>::HeadType	DigestEngineType;

public:
	TestDigestEngine(ScopedLogMessage& msg, const Poco::URI& uri, const char* passphrase=kPassphrase) :
		TestDigestEngineBase()
	{
		CreateDigestEngine(passphrase);
		Poco::DigestOutputStream dos(*m_pDigestEngine);
		std::auto_ptr<std::istream> pStr(Poco::URIStreamOpener::defaultOpener().open(uri));
		Poco::StreamCopier::copyStream(*pStr.get(), dos);
		dos.close();
		std::string digestStr(Poco::DigestEngine::digestToHex(m_pDigestEngine->digest()));

		Poco::URI digestUri("http://poco.roundsquare.net/downloads/test."+digestName[N]);
		std::auto_ptr<std::istream> pStrDigest(Poco::URIStreamOpener::defaultOpener().open(digestUri));
		std::stringstream ss;
		Poco::StreamCopier::copyStream(*pStrDigest.get(), ss);
		msg.Message(Poco::format("   %s: %s [%s]"
								,	Poco::toUpper((4 == digestName[N].length()) ? digestName[N]:(" "+digestName[N]))
								,	digestStr
								,	std::string((0 == ss.str().compare(digestStr)) ? "OK":"NG"))	);
	}
	~TestDigestEngine()
	{
		delete m_pDigestEngine;
	}

private:
	void CreateDigestEngine(const char* /*passphrase*/)
	{
		m_pDigestEngine = new DigestEngineType;
	}
	Poco::DigestEngine*	m_pDigestEngine;
};

template<>
void TestDigestEngine<eDigestTypeHMAC>::CreateDigestEngine(const char* passphrase)
{
	m_pDigestEngine = new DigestEngineType(std::string(passphrase));
}

//----------------------------------------
//	CreateTestDigestEngineInstances
//----------------------------------------
template<DigestType N>
void CreateTestDigestEngineInstances(	std::vector<TestDigestEngineBase*>& vec
									,	ScopedLogMessage& msg
									,	const Poco::URI& uri
									,	const char* passphrase=kPassphrase	)
{
	vec[N] = new TestDigestEngine<N>(msg, uri, passphrase);
	CreateTestDigestEngineInstances<static_cast<DigestType>(N+1)>(vec, msg, uri, passphrase);	// recursive call
}

template<>
void CreateTestDigestEngineInstances<eDigestTypeHMAC>(
										std::vector<TestDigestEngineBase*>& vec
									,	ScopedLogMessage& msg
									,	const Poco::URI& uri
									,	const char* passphrase	)
{
	vec[eDigestTypeHMAC] = new TestDigestEngine<eDigestTypeHMAC>(msg, uri, passphrase);
}

//----------------------------------------
//	DeleteTestDigestEngineInstance
//----------------------------------------
class DeleteTestDigestEngineInstance
{
public:
	void operator () (TestDigestEngineBase* ptr)
	{
		delete ptr;
	}
};

//----------------------------------------
//	PrepareConsoleLogger
//----------------------------------------
void PrepareConsoleLogger(const std::string& name, int level=Poco::Message::PRIO_INFORMATION)
{
	Poco::FormattingChannel* pFCConsole = new Poco::FormattingChannel(new Poco::PatternFormatter("%t"));
	pFCConsole->setChannel(new Poco::ConsoleChannel);
	pFCConsole->open();

	Poco::Logger::create(name, pFCConsole, level);
}

//----------------------------------------
//	main
//----------------------------------------
int main(int /*argc*/, char** /*argv*/)
{
	PrepareConsoleLogger(Poco::Logger::ROOT, Poco::Message::PRIO_INFORMATION);

	ScopedLogMessage msg("TypeListTest ", "start", "end");

	Poco::URI uri("http://poco.roundsquare.net/downloads/test.txt");
	Poco::Net::HTTPStreamFactory::registerFactory();
	std::auto_ptr<std::istream> pStr(Poco::URIStreamOpener::defaultOpener().open(uri));
	msg.Message("  source text:");
	Poco::StreamCopier::copyStream(*pStr.get(), std::cout);

	std::vector<TestDigestEngineBase*> vec(kNumDigestType);
#if (POCO_VERSION < 0x01040200)
	CreateTestDigestEngineInstances<eDigestTypeMD2>(vec, msg, uri);
#else
	CreateTestDigestEngineInstances<eDigestTypeMD4>(vec, msg, uri);
#endif
	std::for_each(vec.begin(), vec.end(), DeleteTestDigestEngineInstance());

	return 0;
}